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