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