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 = &params.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  }