arnaucube
arnaucube/hermez-nodePublic Self-hosted repository
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}