observation_test.go 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. package processor
  2. import (
  3. "crypto/ecdsa"
  4. "crypto/rand"
  5. "testing"
  6. "time"
  7. "github.com/certusone/wormhole/node/pkg/common"
  8. gossipv1 "github.com/certusone/wormhole/node/pkg/proto/gossip/v1"
  9. ethcommon "github.com/ethereum/go-ethereum/common"
  10. "github.com/ethereum/go-ethereum/crypto"
  11. "github.com/stretchr/testify/assert"
  12. "github.com/wormhole-foundation/wormhole/sdk/vaa"
  13. "go.uber.org/zap"
  14. "go.uber.org/zap/zaptest/observer"
  15. )
  16. func getVAA() vaa.VAA {
  17. var payload = []byte{97, 97, 97, 97, 97, 97}
  18. var governanceEmitter = vaa.Address{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4}
  19. return vaa.VAA{
  20. Version: uint8(1),
  21. GuardianSetIndex: uint32(1),
  22. Signatures: nil,
  23. Timestamp: time.Unix(0, 0),
  24. Nonce: uint32(1),
  25. Sequence: uint64(1),
  26. ConsistencyLevel: uint8(32),
  27. EmitterChain: vaa.ChainIDSolana,
  28. EmitterAddress: governanceEmitter,
  29. Payload: payload,
  30. }
  31. }
  32. func TestHandleInboundSignedVAAWithQuorum_NilGuardianSet(t *testing.T) {
  33. testVAA := getVAA()
  34. marshalVAA, _ := testVAA.Marshal()
  35. // Stub out the minimum to get processor to dance
  36. observedZapCore, observedLogs := observer.New(zap.InfoLevel)
  37. observedLogger := zap.New(observedZapCore)
  38. signedVAAWithQuorum := &gossipv1.SignedVAAWithQuorum{Vaa: marshalVAA}
  39. processor := Processor{}
  40. processor.logger = observedLogger
  41. processor.handleInboundSignedVAAWithQuorum(signedVAAWithQuorum)
  42. // Check to see if we got an error, which we should have,
  43. // because a `gs` is not defined on processor
  44. assert.Equal(t, 1, observedLogs.Len())
  45. firstLog := observedLogs.All()[0]
  46. errorString := "dropping SignedVAAWithQuorum message since we haven't initialized our guardian set yet"
  47. assert.Equal(t, errorString, firstLog.Message)
  48. }
  49. func TestHandleInboundSignedVAAWithQuorum(t *testing.T) {
  50. goodPrivateKey1, _ := ecdsa.GenerateKey(crypto.S256(), rand.Reader)
  51. goodAddr1 := crypto.PubkeyToAddress(goodPrivateKey1.PublicKey)
  52. badPrivateKey1, _ := ecdsa.GenerateKey(crypto.S256(), rand.Reader)
  53. tests := []struct {
  54. label string
  55. keyOrder []*ecdsa.PrivateKey
  56. indexOrder []uint8
  57. addrs []ethcommon.Address
  58. errString string
  59. }{
  60. {label: "GuardianSetNoKeys", keyOrder: []*ecdsa.PrivateKey{}, indexOrder: []uint8{}, addrs: []ethcommon.Address{},
  61. errString: "dropping SignedVAAWithQuorum message since we have a guardian set without keys"},
  62. {label: "VAANoSignatures", keyOrder: []*ecdsa.PrivateKey{}, indexOrder: []uint8{0}, addrs: []ethcommon.Address{goodAddr1},
  63. errString: "dropping SignedVAAWithQuorum message because it failed verification: VAA was not signed"},
  64. {label: "VAAInvalidSignatures", keyOrder: []*ecdsa.PrivateKey{badPrivateKey1}, indexOrder: []uint8{0}, addrs: []ethcommon.Address{goodAddr1},
  65. errString: "dropping SignedVAAWithQuorum message because it failed verification: VAA had bad signatures"},
  66. {label: "DuplicateGoodSignaturesNonMonotonic", keyOrder: []*ecdsa.PrivateKey{goodPrivateKey1, goodPrivateKey1, goodPrivateKey1, goodPrivateKey1}, indexOrder: []uint8{0, 0, 0, 0}, addrs: []ethcommon.Address{goodAddr1},
  67. errString: "dropping SignedVAAWithQuorum message because it failed verification: VAA had bad signatures"},
  68. {label: "DuplicateGoodSignaturesMonotonic", keyOrder: []*ecdsa.PrivateKey{goodPrivateKey1, goodPrivateKey1, goodPrivateKey1, goodPrivateKey1}, indexOrder: []uint8{0, 1, 2, 3}, addrs: []ethcommon.Address{goodAddr1},
  69. errString: "dropping SignedVAAWithQuorum message because it failed verification: VAA had bad signatures"},
  70. }
  71. for _, tc := range tests {
  72. t.Run(tc.label, func(t *testing.T) {
  73. testVAA := getVAA()
  74. // Define a GuardianSet from test addrs
  75. guardianSet := common.GuardianSet{
  76. Keys: tc.addrs,
  77. Index: 1,
  78. }
  79. // Sign with the keys at the proper index
  80. for i, key := range tc.keyOrder {
  81. testVAA.AddSignature(key, tc.indexOrder[i])
  82. }
  83. marshalVAA, err := testVAA.Marshal()
  84. if err != nil {
  85. panic(err)
  86. }
  87. // Stub out the minimum to get processor to dance
  88. observedZapCore, observedLogs := observer.New(zap.InfoLevel)
  89. observedLogger := zap.New(observedZapCore)
  90. signedVAAWithQuorum := &gossipv1.SignedVAAWithQuorum{Vaa: marshalVAA}
  91. processor := Processor{}
  92. processor.gs = &guardianSet
  93. processor.logger = observedLogger
  94. processor.handleInboundSignedVAAWithQuorum(signedVAAWithQuorum)
  95. // Check to see if we got an error, which we should have
  96. assert.Equal(t, 1, observedLogs.Len())
  97. firstLog := observedLogs.All()[0]
  98. assert.Equal(t, tc.errString, firstLog.Message)
  99. })
  100. }
  101. }