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/test/til"
11 "github.com/stretchr/testify/assert"
12 "github.com/stretchr/testify/require"
13)
14
15func TestProcessTxsSynchronizer(t *testing.T) {
16 // TODO once TTGL is updated, use the blockchain L2Tx (not PoolL2Tx) for
17 // the Synchronizer tests
18
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.SetTest0 code
27 tc := til.NewContext(eth.RollupConstMaxL1UserTx)
28 blocks, err := tc.GenerateBlocks(til.SetBlockchain0)
29 require.Nil(t, err)
30
31 assert.Equal(t, 29, len(blocks[0].L1UserTxs))
32 assert.Equal(t, 0, len(blocks[0].Batches[0].L1CoordinatorTxs))
33 assert.Equal(t, 21, len(blocks[0].Batches[1].L2Txs))
34 assert.Equal(t, 1, len(blocks[1].Batches[0].L1CoordinatorTxs))
35 assert.Equal(t, 59, len(blocks[1].Batches[0].L2Txs))
36 assert.Equal(t, 1, len(blocks[1].Batches[1].L1CoordinatorTxs))
37 assert.Equal(t, 8, len(blocks[1].Batches[1].L2Txs))
38
39 // use first batch
40 l2Txs := common.L2TxsToPoolL2Txs(blocks[0].Batches[0].L2Txs)
41 _, exitInfos, err := sdb.ProcessTxs(blocks[0].L1UserTxs, blocks[0].Batches[0].L1CoordinatorTxs, l2Txs)
42 require.Nil(t, err)
43 assert.Equal(t, 0, len(exitInfos))
44 acc, err := sdb.GetAccount(common.Idx(256))
45 require.Nil(t, err)
46 assert.Equal(t, "50", acc.Balance.String())
47
48 // second batch of first block
49 l2Txs = common.L2TxsToPoolL2Txs(blocks[0].Batches[1].L2Txs)
50 _, exitInfos, err = sdb.ProcessTxs(nil, blocks[0].Batches[1].L1CoordinatorTxs, l2Txs)
51 require.Nil(t, err)
52 // TODO once TTGL is updated, add a check that a input poolL2Tx with
53 // Nonce & TokenID =0, after ProcessTxs call has the expected value
54
55 assert.Equal(t, 0, len(exitInfos))
56 acc, err = sdb.GetAccount(common.Idx(256))
57 require.Nil(t, err)
58 assert.Equal(t, "28", acc.Balance.String())
59
60 // use second batch
61 l2Txs = common.L2TxsToPoolL2Txs(blocks[1].Batches[0].L2Txs)
62 _, exitInfos, err = sdb.ProcessTxs(nil, blocks[1].Batches[0].L1CoordinatorTxs, l2Txs)
63 require.Nil(t, err)
64 assert.Equal(t, 4, len(exitInfos)) // the 'ForceExit(1)' is not computed yet, as the batch is without L1UserTxs
65 acc, err = sdb.GetAccount(common.Idx(256))
66 require.Nil(t, err)
67 assert.Equal(t, "53", acc.Balance.String())
68
69 // use third batch
70 l2Txs = common.L2TxsToPoolL2Txs(blocks[1].Batches[1].L2Txs)
71 _, exitInfos, err = sdb.ProcessTxs(blocks[1].L1UserTxs, blocks[1].Batches[1].L1CoordinatorTxs, l2Txs)
72 require.Nil(t, err)
73
74 assert.Equal(t, 2, len(exitInfos)) // 2, as previous batch was without L1UserTxs, and has pending the 'ForceExit(1) A: 5'
75 acc, err = sdb.GetAccount(common.Idx(256))
76 assert.Nil(t, err)
77 assert.Equal(t, "78", acc.Balance.String())
78}
79
80/*
81WIP
82
83func TestProcessTxsBatchBuilder(t *testing.T) {
84 dir, err := ioutil.TempDir("", "tmpdb")
85 require.Nil(t, err)
86 defer assert.Nil(t, os.RemoveAll(dir))
87
88 sdb, err := NewStateDB(dir, TypeBatchBuilder, 32)
89 assert.Nil(t, err)
90
91 // generate test transactions from test.SetTest0 code
92 tc := til.NewContext()
93 blocks := tc.GenerateBlocks(til.SetBlockchain0)
94
95 assert.Equal(t, 29, len(blocks[0].Batches[0].L1UserTxs))
96 assert.Equal(t, 0, len(blocks[0].Batches[0].L1CoordinatorTxs))
97 assert.Equal(t, 21, len(blocks[0].Batches[0].L2Txs))
98 assert.Equal(t, 1, len(blocks[0].Batches[1].L1UserTxs))
99 assert.Equal(t, 1, len(blocks[0].Batches[1].L1CoordinatorTxs))
100 assert.Equal(t, 59, len(blocks[0].Batches[1].L2Txs))
101 assert.Equal(t, 9, len(blocks[0].Batches[2].L1UserTxs))
102 assert.Equal(t, 0, len(blocks[0].Batches[2].L1CoordinatorTxs))
103 assert.Equal(t, 8, len(blocks[0].Batches[2].L2Txs))
104
105 // use first batch
106 l2Txs := common.L2TxsToPoolL2Txs(blocks[0].Batches[0].L2Txs)
107 _, exitInfos, err := sdb.ProcessTxs(blocks[0].Batches[0].L1UserTxs, blocks[0].Batches[0].L1CoordinatorTxs, l2Txs)
108 require.Nil(t, err)
109 assert.Equal(t, 0, len(exitInfos))
110 acc, err := sdb.GetAccount(common.Idx(256))
111 assert.Nil(t, err)
112 assert.Equal(t, "28", acc.Balance.String())
113
114 // use second batch
115 l2Txs = common.L2TxsToPoolL2Txs(blocks[0].Batches[1].L2Txs)
116 _, exitInfos, err = sdb.ProcessTxs(blocks[0].Batches[1].L1UserTxs, blocks[0].Batches[1].L1CoordinatorTxs, l2Txs)
117 require.Nil(t, err)
118 assert.Equal(t, 5, len(exitInfos))
119 acc, err = sdb.GetAccount(common.Idx(256))
120 require.Nil(t, err)
121 assert.Equal(t, "48", acc.Balance.String())
122
123 // use third batch
124 l2Txs = common.L2TxsToPoolL2Txs(blocks[0].Batches[2].L2Txs)
125 _, exitInfos, err = sdb.ProcessTxs(blocks[0].Batches[2].L1UserTxs, blocks[0].Batches[2].L1CoordinatorTxs, l2Txs)
126 require.Nil(t, err)
127 assert.Equal(t, 1, len(exitInfos))
128 acc, err = sdb.GetAccount(common.Idx(256))
129 assert.Nil(t, err)
130 assert.Equal(t, "23", acc.Balance.String())
131}
132
133func TestZKInputsGeneration(t *testing.T) {
134 dir, err := ioutil.TempDir("", "tmpdb")
135 require.Nil(t, err)
136 defer assert.Nil(t, os.RemoveAll(dir))
137
138 sdb, err := NewStateDB(dir, TypeBatchBuilder, 32)
139 assert.Nil(t, err)
140
141 // generate test transactions from test.SetTest0 code
142 tc := til.NewContext()
143 blocks := tc.GenerateBlocks(til.SetBlockchain0)
144 assert.Equal(t, 29, len(blocks[0].Batches[0].L1UserTxs))
145 assert.Equal(t, 0, len(blocks[0].Batches[0].L1CoordinatorTxs))
146 assert.Equal(t, 21, len(blocks[0].Batches[0].L2Txs))
147
148 l2Txs := common.L2TxsToPoolL2Txs(blocks[0].Batches[0].L2Txs)
149 zki, _, err := sdb.ProcessTxs(blocks[0].Batches[0].L1UserTxs, blocks[0].Batches[0].L1CoordinatorTxs, l2Txs)
150 require.Nil(t, err)
151
152 s, err := json.Marshal(zki)
153 require.Nil(t, err)
154 debug:=true
155 if debug {
156 fmt.Println(string(s))
157 }
158}
159*/