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