arnaucube
arnaucube/hermez-nodePublic Self-hosted repository
hermez-node/common/leaf_test.go
common/leaf_test.goRaw
  1package common
  2
  3import (
  4	"fmt"
  5	"math"
  6	"math/big"
  7	"testing"
  8
  9	ethCommon "github.com/ethereum/go-ethereum/common"
 10	cryptoConstants "github.com/iden3/go-iden3-crypto/constants"
 11	cryptoUtils "github.com/iden3/go-iden3-crypto/utils"
 12	"github.com/stretchr/testify/assert"
 13)
 14
 15func TestLeaf(t *testing.T) {
 16	leaf := &Leaf{
 17		TokenID: TokenID(1),
 18		Nonce:   uint64(1234),
 19		Balance: big.NewInt(1000),
 20		Sign:    true,
 21		Ay:      big.NewInt(6789),
 22		EthAddr: ethCommon.HexToAddress("0xc58d29fA6e86E4FAe04DDcEd660d45BCf3Cb2370"),
 23	}
 24	b, err := leaf.Bytes()
 25	assert.Nil(t, err)
 26	assert.Equal(t, byte(1), b[10])
 27	l1, err := LeafFromBytes(b)
 28	assert.Nil(t, err)
 29	assert.Equal(t, leaf, l1)
 30
 31	e, err := leaf.BigInts()
 32	assert.Nil(t, err)
 33	assert.True(t, cryptoUtils.CheckBigIntInField(e[0]))
 34	assert.True(t, cryptoUtils.CheckBigIntInField(e[1]))
 35	assert.True(t, cryptoUtils.CheckBigIntInField(e[2]))
 36	assert.True(t, cryptoUtils.CheckBigIntInField(e[3]))
 37
 38	assert.Equal(t, "1000", e[1].String())
 39	assert.Equal(t, "6789", e[2].String())
 40	assert.Equal(t, new(big.Int).SetBytes(SwapEndianness(leaf.EthAddr.Bytes())).String(), e[3].String())
 41
 42	l2, err := LeafFromBigInts(e)
 43	assert.Nil(t, err)
 44	assert.Equal(t, leaf, l2)
 45	assert.Equal(t, l1, l2)
 46}
 47
 48// func TestLeafLoop(t *testing.T) {
 49//         // check that for different Address there is no problem
 50//         for i := 0; i < 256; i++ {
 51//                 key, err := ethCrypto.GenerateKey()
 52//                 assert.Nil(t, err)
 53//                 address := ethCrypto.PubkeyToAddress(key.PublicKey)
 54//
 55//                 leaf := &Leaf{
 56//                         TokenID: TokenID(i),
 57//                         Nonce:   uint64(i),
 58//                         Balance: big.NewInt(1000),
 59//                         Sign:    true,
 60//                         Ay:      big.NewInt(6789),
 61//                         EthAddr: address,
 62//                 }
 63//                 b, err := leaf.Bytes()
 64//                 assert.Nil(t, err)
 65//                 l1, err := LeafFromBytes(b)
 66//                 assert.Nil(t, err)
 67//                 assert.Equal(t, leaf, l1)
 68//
 69//                 e, err := leaf.BigInts()
 70//                 assert.Nil(t, err)
 71//                 assert.True(t, cryptoUtils.CheckBigIntInField(e[0]))
 72//                 assert.True(t, cryptoUtils.CheckBigIntInField(e[1]))
 73//                 assert.True(t, cryptoUtils.CheckBigIntInField(e[2]))
 74//                 assert.True(t, cryptoUtils.CheckBigIntInField(e[3]))
 75//
 76//                 l2, err := LeafFromBigInts(e)
 77//                 assert.Nil(t, err)
 78//                 assert.Equal(t, leaf, l2)
 79//         }
 80// }
 81
 82func TestLeafErrNotInFF(t *testing.T) {
 83	z := big.NewInt(0)
 84
 85	// Q-1 should not give error
 86	r := new(big.Int).Sub(cryptoConstants.Q, big.NewInt(1))
 87	e := [NLEAFELEMS]*big.Int{z, z, r, r}
 88	_, err := LeafFromBigInts(e)
 89	assert.Nil(t, err)
 90
 91	// Q should give error
 92	r = cryptoConstants.Q
 93	e = [NLEAFELEMS]*big.Int{z, z, r, r}
 94	_, err = LeafFromBigInts(e)
 95	assert.NotNil(t, err)
 96	assert.Equal(t, ErrNotInFF, err)
 97
 98	// Q+1 should give error
 99	r = new(big.Int).Add(cryptoConstants.Q, big.NewInt(1))
100	e = [NLEAFELEMS]*big.Int{z, z, r, r}
101	_, err = LeafFromBigInts(e)
102	assert.NotNil(t, err)
103	assert.Equal(t, ErrNotInFF, err)
104}
105
106func TestLeafErrNumOverflowNonce(t *testing.T) {
107	// check limit
108	leaf := &Leaf{
109		TokenID: TokenID(1),
110		Nonce:   uint64(math.Pow(2, 40) - 1),
111		Balance: big.NewInt(1000),
112		Sign:    true,
113		Ay:      big.NewInt(6789),
114		EthAddr: ethCommon.HexToAddress("0xc58d29fA6e86E4FAe04DDcEd660d45BCf3Cb2370"),
115	}
116	_, err := leaf.Bytes()
117	assert.Nil(t, err)
118
119	// force value overflow
120	leaf.Nonce = uint64(math.Pow(2, 40))
121	b, err := leaf.Bytes()
122	assert.NotNil(t, err)
123	assert.Equal(t, fmt.Errorf("%s Nonce", ErrNumOverflow), err)
124
125	_, err = LeafFromBytes(b)
126	assert.Nil(t, err)
127}
128
129func TestLeafErrNumOverflowBalance(t *testing.T) {
130	// check limit
131	leaf := &Leaf{
132		TokenID: TokenID(1),
133		Nonce:   uint64(math.Pow(2, 40) - 1),
134		Balance: new(big.Int).Sub(new(big.Int).Exp(big.NewInt(2), big.NewInt(192), nil), big.NewInt(1)),
135		Sign:    true,
136		Ay:      big.NewInt(6789),
137		EthAddr: ethCommon.HexToAddress("0xc58d29fA6e86E4FAe04DDcEd660d45BCf3Cb2370"),
138	}
139	assert.Equal(t, "6277101735386680763835789423207666416102355444464034512895", leaf.Balance.String())
140
141	_, err := leaf.Bytes()
142	assert.Nil(t, err)
143
144	// force value overflow
145	leaf.Balance = new(big.Int).Exp(big.NewInt(2), big.NewInt(192), nil)
146	assert.Equal(t, "6277101735386680763835789423207666416102355444464034512896", leaf.Balance.String())
147	b, err := leaf.Bytes()
148	assert.NotNil(t, err)
149	assert.Equal(t, fmt.Errorf("%s Balance", ErrNumOverflow), err)
150
151	_, err = LeafFromBytes(b)
152	assert.Nil(t, err)
153
154	b[56] = 1
155	_, err = LeafFromBytes(b)
156	assert.NotNil(t, err)
157	assert.Equal(t, fmt.Errorf("%s Balance", ErrNumOverflow), err)
158}