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 // store the keys for idx by Addr & BJJ
37 err = sdb.setIdxByEthAddrBJJ(idx, addr, pk)
38 require.Nil(t, err)
39
40 idxR, err := sdb.GetIdxByEthAddrBJJ(addr, pk)
41 assert.Nil(t, err)
42 assert.Equal(t, idx, idxR)
43
44 // expect error when getting only by EthAddr, as value does not exist
45 // in the db for only EthAddr
46 _, err = sdb.GetIdxByEthAddr(addr)
47 assert.Nil(t, err)
48 _, err = sdb.GetIdxByEthAddr(addr2)
49 assert.NotNil(t, err)
50
51 // expect to fail
52 idxR, err = sdb.GetIdxByEthAddrBJJ(addr2, pk)
53 assert.NotNil(t, err)
54 assert.Equal(t, common.Idx(0), idxR)
55 idxR, err = sdb.GetIdxByEthAddrBJJ(addr, pk2)
56 assert.NotNil(t, err)
57 assert.Equal(t, common.Idx(0), idxR)
58
59 // try to store bigger idx, will not affect as already exist a smaller
60 // Idx for that Addr & BJJ
61 err = sdb.setIdxByEthAddrBJJ(idx2, addr, pk)
62 assert.Nil(t, err)
63
64 // store smaller idx
65 err = sdb.setIdxByEthAddrBJJ(idx3, addr, pk)
66 assert.Nil(t, err)
67
68 idxR, err = sdb.GetIdxByEthAddrBJJ(addr, pk)
69 assert.Nil(t, err)
70 assert.Equal(t, idx3, idxR)
71
72 // by EthAddr should work
73 idxR, err = sdb.GetIdxByEthAddr(addr)
74 assert.Nil(t, err)
75 assert.Equal(t, idx3, idxR)
76 // expect error when trying to get Idx by addr2 & pk2
77 idxR, err = sdb.GetIdxByEthAddrBJJ(addr2, pk2)
78 assert.NotNil(t, err)
79 assert.Equal(t, ErrToIdxNotFound, err)
80 assert.Equal(t, common.Idx(0), idxR)
81}
82
83func TestBJJCompressedTo256BigInt(t *testing.T) {
84 var pkComp babyjub.PublicKeyComp
85 r := BJJCompressedTo256BigInts(pkComp)
86 zero := big.NewInt(0)
87 for i := 0; i < 256; i++ {
88 assert.Equal(t, zero, r[i])
89 }
90
91 pkComp[0] = 3
92 r = BJJCompressedTo256BigInts(pkComp)
93 one := big.NewInt(1)
94 for i := 0; i < 256; i++ {
95 if i != 0 && i != 1 {
96 assert.Equal(t, zero, r[i])
97 } else {
98 assert.Equal(t, one, r[i])
99 }
100 }
101
102 pkComp[31] = 4
103 r = BJJCompressedTo256BigInts(pkComp)
104 for i := 0; i < 256; i++ {
105 if i != 0 && i != 1 && i != 250 {
106 assert.Equal(t, zero, r[i])
107 } else {
108 assert.Equal(t, one, r[i])
109 }
110 }
111}