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