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