arnaucube
arnaucube/hermez-nodePublic Self-hosted repository
hermez-node/common/pooll2tx_test.go
common/pooll2tx_test.goRaw
  1package common
  2
  3import (
  4	"encoding/hex"
  5	"math/big"
  6	"testing"
  7
  8	ethCommon "github.com/ethereum/go-ethereum/common"
  9	"github.com/iden3/go-iden3-crypto/babyjub"
 10	"github.com/stretchr/testify/assert"
 11)
 12
 13func TestNonceParser(t *testing.T) {
 14	n := Nonce(1)
 15	nBytes, err := n.Bytes()
 16	assert.Nil(t, err)
 17	assert.Equal(t, 5, len(nBytes))
 18	assert.Equal(t, "0000000001", hex.EncodeToString(nBytes[:]))
 19	n2 := NonceFromBytes(nBytes)
 20	assert.Equal(t, n, n2)
 21
 22	// value before overflow
 23	n = Nonce(1099511627775)
 24	nBytes, err = n.Bytes()
 25	assert.Nil(t, err)
 26	assert.Equal(t, 5, len(nBytes))
 27	assert.Equal(t, "ffffffffff", hex.EncodeToString(nBytes[:]))
 28	n2 = NonceFromBytes(nBytes)
 29	assert.Equal(t, n, n2)
 30
 31	// expect value overflow
 32	n = Nonce(1099511627776)
 33	nBytes, err = n.Bytes()
 34	assert.NotNil(t, err)
 35	assert.Equal(t, ErrNonceOverflow, err)
 36}
 37
 38func TestTxCompressedData(t *testing.T) {
 39	var sk babyjub.PrivateKey
 40	_, err := hex.Decode(sk[:], []byte("0001020304050607080900010203040506070809000102030405060708090001"))
 41	assert.Nil(t, err)
 42
 43	tx := PoolL2Tx{
 44		FromIdx: 2,
 45		ToIdx:   3,
 46		Amount:  big.NewInt(4),
 47		TokenID: 5,
 48		Nonce:   6,
 49		ToBJJ:   sk.Public(),
 50	}
 51	txCompressedData, err := tx.TxCompressedData()
 52	assert.Nil(t, err)
 53	// test vector value generated from javascript implementation
 54	expectedStr := "1766847064778421992193717128424891165872736891548909569553540449389241871"
 55	assert.Equal(t, expectedStr, txCompressedData.String())
 56	expected, ok := new(big.Int).SetString(expectedStr, 10)
 57	assert.True(t, ok)
 58	assert.Equal(t, expected.Bytes(), txCompressedData.Bytes())
 59	assert.Equal(t, "10000000000060000000500040000000000030000000000020001c60be60f", hex.EncodeToString(txCompressedData.Bytes())[1:])
 60
 61	tx = PoolL2Tx{
 62		FromIdx: 7,
 63		ToIdx:   8,
 64		Amount:  big.NewInt(9),
 65		TokenID: 10,
 66		Nonce:   11,
 67		Fee:     12,
 68		ToBJJ:   sk.Public(),
 69	}
 70	txCompressedData, err = tx.TxCompressedDataV2()
 71	assert.Nil(t, err)
 72	// test vector value generated from javascript implementation
 73	expectedStr = "6571340879233176732837827812956721483162819083004853354503"
 74	assert.Equal(t, expectedStr, txCompressedData.String())
 75	expected, ok = new(big.Int).SetString(expectedStr, 10)
 76	assert.True(t, ok)
 77	assert.Equal(t, expected.Bytes(), txCompressedData.Bytes())
 78	assert.Equal(t, "10c000000000b0000000a0009000000000008000000000007", hex.EncodeToString(txCompressedData.Bytes())[1:])
 79}
 80
 81func TestHashToSign(t *testing.T) {
 82	var sk babyjub.PrivateKey
 83	_, err := hex.Decode(sk[:], []byte("0001020304050607080900010203040506070809000102030405060708090001"))
 84	assert.Nil(t, err)
 85	ethAddr := ethCommon.HexToAddress("0xc58d29fA6e86E4FAe04DDcEd660d45BCf3Cb2370")
 86
 87	tx := PoolL2Tx{
 88		FromIdx:     2,
 89		ToIdx:       3,
 90		Amount:      big.NewInt(4),
 91		TokenID:     5,
 92		Nonce:       6,
 93		ToBJJ:       sk.Public(),
 94		RqToEthAddr: ethAddr,
 95		RqToBJJ:     sk.Public(),
 96	}
 97	toSign, err := tx.HashToSign()
 98	assert.Nil(t, err)
 99	assert.Equal(t, "14526446928649310956370997581245770629723313742905751117262272426489782809503", toSign.String())
100}
101
102func TestVerifyTxSignature(t *testing.T) {
103	var sk babyjub.PrivateKey
104	_, err := hex.Decode(sk[:], []byte("0001020304050607080900010203040506070809000102030405060708090001"))
105	assert.Nil(t, err)
106	ethAddr := ethCommon.HexToAddress("0xc58d29fA6e86E4FAe04DDcEd660d45BCf3Cb2370")
107
108	tx := PoolL2Tx{
109		FromIdx:     2,
110		ToIdx:       3,
111		Amount:      big.NewInt(4),
112		TokenID:     5,
113		Nonce:       6,
114		ToBJJ:       sk.Public(),
115		RqToEthAddr: ethAddr,
116		RqToBJJ:     sk.Public(),
117	}
118	toSign, err := tx.HashToSign()
119	assert.Nil(t, err)
120	assert.Equal(t, "14526446928649310956370997581245770629723313742905751117262272426489782809503", toSign.String())
121
122	sig := sk.SignPoseidon(toSign)
123	tx.Signature = sig
124	assert.True(t, tx.VerifySignature(sk.Public()))
125}