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