@@ -115,6 +115,10 @@ class RingSettlementGadget : public GadgetT
115115 const VariableT tradingHistoryRootB_A;
116116 const VariableT tradingHistoryRootS_B;
117117 const VariableT tradingHistoryRootB_B;
118+ const VariableT tradingHistoryRootA_M;
119+ const VariableT tradingHistoryRootB_M;
120+ const VariableT tradingHistoryRootO_M;
121+ const VariableT tradingHistoryRoot_O;
118122
119123 const VariableT balancesRootA;
120124 const VariableT balancesRootB;
@@ -123,7 +127,7 @@ class RingSettlementGadget : public GadgetT
123127 VariableT blockexchangeID;
124128
125129 const jubjub::VariablePointT publicKey;
126- libsnark::dual_variable_gadget<FieldT> minerAccountID ;
130+ libsnark::dual_variable_gadget<FieldT> ringMatcherAccountID ;
127131 VariableArrayT tokenID;
128132 libsnark::dual_variable_gadget<FieldT> fee;
129133 FloatGadget fFee ;
@@ -134,9 +138,6 @@ class RingSettlementGadget : public GadgetT
134138 OrderGadget orderA;
135139 OrderGadget orderB;
136140
137- ForceNotEqualGadget accountA_neq_ringMatcher;
138- ForceNotEqualGadget accountB_neq_ringMatcher;
139-
140141 OrderMatchingGadget orderMatching;
141142
142143 TernaryGadget uFillS_A;
@@ -201,7 +202,7 @@ class RingSettlementGadget : public GadgetT
201202 UpdateBalanceGadget updateBalanceF_O;
202203
203204 const VariableArrayT message;
204- SignatureVerifier minerSignatureVerifier ;
205+ SignatureVerifier ringMatcherSignatureVerifier ;
205206 SignatureVerifier dualAuthASignatureVerifier;
206207 SignatureVerifier dualAuthBSignatureVerifier;
207208
@@ -224,7 +225,7 @@ class RingSettlementGadget : public GadgetT
224225 constants (_constants),
225226
226227 publicKey (pb, FMT(prefix, " .publicKey" )),
227- minerAccountID (pb, NUM_BITS_ACCOUNT, FMT(prefix, " .minerAccountID " )),
228+ ringMatcherAccountID (pb, NUM_BITS_ACCOUNT, FMT(prefix, " .ringMatcherAccountID " )),
228229 tokenID (make_var_array(pb, TREE_DEPTH_TOKENS, FMT(prefix, " .tokenID" ))),
229230 fee (pb, NUM_BITS_AMOUNT, FMT(prefix, " .fee" )),
230231 fFee (pb, constants, Float12Encoding, FMT(prefix, " .fFee" )),
@@ -235,9 +236,6 @@ class RingSettlementGadget : public GadgetT
235236 orderA (pb, params, constants, _exchangeID, FMT(prefix, " .orderA" )),
236237 orderB (pb, params, constants, _exchangeID, FMT(prefix, " .orderB" )),
237238
238- accountA_neq_ringMatcher (pb, orderA.accountID.packed, minerAccountID.packed, FMT(prefix, " .accountA_neq_ringMatcher" )),
239- accountB_neq_ringMatcher (pb, orderB.accountID.packed, minerAccountID.packed, FMT(prefix, " .accountB_neq_ringMatcher" )),
240-
241239 // Match orders
242240 orderMatching (pb, constants, _timestamp, orderA, orderB, FMT(prefix, " .orderMatching" )),
243241
@@ -291,6 +289,10 @@ class RingSettlementGadget : public GadgetT
291289 tradingHistoryRootB_A (make_variable(pb, FMT(prefix, " .tradingHistoryRootB_A" ))),
292290 tradingHistoryRootS_B (make_variable(pb, FMT(prefix, " .tradingHistoryRootS_B" ))),
293291 tradingHistoryRootB_B (make_variable(pb, FMT(prefix, " .tradingHistoryRootB_B" ))),
292+ tradingHistoryRootA_M (make_variable(pb, FMT(prefix, " .tradingHistoryRootA_M" ))),
293+ tradingHistoryRootB_M (make_variable(pb, FMT(prefix, " .tradingHistoryRootB_M" ))),
294+ tradingHistoryRootO_M (make_variable(pb, FMT(prefix, " .tradingHistoryRootO_M" ))),
295+ tradingHistoryRoot_O (make_variable(pb, FMT(prefix, " .tradingHistoryRoot_O" ))),
294296
295297 // Initial balances roots
296298 balancesRootA (make_variable(pb, FMT(prefix, " .balancesRootA" ))),
@@ -341,18 +343,18 @@ class RingSettlementGadget : public GadgetT
341343
342344 // Update Ring-Matcher
343345 updateBalanceA_M(pb, balancesRootM, orderA.tokenB.bits,
344- {balanceA_M.front (), constants. emptyTradeHistory },
345- {balanceA_M.back (), constants. emptyTradeHistory },
346+ {balanceA_M.front (), tradingHistoryRootA_M },
347+ {balanceA_M.back (), tradingHistoryRootA_M },
346348 FMT (prefix, " .updateBalanceA_M" )),
347349 updateBalanceB_M(pb, updateBalanceA_M.getNewRoot(), orderB.tokenB.bits,
348- {balanceB_M.front (), constants. emptyTradeHistory },
349- {balanceB_M.back (), constants. emptyTradeHistory },
350+ {balanceB_M.front (), tradingHistoryRootB_M },
351+ {balanceB_M.back (), tradingHistoryRootB_M },
350352 FMT (prefix, " .updateBalanceB_M" )),
351353 updateBalanceO_M(pb, updateBalanceB_M.getNewRoot(), tokenID,
352- {balanceO_M.front (), constants. emptyTradeHistory },
353- {balanceO_M.back (), constants. emptyTradeHistory },
354+ {balanceO_M.front (), tradingHistoryRootO_M },
355+ {balanceO_M.back (), tradingHistoryRootO_M },
354356 FMT (prefix, " .updateBalanceO_M" )),
355- updateAccount_M(pb, updateAccount_B.result(), minerAccountID .bits,
357+ updateAccount_M(pb, updateAccount_B.result(), ringMatcherAccountID .bits,
356358 {publicKey.x , publicKey.y , nonce_before.packed , balancesRootM},
357359 {publicKey.x , publicKey.y , nonce_after.result (), updateBalanceO_M.getNewRoot ()},
358360 FMT (prefix, " .updateAccount_M" )),
@@ -369,17 +371,17 @@ class RingSettlementGadget : public GadgetT
369371
370372 // Update Operator
371373 updateBalanceF_O(pb, _operatorBalancesRoot, tokenID,
372- {balanceF_O.front (), constants. emptyTradeHistory },
373- {balanceF_O.back (), constants. emptyTradeHistory },
374+ {balanceF_O.front (), tradingHistoryRoot_O },
375+ {balanceF_O.back (), tradingHistoryRoot_O },
374376 FMT (prefix, " .updateBalanceF_O" )),
375377
376378 // Signatures
377379 message(flatten({orderA.getHash (), orderB.getHash (),
378- minerAccountID .bits , tokenID, fee.bits ,
380+ ringMatcherAccountID .bits , tokenID, fee.bits ,
379381 orderA.feeBips .bits , orderB.feeBips .bits ,
380382 orderA.rebateBips .bits , orderB.rebateBips .bits ,
381383 nonce_before.bits , constants.padding_0 })),
382- minerSignatureVerifier (pb, params, publicKey, message, FMT(prefix, " .minerSignatureVerifier " )),
384+ ringMatcherSignatureVerifier (pb, params, publicKey, message, FMT(prefix, " .ringMatcherSignatureVerifier " )),
383385 dualAuthASignatureVerifier(pb, params, orderA.dualAuthPublicKey, message, FMT(prefix, " .dualAuthASignatureVerifier" )),
384386 dualAuthBSignatureVerifier(pb, params, orderB.dualAuthPublicKey, message, FMT(prefix, " .dualAuthBSignatureVerifier" ))
385387 {
@@ -405,7 +407,7 @@ class RingSettlementGadget : public GadgetT
405407 {
406408 return
407409 {
408- minerAccountID .bits ,
410+ ringMatcherAccountID .bits ,
409411 fFee .bits (),
410412 tokenID,
411413
@@ -427,8 +429,8 @@ class RingSettlementGadget : public GadgetT
427429 pb.val (publicKey.x ) = ringSettlement.accountUpdate_M .before .publicKey .x ;
428430 pb.val (publicKey.y ) = ringSettlement.accountUpdate_M .before .publicKey .y ;
429431
430- minerAccountID .bits .fill_with_bits_of_field_element (pb, ringSettlement.ring .minerAccountID );
431- minerAccountID .generate_r1cs_witness_from_bits ();
432+ ringMatcherAccountID .bits .fill_with_bits_of_field_element (pb, ringSettlement.ring .ringMatcherAccountID );
433+ ringMatcherAccountID .generate_r1cs_witness_from_bits ();
432434 tokenID.fill_with_bits_of_field_element (pb, ringSettlement.ring .tokenID );
433435 fee.bits .fill_with_bits_of_field_element (pb, ringSettlement.ring .fee );
434436 fee.generate_r1cs_witness_from_bits ();
@@ -449,9 +451,6 @@ class RingSettlementGadget : public GadgetT
449451 ringSettlement.balanceUpdateB_B .before ,
450452 ringSettlement.tradeHistoryUpdate_B .before );
451453
452- accountA_neq_ringMatcher.generate_r1cs_witness ();
453- accountB_neq_ringMatcher.generate_r1cs_witness ();
454-
455454 // Match orders
456455 orderMatching.generate_r1cs_witness ();
457456
@@ -503,6 +502,10 @@ class RingSettlementGadget : public GadgetT
503502 pb.val (tradingHistoryRootB_A) = ringSettlement.balanceUpdateB_A .before .tradingHistoryRoot ;
504503 pb.val (tradingHistoryRootS_B) = ringSettlement.balanceUpdateS_B .before .tradingHistoryRoot ;
505504 pb.val (tradingHistoryRootB_B) = ringSettlement.balanceUpdateB_B .before .tradingHistoryRoot ;
505+ pb.val (tradingHistoryRootA_M) = ringSettlement.balanceUpdateA_M .before .tradingHistoryRoot ;
506+ pb.val (tradingHistoryRootB_M) = ringSettlement.balanceUpdateB_M .before .tradingHistoryRoot ;
507+ pb.val (tradingHistoryRootO_M) = ringSettlement.balanceUpdateO_M .before .tradingHistoryRoot ;
508+ pb.val (tradingHistoryRoot_O) = ringSettlement.balanceUpdateF_O .before .tradingHistoryRoot ;
506509
507510 // Initial balances roots
508511 pb.val (balancesRootA) = ringSettlement.balanceUpdateS_A .rootBefore ;
@@ -535,15 +538,15 @@ class RingSettlementGadget : public GadgetT
535538 updateBalanceF_O.generate_r1cs_witness (ringSettlement.balanceUpdateF_O .proof );
536539
537540 // Signatures
538- minerSignatureVerifier .generate_r1cs_witness (ringSettlement.ring .minerSignature );
541+ ringMatcherSignatureVerifier .generate_r1cs_witness (ringSettlement.ring .ringMatcherSignature );
539542 dualAuthASignatureVerifier.generate_r1cs_witness (ringSettlement.ring .dualAuthASignature );
540543 dualAuthBSignatureVerifier.generate_r1cs_witness (ringSettlement.ring .dualAuthBSignature );
541544 }
542545
543546
544547 void generate_r1cs_constraints ()
545548 {
546- minerAccountID .generate_r1cs_constraints (true );
549+ ringMatcherAccountID .generate_r1cs_constraints (true );
547550 fee.generate_r1cs_constraints (true );
548551 fFee .generate_r1cs_constraints ();
549552 ensureAccuracyFee.generate_r1cs_constraints ();
@@ -553,9 +556,6 @@ class RingSettlementGadget : public GadgetT
553556 orderA.generate_r1cs_constraints ();
554557 orderB.generate_r1cs_constraints ();
555558
556- accountA_neq_ringMatcher.generate_r1cs_constraints ();
557- accountB_neq_ringMatcher.generate_r1cs_constraints ();
558-
559559 // Match orders
560560 orderMatching.generate_r1cs_constraints ();
561561
@@ -612,7 +612,7 @@ class RingSettlementGadget : public GadgetT
612612 updateBalanceF_O.generate_r1cs_constraints ();
613613
614614 // Signatures
615- minerSignatureVerifier .generate_r1cs_constraints ();
615+ ringMatcherSignatureVerifier .generate_r1cs_constraints ();
616616 dualAuthASignatureVerifier.generate_r1cs_constraints ();
617617 dualAuthBSignatureVerifier.generate_r1cs_constraints ();
618618 }
@@ -650,6 +650,7 @@ class RingSettlementCircuit : public GadgetT
650650 libsnark::dual_variable_gadget<FieldT> operatorAccountID;
651651 const jubjub::VariablePointT publicKey;
652652 const VariableT balancesRootO_before;
653+ const VariableT nonce_O;
653654 UpdateAccountGadget* updateAccount_O;
654655
655656 RingSettlementCircuit (ProtoboardT& pb, const std::string& prefix) :
@@ -672,7 +673,8 @@ class RingSettlementCircuit : public GadgetT
672673
673674 operatorAccountID (pb, TREE_DEPTH_ACCOUNTS, FMT(prefix, " .operatorAccountID" )),
674675 publicKey (pb, FMT(prefix, " .publicKey" )),
675- balancesRootO_before (make_variable(pb, FMT(prefix, " .balancesRootO_before" )))
676+ balancesRootO_before (make_variable(pb, FMT(prefix, " .balancesRootO_before" ))),
677+ nonce_O (make_variable(pb, FMT(prefix, " .nonce_O" )))
676678 {
677679 this ->updateAccount_P = nullptr ;
678680 this ->updateAccount_O = nullptr ;
@@ -759,8 +761,8 @@ class RingSettlementCircuit : public GadgetT
759761
760762 // Update the operator
761763 updateAccount_O = new UpdateAccountGadget (pb, updateAccount_P->result (), operatorAccountID.bits ,
762- {publicKey.x , publicKey.y , constants. zero , balancesRootO_before},
763- {publicKey.x , publicKey.y , constants. zero , ringSettlements.back ()->getNewOperatorBalancesRoot ()},
764+ {publicKey.x , publicKey.y , nonce_O , balancesRootO_before},
765+ {publicKey.x , publicKey.y , nonce_O , ringSettlements.back ()->getNewOperatorBalancesRoot ()},
764766 FMT (annotation_prefix, " .updateAccount_O" ));
765767 updateAccount_O->generate_r1cs_constraints ();
766768
@@ -815,6 +817,7 @@ class RingSettlementCircuit : public GadgetT
815817 pb.val (publicKey.x ) = block.accountUpdate_O .before .publicKey .x ;
816818 pb.val (publicKey.y ) = block.accountUpdate_O .before .publicKey .y ;
817819 pb.val (balancesRootO_before) = block.accountUpdate_O .before .balancesRoot ;
820+ pb.val (nonce_O) = block.accountUpdate_O .before .nonce ;
818821 pb.val (balancesRootP_before) = block.accountUpdate_P .before .balancesRoot ;
819822
820823 for (unsigned int i = 0 ; i < block.ringSettlements .size (); i++)
0 commit comments