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 TestNewPoolL2Tx(t *testing.T) {
 14	poolL2Tx := &PoolL2Tx{
 15		FromIdx: 87654,
 16		ToIdx:   300,
 17		Amount:  big.NewInt(4),
 18		TokenID: 5,
 19		Nonce:   144,
 20	}
 21	poolL2Tx, err := NewPoolL2Tx(poolL2Tx)
 22	assert.Nil(t, err)
 23	assert.Equal(t, "0x020000000156660000000090", poolL2Tx.TxID.String())
 24}
 25
 26func TestTxCompressedData(t *testing.T) {
 27	var sk babyjub.PrivateKey
 28	_, err := hex.Decode(sk[:], []byte("0001020304050607080900010203040506070809000102030405060708090001"))
 29	assert.Nil(t, err)
 30
 31	tx := PoolL2Tx{
 32		FromIdx: 2,
 33		ToIdx:   3,
 34		Amount:  big.NewInt(4),
 35		TokenID: 5,
 36		Nonce:   6,
 37		ToBJJ:   sk.Public(),
 38	}
 39	txCompressedData, err := tx.TxCompressedData()
 40	assert.Nil(t, err)
 41	// test vector value generated from javascript implementation
 42	expectedStr := "1766847064778421992193717128424891165872736891548909569553540449389241871"
 43	assert.Equal(t, expectedStr, txCompressedData.String())
 44	expected, ok := new(big.Int).SetString(expectedStr, 10)
 45	assert.True(t, ok)
 46	assert.Equal(t, expected.Bytes(), txCompressedData.Bytes())
 47	assert.Equal(t, "10000000000060000000500040000000000030000000000020001c60be60f", hex.EncodeToString(txCompressedData.Bytes())[1:])
 48
 49	tx = PoolL2Tx{
 50		FromIdx: 7,
 51		ToIdx:   8,
 52		Amount:  big.NewInt(9),
 53		TokenID: 10,
 54		Nonce:   11,
 55		Fee:     12,
 56		ToBJJ:   sk.Public(),
 57	}
 58	txCompressedData, err = tx.TxCompressedDataV2()
 59	assert.Nil(t, err)
 60	// test vector value generated from javascript implementation
 61	expectedStr = "6571340879233176732837827812956721483162819083004853354503"
 62	assert.Equal(t, expectedStr, txCompressedData.String())
 63	expected, ok = new(big.Int).SetString(expectedStr, 10)
 64	assert.True(t, ok)
 65	assert.Equal(t, expected.Bytes(), txCompressedData.Bytes())
 66	assert.Equal(t, "10c000000000b0000000a0009000000000008000000000007", hex.EncodeToString(txCompressedData.Bytes())[1:])
 67}
 68
 69func TestHashToSign(t *testing.T) {
 70	var sk babyjub.PrivateKey
 71	_, err := hex.Decode(sk[:], []byte("0001020304050607080900010203040506070809000102030405060708090001"))
 72	assert.Nil(t, err)
 73	ethAddr := ethCommon.HexToAddress("0xc58d29fA6e86E4FAe04DDcEd660d45BCf3Cb2370")
 74
 75	tx := PoolL2Tx{
 76		FromIdx:     2,
 77		ToIdx:       3,
 78		Amount:      big.NewInt(4),
 79		TokenID:     5,
 80		Nonce:       6,
 81		ToBJJ:       sk.Public(),
 82		RqToEthAddr: ethAddr,
 83		RqToBJJ:     sk.Public(),
 84	}
 85	toSign, err := tx.HashToSign()
 86	assert.Nil(t, err)
 87	assert.Equal(t, "14526446928649310956370997581245770629723313742905751117262272426489782809503", toSign.String())
 88}
 89
 90func TestVerifyTxSignature(t *testing.T) {
 91	var sk babyjub.PrivateKey
 92	_, err := hex.Decode(sk[:], []byte("0001020304050607080900010203040506070809000102030405060708090001"))
 93	assert.Nil(t, err)
 94	ethAddr := ethCommon.HexToAddress("0xc58d29fA6e86E4FAe04DDcEd660d45BCf3Cb2370")
 95
 96	tx := PoolL2Tx{
 97		FromIdx:     2,
 98		ToIdx:       3,
 99		Amount:      big.NewInt(4),
100		TokenID:     5,
101		Nonce:       6,
102		ToBJJ:       sk.Public(),
103		RqToEthAddr: ethAddr,
104		RqToBJJ:     sk.Public(),
105	}
106	toSign, err := tx.HashToSign()
107	assert.Nil(t, err)
108	assert.Equal(t, "14526446928649310956370997581245770629723313742905751117262272426489782809503", toSign.String())
109
110	sig := sk.SignPoseidon(toSign)
111	tx.Signature = sig
112	assert.True(t, tx.VerifySignature(sk.Public()))
113}