arnaucube
arnaucube/hermez-nodePublic Self-hosted repository
hermez-node/db/statedb/txprocessors_test.go
db/statedb/txprocessors_test.goRaw
  1package statedb
  2
  3import (
  4	"io/ioutil"
  5	"os"
  6	"testing"
  7
  8	"github.com/hermeznetwork/hermez-node/common"
  9	"github.com/hermeznetwork/hermez-node/eth"
 10	"github.com/hermeznetwork/hermez-node/log"
 11	"github.com/hermeznetwork/hermez-node/test/til"
 12	"github.com/stretchr/testify/assert"
 13	"github.com/stretchr/testify/require"
 14)
 15
 16// TODO: Test CollectedFees output
 17
 18func TestProcessTxsSynchronizer(t *testing.T) {
 19	// TODO once TTGL is updated, use the blockchain L2Tx (not PoolL2Tx) for
 20	// the Synchronizer tests
 21
 22	dir, err := ioutil.TempDir("", "tmpdb")
 23	require.Nil(t, err)
 24	defer assert.Nil(t, os.RemoveAll(dir))
 25
 26	sdb, err := NewStateDB(dir, TypeSynchronizer, 32)
 27	assert.Nil(t, err)
 28
 29	// generate test transactions from test.SetTest0 code
 30	tc := til.NewContext(eth.RollupConstMaxL1UserTx)
 31	blocks, err := tc.GenerateBlocks(til.SetBlockchain0)
 32	require.Nil(t, err)
 33
 34	assert.Equal(t, 31, len(blocks[0].L1UserTxs))
 35	assert.Equal(t, 4, len(blocks[0].Batches[0].L1CoordinatorTxs))
 36	assert.Equal(t, 0, len(blocks[0].Batches[1].L1CoordinatorTxs))
 37	assert.Equal(t, 22, len(blocks[0].Batches[2].L2Txs))
 38	assert.Equal(t, 1, len(blocks[1].Batches[0].L1CoordinatorTxs))
 39	assert.Equal(t, 59, len(blocks[1].Batches[0].L2Txs))
 40	assert.Equal(t, 1, len(blocks[1].Batches[1].L1CoordinatorTxs))
 41	assert.Equal(t, 8, len(blocks[1].Batches[1].L2Txs))
 42
 43	// Coordinator Idx where to send the fees
 44	coordIdxs := []common.Idx{256, 257, 258, 259}
 45
 46	// Idx of user 'A'
 47	idxA1 := tc.Users["A"].Accounts[common.TokenID(1)].Idx
 48
 49	// Process the 1st batch, which contains the L1CoordinatorTxs necessary
 50	// to create the Coordinator accounts to receive the fees
 51	log.Debug("1st batch, 1st block, only L1CoordinatorTxs")
 52	ptOut, err := sdb.ProcessTxs(nil, nil, blocks[0].Batches[0].L1CoordinatorTxs, nil)
 53	require.Nil(t, err)
 54	assert.Equal(t, 4, len(ptOut.CreatedAccounts))
 55
 56	log.Debug("2nd batch, 1st block")
 57	l2Txs := common.L2TxsToPoolL2Txs(blocks[0].Batches[1].L2Txs)
 58	ptOut, err = sdb.ProcessTxs(coordIdxs, blocks[0].L1UserTxs, blocks[0].Batches[1].L1CoordinatorTxs, l2Txs)
 59	require.Nil(t, err)
 60	assert.Equal(t, 0, len(ptOut.ExitInfos))
 61	assert.Equal(t, 31, len(ptOut.CreatedAccounts))
 62	acc, err := sdb.GetAccount(idxA1)
 63	require.Nil(t, err)
 64	assert.Equal(t, "50", acc.Balance.String())
 65
 66	log.Debug("3rd batch, 1st block")
 67	l2Txs = common.L2TxsToPoolL2Txs(blocks[0].Batches[2].L2Txs)
 68	ptOut, err = sdb.ProcessTxs(coordIdxs, nil, blocks[0].Batches[2].L1CoordinatorTxs, l2Txs)
 69	require.Nil(t, err)
 70	// TODO once TTGL is updated, add a check that a input poolL2Tx with
 71	// Nonce & TokenID =0, after ProcessTxs call has the expected value
 72
 73	assert.Equal(t, 0, len(ptOut.ExitInfos))
 74	assert.Equal(t, 0, len(ptOut.CreatedAccounts))
 75	acc, err = sdb.GetAccount(idxA1)
 76	require.Nil(t, err)
 77	assert.Equal(t, "28", acc.Balance.String())
 78
 79	log.Debug("1st batch, 2nd block")
 80	l2Txs = common.L2TxsToPoolL2Txs(blocks[1].Batches[0].L2Txs)
 81	ptOut, err = sdb.ProcessTxs(coordIdxs, nil, blocks[1].Batches[0].L1CoordinatorTxs, l2Txs)
 82	require.Nil(t, err)
 83	assert.Equal(t, 4, len(ptOut.ExitInfos)) // the 'ForceExit(1)' is not computed yet, as the batch is without L1UserTxs
 84	assert.Equal(t, 1, len(ptOut.CreatedAccounts))
 85	acc, err = sdb.GetAccount(idxA1)
 86	require.Nil(t, err)
 87	assert.Equal(t, "53", acc.Balance.String())
 88
 89	log.Debug("2nd batch, 2nd block")
 90	l2Txs = common.L2TxsToPoolL2Txs(blocks[1].Batches[1].L2Txs)
 91	ptOut, err = sdb.ProcessTxs(coordIdxs, blocks[1].L1UserTxs, blocks[1].Batches[1].L1CoordinatorTxs, l2Txs)
 92	require.Nil(t, err)
 93
 94	assert.Equal(t, 2, len(ptOut.ExitInfos)) // 2, as previous batch was without L1UserTxs, and has pending the 'ForceExit(1) A: 5'
 95	assert.Equal(t, 1, len(ptOut.CreatedAccounts))
 96	acc, err = sdb.GetAccount(idxA1)
 97	assert.Nil(t, err)
 98	assert.Equal(t, "78", acc.Balance.String())
 99
100	idxB0 := tc.Users["C"].Accounts[common.TokenID(0)].Idx
101	acc, err = sdb.GetAccount(idxB0)
102	require.Nil(t, err)
103	assert.Equal(t, "51", acc.Balance.String())
104
105	// get balance of Coordinator account for TokenID==0
106	acc, err = sdb.GetAccount(common.Idx(256))
107	require.Nil(t, err)
108	assert.Equal(t, "2", acc.Balance.String())
109}
110
111/*
112WIP
113
114func TestProcessTxsBatchBuilder(t *testing.T) {
115	dir, err := ioutil.TempDir("", "tmpdb")
116	require.Nil(t, err)
117	defer assert.Nil(t, os.RemoveAll(dir))
118
119	sdb, err := NewStateDB(dir, TypeBatchBuilder, 32)
120	assert.Nil(t, err)
121
122	// generate test transactions from test.SetTest0 code
123	tc := til.NewContext()
124	blocks := tc.GenerateBlocks(til.SetBlockchain0)
125
126	assert.Equal(t, 29, len(blocks[0].Batches[0].L1UserTxs))
127	assert.Equal(t, 0, len(blocks[0].Batches[0].L1CoordinatorTxs))
128	assert.Equal(t, 21, len(blocks[0].Batches[0].L2Txs))
129	assert.Equal(t, 1, len(blocks[0].Batches[1].L1UserTxs))
130	assert.Equal(t, 1, len(blocks[0].Batches[1].L1CoordinatorTxs))
131	assert.Equal(t, 59, len(blocks[0].Batches[1].L2Txs))
132	assert.Equal(t, 9, len(blocks[0].Batches[2].L1UserTxs))
133	assert.Equal(t, 0, len(blocks[0].Batches[2].L1CoordinatorTxs))
134	assert.Equal(t, 8, len(blocks[0].Batches[2].L2Txs))
135
136	// Idx of user 'A'
137	idxA1 := tc.Users["A"].Accounts[common.TokenID(1)].Idx
138
139	// use first batch
140	l2Txs := common.L2TxsToPoolL2Txs(blocks[0].Batches[0].L2Txs)
141	_, exitInfos, err := sdb.ProcessTxs(coordIdxs, blocks[0].Batches[0].L1UserTxs, blocks[0].Batches[0].L1CoordinatorTxs, l2Txs)
142	require.Nil(t, err)
143	assert.Equal(t, 0, len(exitInfos))
144	acc, err := sdb.GetAccount(idxA1)
145	assert.Nil(t, err)
146	assert.Equal(t, "28", acc.Balance.String())
147
148	// use second batch
149	l2Txs = common.L2TxsToPoolL2Txs(blocks[0].Batches[1].L2Txs)
150	_, exitInfos, err = sdb.ProcessTxs(coordIdxs, blocks[0].Batches[1].L1UserTxs, blocks[0].Batches[1].L1CoordinatorTxs, l2Txs)
151	require.Nil(t, err)
152	assert.Equal(t, 5, len(exitInfos))
153	acc, err = sdb.GetAccount(idxA1)
154	require.Nil(t, err)
155	assert.Equal(t, "48", acc.Balance.String())
156
157	// use third batch
158	l2Txs = common.L2TxsToPoolL2Txs(blocks[0].Batches[2].L2Txs)
159	_, exitInfos, err = sdb.ProcessTxs(coordIdxs, blocks[0].Batches[2].L1UserTxs, blocks[0].Batches[2].L1CoordinatorTxs, l2Txs)
160	require.Nil(t, err)
161	assert.Equal(t, 1, len(exitInfos))
162	acc, err = sdb.GetAccount(idxA1)
163	assert.Nil(t, err)
164	assert.Equal(t, "23", acc.Balance.String())
165}
166
167func TestZKInputsGeneration(t *testing.T) {
168	dir, err := ioutil.TempDir("", "tmpdb")
169	require.Nil(t, err)
170	defer assert.Nil(t, os.RemoveAll(dir))
171
172	sdb, err := NewStateDB(dir, TypeBatchBuilder, 32)
173	assert.Nil(t, err)
174
175	// generate test transactions from test.SetTest0 code
176	tc := til.NewContext()
177	blocks := tc.GenerateBlocks(til.SetBlockchain0)
178	assert.Equal(t, 29, len(blocks[0].Batches[0].L1UserTxs))
179	assert.Equal(t, 0, len(blocks[0].Batches[0].L1CoordinatorTxs))
180	assert.Equal(t, 21, len(blocks[0].Batches[0].L2Txs))
181
182	l2Txs := common.L2TxsToPoolL2Txs(blocks[0].Batches[0].L2Txs)
183	zki, _, err := sdb.ProcessTxs(coordIdxs, blocks[0].Batches[0].L1UserTxs, blocks[0].Batches[0].L1CoordinatorTxs, l2Txs)
184	require.Nil(t, err)
185
186	s, err := json.Marshal(zki)
187	require.Nil(t, err)
188	debug:=true
189	if debug {
190		fmt.Println(string(s))
191	}
192}
193*/