code: func makeGenesis(faucets []*ecdsa.PrivateKey, sealers []*ecdsa.PrivateKey) *core.Genesis {
  	// Create a Clique network based off of the Rinkeby config
  	genesis := core.DefaultRinkebyGenesisBlock()
  	genesis.GasLimit = 25000000
  
  	genesis.Config.ChainID = big.NewInt(18)
  	genesis.Config.Clique.Period = 1
  	genesis.Config.EIP150Hash = common.Hash{}
  
  	genesis.Alloc = core.GenesisAlloc{}
  	for _, faucet := range faucets {
  		genesis.Alloc[crypto.PubkeyToAddress(faucet.PublicKey)] = core.GenesisAccount{
  			Balance: new(big.Int).Exp(big.NewInt(2), big.NewInt(128), nil),
  		}
  	}
  	// Sort the signers and embed into the extra-data section
  	signers := make([]common.Address, len(sealers))
  	for i, sealer := range sealers {
  		signers[i] = crypto.PubkeyToAddress(sealer.PublicKey)
  	}
  	for i := 0; i < len(signers); i++ {
  		for j := i + 1; j < len(signers); j++ {
  			if bytes.Compare(signers[i][:], signers[j][:]) > 0 {
  				signers[i], signers[j] = signers[j], signers[i]
  			}
  		}
  	}
  	genesis.ExtraData = make([]byte, 32+len(signers)*common.AddressLength+65)
  	for i, signer := range signers {
  		copy(genesis.ExtraData[32+i*common.AddressLength:], signer[:])
  	}
  	// Return the genesis block for initialization
  	return genesis
  }
docs: // makeGenesis creates a custom Clique genesis block based on some pre-defined
  // signer and faucet accounts.