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 log.Debug("1st batch, 1st block, only L1CoordinatorTxs")
48 _, _, err = sdb.ProcessTxs(nil, nil, blocks[0].Batches[0].L1CoordinatorTxs, nil)
49 require.Nil(t, err)
50
51 log.Debug("2nd batch, 1st block")
52 l2Txs := common.L2TxsToPoolL2Txs(blocks[0].Batches[1].L2Txs)
53 _, exitInfos, err := sdb.ProcessTxs(coordIdxs, blocks[0].L1UserTxs, blocks[0].Batches[1].L1CoordinatorTxs, l2Txs)
54 require.Nil(t, err)
55 assert.Equal(t, 0, len(exitInfos))
56 acc, err := sdb.GetAccount(idxA1)
57 require.Nil(t, err)
58 assert.Equal(t, "50", acc.Balance.String())
59
60 log.Debug("3rd batch, 1st block")
61 l2Txs = common.L2TxsToPoolL2Txs(blocks[0].Batches[2].L2Txs)
62 _, exitInfos, err = sdb.ProcessTxs(coordIdxs, nil, blocks[0].Batches[2].L1CoordinatorTxs, l2Txs)
63 require.Nil(t, err)
64 // TODO once TTGL is updated, add a check that a input poolL2Tx with
65 // Nonce & TokenID =0, after ProcessTxs call has the expected value
66
67 assert.Equal(t, 0, len(exitInfos))
68 acc, err = sdb.GetAccount(idxA1)
69 require.Nil(t, err)
70 assert.Equal(t, "28", acc.Balance.String())
71
72 log.Debug("1st batch, 2nd block")
73 l2Txs = common.L2TxsToPoolL2Txs(blocks[1].Batches[0].L2Txs)
74 _, exitInfos, err = sdb.ProcessTxs(coordIdxs, nil, blocks[1].Batches[0].L1CoordinatorTxs, l2Txs)
75 require.Nil(t, err)
76 assert.Equal(t, 4, len(exitInfos)) // the 'ForceExit(1)' is not computed yet, as the batch is without L1UserTxs
77 acc, err = sdb.GetAccount(idxA1)
78 require.Nil(t, err)
79 assert.Equal(t, "53", acc.Balance.String())
80
81 log.Debug("2nd batch, 2nd block")
82 l2Txs = common.L2TxsToPoolL2Txs(blocks[1].Batches[1].L2Txs)
83 _, exitInfos, err = sdb.ProcessTxs(coordIdxs, blocks[1].L1UserTxs, blocks[1].Batches[1].L1CoordinatorTxs, l2Txs)
84 require.Nil(t, err)
85
86 assert.Equal(t, 2, len(exitInfos)) // 2, as previous batch was without L1UserTxs, and has pending the 'ForceExit(1) A: 5'
87 acc, err = sdb.GetAccount(idxA1)
88 assert.Nil(t, err)
89 assert.Equal(t, "78", acc.Balance.String())
90
91 idxB0 := tc.Users["C"].Accounts[common.TokenID(0)].Idx
92 acc, err = sdb.GetAccount(idxB0)
93 require.Nil(t, err)
94 assert.Equal(t, "51", acc.Balance.String())
95
96 // get balance of Coordinator account for TokenID==0
97 acc, err = sdb.GetAccount(common.Idx(256))
98 require.Nil(t, err)
99 assert.Equal(t, "2", acc.Balance.String())
100}
101
102/*
103WIP
104
105func TestProcessTxsBatchBuilder(t *testing.T) {
106 dir, err := ioutil.TempDir("", "tmpdb")
107 require.Nil(t, err)
108 defer assert.Nil(t, os.RemoveAll(dir))
109
110 sdb, err := NewStateDB(dir, TypeBatchBuilder, 32)
111 assert.Nil(t, err)
112
113 // generate test transactions from test.SetTest0 code
114 tc := til.NewContext()
115 blocks := tc.GenerateBlocks(til.SetBlockchain0)
116
117 assert.Equal(t, 29, len(blocks[0].Batches[0].L1UserTxs))
118 assert.Equal(t, 0, len(blocks[0].Batches[0].L1CoordinatorTxs))
119 assert.Equal(t, 21, len(blocks[0].Batches[0].L2Txs))
120 assert.Equal(t, 1, len(blocks[0].Batches[1].L1UserTxs))
121 assert.Equal(t, 1, len(blocks[0].Batches[1].L1CoordinatorTxs))
122 assert.Equal(t, 59, len(blocks[0].Batches[1].L2Txs))
123 assert.Equal(t, 9, len(blocks[0].Batches[2].L1UserTxs))
124 assert.Equal(t, 0, len(blocks[0].Batches[2].L1CoordinatorTxs))
125 assert.Equal(t, 8, len(blocks[0].Batches[2].L2Txs))
126
127 // Idx of user 'A'
128 idxA1 := tc.Users["A"].Accounts[common.TokenID(1)].Idx
129
130 // use first batch
131 l2Txs := common.L2TxsToPoolL2Txs(blocks[0].Batches[0].L2Txs)
132 _, exitInfos, err := sdb.ProcessTxs(coordIdxs, blocks[0].Batches[0].L1UserTxs, blocks[0].Batches[0].L1CoordinatorTxs, l2Txs)
133 require.Nil(t, err)
134 assert.Equal(t, 0, len(exitInfos))
135 acc, err := sdb.GetAccount(idxA1)
136 assert.Nil(t, err)
137 assert.Equal(t, "28", acc.Balance.String())
138
139 // use second batch
140 l2Txs = common.L2TxsToPoolL2Txs(blocks[0].Batches[1].L2Txs)
141 _, exitInfos, err = sdb.ProcessTxs(coordIdxs, blocks[0].Batches[1].L1UserTxs, blocks[0].Batches[1].L1CoordinatorTxs, l2Txs)
142 require.Nil(t, err)
143 assert.Equal(t, 5, len(exitInfos))
144 acc, err = sdb.GetAccount(idxA1)
145 require.Nil(t, err)
146 assert.Equal(t, "48", acc.Balance.String())
147
148 // use third batch
149 l2Txs = common.L2TxsToPoolL2Txs(blocks[0].Batches[2].L2Txs)
150 _, exitInfos, err = sdb.ProcessTxs(coordIdxs, blocks[0].Batches[2].L1UserTxs, blocks[0].Batches[2].L1CoordinatorTxs, l2Txs)
151 require.Nil(t, err)
152 assert.Equal(t, 1, len(exitInfos))
153 acc, err = sdb.GetAccount(idxA1)
154 assert.Nil(t, err)
155 assert.Equal(t, "23", acc.Balance.String())
156}
157
158func TestZKInputsGeneration(t *testing.T) {
159 dir, err := ioutil.TempDir("", "tmpdb")
160 require.Nil(t, err)
161 defer assert.Nil(t, os.RemoveAll(dir))
162
163 sdb, err := NewStateDB(dir, TypeBatchBuilder, 32)
164 assert.Nil(t, err)
165
166 // generate test transactions from test.SetTest0 code
167 tc := til.NewContext()
168 blocks := tc.GenerateBlocks(til.SetBlockchain0)
169 assert.Equal(t, 29, len(blocks[0].Batches[0].L1UserTxs))
170 assert.Equal(t, 0, len(blocks[0].Batches[0].L1CoordinatorTxs))
171 assert.Equal(t, 21, len(blocks[0].Batches[0].L2Txs))
172
173 l2Txs := common.L2TxsToPoolL2Txs(blocks[0].Batches[0].L2Txs)
174 zki, _, err := sdb.ProcessTxs(coordIdxs, blocks[0].Batches[0].L1UserTxs, blocks[0].Batches[0].L1CoordinatorTxs, l2Txs)
175 require.Nil(t, err)
176
177 s, err := json.Marshal(zki)
178 require.Nil(t, err)
179 debug:=true
180 if debug {
181 fmt.Println(string(s))
182 }
183}
184*/