2020-08-04 14:40:00 -07:00
|
|
|
package vaa
|
|
|
|
|
|
|
|
import (
|
2020-08-14 13:45:45 -07:00
|
|
|
"crypto/ecdsa"
|
|
|
|
"crypto/rand"
|
2020-08-05 04:12:54 -07:00
|
|
|
"encoding/hex"
|
2020-08-04 14:40:00 -07:00
|
|
|
"github.com/ethereum/go-ethereum/common"
|
2020-08-14 13:45:45 -07:00
|
|
|
"github.com/ethereum/go-ethereum/crypto"
|
2020-08-04 14:40:00 -07:00
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"testing"
|
|
|
|
"time"
|
|
|
|
)
|
|
|
|
|
|
|
|
func TestSerializeDeserialize(t *testing.T) {
|
|
|
|
tests := []struct {
|
|
|
|
name string
|
|
|
|
vaa *VAA
|
|
|
|
}{
|
|
|
|
{
|
2021-07-09 05:56:52 -07:00
|
|
|
name: "NormalVAA",
|
2020-08-04 14:40:00 -07:00
|
|
|
vaa: &VAA{
|
2020-08-05 03:28:44 -07:00
|
|
|
Version: 1,
|
2020-08-04 14:40:00 -07:00
|
|
|
GuardianSetIndex: 9,
|
2020-08-14 13:45:45 -07:00
|
|
|
Signatures: []*Signature{
|
|
|
|
{
|
|
|
|
Index: 1,
|
|
|
|
Signature: [65]byte{},
|
|
|
|
},
|
2020-08-04 14:40:00 -07:00
|
|
|
},
|
2021-07-09 05:56:52 -07:00
|
|
|
Timestamp: time.Unix(2837, 0),
|
|
|
|
Nonce: 10,
|
|
|
|
Sequence: 3,
|
|
|
|
ConsistencyLevel: 5,
|
|
|
|
EmitterChain: 8,
|
|
|
|
EmitterAddress: Address{1, 2, 3},
|
|
|
|
Payload: []byte("abc"),
|
2021-01-19 04:01:45 -08:00
|
|
|
},
|
|
|
|
},
|
2020-08-04 14:40:00 -07:00
|
|
|
}
|
|
|
|
for _, test := range tests {
|
|
|
|
t.Run(test.name, func(t *testing.T) {
|
|
|
|
|
2020-08-19 07:41:25 -07:00
|
|
|
vaaData, err := test.vaa.Marshal()
|
2020-08-04 14:40:00 -07:00
|
|
|
require.NoError(t, err)
|
|
|
|
|
2020-08-05 04:12:54 -07:00
|
|
|
println(hex.EncodeToString(vaaData))
|
2020-08-19 07:41:25 -07:00
|
|
|
vaaParsed, err := Unmarshal(vaaData)
|
2020-08-04 14:40:00 -07:00
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
require.EqualValues(t, test.vaa, vaaParsed)
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
2020-08-05 01:48:43 -07:00
|
|
|
|
|
|
|
func TestVerifySignature(t *testing.T) {
|
|
|
|
v := &VAA{
|
|
|
|
Version: 8,
|
|
|
|
GuardianSetIndex: 9,
|
|
|
|
Timestamp: time.Unix(2837, 0),
|
2021-07-09 05:56:52 -07:00
|
|
|
Nonce: 5,
|
|
|
|
Sequence: 10,
|
|
|
|
ConsistencyLevel: 2,
|
|
|
|
EmitterChain: 2,
|
|
|
|
EmitterAddress: Address{0, 1, 2, 3, 4},
|
|
|
|
Payload: []byte("abcd"),
|
2020-08-05 01:48:43 -07:00
|
|
|
}
|
|
|
|
|
2020-08-14 13:45:45 -07:00
|
|
|
data, err := v.SigningMsg()
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
key, err := ecdsa.GenerateKey(crypto.S256(), rand.Reader)
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
sig, err := crypto.Sign(data.Bytes(), key)
|
|
|
|
require.NoError(t, err)
|
|
|
|
sigData := [65]byte{}
|
|
|
|
copy(sigData[:], sig)
|
|
|
|
|
|
|
|
v.Signatures = append(v.Signatures, &Signature{
|
|
|
|
Index: 0,
|
|
|
|
Signature: sigData,
|
|
|
|
})
|
|
|
|
addr := crypto.PubkeyToAddress(key.PublicKey)
|
|
|
|
require.True(t, v.VerifySignatures([]common.Address{
|
|
|
|
addr,
|
|
|
|
}))
|
2020-08-05 01:48:43 -07:00
|
|
|
}
|
2021-09-30 07:58:54 -07:00
|
|
|
|
|
|
|
func TestBodyRegisterChain_Serialize(t *testing.T) {
|
|
|
|
header, _ := hex.DecodeString("000000000000000000000000000000000000000000546f6b656e427269646765")
|
|
|
|
require.Len(t, header, 32)
|
|
|
|
|
|
|
|
var headerB [32]byte
|
|
|
|
copy(headerB[:], header)
|
|
|
|
msg := &BodyRegisterChain{
|
|
|
|
Header: headerB,
|
|
|
|
ChainID: 8,
|
|
|
|
EmitterAddress: Address{1, 2, 3, 4},
|
|
|
|
}
|
|
|
|
|
|
|
|
data := msg.Serialize()
|
|
|
|
require.Equal(t, "000000000000000000000000000000000000000000546f6b656e42726964676501000000080102030400000000000000000000000000000000000000000000000000000000", hex.EncodeToString(data))
|
|
|
|
}
|