Skip to content

Commit

Permalink
Update txdata encoding scheme (#197)
Browse files Browse the repository at this point in the history
* versionaize

* update da scheme

* update version

Co-authored-by: Ho <[email protected]>
  • Loading branch information
noel2004 and Ho authored Nov 19, 2021
1 parent b91830c commit 46608b1
Show file tree
Hide file tree
Showing 9 changed files with 29 additions and 39 deletions.
1 change: 1 addition & 0 deletions circuits.ver
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
197
1 change: 0 additions & 1 deletion src/block.circom
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,6 @@ template Block(nTxs, balanceLevels, orderLevels, accountLevels) {
encodeData[i].accountID1 <== encodedTxs[i][1];
encodeData[i].accountID2 <== encodedTxs[i][8];
encodeData[i].tokenID1 <== encodedTxs[i][2];
encodeData[i].tokenID2 <== encodedTxs[i][9];
encodeData[i].amount <== encodedTxs[i][24];
encodeData[i].newOrder1TokenSell <== encodedTxs[i][39];
encodeData[i].newOrder2TokenSell <== encodedTxs[i][53];
Expand Down
21 changes: 10 additions & 11 deletions src/decode_tx.circom
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ include "./lib/bitify.circom";
*/

function TxLength() { return 60; }
function DecodeAmountCount() {return 5; }
function DecodeAmountCount() {return 4; }

template DecodeTx() {

Expand Down Expand Up @@ -106,8 +106,7 @@ template DecodeTx() {
s2 <== in[21];
r8x2 <== in[22];
r8y2 <== in[23];
decodeAmount[0].encodedAmount <== in[24];
amount <== decodeAmount[0].decodedAmount;
amount <== in[24];
amount1 <== in[25];
amount2 <== in[26];
balance3 <== in[27];
Expand All @@ -124,12 +123,12 @@ template DecodeTx() {
newOrder1ID <== in[38];
newOrder1TokenSell <== in[39];
newOrder1FilledSell <== in[40];
decodeAmount[1].encodedAmount <== in[41];
newOrder1AmountSell <== decodeAmount[1].decodedAmount;
decodeAmount[0].encodedAmount <== in[41];
newOrder1AmountSell <== decodeAmount[0].decodedAmount;
newOrder1TokenBuy <== in[42];
newOrder1FilledBuy <== in[43];
decodeAmount[2].encodedAmount <== in[44];
newOrder1AmountBuy <== decodeAmount[2].decodedAmount;
decodeAmount[1].encodedAmount <== in[44];
newOrder1AmountBuy <== decodeAmount[1].decodedAmount;
oldOrder2ID <== in[45];
oldOrder2TokenSell <== in[46];
oldOrder2FilledSell <== in[47];
Expand All @@ -140,12 +139,12 @@ template DecodeTx() {
newOrder2ID <== in[52];
newOrder2TokenSell <== in[53];
newOrder2FilledSell <== in[54];
decodeAmount[3].encodedAmount <== in[55];
newOrder2AmountSell <== decodeAmount[3].decodedAmount;
decodeAmount[2].encodedAmount <== in[55];
newOrder2AmountSell <== decodeAmount[2].decodedAmount;
newOrder2TokenBuy <== in[56];
newOrder2FilledBuy <== in[57];
decodeAmount[4].encodedAmount <== in[58];
newOrder2AmountBuy <== decodeAmount[4].decodedAmount;
decodeAmount[3].encodedAmount <== in[58];
newOrder2AmountBuy <== decodeAmount[3].decodedAmount;
dstIsNew <== in[59];

}
16 changes: 4 additions & 12 deletions src/encode_data.circom
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ include "./lib/bitify.circom";
function TxDataLength(balanceLevels, orderLevels, accountLevels) {
var ret = 0;

var commonLen = accountLevels*2 + balanceLevels*2 + 40*1;
var commonLen = 128*1 + accountLevels*2 + balanceLevels*1;
if ( ret < commonLen){
ret = commonLen;
}
Expand Down Expand Up @@ -34,7 +34,6 @@ template EncodeData(balanceLevels, orderLevels, accountLevels) {
signal input accountID1;
signal input accountID2;
signal input tokenID1;
signal input tokenID2;
signal input amount;
signal input newOrder1TokenSell;
signal input newOrder2TokenSell;
Expand Down Expand Up @@ -101,20 +100,13 @@ template EncodeData(balanceLevels, orderLevels, accountLevels) {
encodedCommonTx[i+offset] <== useCommon*encodeCommonTokenID1.out[i];
}
offset += balanceLevels;
component encodeCommonTokenID2 = Num2BitsIfEnabled(balanceLevels);
encodeCommonTokenID2.in <== tokenID2;
encodeCommonTokenID2.enabled <== 1;
for (var i = 0; i < balanceLevels; i++) {
encodedCommonTx[i+offset] <== useCommon*encodeCommonTokenID2.out[i];
}
offset += balanceLevels;
component encodeCommonAmount = Num2BitsIfEnabled(floats);
component encodeCommonAmount = Num2BitsIfEnabled(128);
encodeCommonAmount.in <== amount;
encodeCommonAmount.enabled <== 1;
for (var i = 0; i < floats; i++) {
for (var i = 0; i < 128; i++) {
encodedCommonTx[i+offset] <== useCommon*encodeCommonAmount.out[i];
}
offset += floats;
offset += 128;
//filling reset part by 0
assert(offset <= encodeLength);
for (var i = 0; i < encodeLength - offset; i++) {
Expand Down
1 change: 0 additions & 1 deletion src/tx_dec_enc.circom
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ template GenerateTxDataFromTx(balanceLevels, orderLevels, accountLevels) {
encodeData.accountID1 <== in[1];
encodeData.accountID2 <== in[8];
encodeData.tokenID1 <== in[2];
encodeData.tokenID2 <== in[9];
encodeData.amount <== in[24];
encodeData.newOrder1TokenSell <== in[39];
encodeData.newOrder2TokenSell <== in[53];
Expand Down
8 changes: 3 additions & 5 deletions test/codec/encode_data.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { encodeCtx } from './bitstream';

export function txDAEncodeLength(nTokenLevel: number, nOrderLevel: number, nAccountLevel: number) {
let ret = 0;
let commonLen = nAccountLevel * 2 + nTokenLevel * 2 + 40 * 1;
let commonLen = 128 * 1 + nAccountLevel * 2 + nTokenLevel * 1;
if (ret < commonLen) {
ret = commonLen;
}
Expand Down Expand Up @@ -47,8 +47,7 @@ class DAEncoder extends encodeCtx {
AccountID1: 0,
AccountID2: 1,
TokenID1: 2,
TokenID2: 3,
Amount: 4,
Amount: 3,
};

encodeCommon(payload: Array<bigint>, idx) {
Expand All @@ -62,8 +61,7 @@ class DAEncoder extends encodeCtx {
this.encodeNumber(payload[idx['AccountID1']], accountLevels, false);
this.encodeNumber(payload[idx['AccountID2']], accountLevels, false);
this.encodeNumber(payload[idx['TokenID1']], balanceLevels, false);
this.encodeNumber(payload[idx['TokenID2']], balanceLevels, false);
this.encodeNumber(payload[idx['Amount']], floats, false);
this.encodeNumber(payload[idx['Amount']], 128, false);
this.encodeAlign(this.encodeLength);
}

Expand Down
9 changes: 6 additions & 3 deletions test/common/da_hashing.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ import { assert } from 'console';

const { TxDetailIdx, TxType } = tx;

const U128MAX = BigInt('340282366920938463463374607431768211456');

class DA_Hasher {
private encoder: DAEncoder;

Expand All @@ -20,17 +22,17 @@ class DA_Hasher {

encodeTransfer(tx: tx.TranferTx) {
this.encoder.encodeNumber(0, 3); //000
this.encoder.encodeCommon([tx.from, tx.to, tx.tokenID, tx.tokenID, encodeFloat(tx.amount)], DAEncoder.commonIdx);
this.encoder.encodeCommon([tx.from, tx.to, tx.tokenID, tx.amount], DAEncoder.commonIdx);
}

encodeWithdraw(tx: tx.WithdrawTx) {
this.encoder.encodeNumber(2, 3); //010
this.encoder.encodeCommon([tx.accountID, tx.accountID, tx.tokenID, tx.tokenID, encodeFloat(tx.amount)], DAEncoder.commonIdx);
this.encoder.encodeCommon([tx.accountID, tx.accountID, tx.tokenID, tx.amount], DAEncoder.commonIdx);
}

encodeDeposit(tx: tx.DepositToOldTx | tx.DepositToNewTx) {
this.encoder.encodeNumber(0, 3); //000
this.encoder.encodeCommon([tx.accountID, tx.accountID, tx.tokenID, tx.tokenID, encodeFloat(tx.amount)], DAEncoder.commonIdx);
this.encoder.encodeCommon([tx.accountID, tx.accountID, tx.tokenID, tx.amount], DAEncoder.commonIdx);
}

encodeKeyUpdate(tx: tx.DepositToNewTx) {
Expand Down Expand Up @@ -84,6 +86,7 @@ class DA_Hasher {
//when handling common deposit tx, continue to next case
case TxType.Transfer:
this.encoder.encodeNumber(0, 3); //000
assert(payload[TxDetailIdx.Amount] < U128MAX);
this.encodeRawPayload(payload, 'encodeCommon');
break;
case TxType.SpotTrade:
Expand Down
6 changes: 3 additions & 3 deletions test/global_state.ts
Original file line number Diff line number Diff line change
Expand Up @@ -391,7 +391,7 @@ class GlobalState {
let encodedTx: Array<bigint> = new Array(TxLength);
encodedTx.fill(0n, 0, TxLength);

encodedTx[TxDetailIdx.Amount] = encodeFloat(tx.amount);
encodedTx[TxDetailIdx.Amount] = tx.amount;

encodedTx[TxDetailIdx.TokenID1] = Scalar.e(tx.tokenID);
encodedTx[TxDetailIdx.AccountID1] = Scalar.e(tx.accountID);
Expand Down Expand Up @@ -476,7 +476,7 @@ class GlobalState {
encodedTx[TxDetailIdx.AccountID2] = tx.to;
encodedTx[TxDetailIdx.TokenID1] = tx.tokenID;
encodedTx[TxDetailIdx.TokenID2] = tx.tokenID;
encodedTx[TxDetailIdx.Amount] = encodeFloat(tx.amount);
encodedTx[TxDetailIdx.Amount] = tx.amount;
encodedTx[TxDetailIdx.Nonce1] = fromAccount.nonce;
encodedTx[TxDetailIdx.Nonce2] = toAccount.nonce;
encodedTx[TxDetailIdx.Sign1] = fromAccount.sign;
Expand Down Expand Up @@ -536,7 +536,7 @@ class GlobalState {
let encodedTx: Array<bigint> = new Array(TxLength);
encodedTx.fill(0n, 0, TxLength);

encodedTx[TxDetailIdx.Amount] = encodeFloat(tx.amount);
encodedTx[TxDetailIdx.Amount] = tx.amount;

encodedTx[TxDetailIdx.TokenID1] = Scalar.e(tx.tokenID);
encodedTx[TxDetailIdx.AccountID1] = Scalar.e(tx.accountID);
Expand Down
5 changes: 2 additions & 3 deletions tpl/config.js
Original file line number Diff line number Diff line change
Expand Up @@ -68,8 +68,8 @@ function getCommonPayload() {
);
}
function getEncodedAmount() {
//no amount would be compressed outside of spotTrade any more
return splitAndTrim(`
amount
`).concat(orderLeafsNaming(['amountSell', 'amountBuy'], ['new']));
}
//console.log('commonPayload', getCommonPayload())
Expand Down Expand Up @@ -138,8 +138,7 @@ const config = {
['accountID1', 'accountLevels'],
['accountID2', 'accountLevels'],
['tokenID1', 'balanceLevels'],
['tokenID2', 'balanceLevels'],
['amount', 'floats'],
['amount', '128'],
],
spotTrade: [
['accountID1', 'accountLevels'],
Expand Down

0 comments on commit 46608b1

Please sign in to comment.