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