engine_test.go 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. package qbftengine
  2. import (
  3. "bytes"
  4. "math/big"
  5. "reflect"
  6. "testing"
  7. "github.com/ethereum/go-ethereum/common"
  8. "github.com/ethereum/go-ethereum/common/hexutil"
  9. istanbulcommon "github.com/ethereum/go-ethereum/consensus/istanbul/common"
  10. "github.com/ethereum/go-ethereum/core/types"
  11. )
  12. func TestPrepareExtra(t *testing.T) {
  13. validators := make([]common.Address, 4)
  14. validators[0] = common.BytesToAddress(hexutil.MustDecode("0x44add0ec310f115a0e603b2d7db9f067778eaf8a"))
  15. validators[1] = common.BytesToAddress(hexutil.MustDecode("0x294fc7e8f22b3bcdcf955dd7ff3ba2ed833f8212"))
  16. validators[2] = common.BytesToAddress(hexutil.MustDecode("0x6beaaed781d2d2ab6350f5c4566a2c6eaac407a6"))
  17. validators[3] = common.BytesToAddress(hexutil.MustDecode("0x8be76812f765c24641ec63dc2852b378aba2b440"))
  18. expectedResult := hexutil.MustDecode("0xf87aa00000000000000000000000000000000000000000000000000000000000000000f8549444add0ec310f115a0e603b2d7db9f067778eaf8a94294fc7e8f22b3bcdcf955dd7ff3ba2ed833f8212946beaaed781d2d2ab6350f5c4566a2c6eaac407a6948be76812f765c24641ec63dc2852b378aba2b440c080c0")
  19. h := &types.Header{}
  20. err := ApplyHeaderQBFTExtra(
  21. h,
  22. WriteValidators(validators),
  23. )
  24. if err != nil {
  25. t.Errorf("error mismatch: have %v, want: nil", err)
  26. }
  27. if !reflect.DeepEqual(h.Extra, expectedResult) {
  28. t.Errorf("payload mismatch: have %v, want %v", h.Extra, expectedResult)
  29. }
  30. }
  31. func TestWriteCommittedSeals(t *testing.T) {
  32. istRawData := hexutil.MustDecode("0xf85a80f8549444add0ec310f115a0e603b2d7db9f067778eaf8a94294fc7e8f22b3bcdcf955dd7ff3ba2ed833f8212946beaaed781d2d2ab6350f5c4566a2c6eaac407a6948be76812f765c24641ec63dc2852b378aba2b440c080c0")
  33. expectedCommittedSeal := append([]byte{1, 2, 3}, bytes.Repeat([]byte{0x00}, types.IstanbulExtraSeal-3)...)
  34. expectedIstExtra := &types.QBFTExtra{
  35. VanityData: []byte{},
  36. Validators: []common.Address{
  37. common.BytesToAddress(hexutil.MustDecode("0x44add0ec310f115a0e603b2d7db9f067778eaf8a")),
  38. common.BytesToAddress(hexutil.MustDecode("0x294fc7e8f22b3bcdcf955dd7ff3ba2ed833f8212")),
  39. common.BytesToAddress(hexutil.MustDecode("0x6beaaed781d2d2ab6350f5c4566a2c6eaac407a6")),
  40. common.BytesToAddress(hexutil.MustDecode("0x8be76812f765c24641ec63dc2852b378aba2b440")),
  41. },
  42. CommittedSeal: [][]byte{expectedCommittedSeal},
  43. Round: 0,
  44. Vote: nil,
  45. }
  46. h := &types.Header{
  47. Extra: istRawData,
  48. }
  49. // normal case
  50. err := ApplyHeaderQBFTExtra(
  51. h,
  52. writeCommittedSeals([][]byte{expectedCommittedSeal}),
  53. )
  54. if err != nil {
  55. t.Errorf("error mismatch: have %v, want: nil", err)
  56. }
  57. // verify istanbul extra-data
  58. istExtra, err := getExtra(h)
  59. if err != nil {
  60. t.Errorf("error mismatch: have %v, want nil", err)
  61. }
  62. if !reflect.DeepEqual(istExtra, expectedIstExtra) {
  63. t.Errorf("extra data mismatch: have %v, want %v", istExtra, expectedIstExtra)
  64. }
  65. // invalid seal
  66. unexpectedCommittedSeal := append(expectedCommittedSeal, make([]byte, 1)...)
  67. err = ApplyHeaderQBFTExtra(
  68. h,
  69. writeCommittedSeals([][]byte{unexpectedCommittedSeal}),
  70. )
  71. if err != istanbulcommon.ErrInvalidCommittedSeals {
  72. t.Errorf("error mismatch: have %v, want %v", err, istanbulcommon.ErrInvalidCommittedSeals)
  73. }
  74. }
  75. func TestWriteRoundNumber(t *testing.T) {
  76. istRawData := hexutil.MustDecode("0xf85a80f8549444add0ec310f115a0e603b2d7db9f067778eaf8a94294fc7e8f22b3bcdcf955dd7ff3ba2ed833f8212946beaaed781d2d2ab6350f5c4566a2c6eaac407a6948be76812f765c24641ec63dc2852b378aba2b440c005c0")
  77. expectedIstExtra := &types.QBFTExtra{
  78. VanityData: []byte{},
  79. Validators: []common.Address{
  80. common.BytesToAddress(hexutil.MustDecode("0x44add0ec310f115a0e603b2d7db9f067778eaf8a")),
  81. common.BytesToAddress(hexutil.MustDecode("0x294fc7e8f22b3bcdcf955dd7ff3ba2ed833f8212")),
  82. common.BytesToAddress(hexutil.MustDecode("0x6beaaed781d2d2ab6350f5c4566a2c6eaac407a6")),
  83. common.BytesToAddress(hexutil.MustDecode("0x8be76812f765c24641ec63dc2852b378aba2b440")),
  84. },
  85. CommittedSeal: [][]byte{},
  86. Round: 5,
  87. Vote: nil,
  88. }
  89. var expectedErr error
  90. h := &types.Header{
  91. Extra: istRawData,
  92. }
  93. // normal case
  94. err := ApplyHeaderQBFTExtra(
  95. h,
  96. writeRoundNumber(big.NewInt(5)),
  97. )
  98. if err != expectedErr {
  99. t.Errorf("error mismatch: have %v, want %v", err, expectedErr)
  100. }
  101. // verify istanbul extra-data
  102. istExtra, err := getExtra(h)
  103. if err != nil {
  104. t.Errorf("error mismatch: have %v, want nil", err)
  105. }
  106. if !reflect.DeepEqual(istExtra, expectedIstExtra) {
  107. t.Errorf("extra data mismatch: have %v, want %v", istExtra.VanityData, expectedIstExtra.VanityData)
  108. }
  109. }
  110. func TestWriteValidatorVote(t *testing.T) {
  111. vanity := bytes.Repeat([]byte{0x00}, types.IstanbulExtraVanity)
  112. istRawData := hexutil.MustDecode("0xf85a80f8549444add0ec310f115a0e603b2d7db9f067778eaf8a94294fc7e8f22b3bcdcf955dd7ff3ba2ed833f8212946beaaed781d2d2ab6350f5c4566a2c6eaac407a6948be76812f765c24641ec63dc2852b378aba2b440c005c0")
  113. vote := &types.ValidatorVote{RecipientAddress: common.BytesToAddress(hexutil.MustDecode("0x44add0ec310f115a0e603b2d7db9f06777123456")), VoteType: types.QBFTAuthVote}
  114. expectedIstExtra := &types.QBFTExtra{
  115. VanityData: vanity,
  116. Validators: []common.Address{},
  117. CommittedSeal: [][]byte{},
  118. Round: 0,
  119. Vote: vote,
  120. }
  121. var expectedErr error
  122. h := &types.Header{
  123. Extra: istRawData,
  124. }
  125. // normal case
  126. err := ApplyHeaderQBFTExtra(
  127. h,
  128. WriteVote(common.BytesToAddress(hexutil.MustDecode("0x44add0ec310f115a0e603b2d7db9f06777123456")), true),
  129. )
  130. if err != expectedErr {
  131. t.Errorf("error mismatch: have %v, want %v", err, expectedErr)
  132. }
  133. // verify istanbul extra-data
  134. istExtra, err := getExtra(h)
  135. if err != nil {
  136. t.Errorf("error mismatch: have %v, want nil", err)
  137. }
  138. if !reflect.DeepEqual(istExtra.Vote, expectedIstExtra.Vote) {
  139. t.Errorf("extra data mismatch: have %v, want %v", istExtra, expectedIstExtra)
  140. }
  141. }