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