arnaucube
arnaucube/hermez-nodePublic Self-hosted repository
hermez-node/db/statedb/txprocessors_test.go
db/statedb/txprocessors_test.goRaw
  1package statedb
  2
  3import (
  4	"encoding/json"
  5	"fmt"
  6	"io/ioutil"
  7	"os"
  8	"testing"
  9
 10	"github.com/hermeznetwork/hermez-node/common"
 11	"github.com/hermeznetwork/hermez-node/eth"
 12	"github.com/hermeznetwork/hermez-node/log"
 13	"github.com/hermeznetwork/hermez-node/test/til"
 14	"github.com/stretchr/testify/assert"
 15	"github.com/stretchr/testify/require"
 16)
 17
 18func TestProcessTxsSynchronizer(t *testing.T) {
 19	dir, err := ioutil.TempDir("", "tmpdb")
 20	require.Nil(t, err)
 21	defer assert.Nil(t, os.RemoveAll(dir))
 22
 23	sdb, err := NewStateDB(dir, TypeSynchronizer, 32)
 24	assert.Nil(t, err)
 25
 26	// generate test transactions from test.SetBlockchain0 code
 27	tc := til.NewContext(eth.RollupConstMaxL1UserTx)
 28	blocks, err := tc.GenerateBlocks(til.SetBlockchain0)
 29	require.Nil(t, err)
 30
 31	assert.Equal(t, 31, len(blocks[0].L1UserTxs))
 32	assert.Equal(t, 4, len(blocks[0].Batches[0].L1CoordinatorTxs))
 33	assert.Equal(t, 0, len(blocks[0].Batches[1].L1CoordinatorTxs))
 34	assert.Equal(t, 22, len(blocks[0].Batches[2].L2Txs))
 35	assert.Equal(t, 1, len(blocks[1].Batches[0].L1CoordinatorTxs))
 36	assert.Equal(t, 62, len(blocks[1].Batches[0].L2Txs))
 37	assert.Equal(t, 1, len(blocks[1].Batches[1].L1CoordinatorTxs))
 38	assert.Equal(t, 8, len(blocks[1].Batches[1].L2Txs))
 39
 40	// Coordinator Idx where to send the fees
 41	coordIdxs := []common.Idx{256, 257, 258, 259}
 42
 43	// Idx of user 'A'
 44	idxA1 := tc.Users["A"].Accounts[common.TokenID(1)].Idx
 45
 46	// Process the 1st batch, which contains the L1CoordinatorTxs necessary
 47	// to create the Coordinator accounts to receive the fees
 48	log.Debug("block:0 batch:0, only L1CoordinatorTxs")
 49	ptOut, err := sdb.ProcessTxs(nil, nil, blocks[0].Batches[0].L1CoordinatorTxs, nil)
 50	require.Nil(t, err)
 51	assert.Equal(t, 4, len(ptOut.CreatedAccounts))
 52	assert.Equal(t, 0, len(ptOut.CollectedFees))
 53
 54	log.Debug("block:0 batch:1")
 55	l2Txs := common.L2TxsToPoolL2Txs(blocks[0].Batches[1].L2Txs)
 56	ptOut, err = sdb.ProcessTxs(coordIdxs, blocks[0].L1UserTxs, blocks[0].Batches[1].L1CoordinatorTxs, l2Txs)
 57	require.Nil(t, err)
 58	assert.Equal(t, 0, len(ptOut.ExitInfos))
 59	assert.Equal(t, 31, len(ptOut.CreatedAccounts))
 60	assert.Equal(t, 4, len(ptOut.CollectedFees))
 61	assert.Equal(t, "0", ptOut.CollectedFees[common.TokenID(0)].String())
 62	assert.Equal(t, "0", ptOut.CollectedFees[common.TokenID(1)].String())
 63	assert.Equal(t, "0", ptOut.CollectedFees[common.TokenID(2)].String())
 64	assert.Equal(t, "0", ptOut.CollectedFees[common.TokenID(3)].String())
 65	acc, err := sdb.GetAccount(idxA1)
 66	require.Nil(t, err)
 67	assert.Equal(t, "50", acc.Balance.String())
 68
 69	log.Debug("block:0 batch:2")
 70	l2Txs = common.L2TxsToPoolL2Txs(blocks[0].Batches[2].L2Txs)
 71	ptOut, err = sdb.ProcessTxs(coordIdxs, nil, blocks[0].Batches[2].L1CoordinatorTxs, l2Txs)
 72	require.Nil(t, err)
 73	assert.Equal(t, 0, len(ptOut.ExitInfos))
 74	assert.Equal(t, 0, len(ptOut.CreatedAccounts))
 75	assert.Equal(t, 4, len(ptOut.CollectedFees))
 76	assert.Equal(t, "2", ptOut.CollectedFees[common.TokenID(0)].String())
 77	assert.Equal(t, "1", ptOut.CollectedFees[common.TokenID(1)].String())
 78	assert.Equal(t, "0", ptOut.CollectedFees[common.TokenID(2)].String())
 79	assert.Equal(t, "0", ptOut.CollectedFees[common.TokenID(3)].String())
 80	acc, err = sdb.GetAccount(idxA1)
 81	require.Nil(t, err)
 82	assert.Equal(t, "35", acc.Balance.String())
 83
 84	log.Debug("block:1 batch:0")
 85	l2Txs = common.L2TxsToPoolL2Txs(blocks[1].Batches[0].L2Txs)
 86	// before processing expect l2Txs[0:2].Nonce==0
 87	assert.Equal(t, common.Nonce(0), l2Txs[0].Nonce)
 88	assert.Equal(t, common.Nonce(0), l2Txs[1].Nonce)
 89	assert.Equal(t, common.Nonce(0), l2Txs[2].Nonce)
 90
 91	ptOut, err = sdb.ProcessTxs(coordIdxs, nil, blocks[1].Batches[0].L1CoordinatorTxs, l2Txs)
 92	require.Nil(t, err)
 93
 94	// after processing expect l2Txs[0:2].Nonce!=0 and has expected value
 95	assert.Equal(t, common.Nonce(6), l2Txs[0].Nonce)
 96	assert.Equal(t, common.Nonce(7), l2Txs[1].Nonce)
 97	assert.Equal(t, common.Nonce(8), l2Txs[2].Nonce)
 98
 99	assert.Equal(t, 4, len(ptOut.ExitInfos)) // the 'ForceExit(1)' is not computed yet, as the batch is without L1UserTxs
100	assert.Equal(t, 1, len(ptOut.CreatedAccounts))
101	assert.Equal(t, 4, len(ptOut.CollectedFees))
102	assert.Equal(t, "0", ptOut.CollectedFees[common.TokenID(0)].String())
103	assert.Equal(t, "1", ptOut.CollectedFees[common.TokenID(1)].String())
104	assert.Equal(t, "0", ptOut.CollectedFees[common.TokenID(2)].String())
105	assert.Equal(t, "0", ptOut.CollectedFees[common.TokenID(3)].String())
106	acc, err = sdb.GetAccount(idxA1)
107	require.Nil(t, err)
108	assert.Equal(t, "57", acc.Balance.String())
109
110	log.Debug("block:1 batch:1")
111	l2Txs = common.L2TxsToPoolL2Txs(blocks[1].Batches[1].L2Txs)
112	ptOut, err = sdb.ProcessTxs(coordIdxs, blocks[1].L1UserTxs, blocks[1].Batches[1].L1CoordinatorTxs, l2Txs)
113	require.Nil(t, err)
114
115	assert.Equal(t, 2, len(ptOut.ExitInfos)) // 2, as previous batch was without L1UserTxs, and has pending the 'ForceExit(1) A: 5'
116	assert.Equal(t, 1, len(ptOut.CreatedAccounts))
117	assert.Equal(t, 4, len(ptOut.CollectedFees))
118	assert.Equal(t, "0", ptOut.CollectedFees[common.TokenID(0)].String())
119	assert.Equal(t, "0", ptOut.CollectedFees[common.TokenID(1)].String())
120	assert.Equal(t, "0", ptOut.CollectedFees[common.TokenID(2)].String())
121	assert.Equal(t, "0", ptOut.CollectedFees[common.TokenID(3)].String())
122	acc, err = sdb.GetAccount(idxA1)
123	assert.Nil(t, err)
124	assert.Equal(t, "82", acc.Balance.String())
125
126	idxB0 := tc.Users["C"].Accounts[common.TokenID(0)].Idx
127	acc, err = sdb.GetAccount(idxB0)
128	require.Nil(t, err)
129	assert.Equal(t, "51", acc.Balance.String())
130
131	// get balance of Coordinator account for TokenID==0
132	acc, err = sdb.GetAccount(common.Idx(256))
133	require.Nil(t, err)
134	assert.Equal(t, "2", acc.Balance.String())
135}
136
137func TestProcessTxsBatchBuilder(t *testing.T) {
138	dir, err := ioutil.TempDir("", "tmpdb")
139	require.Nil(t, err)
140	defer assert.Nil(t, os.RemoveAll(dir))
141
142	sdb, err := NewStateDB(dir, TypeBatchBuilder, 32)
143	assert.Nil(t, err)
144
145	// generate test transactions from test.SetBlockchain0 code
146	tc := til.NewContext(eth.RollupConstMaxL1UserTx)
147	blocks, err := tc.GenerateBlocks(til.SetBlockchain0)
148	require.Nil(t, err)
149
150	// Coordinator Idx where to send the fees
151	coordIdxs := []common.Idx{256, 257, 258, 259}
152
153	// Idx of user 'A'
154	idxA1 := tc.Users["A"].Accounts[common.TokenID(1)].Idx
155
156	// Process the 1st batch, which contains the L1CoordinatorTxs necessary
157	// to create the Coordinator accounts to receive the fees
158	log.Debug("block:0 batch:0, only L1CoordinatorTxs")
159	ptOut, err := sdb.ProcessTxs(nil, nil, blocks[0].Batches[0].L1CoordinatorTxs, nil)
160	require.Nil(t, err)
161	// expect 0 at CreatedAccount, as is only computed when StateDB.Type==TypeSynchronizer
162	assert.Equal(t, 0, len(ptOut.CreatedAccounts))
163
164	log.Debug("block:0 batch:1")
165	l2Txs := common.L2TxsToPoolL2Txs(blocks[0].Batches[1].L2Txs)
166	ptOut, err = sdb.ProcessTxs(coordIdxs, blocks[0].L1UserTxs, blocks[0].Batches[1].L1CoordinatorTxs, l2Txs)
167	require.Nil(t, err)
168	assert.Equal(t, 0, len(ptOut.ExitInfos))
169	assert.Equal(t, 0, len(ptOut.CreatedAccounts))
170	acc, err := sdb.GetAccount(idxA1)
171	require.Nil(t, err)
172	assert.Equal(t, "50", acc.Balance.String())
173
174	log.Debug("block:0 batch:2")
175	l2Txs = common.L2TxsToPoolL2Txs(blocks[0].Batches[2].L2Txs)
176	ptOut, err = sdb.ProcessTxs(coordIdxs, nil, blocks[0].Batches[2].L1CoordinatorTxs, l2Txs)
177	require.Nil(t, err)
178	assert.Equal(t, 0, len(ptOut.ExitInfos))
179	assert.Equal(t, 0, len(ptOut.CreatedAccounts))
180	acc, err = sdb.GetAccount(idxA1)
181	require.Nil(t, err)
182	assert.Equal(t, "35", acc.Balance.String())
183
184	log.Debug("block:1 batch:0")
185	l2Txs = common.L2TxsToPoolL2Txs(blocks[1].Batches[0].L2Txs)
186	_, err = sdb.ProcessTxs(coordIdxs, nil, blocks[1].Batches[0].L1CoordinatorTxs, l2Txs)
187	require.Nil(t, err)
188	acc, err = sdb.GetAccount(idxA1)
189	require.Nil(t, err)
190	assert.Equal(t, "57", acc.Balance.String())
191
192	log.Debug("block:1 batch:1")
193	l2Txs = common.L2TxsToPoolL2Txs(blocks[1].Batches[1].L2Txs)
194	_, err = sdb.ProcessTxs(coordIdxs, blocks[1].L1UserTxs, blocks[1].Batches[1].L1CoordinatorTxs, l2Txs)
195	require.Nil(t, err)
196	acc, err = sdb.GetAccount(idxA1)
197	assert.Nil(t, err)
198	assert.Equal(t, "82", acc.Balance.String())
199
200	idxB0 := tc.Users["C"].Accounts[common.TokenID(0)].Idx
201	acc, err = sdb.GetAccount(idxB0)
202	require.Nil(t, err)
203	assert.Equal(t, "51", acc.Balance.String())
204
205	// get balance of Coordinator account for TokenID==0
206	acc, err = sdb.GetAccount(common.Idx(256))
207	require.Nil(t, err)
208	assert.Equal(t, common.TokenID(0), acc.TokenID)
209	assert.Equal(t, "2", acc.Balance.String())
210	acc, err = sdb.GetAccount(common.Idx(257))
211	require.Nil(t, err)
212	assert.Equal(t, common.TokenID(1), acc.TokenID)
213	assert.Equal(t, "2", acc.Balance.String())
214}
215
216func TestZKInputsGeneration(t *testing.T) {
217	dir, err := ioutil.TempDir("", "tmpdb")
218	require.Nil(t, err)
219	defer assert.Nil(t, os.RemoveAll(dir))
220
221	sdb, err := NewStateDB(dir, TypeBatchBuilder, 32)
222	assert.Nil(t, err)
223
224	// generate test transactions from test.SetBlockchain0 code
225	tc := til.NewContext(eth.RollupConstMaxL1UserTx)
226	blocks, err := tc.GenerateBlocks(til.SetBlockchain0)
227	require.Nil(t, err)
228
229	// Coordinator Idx where to send the fees
230	coordIdxs := []common.Idx{256, 257, 258, 259}
231
232	log.Debug("block:0 batch:0, only L1CoordinatorTxs")
233	_, err = sdb.ProcessTxs(nil, nil, blocks[0].Batches[0].L1CoordinatorTxs, nil)
234	require.Nil(t, err)
235
236	l2Txs := common.L2TxsToPoolL2Txs(blocks[0].Batches[1].L2Txs)
237	ptOut, err := sdb.ProcessTxs(coordIdxs, blocks[0].L1UserTxs, blocks[0].Batches[1].L1CoordinatorTxs, l2Txs)
238	require.Nil(t, err)
239
240	s, err := json.Marshal(ptOut.ZKInputs)
241	require.Nil(t, err)
242	debug := false
243	if debug {
244		fmt.Println(string(s))
245	}
246}