@@ -20,6 +20,8 @@ func loadPayload(tasks []*task.Task, projectConfig *project.Config) ([]byte, err
2020 return encodeLivenessPayload (tasks [0 ], projectConfig )
2121 case "movement" :
2222 return encodeMovementPayload (tasks , projectConfig )
23+ case "sum" :
24+ return encodeSumPayload (tasks , projectConfig )
2325 default :
2426 return tasks [0 ].Payload , nil
2527 }
@@ -168,3 +170,81 @@ func abs(a, b uint64) uint64 {
168170 }
169171 return b - a
170172}
173+
174+ const SumMaxItems = 2
175+
176+ type ProofOfSumCircuit struct {
177+ PayloadHashs [SumMaxItems ][32 ]uints.U8
178+ Timestamps [SumMaxItems ]frontend.Variable
179+ Values [SumMaxItems ]frontend.Variable
180+ SigBytes [SumMaxItems ][64 ]uints.U8
181+
182+ PubBytes [SumMaxItems ][65 ]uints.U8
183+ StartTime frontend.Variable
184+
185+ Threshold frontend.Variable `gnark:",public"`
186+ EthAddress frontend.Variable `gnark:",public"`
187+ }
188+
189+ func (circuit * ProofOfSumCircuit ) Define (api frontend.API ) error { return nil }
190+
191+ func encodeSumPayload (tasks []* task.Task , projectConfig * project.Config ) ([]byte , error ) {
192+ if len (tasks ) != 1 {
193+ return nil , errors .Errorf ("invalid tasks len, expect %d, get %d" , 1 , len (tasks ))
194+ }
195+ assignment := ProofOfSumCircuit {}
196+ task := tasks [0 ]
197+ if task .PrevTask == nil {
198+ return nil , errors .New ("sum project miss previous task" )
199+ }
200+ lastPayloadHash , _ , _ , lastData , err := api .HashTask (
201+ & api.CreateTaskReq {
202+ Nonce : task .PrevTask .Nonce ,
203+ ProjectID : task .PrevTask .ProjectID .String (),
204+ ProjectVersion : task .PrevTask .ProjectVersion ,
205+ Payload : task .PrevTask .Payload ,
206+ }, projectConfig )
207+ if err != nil {
208+ return nil , err
209+ }
210+ curPayloadHash , _ , _ , curData , err := api .HashTask (
211+ & api.CreateTaskReq {
212+ Nonce : task .Nonce ,
213+ ProjectID : task .ProjectID .String (),
214+ ProjectVersion : task .ProjectVersion ,
215+ Payload : task .Payload ,
216+ }, projectConfig )
217+ if err != nil {
218+ return nil , err
219+ }
220+ lastTimestamp := lastData [0 ].(uint64 )
221+ lastValue := lastData [1 ].(uint64 )
222+ lastSig := task .PrevTask .Signature [:64 ]
223+ curTimestamp := curData [0 ].(uint64 )
224+ curValue := curData [1 ].(uint64 )
225+ curSig := task .Signature [:64 ]
226+
227+ assignment .PayloadHashs [0 ] = [32 ]uints.U8 (uints .NewU8Array (lastPayloadHash [:]))
228+ assignment .Timestamps [0 ] = lastTimestamp
229+ assignment .Values [0 ] = lastValue
230+ assignment .SigBytes [0 ] = [64 ]uints.U8 (uints .NewU8Array (lastSig [:]))
231+ assignment .PayloadHashs [1 ] = [32 ]uints.U8 (uints .NewU8Array (curPayloadHash [:]))
232+ assignment .Timestamps [1 ] = curTimestamp
233+ assignment .Values [1 ] = curValue
234+ assignment .SigBytes [1 ] = [64 ]uints.U8 (uints .NewU8Array (curSig [:]))
235+ assignment .PubBytes [0 ] = [65 ]uints.U8 (uints .NewU8Array (task .DevicePubKey ))
236+ assignment .PubBytes [1 ] = [65 ]uints.U8 (uints .NewU8Array (task .DevicePubKey ))
237+ assignment .Threshold = uint64 (10 )
238+
239+ pubkey , err := crypto .UnmarshalPubkey (task .DevicePubKey )
240+ if err != nil {
241+ return nil , errors .Wrap (err , "failed to unmarshal pubkey" )
242+ }
243+ assignment .EthAddress = crypto .PubkeyToAddress (* pubkey ).Big ()
244+
245+ witness , err := frontend .NewWitness (& assignment , ecc .BN254 .ScalarField ())
246+ if err != nil {
247+ return nil , err
248+ }
249+ return witness .MarshalBinary ()
250+ }
0 commit comments