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}