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, "0100000000", hex.EncodeToString(nBytes[:]))
19 n2, err := NonceFromBytes(nBytes)
20 assert.Nil(t, err)
21 assert.Equal(t, n, n2)
22
23 // value before overflow
24 n = Nonce(1099511627775)
25 nBytes, err = n.Bytes()
26 assert.Nil(t, err)
27 assert.Equal(t, 5, len(nBytes))
28 assert.Equal(t, "ffffffffff", hex.EncodeToString(nBytes[:]))
29 n2, err = NonceFromBytes(nBytes)
30 assert.Nil(t, err)
31 assert.Equal(t, n, n2)
32
33 // expect value overflow
34 n = Nonce(1099511627776)
35 nBytes, err = n.Bytes()
36 assert.NotNil(t, err)
37 assert.Equal(t, ErrNonceOverflow, err)
38 _, err = NonceFromBytes(nBytes)
39 assert.Nil(t, err)
40}
41
42func TestTxCompressedData(t *testing.T) {
43 var sk babyjub.PrivateKey
44 _, err := hex.Decode(sk[:], []byte("0001020304050607080900010203040506070809000102030405060708090001"))
45 assert.Nil(t, err)
46
47 tx := PoolL2Tx{
48 FromIdx: 2,
49 ToIdx: 3,
50 Amount: big.NewInt(4),
51 TokenID: 5,
52 Nonce: 6,
53 ToBJJ: sk.Public(),
54 }
55 txCompressedData, err := tx.TxCompressedData()
56 assert.Nil(t, err)
57 // test vector value generated from javascript implementation
58 assert.Equal(t, "1766847064778421992193717128424891165872736891548909569553540449389241871", txCompressedData.String())
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 assert.Equal(t, "6571340879233176732837827812956721483162819083004853354503", txCompressedData.String())
74 assert.Equal(t, "10c000000000b0000000a0009000000000008000000000007", hex.EncodeToString(txCompressedData.Bytes())[1:])
75
76}
77
78func TestHashToSign(t *testing.T) {
79 var sk babyjub.PrivateKey
80 _, err := hex.Decode(sk[:], []byte("0001020304050607080900010203040506070809000102030405060708090001"))
81 assert.Nil(t, err)
82 ethAddr := ethCommon.HexToAddress("0xc58d29fA6e86E4FAe04DDcEd660d45BCf3Cb2370")
83
84 tx := PoolL2Tx{
85 FromIdx: 2,
86 ToIdx: 3,
87 Amount: big.NewInt(4),
88 TokenID: 5,
89 Nonce: 6,
90 ToBJJ: sk.Public(),
91 RqToEthAddr: ethAddr,
92 RqToBJJ: sk.Public(),
93 }
94 toSign, err := tx.HashToSign()
95 assert.Nil(t, err)
96 assert.Equal(t, "14526446928649310956370997581245770629723313742905751117262272426489782809503", toSign.String())
97}
98
99func TestVerifyTxSignature(t *testing.T) {
100 var sk babyjub.PrivateKey
101 _, err := hex.Decode(sk[:], []byte("0001020304050607080900010203040506070809000102030405060708090001"))
102 assert.Nil(t, err)
103 ethAddr := ethCommon.HexToAddress("0xc58d29fA6e86E4FAe04DDcEd660d45BCf3Cb2370")
104
105 tx := PoolL2Tx{
106 FromIdx: 2,
107 ToIdx: 3,
108 Amount: big.NewInt(4),
109 TokenID: 5,
110 Nonce: 6,
111 ToBJJ: sk.Public(),
112 RqToEthAddr: ethAddr,
113 RqToBJJ: sk.Public(),
114 }
115 toSign, err := tx.HashToSign()
116 assert.Nil(t, err)
117 assert.Equal(t, "14526446928649310956370997581245770629723313742905751117262272426489782809503", toSign.String())
118
119 sig := sk.SignPoseidon(toSign)
120 tx.Signature = sig
121 assert.True(t, tx.VerifySignature(sk.Public()))
122}