hermez-node/db/statedb/utils_test.go
db/statedb/utils_test.goRaw
1package statedb
2
3import (
4 "fmt"
5 "io/ioutil"
6 "math/big"
7 "os"
8 "testing"
9
10 ethCommon "github.com/ethereum/go-ethereum/common"
11 "github.com/hermeznetwork/hermez-node/common"
12 "github.com/hermeznetwork/tracerr"
13 "github.com/iden3/go-iden3-crypto/babyjub"
14 "github.com/stretchr/testify/assert"
15 "github.com/stretchr/testify/require"
16)
17
18func TestGetIdx(t *testing.T) {
19 dir, err := ioutil.TempDir("", "tmpdb")
20 require.NoError(t, err)
21 defer assert.NoError(t, os.RemoveAll(dir))
22
23 chainID := uint16(0)
24 sdb, err := NewStateDB(dir, 128, TypeTxSelector, 0, chainID)
25 assert.NoError(t, err)
26
27 var sk babyjub.PrivateKey
28 copy(sk[:], []byte("1234")) // only for testing
29 pk := sk.Public()
30 var sk2 babyjub.PrivateKey
31 copy(sk2[:], []byte("12345")) // only for testing
32 pk2 := sk2.Public()
33 addr := ethCommon.HexToAddress("0x74E803744B7EEFc272E852f89a05D41515d431f2")
34 addr2 := ethCommon.HexToAddress("0x54A0706531cEa2ee8F09bAd22f604e377bb56948")
35 idx := common.Idx(1234)
36 idx2 := common.Idx(12345)
37 idx3 := common.Idx(1233)
38
39 tokenID0 := common.TokenID(0)
40 tokenID1 := common.TokenID(1)
41
42 // store the keys for idx by Addr & BJJ
43 err = sdb.setIdxByEthAddrBJJ(idx, addr, pk.Compress(), tokenID0)
44 require.NoError(t, err)
45
46 idxR, err := sdb.GetIdxByEthAddrBJJ(addr, pk.Compress(), tokenID0)
47 assert.NoError(t, err)
48 assert.Equal(t, idx, idxR)
49
50 // expect error when getting only by EthAddr, as value does not exist
51 // in the db for only EthAddr
52 _, err = sdb.GetIdxByEthAddr(addr, tokenID0)
53 assert.NoError(t, err)
54 _, err = sdb.GetIdxByEthAddr(addr2, tokenID0)
55 assert.NotNil(t, err)
56 // expect error when getting by EthAddr and BJJ, but for another TokenID
57 _, err = sdb.GetIdxByEthAddrBJJ(addr, pk.Compress(), tokenID1)
58 assert.NotNil(t, err)
59
60 // expect to fail
61 idxR, err = sdb.GetIdxByEthAddrBJJ(addr2, pk.Compress(), tokenID0)
62 assert.NotNil(t, err)
63 assert.Equal(t, common.Idx(0), idxR)
64 idxR, err = sdb.GetIdxByEthAddrBJJ(addr, pk2.Compress(), tokenID0)
65 assert.NotNil(t, err)
66 assert.Equal(t, common.Idx(0), idxR)
67
68 // try to store bigger idx, will not affect as already exist a smaller
69 // Idx for that Addr & BJJ
70 err = sdb.setIdxByEthAddrBJJ(idx2, addr, pk.Compress(), tokenID0)
71 assert.NoError(t, err)
72
73 // store smaller idx
74 err = sdb.setIdxByEthAddrBJJ(idx3, addr, pk.Compress(), tokenID0)
75 assert.NoError(t, err)
76
77 idxR, err = sdb.GetIdxByEthAddrBJJ(addr, pk.Compress(), tokenID0)
78 assert.NoError(t, err)
79 assert.Equal(t, idx3, idxR)
80
81 // by EthAddr should work
82 idxR, err = sdb.GetIdxByEthAddr(addr, tokenID0)
83 assert.NoError(t, err)
84 assert.Equal(t, idx3, idxR)
85 // expect error when trying to get Idx by addr2 & pk2
86 idxR, err = sdb.GetIdxByEthAddrBJJ(addr2, pk2.Compress(), tokenID0)
87 assert.NotNil(t, err)
88 expectedErr := fmt.Errorf("GetIdxByEthAddrBJJ: %s: ToEthAddr: %s, ToBJJ: %s, TokenID: %d", ErrToIdxNotFound, addr2.Hex(), pk2, tokenID0)
89 assert.Equal(t, expectedErr, tracerr.Unwrap(err))
90 assert.Equal(t, common.Idx(0), idxR)
91 // expect error when trying to get Idx by addr with not used TokenID
92 _, err = sdb.GetIdxByEthAddr(addr, tokenID1)
93 assert.NotNil(t, err)
94}
95
96func TestBJJCompressedTo256BigInt(t *testing.T) {
97 var pkComp babyjub.PublicKeyComp
98 r := BJJCompressedTo256BigInts(pkComp)
99 zero := big.NewInt(0)
100 for i := 0; i < 256; i++ {
101 assert.Equal(t, zero, r[i])
102 }
103
104 pkComp[0] = 3
105 r = BJJCompressedTo256BigInts(pkComp)
106 one := big.NewInt(1)
107 for i := 0; i < 256; i++ {
108 if i != 0 && i != 1 {
109 assert.Equal(t, zero, r[i])
110 } else {
111 assert.Equal(t, one, r[i])
112 }
113 }
114
115 pkComp[31] = 4
116 r = BJJCompressedTo256BigInts(pkComp)
117 for i := 0; i < 256; i++ {
118 if i != 0 && i != 1 && i != 250 {
119 assert.Equal(t, zero, r[i])
120 } else {
121 assert.Equal(t, one, r[i])
122 }
123 }
124}