genesis.go 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. package testutils
  2. import (
  3. "bytes"
  4. "crypto/ecdsa"
  5. "github.com/ethereum/go-ethereum/common"
  6. istanbulcommon "github.com/ethereum/go-ethereum/consensus/istanbul/common"
  7. "github.com/ethereum/go-ethereum/core"
  8. "github.com/ethereum/go-ethereum/core/types"
  9. "github.com/ethereum/go-ethereum/crypto"
  10. "github.com/ethereum/go-ethereum/params"
  11. "github.com/ethereum/go-ethereum/rlp"
  12. )
  13. func Genesis(validators []common.Address, isQBFT bool) *core.Genesis {
  14. // generate genesis block
  15. genesis := core.DefaultGenesisBlock()
  16. genesis.Config = params.TestChainConfig
  17. // force enable Istanbul engine
  18. genesis.Config.Istanbul = &params.IstanbulConfig{}
  19. genesis.Config.Ethash = nil
  20. genesis.Difficulty = istanbulcommon.DefaultDifficulty
  21. genesis.Nonce = istanbulcommon.EmptyBlockNonce.Uint64()
  22. genesis.Mixhash = types.IstanbulDigest
  23. if isQBFT {
  24. appendValidators(genesis, validators)
  25. } else {
  26. appendValidatorsIstanbulExtra(genesis, validators)
  27. }
  28. return genesis
  29. }
  30. func GenesisAndKeys(n int, isQBFT bool) (*core.Genesis, []*ecdsa.PrivateKey) {
  31. // Setup validators
  32. var nodeKeys = make([]*ecdsa.PrivateKey, n)
  33. var addrs = make([]common.Address, n)
  34. for i := 0; i < n; i++ {
  35. nodeKeys[i], _ = crypto.GenerateKey()
  36. addrs[i] = crypto.PubkeyToAddress(nodeKeys[i].PublicKey)
  37. }
  38. // generate genesis block
  39. genesis := Genesis(addrs, isQBFT)
  40. return genesis, nodeKeys
  41. }
  42. func appendValidatorsIstanbulExtra(genesis *core.Genesis, addrs []common.Address) {
  43. if len(genesis.ExtraData) < types.IstanbulExtraVanity {
  44. genesis.ExtraData = append(genesis.ExtraData, bytes.Repeat([]byte{0x00}, types.IstanbulExtraVanity)...)
  45. }
  46. genesis.ExtraData = genesis.ExtraData[:types.IstanbulExtraVanity]
  47. ist := &types.IstanbulExtra{
  48. Validators: addrs,
  49. Seal: []byte{},
  50. CommittedSeal: [][]byte{},
  51. }
  52. istPayload, err := rlp.EncodeToBytes(&ist)
  53. if err != nil {
  54. panic("failed to encode istanbul extra")
  55. }
  56. genesis.ExtraData = append(genesis.ExtraData, istPayload...)
  57. }
  58. func appendValidators(genesis *core.Genesis, addrs []common.Address) {
  59. vanity := append(genesis.ExtraData, bytes.Repeat([]byte{0x00}, types.IstanbulExtraVanity-len(genesis.ExtraData))...)
  60. ist := &types.QBFTExtra{
  61. VanityData: vanity,
  62. Validators: addrs,
  63. Vote: nil,
  64. CommittedSeal: [][]byte{},
  65. Round: 0,
  66. }
  67. istPayload, err := rlp.EncodeToBytes(&ist)
  68. if err != nil {
  69. panic("failed to encode istanbul extra")
  70. }
  71. genesis.ExtraData = istPayload
  72. }