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	tx := PoolL2Tx{
 31		FromIdx: 2,
 32		ToIdx:   3,
 33		Amount:  big.NewInt(4),
 34		TokenID: 5,
 35		Nonce:   6,
 36		ToBJJ:   sk.Public(),
 37	}
 38	txCompressedData, err := tx.TxCompressedData()
 39	assert.Nil(t, err)
 40	// test vector value generated from javascript implementation
 41	expectedStr := "1766847064778421992193717128424891165872736891548909569553540449389241871"
 42	assert.Equal(t, expectedStr, txCompressedData.String())
 43	assert.Equal(t, "010000000000060000000500040000000000030000000000020001c60be60f", hex.EncodeToString(txCompressedData.Bytes()))
 44	tx = PoolL2Tx{
 45		RqFromIdx: 7,
 46		RqToIdx:   8,
 47		RqAmount:  big.NewInt(9),
 48		RqTokenID: 10,
 49		RqNonce:   11,
 50		RqFee:     12,
 51		RqToBJJ:   sk.Public(),
 52	}
 53	txCompressedData, err = tx.RqTxCompressedDataV2()
 54	assert.Nil(t, err)
 55	// test vector value generated from javascript implementation
 56	expectedStr = "6571340879233176732837827812956721483162819083004853354503"
 57	assert.Equal(t, expectedStr, txCompressedData.String())
 58	assert.Equal(t, "010c000000000b0000000a0009000000000008000000000007", hex.EncodeToString(txCompressedData.Bytes()))
 59}
 60
 61func TestTxCompressedDataV2(t *testing.T) {
 62	var sk babyjub.PrivateKey
 63	_, err := hex.Decode(sk[:], []byte("0001020304050607080900010203040506070809000102030405060708090001"))
 64	assert.Nil(t, err)
 65	tx := PoolL2Tx{
 66		FromIdx: 7,
 67		ToIdx:   8,
 68		Amount:  big.NewInt(9),
 69		TokenID: 10,
 70		Nonce:   11,
 71		Fee:     12,
 72		ToBJJ:   sk.Public(),
 73	}
 74	txCompressedData, err := tx.TxCompressedDataV2()
 75	assert.Nil(t, err)
 76	// test vector value generated from javascript implementation
 77	expectedStr := "6571340879233176732837827812956721483162819083004853354503"
 78	assert.Equal(t, expectedStr, txCompressedData.String())
 79	expected, ok := new(big.Int).SetString(expectedStr, 10)
 80	assert.True(t, ok)
 81
 82	assert.Equal(t, expected.Bytes(), txCompressedData.Bytes())
 83	assert.Equal(t, "010c000000000b0000000a0009000000000008000000000007", hex.EncodeToString(txCompressedData.Bytes()))
 84}
 85
 86func TestRqTxCompressedDataV2(t *testing.T) {
 87	var sk babyjub.PrivateKey
 88	_, err := hex.Decode(sk[:], []byte("0001020304050607080900010203040506070809000102030405060708090001"))
 89	assert.Nil(t, err)
 90	tx := PoolL2Tx{
 91		RqFromIdx: 7,
 92		RqToIdx:   8,
 93		RqAmount:  big.NewInt(9),
 94		RqTokenID: 10,
 95		RqNonce:   11,
 96		RqFee:     12,
 97		RqToBJJ:   sk.Public(),
 98	}
 99	txCompressedData, err := tx.RqTxCompressedDataV2()
100	assert.Nil(t, err)
101	// test vector value generated from javascript implementation
102	expectedStr := "6571340879233176732837827812956721483162819083004853354503"
103	assert.Equal(t, expectedStr, txCompressedData.String())
104	expected, ok := new(big.Int).SetString(expectedStr, 10)
105	assert.True(t, ok)
106	assert.Equal(t, expected.Bytes(), txCompressedData.Bytes())
107	assert.Equal(t, "010c000000000b0000000a0009000000000008000000000007", hex.EncodeToString(txCompressedData.Bytes()))
108}
109
110func TestHashToSign(t *testing.T) {
111	var sk babyjub.PrivateKey
112	_, err := hex.Decode(sk[:], []byte("0001020304050607080900010203040506070809000102030405060708090001"))
113	assert.Nil(t, err)
114	tx := PoolL2Tx{
115		FromIdx:     2,
116		ToIdx:       3,
117		Amount:      big.NewInt(4),
118		TokenID:     5,
119		Nonce:       6,
120		ToBJJ:       sk.Public(),
121		RqToEthAddr: ethCommon.HexToAddress("0xc58d29fA6e86E4FAe04DDcEd660d45BCf3Cb2370"),
122		RqToBJJ:     sk.Public(),
123	}
124	toSign, err := tx.HashToSign()
125	assert.Nil(t, err)
126	assert.Equal(t, "13412877307445712067533842795279849753265998687662992184595695642580679868064", toSign.String())
127}
128
129func TestVerifyTxSignature(t *testing.T) {
130	var sk babyjub.PrivateKey
131	_, err := hex.Decode(sk[:], []byte("0001020304050607080900010203040506070809000102030405060708090001"))
132	assert.Nil(t, err)
133	tx := PoolL2Tx{
134		FromIdx:     2,
135		ToIdx:       3,
136		Amount:      big.NewInt(4),
137		TokenID:     5,
138		Nonce:       6,
139		ToBJJ:       sk.Public(),
140		RqToEthAddr: ethCommon.HexToAddress("0xc58d29fA6e86E4FAe04DDcEd660d45BCf3Cb2370"),
141		RqToBJJ:     sk.Public(),
142	}
143	toSign, err := tx.HashToSign()
144	assert.Nil(t, err)
145	assert.Equal(t, "13412877307445712067533842795279849753265998687662992184595695642580679868064", toSign.String())
146
147	sig := sk.SignPoseidon(toSign)
148	tx.Signature = sig.Compress()
149	assert.True(t, tx.VerifySignature(sk.Public()))
150}