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/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}