Skip to content

Commit 295bb8d

Browse files
authored
Misc improvements with equal accounts (#2)
* Added transformation of ring data to make the it easier to compress * Fixed ring settlement without DA * Renamed numElements to blockSize for consistency * More flexible ring data transformation * Small data transform change * Misc improvements when accounts are the same in requests * Small refactor (miner -> ringMatcher)
1 parent 9dac6d1 commit 295bb8d

File tree

4 files changed

+52
-43
lines changed

4 files changed

+52
-43
lines changed

Circuits/OffchainWithdrawalCircuit.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ class OffchainWithdrawalGadget : public GadgetT
4242
AccountState accountWalletBefore;
4343

4444
VariableT balanceF_O_before;
45+
VariableT tradingHistoryRootF_O;
4546

4647
MulDivGadget feeToWallet;
4748
UnsafeSubGadget feeToOperator;
@@ -127,6 +128,7 @@ class OffchainWithdrawalGadget : public GadgetT
127128

128129
// Operator
129130
balanceF_O_before(make_variable(pb, FMT(prefix, ".balanceF_O_before"))),
131+
tradingHistoryRootF_O(make_variable(pb, FMT(prefix, ".tradingHistoryRootF_O"))),
130132

131133
// Split the fee between wallet and operator
132134
feeToWallet(pb, constants, fFee.value(), walletSplitPercentage.value.packed, constants._100, FMT(prefix, ".feeToWallet")),
@@ -178,8 +180,8 @@ class OffchainWithdrawalGadget : public GadgetT
178180

179181
// Update Operator
180182
updateBalanceF_O(pb, operatorBalancesRoot, feeTokenID,
181-
{balanceF_O_before, constants.emptyTradeHistory},
182-
{feePaymentOperator.Y, constants.emptyTradeHistory},
183+
{balanceF_O_before, tradingHistoryRootF_O},
184+
{feePaymentOperator.Y, tradingHistoryRootF_O},
183185
FMT(prefix, ".updateBalanceF_O")),
184186

185187
// Signature
@@ -252,6 +254,7 @@ class OffchainWithdrawalGadget : public GadgetT
252254

253255
// Operator
254256
pb.val(balanceF_O_before) = withdrawal.balanceUpdateF_O.before.balance;
257+
pb.val(tradingHistoryRootF_O) = withdrawal.balanceUpdateF_O.before.tradingHistoryRoot;
255258

256259
// Fee payments calculations
257260
feeToWallet.generate_r1cs_witness();

Circuits/OrderCancellationCircuit.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ class OrderCancellationGadget : public GadgetT
5151
VariableT balancesRoot_W_before;
5252
VariableT balanceF_W_before;
5353
VariableT nonce_W;
54+
VariableT tradingHistoryRootF_W;
5455

5556
VariableT balanceF_O_before;
5657
VariableT tradingHistoryRootF_O;
@@ -120,6 +121,7 @@ class OrderCancellationGadget : public GadgetT
120121
balancesRoot_W_before(make_variable(pb, FMT(prefix, ".balancesRoot_W_before"))),
121122
balanceF_W_before(make_variable(pb, FMT(prefix, ".balanceF_W_before"))),
122123
nonce_W(make_variable(pb, FMT(prefix, ".nonce_W"))),
124+
tradingHistoryRootF_W(make_variable(pb, FMT(prefix, ".tradingHistoryRootF_W"))),
123125

124126
balanceF_O_before(make_variable(pb, FMT(prefix, ".balanceF_O_before"))),
125127
tradingHistoryRootF_O(make_variable(pb, FMT(prefix, ".tradingHistoryRootF_O"))),
@@ -160,8 +162,8 @@ class OrderCancellationGadget : public GadgetT
160162

161163
// Wallet balance
162164
updateBalanceF_W(pb, balancesRoot_W_before, feeTokenID,
163-
{balanceF_W_before, constants.emptyTradeHistory},
164-
{feePaymentWallet.Y, constants.emptyTradeHistory},
165+
{balanceF_W_before, tradingHistoryRootF_W},
166+
{feePaymentWallet.Y, tradingHistoryRootF_W},
165167
FMT(prefix, ".updateBalanceF_W")),
166168
// Wallet account
167169
updateAccount_W(pb, updateAccount_A.result(), walletAccountID,
@@ -240,6 +242,7 @@ class OrderCancellationGadget : public GadgetT
240242
pb.val(balancesRoot_W_before) = cancellation.accountUpdate_W.before.balancesRoot;
241243
pb.val(balanceF_W_before) = cancellation.balanceUpdateF_W.before.balance;
242244
pb.val(nonce_W) = cancellation.accountUpdate_W.before.nonce;
245+
pb.val(tradingHistoryRootF_W) = cancellation.balanceUpdateF_W.before.tradingHistoryRoot;
243246

244247
pb.val(balanceF_O_before) = cancellation.balanceUpdateF_O.before.balance;
245248
pb.val(tradingHistoryRootF_O) = cancellation.balanceUpdateF_O.before.tradingHistoryRoot;

Circuits/RingSettlementCircuit.h

Lines changed: 38 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -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++)

Utils/Data.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -204,12 +204,12 @@ class Ring
204204
Order orderA;
205205
Order orderB;
206206

207-
ethsnarks::FieldT minerAccountID;
207+
ethsnarks::FieldT ringMatcherAccountID;
208208
ethsnarks::FieldT tokenID;
209209
ethsnarks::FieldT fee;
210210
ethsnarks::FieldT nonce;
211211

212-
Signature minerSignature;
212+
Signature ringMatcherSignature;
213213
Signature dualAuthASignature;
214214
Signature dualAuthBSignature;
215215
};
@@ -219,12 +219,12 @@ void from_json(const json& j, Ring& ring)
219219
ring.orderA = j.at("orderA").get<Order>();
220220
ring.orderB = j.at("orderB").get<Order>();
221221

222-
ring.minerAccountID = ethsnarks::FieldT(j.at("minerAccountID"));
222+
ring.ringMatcherAccountID = ethsnarks::FieldT(j.at("ringMatcherAccountID"));
223223
ring.tokenID = ethsnarks::FieldT(j.at("tokenID"));
224224
ring.fee = ethsnarks::FieldT(j.at("fee").get<std::string>().c_str());
225225
ring.nonce = ethsnarks::FieldT(j.at("nonce"));
226226

227-
ring.minerSignature = j.at("minerSignature").get<Signature>();
227+
ring.ringMatcherSignature = j.at("ringMatcherSignature").get<Signature>();
228228
ring.dualAuthASignature = j.at("dualAuthASignature").get<Signature>();
229229
ring.dualAuthBSignature = j.at("dualAuthBSignature").get<Signature>();
230230
}

0 commit comments

Comments
 (0)