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*/