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