hermez-node/db/statedb/zkinputsgen_test.go
db/statedb/zkinputsgen_test.goRaw
1package statedb
2
3import (
4 "encoding/hex"
5 "encoding/json"
6 "fmt"
7 "io/ioutil"
8 "math/big"
9 "os"
10 "testing"
11
12 ethCommon "github.com/ethereum/go-ethereum/common"
13 "github.com/hermeznetwork/hermez-node/common"
14 "github.com/iden3/go-iden3-crypto/babyjub"
15 "github.com/stretchr/testify/assert"
16 "github.com/stretchr/testify/require"
17)
18
19func printZKInputs(t *testing.T, zki *common.ZKInputs) {
20 s, err := json.Marshal(zki)
21 require.Nil(t, err)
22 h, err := zki.HashGlobalData()
23 require.Nil(t, err)
24
25 fmt.Println("\nCopy&Paste into js circom test:\n let zkInput = JSON.parse(`" + string(s) + "`);")
26 // fmt.Println("\nZKInputs json:\n echo '" + string(s) + "' | jq")
27
28 fmt.Printf(`
29 const output={
30 hashGlobalInputs: "%s",
31 };
32 await circuit.assertOut(w, output);
33 `, h.String())
34 fmt.Println("")
35}
36
37func TestZKInputsHashTestVector0(t *testing.T) {
38 dir, err := ioutil.TempDir("", "tmpdb")
39 require.Nil(t, err)
40 defer assert.Nil(t, os.RemoveAll(dir))
41
42 sdb, err := NewStateDB(dir, TypeBatchBuilder, 32)
43 assert.Nil(t, err)
44
45 // same values than in the js test
46 bjj0, err := common.BJJFromStringWithChecksum("21b0a1688b37f77b1d1d5539ec3b826db5ac78b2513f574a04c50a7d4f8246d7")
47 assert.Nil(t, err)
48 l1Txs := []common.L1Tx{
49 {
50 FromIdx: 0,
51 DepositAmount: big.NewInt(16000000),
52 Amount: big.NewInt(0),
53 TokenID: 1,
54 FromBJJ: bjj0,
55 FromEthAddr: ethCommon.HexToAddress("0x7e5f4552091a69125d5dfcb7b8c2659029395bdf"),
56 ToIdx: 0,
57 Type: common.TxTypeCreateAccountDeposit,
58 UserOrigin: true,
59 },
60 }
61 l2Txs := []common.PoolL2Tx{
62 {
63 FromIdx: 256,
64 ToIdx: 256,
65 TokenID: 1,
66 Amount: big.NewInt(1000),
67 Nonce: 0,
68 Fee: 126,
69 Type: common.TxTypeTransfer,
70 },
71 }
72
73 ptc := ProcessTxsConfig{
74 NLevels: 32,
75 MaxFeeTx: 8,
76 MaxTx: 32,
77 MaxL1Tx: 16,
78 }
79 // skip first batch to do the test with BatchNum=1
80 _, err = sdb.ProcessTxs(ptc, nil, nil, nil, nil)
81 require.Nil(t, err)
82
83 ptOut, err := sdb.ProcessTxs(ptc, nil, l1Txs, nil, l2Txs)
84 require.Nil(t, err)
85
86 // check expected account keys values from tx inputs
87 acc, err := sdb.GetAccount(common.Idx(256))
88 require.Nil(t, err)
89 assert.Equal(t, "d746824f7d0ac5044a573f51b278acb56d823bec39551d1d7bf7378b68a1b021", acc.PublicKey.Compress().String())
90 assert.Equal(t, "0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf", acc.EthAddr.Hex())
91
92 // check that there no exist more accounts
93 _, err = sdb.GetAccount(common.Idx(257))
94 require.NotNil(t, err)
95 ptOut.ZKInputs.FeeIdxs[0] = common.Idx(256).BigInt()
96
97 toHash, err := ptOut.ZKInputs.ToHashGlobalData()
98 assert.Nil(t, err)
99 // value from js test vector
100 expectedToHash := "0000000000ff000000000100000000000000000000000000000000000000000000000000000000000000000015ba488d749f6b891d29d0bf3a72481ec812e4d4ecef2bf7a3fc64f3c010444200000000000000000000000000000000000000000000000000000000000000007e5f4552091a69125d5dfcb7b8c2659029395bdf21b0a1688b37f77b1d1d5539ec3b826db5ac78b2513f574a04c50a7d4f8246d700000000000028a00000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000010003e87e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000001"
101 // checks are splitted to find the difference easier
102 assert.Equal(t, expectedToHash[:1000], hex.EncodeToString(toHash)[:1000])
103 assert.Equal(t, expectedToHash[1000:2000], hex.EncodeToString(toHash)[1000:2000])
104 assert.Equal(t, expectedToHash[2000:], hex.EncodeToString(toHash)[2000:])
105
106 h, err := ptOut.ZKInputs.HashGlobalData()
107 require.Nil(t, err)
108 // value from js test vector
109 assert.Equal(t, "4356692423721763303547321618014315464040324829724049399065961225345730555597", h.String())
110}
111
112func TestZKInputsHashTestVector1(t *testing.T) {
113 dir, err := ioutil.TempDir("", "tmpdb")
114 require.Nil(t, err)
115 defer assert.Nil(t, os.RemoveAll(dir))
116
117 sdb, err := NewStateDB(dir, TypeBatchBuilder, 32)
118 assert.Nil(t, err)
119
120 // same values than in the js test
121 bjj0, err := common.BJJFromStringWithChecksum("21b0a1688b37f77b1d1d5539ec3b826db5ac78b2513f574a04c50a7d4f8246d7")
122 assert.Nil(t, err)
123 bjj1, err := common.BJJFromStringWithChecksum("093985b1993d9f743f9d7d943ed56f38601cb8b196db025f79650c4007c3054d")
124 assert.Nil(t, err)
125 l1Txs := []common.L1Tx{
126 {
127 FromIdx: 0,
128 DepositAmount: big.NewInt(16000000),
129 Amount: big.NewInt(0),
130 TokenID: 1,
131 FromBJJ: bjj0,
132 FromEthAddr: ethCommon.HexToAddress("0x7e5f4552091a69125d5dfcb7b8c2659029395bdf"),
133 ToIdx: 0,
134 Type: common.TxTypeCreateAccountDeposit,
135 UserOrigin: true,
136 },
137 {
138 FromIdx: 0,
139 DepositAmount: big.NewInt(16000000),
140 Amount: big.NewInt(0),
141 TokenID: 1,
142 FromBJJ: bjj1,
143 FromEthAddr: ethCommon.HexToAddress("0x2b5ad5c4795c026514f8317c7a215e218dccd6cf"),
144 ToIdx: 0,
145 Type: common.TxTypeCreateAccountDeposit,
146 UserOrigin: true,
147 },
148 }
149 l2Txs := []common.PoolL2Tx{
150 {
151 FromIdx: 257,
152 ToIdx: 256,
153 TokenID: 1,
154 Amount: big.NewInt(1000),
155 Nonce: 0,
156 Fee: 137,
157 Type: common.TxTypeTransfer,
158 },
159 }
160
161 ptc := ProcessTxsConfig{
162 NLevels: 32,
163 MaxFeeTx: 8,
164 MaxTx: 32,
165 MaxL1Tx: 16,
166 }
167 // skip first batch to do the test with BatchNum=1
168 _, err = sdb.ProcessTxs(ptc, nil, nil, nil, nil)
169 require.Nil(t, err)
170
171 ptOut, err := sdb.ProcessTxs(ptc, nil, l1Txs, nil, l2Txs)
172 require.Nil(t, err)
173
174 // check expected account keys values from tx inputs
175 acc, err := sdb.GetAccount(common.Idx(256))
176 require.Nil(t, err)
177 assert.Equal(t, "d746824f7d0ac5044a573f51b278acb56d823bec39551d1d7bf7378b68a1b021", acc.PublicKey.Compress().String())
178 assert.Equal(t, "0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf", acc.EthAddr.Hex())
179 acc, err = sdb.GetAccount(common.Idx(257))
180 require.Nil(t, err)
181 assert.Equal(t, "4d05c307400c65795f02db96b1b81c60386fd53e947d9d3f749f3d99b1853909", acc.PublicKey.Compress().String())
182 assert.Equal(t, "0x2B5AD5c4795c026514f8317c7a215E218DcCD6cF", acc.EthAddr.Hex())
183
184 // check that there no exist more accounts
185 _, err = sdb.GetAccount(common.Idx(258))
186 require.NotNil(t, err)
187 ptOut.ZKInputs.FeeIdxs[0] = common.Idx(257).BigInt()
188
189 toHash, err := ptOut.ZKInputs.ToHashGlobalData()
190 assert.Nil(t, err)
191 // value from js test vector
192 expectedToHash := "0000000000ff0000000001010000000000000000000000000000000000000000000000000000000000000000304a3f3aef4f416cca887aab7265227449077627138345c2eb25bf8ff946b09500000000000000000000000000000000000000000000000000000000000000007e5f4552091a69125d5dfcb7b8c2659029395bdf21b0a1688b37f77b1d1d5539ec3b826db5ac78b2513f574a04c50a7d4f8246d700000000000028a00000000000010000000000002b5ad5c4795c026514f8317c7a215e218dccd6cf093985b1993d9f743f9d7d943ed56f38601cb8b196db025f79650c4007c3054d00000000000028a000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001010000010003e889000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010100000000000000000000000000000000000000000000000000000000000000000001"
193 // checks are splitted to find the difference easier
194 assert.Equal(t, expectedToHash[:1000], hex.EncodeToString(toHash)[:1000])
195 assert.Equal(t, expectedToHash[1000:2000], hex.EncodeToString(toHash)[1000:2000])
196 assert.Equal(t, expectedToHash[2000:], hex.EncodeToString(toHash)[2000:])
197
198 h, err := ptOut.ZKInputs.HashGlobalData()
199 require.Nil(t, err)
200 // value from js test vector
201 assert.Equal(t, "20293112365009290386650039345314592436395562810005523677125576447132206192598", h.String())
202}
203
204// TestZKInputs0:
205// - 1 L1Tx
206// - 1 L2Tx without fees
207// no Coordinator Idxs defined to receive the fees
208func TestZKInputs0(t *testing.T) {
209 dir, err := ioutil.TempDir("", "tmpdb")
210 require.Nil(t, err)
211 defer assert.Nil(t, os.RemoveAll(dir))
212
213 nLevels := 16
214
215 sdb, err := NewStateDB(dir, TypeBatchBuilder, nLevels)
216 assert.Nil(t, err)
217
218 // same values than in the js test
219 // skJsHex is equivalent to the 0000...0001 js private key in commonjs
220 skJsHex := "7eb258e61862aae75c6c1d1f7efae5006ffc9e4d5596a6ff95f3df4ea209ea7f"
221 skJs, err := hex.DecodeString(skJsHex)
222 require.Nil(t, err)
223 var sk0 babyjub.PrivateKey
224 copy(sk0[:], skJs)
225 bjj0 := sk0.Public()
226 assert.Equal(t, "d746824f7d0ac5044a573f51b278acb56d823bec39551d1d7bf7378b68a1b021", bjj0.String())
227
228 l1Txs := []common.L1Tx{
229 {
230 FromIdx: 0,
231 DepositAmount: big.NewInt(16000000),
232 Amount: big.NewInt(0),
233 TokenID: 1,
234 FromBJJ: bjj0,
235 FromEthAddr: ethCommon.HexToAddress("0x7e5f4552091a69125d5dfcb7b8c2659029395bdf"),
236 ToIdx: 0,
237 Type: common.TxTypeCreateAccountDeposit,
238 UserOrigin: true,
239 },
240 }
241 l2Txs := []common.PoolL2Tx{
242 {
243 FromIdx: 256,
244 ToIdx: 256,
245 TokenID: 1,
246 Amount: big.NewInt(1000),
247 Nonce: 0,
248 Fee: 0,
249 Type: common.TxTypeTransfer,
250 },
251 }
252
253 toSign, err := l2Txs[0].HashToSign()
254 require.Nil(t, err)
255 sig := sk0.SignPoseidon(toSign)
256 l2Txs[0].Signature = sig.Compress()
257
258 ptc := ProcessTxsConfig{
259 NLevels: uint32(nLevels),
260 MaxTx: 3,
261 MaxL1Tx: 2,
262 MaxFeeTx: 2,
263 }
264 // skip first batch to do the test with BatchNum=1
265 _, err = sdb.ProcessTxs(ptc, nil, nil, nil, nil)
266 require.Nil(t, err)
267
268 ptOut, err := sdb.ProcessTxs(ptc, nil, l1Txs, nil, l2Txs)
269 require.Nil(t, err)
270
271 // check expected account keys values from tx inputs
272 acc, err := sdb.GetAccount(common.Idx(256))
273 require.Nil(t, err)
274 assert.Equal(t, "d746824f7d0ac5044a573f51b278acb56d823bec39551d1d7bf7378b68a1b021", acc.PublicKey.Compress().String())
275 assert.Equal(t, "0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf", acc.EthAddr.Hex())
276
277 // check that there no exist more accounts
278 _, err = sdb.GetAccount(common.Idx(257))
279 require.NotNil(t, err)
280
281 debug := false
282 // debug = true
283 if debug {
284 printZKInputs(t, ptOut.ZKInputs)
285 }
286 toHash, err := ptOut.ZKInputs.ToHashGlobalData()
287 require.Nil(t, err)
288 assert.Equal(t, "0000000000ff0000000001000000000000000000000000000000000000000000000000000000000000000000071a61ed5a1ac052b0d1086a330c540b55318a07f6b7989573b9bbbb5380d1a900000000000000000000000000000000000000000000000000000000000000007e5f4552091a69125d5dfcb7b8c2659029395bdf21b0a1688b37f77b1d1d5539ec3b826db5ac78b2513f574a04c50a7d4f8246d700000000000028a0000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100010003e8000000000000000000000000000000000001", hex.EncodeToString(toHash))
289
290 h, err := ptOut.ZKInputs.HashGlobalData()
291 require.Nil(t, err)
292 assert.Equal(t, "10273997725311869157325593477103834352520120955255334791164183491223442653056", h.String())
293
294 s, err := json.Marshal(ptOut.ZKInputs)
295 require.Nil(t, err)
296
297 // the 'expected' data has been checked with the circom circuits
298 expected := `{"auxFromIdx":["256","0","0"],"auxToIdx":["0","0","0"],"ay1":["15238403086306505038849621710779816852318505119327426213168494964113886299863","15238403086306505038849621710779816852318505119327426213168494964113886299863","0"],"ay2":["0","15238403086306505038849621710779816852318505119327426213168494964113886299863","0"],"ay3":["0","0"],"balance1":["16000000","16000000","0"],"balance2":["0","15999000","0"],"balance3":["0","0"],"currentNumBatch":"1","ethAddr1":["721457446580647751014191829380889690493307935711","721457446580647751014191829380889690493307935711","0"],"ethAddr2":["0","721457446580647751014191829380889690493307935711","0"],"ethAddr3":["0","0"],"feeIdxs":["0","0"],"feePlanTokens":["0","0"],"fromBjjCompressed":[["1","1","1","0","1","0","1","1","0","1","1","0","0","0","1","0","0","1","0","0","0","0","0","1","1","1","1","1","0","0","1","0","1","0","1","1","1","1","1","0","0","1","0","1","0","0","0","0","1","0","1","0","0","0","1","1","0","0","1","0","0","0","0","0","0","1","0","1","0","0","1","0","1","1","1","0","1","0","1","0","1","1","1","1","1","1","0","0","1","0","0","0","1","0","1","0","0","1","0","0","1","1","0","1","0","0","0","1","1","1","1","0","0","0","1","1","0","1","0","1","1","0","1","0","1","1","0","1","1","0","1","1","0","1","1","0","0","1","0","0","0","0","0","1","1","1","0","1","1","1","0","0","0","0","1","1","0","1","1","1","1","0","0","1","1","1","0","0","1","0","1","0","1","0","1","0","1","0","1","1","1","0","0","0","1","0","1","1","1","0","0","0","1","1","0","1","1","1","1","0","1","1","1","0","1","1","1","1","1","1","1","0","1","1","0","0","1","1","0","1","0","0","0","1","0","0","0","1","0","1","1","0","1","0","0","0","0","1","0","1","0","0","0","0","1","1","0","1","1","0","0","0","0","1","0","0"],["0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0"],["0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0"]],"fromEthAddr":["721457446580647751014191829380889690493307935711","0","0"],"fromIdx":["0","256","0"],"globalChainID":"0","imAccFeeOut":[["0","0"],["0","0"]],"imExitRoot":["0","0"],"imFinalAccFee":["0","0"],"imInitStateRootFee":"3212803832159212591526550848126062808026208063555125878245901046146545013161","imOnChain":["1","0"],"imOutIdx":["256","256"],"imStateRoot":["2999178063326948609414231200730958862089790119006655219527433501846141543551","3212803832159212591526550848126062808026208063555125878245901046146545013161"],"imStateRootFee":["3212803832159212591526550848126062808026208063555125878245901046146545013161"],"isOld0_1":["1","0","0"],"isOld0_2":["0","0","0"],"loadAmountF":["10400","0","0"],"maxNumBatch":["0","0","0"],"newAccount":["1","0","0"],"newExit":["0","0","0"],"nonce1":["0","0","0"],"nonce2":["0","1","0"],"nonce3":["0","0"],"oldKey1":["0","0","0"],"oldKey2":["0","0","0"],"oldLastIdx":"255","oldStateRoot":"0","oldValue1":["0","0","0"],"oldValue2":["0","0","0"],"onChain":["1","0","0"],"r8x":["0","13339118088097183560380359255316479838355724395928453439485234854234470298884","0"],"r8y":["0","12062876403986777372637801733000285846673058725183957648593976028822138986587","0"],"rqOffset":["0","0","0"],"rqToBjjAy":["0","0","0"],"rqToEthAddr":["0","0","0"],"rqTxCompressedDataV2":["0","0","0"],"s":["0","1429292460142966038093363510339656828866419125109324886747095533117015974779","0"],"siblings1":[["0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0"],["0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0"],["0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0"]],"siblings2":[["0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0"],["0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0"],["0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0"]],"siblings3":[["0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0"],["0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0"]],"sign1":["0","0","0"],"sign2":["0","0","0"],"sign3":["0","0"],"toBjjAy":["0","0","0"],"toEthAddr":["0","0","0"],"toIdx":["0","256","0"],"tokenID1":["1","1","0"],"tokenID2":["0","1","0"],"tokenID3":["0","0"],"txCompressedData":["1461501637330902918203684832716283019659255211535","1483802382529433561627630154640673862706524841487","3322668559"],"txCompressedDataV2":["0","5271525021049092038181634317484288","0"]}`
299 assert.Equal(t, expected, string(s))
300}
301
302// TestZKInputs1:
303// - 2 L1Tx of CreateAccountDeposit
304// - 1 L2Tx with fees
305func TestZKInputs1(t *testing.T) {
306 dir, err := ioutil.TempDir("", "tmpdb")
307 require.Nil(t, err)
308 defer assert.Nil(t, os.RemoveAll(dir))
309
310 nLevels := 16
311
312 sdb, err := NewStateDB(dir, TypeBatchBuilder, nLevels)
313 assert.Nil(t, err)
314
315 // same values than in the js test
316 // skJsHex is equivalent to the 0000...0001 js private key in commonjs
317 sk0JsHex := "7eb258e61862aae75c6c1d1f7efae5006ffc9e4d5596a6ff95f3df4ea209ea7f"
318 sk0Js, err := hex.DecodeString(sk0JsHex)
319 require.Nil(t, err)
320 var sk0 babyjub.PrivateKey
321 copy(sk0[:], sk0Js)
322 bjj0 := sk0.Public()
323 assert.Equal(t, "d746824f7d0ac5044a573f51b278acb56d823bec39551d1d7bf7378b68a1b021", bjj0.String())
324
325 sk1JsHex := "c005700f76f4b4cec710805c21595688648524df0a9d467afae537b7a7118819"
326 sk1Js, err := hex.DecodeString(sk1JsHex)
327 require.Nil(t, err)
328 var sk1 babyjub.PrivateKey
329 copy(sk1[:], sk1Js)
330 bjj1 := sk1.Public()
331 assert.Equal(t, "4d05c307400c65795f02db96b1b81c60386fd53e947d9d3f749f3d99b1853909", bjj1.String())
332
333 l1Txs := []common.L1Tx{
334 {
335 FromIdx: 0,
336 DepositAmount: big.NewInt(16000000),
337 Amount: big.NewInt(0),
338 TokenID: 1,
339 FromBJJ: bjj0,
340 FromEthAddr: ethCommon.HexToAddress("0x7e5f4552091a69125d5dfcb7b8c2659029395bdf"),
341 ToIdx: 0,
342 Type: common.TxTypeCreateAccountDeposit,
343 UserOrigin: true,
344 },
345 {
346 FromIdx: 0,
347 DepositAmount: big.NewInt(16000000),
348 Amount: big.NewInt(0),
349 TokenID: 1,
350 FromBJJ: bjj1,
351 FromEthAddr: ethCommon.HexToAddress("0x2b5ad5c4795c026514f8317c7a215e218dccd6cf"),
352 ToIdx: 0,
353 Type: common.TxTypeCreateAccountDeposit,
354 UserOrigin: true,
355 },
356 }
357 l2Txs := []common.PoolL2Tx{
358 {
359 FromIdx: 256,
360 ToIdx: 256,
361 TokenID: 1,
362 Amount: big.NewInt(1000),
363 Nonce: 0,
364 Fee: 126,
365 Type: common.TxTypeTransfer,
366 },
367 }
368
369 toSign, err := l2Txs[0].HashToSign()
370 require.Nil(t, err)
371 sig := sk0.SignPoseidon(toSign)
372 l2Txs[0].Signature = sig.Compress()
373
374 ptc := ProcessTxsConfig{
375 NLevels: uint32(nLevels),
376 MaxTx: 3,
377 MaxL1Tx: 2,
378 MaxFeeTx: 2,
379 }
380 // skip first batch to do the test with BatchNum=1
381 _, err = sdb.ProcessTxs(ptc, nil, nil, nil, nil)
382 require.Nil(t, err)
383
384 coordIdxs := []common.Idx{257}
385 ptOut, err := sdb.ProcessTxs(ptc, coordIdxs, l1Txs, nil, l2Txs)
386 require.Nil(t, err)
387
388 // check expected account keys values from tx inputs
389 acc, err := sdb.GetAccount(common.Idx(256))
390 require.Nil(t, err)
391 assert.Equal(t, "d746824f7d0ac5044a573f51b278acb56d823bec39551d1d7bf7378b68a1b021", acc.PublicKey.Compress().String())
392 assert.Equal(t, "0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf", acc.EthAddr.Hex())
393 assert.Equal(t, "15999899", acc.Balance.String())
394 acc, err = sdb.GetAccount(common.Idx(257))
395 require.Nil(t, err)
396 assert.Equal(t, "4d05c307400c65795f02db96b1b81c60386fd53e947d9d3f749f3d99b1853909", acc.PublicKey.Compress().String())
397 assert.Equal(t, "0x2B5AD5c4795c026514f8317c7a215E218DcCD6cF", acc.EthAddr.Hex())
398 assert.Equal(t, "16000101", acc.Balance.String())
399
400 // check that there no exist more accounts
401 _, err = sdb.GetAccount(common.Idx(258))
402 require.NotNil(t, err)
403
404 debug := false
405 // debug = true
406 if debug {
407 printZKInputs(t, ptOut.ZKInputs)
408 }
409
410 toHash, err := ptOut.ZKInputs.ToHashGlobalData()
411 require.Nil(t, err)
412 assert.Equal(t, "0000000000ff0000000001010000000000000000000000000000000000000000000000000000000000000000036d607b790b93bb1768d5390803b5a4a1f77e46755f57900930b14454faf95c00000000000000000000000000000000000000000000000000000000000000007e5f4552091a69125d5dfcb7b8c2659029395bdf21b0a1688b37f77b1d1d5539ec3b826db5ac78b2513f574a04c50a7d4f8246d700000000000028a00000000000010000000000002b5ad5c4795c026514f8317c7a215e218dccd6cf093985b1993d9f743f9d7d943ed56f38601cb8b196db025f79650c4007c3054d00000000000028a000000000000100000000000000000000000000000000000000000100010003e87e01010000000000000001", hex.EncodeToString(toHash))
413
414 h, err := ptOut.ZKInputs.HashGlobalData()
415 require.Nil(t, err)
416 assert.Equal(t, "11039366437749764484706691779656824178800407917434257418748834397596260744468", h.String())
417
418 s, err := json.Marshal(ptOut.ZKInputs)
419 require.Nil(t, err)
420
421 // the 'expected' data has been checked with the circom circuits
422 expected := `{"auxFromIdx":["256","257","0"],"auxToIdx":["0","0","0"],"ay1":["15238403086306505038849621710779816852318505119327426213168494964113886299863","4172448640254579435434214421479401747968866348490029667576411173067925161293","15238403086306505038849621710779816852318505119327426213168494964113886299863"],"ay2":["0","0","15238403086306505038849621710779816852318505119327426213168494964113886299863"],"ay3":["4172448640254579435434214421479401747968866348490029667576411173067925161293","0"],"balance1":["16000000","16000000","16000000"],"balance2":["0","0","15998899"],"balance3":["16000000","0"],"currentNumBatch":"1","ethAddr1":["721457446580647751014191829380889690493307935711","247512291986854564435551364600938690683113101007","721457446580647751014191829380889690493307935711"],"ethAddr2":["0","0","721457446580647751014191829380889690493307935711"],"ethAddr3":["247512291986854564435551364600938690683113101007","0"],"feeIdxs":["257","0"],"feePlanTokens":["1","0"],"fromBjjCompressed":[["1","1","1","0","1","0","1","1","0","1","1","0","0","0","1","0","0","1","0","0","0","0","0","1","1","1","1","1","0","0","1","0","1","0","1","1","1","1","1","0","0","1","0","1","0","0","0","0","1","0","1","0","0","0","1","1","0","0","1","0","0","0","0","0","0","1","0","1","0","0","1","0","1","1","1","0","1","0","1","0","1","1","1","1","1","1","0","0","1","0","0","0","1","0","1","0","0","1","0","0","1","1","0","1","0","0","0","1","1","1","1","0","0","0","1","1","0","1","0","1","1","0","1","0","1","1","0","1","1","0","1","1","0","1","1","0","0","1","0","0","0","0","0","1","1","1","0","1","1","1","0","0","0","0","1","1","0","1","1","1","1","0","0","1","1","1","0","0","1","0","1","0","1","0","1","0","1","0","1","1","1","0","0","0","1","0","1","1","1","0","0","0","1","1","0","1","1","1","1","0","1","1","1","0","1","1","1","1","1","1","1","0","1","1","0","0","1","1","0","1","0","0","0","1","0","0","0","1","0","1","1","0","1","0","0","0","0","1","0","1","0","0","0","0","1","1","0","1","1","0","0","0","0","1","0","0"],["1","0","1","1","0","0","1","0","1","0","1","0","0","0","0","0","1","1","0","0","0","0","1","1","1","1","1","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","1","1","0","0","0","0","1","0","1","0","0","1","1","0","1","0","0","1","1","1","1","0","1","1","1","1","1","0","1","0","0","1","0","0","0","0","0","0","1","1","0","1","1","0","1","1","0","1","1","0","1","0","0","1","1","0","0","0","1","1","0","1","0","0","0","1","1","1","0","1","0","0","1","1","1","0","0","0","0","0","0","0","0","1","1","0","0","0","0","1","1","1","0","0","1","1","1","1","0","1","1","0","1","0","1","0","1","0","1","1","0","1","1","1","1","1","0","0","0","0","1","0","1","0","0","1","1","0","1","1","1","1","1","0","1","0","1","1","1","0","0","1","1","1","1","1","1","1","0","0","0","0","1","0","1","1","1","0","1","1","1","1","1","0","0","1","1","0","1","1","1","1","0","0","1","0","0","1","1","0","0","1","1","0","0","0","1","1","0","1","1","0","1","0","0","0","0","1","1","0","0","1","1","1","0","0","1","0","0","1","0","0","0","0"],["0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0"]],"fromEthAddr":["721457446580647751014191829380889690493307935711","247512291986854564435551364600938690683113101007","0"],"fromIdx":["0","0","256"],"globalChainID":"0","imAccFeeOut":[["0","0"],["0","0"]],"imExitRoot":["0","0"],"imFinalAccFee":["101","0"],"imInitStateRootFee":"10660728613879129016661596154319504485937170756181586060561759832613498905432","imOnChain":["1","1"],"imOutIdx":["256","257"],"imStateRoot":["2999178063326948609414231200730958862089790119006655219527433501846141543551","13160175861809095962915811919507877524206523306071085047160493107056995190544"],"imStateRootFee":["1550190772280924834409423240867892593473592863918771212295716656664630983004"],"isOld0_1":["1","0","0"],"isOld0_2":["0","0","0"],"loadAmountF":["10400","10400","0"],"maxNumBatch":["0","0","0"],"newAccount":["1","1","0"],"newExit":["0","0","0"],"nonce1":["0","0","0"],"nonce2":["0","0","1"],"nonce3":["0","0"],"oldKey1":["0","256","0"],"oldKey2":["0","0","0"],"oldLastIdx":"255","oldStateRoot":"0","oldValue1":["0","9733782510199048326382833205201407219982604211594942097825192094127807440165","0"],"oldValue2":["0","0","0"],"onChain":["1","1","0"],"r8x":["0","0","16795818329006817411605347777151783287113601795569690834743955502344582990059"],"r8y":["0","0","21153110871938011270027204820675751452345817312713349225139208384264949654114"],"rqOffset":["0","0","0"],"rqToBjjAy":["0","0","0"],"rqToEthAddr":["0","0","0"],"rqTxCompressedDataV2":["0","0","0"],"s":["0","0","1550352334297856444344240780544275542131334387040150478134835458055364079268"],"siblings1":[["0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0"],["0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0"],["6975841694765113541634698345295957238501610055097872059913911260522365532165","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0"]],"siblings2":[["0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0"],["0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0"],["6975841694765113541634698345295957238501610055097872059913911260522365532165","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0"]],"siblings3":[["9827704113668630072730115158977131501210702363656902211840117643154933433410","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0"],["0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0"]],"sign1":["0","0","0"],"sign2":["0","0","0"],"sign3":["0","0"],"toBjjAy":["0","0","0"],"toEthAddr":["0","0","0"],"toIdx":["0","0","256"],"tokenID1":["1","1","1"],"tokenID2":["0","0","1"],"tokenID3":["1","0"],"txCompressedData":["1461501637330902918203684832716283019659255211535","1461501637330902918203684832716283019659255211535","869620039695611037216780722449287736442401358123623346624340758723552783"],"txCompressedDataV2":["0","0","3089511010385631938450432878260044363267416251956459471104"]}`
423 assert.Equal(t, expected, string(s))
424}