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