engine_test.go 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. package ibftengine
  2. import (
  3. "bytes"
  4. "reflect"
  5. "testing"
  6. "github.com/ethereum/go-ethereum/common"
  7. "github.com/ethereum/go-ethereum/common/hexutil"
  8. "github.com/ethereum/go-ethereum/consensus/istanbul"
  9. istanbulcommon "github.com/ethereum/go-ethereum/consensus/istanbul/common"
  10. "github.com/ethereum/go-ethereum/core/types"
  11. "github.com/stretchr/testify/assert"
  12. "github.com/stretchr/testify/require"
  13. )
  14. func TestEngine(t *testing.T) {
  15. engine := NewEngine(nil, common.Address{}, nil)
  16. require.NotNil(t, engine, "Constructor")
  17. assert.Implements(t, new(istanbul.Engine), engine)
  18. }
  19. func TestPrepareExtra(t *testing.T) {
  20. validators := make([]common.Address, 4)
  21. validators[0] = common.BytesToAddress(hexutil.MustDecode("0x44add0ec310f115a0e603b2d7db9f067778eaf8a"))
  22. validators[1] = common.BytesToAddress(hexutil.MustDecode("0x294fc7e8f22b3bcdcf955dd7ff3ba2ed833f8212"))
  23. validators[2] = common.BytesToAddress(hexutil.MustDecode("0x6beaaed781d2d2ab6350f5c4566a2c6eaac407a6"))
  24. validators[3] = common.BytesToAddress(hexutil.MustDecode("0x8be76812f765c24641ec63dc2852b378aba2b440"))
  25. vanity := make([]byte, types.IstanbulExtraVanity)
  26. expectedResult := append(vanity, hexutil.MustDecode("0xf858f8549444add0ec310f115a0e603b2d7db9f067778eaf8a94294fc7e8f22b3bcdcf955dd7ff3ba2ed833f8212946beaaed781d2d2ab6350f5c4566a2c6eaac407a6948be76812f765c24641ec63dc2852b378aba2b44080c0")...)
  27. h := &types.Header{
  28. Extra: vanity,
  29. }
  30. payload, err := prepareExtra(h, validators)
  31. if err != nil {
  32. t.Errorf("error mismatch: have %v, want: nil", err)
  33. }
  34. if !reflect.DeepEqual(payload, expectedResult) {
  35. t.Errorf("payload mismatch: have %v, want %v", payload, expectedResult)
  36. }
  37. // append useless information to extra-data
  38. h.Extra = append(vanity, make([]byte, 15)...)
  39. payload, _ = prepareExtra(h, validators)
  40. if !reflect.DeepEqual(payload, expectedResult) {
  41. t.Errorf("payload mismatch: have %v, want %v", payload, expectedResult)
  42. }
  43. }
  44. func TestWriteSeal(t *testing.T) {
  45. vanity := bytes.Repeat([]byte{0x00}, types.IstanbulExtraVanity)
  46. istRawData := hexutil.MustDecode("0xf858f8549444add0ec310f115a0e603b2d7db9f067778eaf8a94294fc7e8f22b3bcdcf955dd7ff3ba2ed833f8212946beaaed781d2d2ab6350f5c4566a2c6eaac407a6948be76812f765c24641ec63dc2852b378aba2b44080c0")
  47. expectedSeal := append([]byte{1, 2, 3}, bytes.Repeat([]byte{0x00}, types.IstanbulExtraSeal-3)...)
  48. expectedIstExtra := &types.IstanbulExtra{
  49. Validators: []common.Address{
  50. common.BytesToAddress(hexutil.MustDecode("0x44add0ec310f115a0e603b2d7db9f067778eaf8a")),
  51. common.BytesToAddress(hexutil.MustDecode("0x294fc7e8f22b3bcdcf955dd7ff3ba2ed833f8212")),
  52. common.BytesToAddress(hexutil.MustDecode("0x6beaaed781d2d2ab6350f5c4566a2c6eaac407a6")),
  53. common.BytesToAddress(hexutil.MustDecode("0x8be76812f765c24641ec63dc2852b378aba2b440")),
  54. },
  55. Seal: expectedSeal,
  56. CommittedSeal: [][]byte{},
  57. }
  58. var expectedErr error
  59. h := &types.Header{
  60. Extra: append(vanity, istRawData...),
  61. }
  62. // normal case
  63. err := writeSeal(h, expectedSeal)
  64. if err != expectedErr {
  65. t.Errorf("error mismatch: have %v, want %v", err, expectedErr)
  66. }
  67. // verify istanbul extra-data
  68. istExtra, err := types.ExtractIstanbulExtra(h)
  69. if err != nil {
  70. t.Errorf("error mismatch: have %v, want nil", err)
  71. }
  72. if !reflect.DeepEqual(istExtra, expectedIstExtra) {
  73. t.Errorf("extra data mismatch: have %v, want %v", istExtra, expectedIstExtra)
  74. }
  75. // invalid seal
  76. unexpectedSeal := append(expectedSeal, make([]byte, 1)...)
  77. err = writeSeal(h, unexpectedSeal)
  78. if err != istanbulcommon.ErrInvalidSignature {
  79. t.Errorf("error mismatch: have %v, want %v", err, istanbulcommon.ErrInvalidSignature)
  80. }
  81. }
  82. func TestWriteCommittedSeals(t *testing.T) {
  83. vanity := bytes.Repeat([]byte{0x00}, types.IstanbulExtraVanity)
  84. istRawData := hexutil.MustDecode("0xf858f8549444add0ec310f115a0e603b2d7db9f067778eaf8a94294fc7e8f22b3bcdcf955dd7ff3ba2ed833f8212946beaaed781d2d2ab6350f5c4566a2c6eaac407a6948be76812f765c24641ec63dc2852b378aba2b44080c0")
  85. expectedCommittedSeal := append([]byte{1, 2, 3}, bytes.Repeat([]byte{0x00}, types.IstanbulExtraSeal-3)...)
  86. expectedIstExtra := &types.IstanbulExtra{
  87. Validators: []common.Address{
  88. common.BytesToAddress(hexutil.MustDecode("0x44add0ec310f115a0e603b2d7db9f067778eaf8a")),
  89. common.BytesToAddress(hexutil.MustDecode("0x294fc7e8f22b3bcdcf955dd7ff3ba2ed833f8212")),
  90. common.BytesToAddress(hexutil.MustDecode("0x6beaaed781d2d2ab6350f5c4566a2c6eaac407a6")),
  91. common.BytesToAddress(hexutil.MustDecode("0x8be76812f765c24641ec63dc2852b378aba2b440")),
  92. },
  93. Seal: []byte{},
  94. CommittedSeal: [][]byte{expectedCommittedSeal},
  95. }
  96. var expectedErr error
  97. h := &types.Header{
  98. Extra: append(vanity, istRawData...),
  99. }
  100. // normal case
  101. err := writeCommittedSeals(h, [][]byte{expectedCommittedSeal})
  102. if err != expectedErr {
  103. t.Errorf("error mismatch: have %v, want %v", err, expectedErr)
  104. }
  105. // verify istanbul extra-data
  106. istExtra, err := types.ExtractIstanbulExtra(h)
  107. if err != nil {
  108. t.Errorf("error mismatch: have %v, want nil", err)
  109. }
  110. if !reflect.DeepEqual(istExtra, expectedIstExtra) {
  111. t.Errorf("extra data mismatch: have %v, want %v", istExtra, expectedIstExtra)
  112. }
  113. // invalid seal
  114. unexpectedCommittedSeal := append(expectedCommittedSeal, make([]byte, 1)...)
  115. err = writeCommittedSeals(h, [][]byte{unexpectedCommittedSeal})
  116. if err != istanbulcommon.ErrInvalidCommittedSeals {
  117. t.Errorf("error mismatch: have %v, want %v", err, istanbulcommon.ErrInvalidCommittedSeals)
  118. }
  119. }