You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
68 lines
2.5 KiB
68 lines
2.5 KiB
package node
|
|
|
|
import (
|
|
"crypto/ecdsa"
|
|
"math/big"
|
|
"math/rand"
|
|
"strings"
|
|
|
|
"github.com/ethereum/go-ethereum/crypto"
|
|
"github.com/ethereum/go-ethereum/ethdb"
|
|
"github.com/ethereum/go-ethereum/params"
|
|
"github.com/harmony-one/harmony/core"
|
|
"github.com/harmony-one/harmony/core/vm"
|
|
)
|
|
|
|
const (
|
|
// FakeAddressNumber is the number of fake address.
|
|
FakeAddressNumber = 100
|
|
// TotalInitFund is the initial total fund to the faucet.
|
|
TotalInitFund = 9000000
|
|
)
|
|
|
|
// GenesisBlockSetup setups a genesis blockchain.
|
|
func (node *Node) GenesisBlockSetup(db ethdb.Database) (*core.BlockChain, error) {
|
|
// Initialize genesis block and blockchain
|
|
genesisAlloc := node.CreateGenesisAllocWithTestingAddresses(FakeAddressNumber)
|
|
contractKey, _ := ecdsa.GenerateKey(crypto.S256(), strings.NewReader("Test contract key string stream that is fixed so that generated test key are deterministic every time"))
|
|
contractAddress := crypto.PubkeyToAddress(contractKey.PublicKey)
|
|
contractFunds := big.NewInt(TotalInitFund)
|
|
contractFunds = contractFunds.Mul(contractFunds, big.NewInt(params.Ether))
|
|
genesisAlloc[contractAddress] = core.GenesisAccount{Balance: contractFunds}
|
|
node.ContractKeys = append(node.ContractKeys, contractKey)
|
|
|
|
chainConfig := params.TestChainConfig
|
|
chainConfig.ChainID = big.NewInt(int64(node.Consensus.ShardID)) // Use ChainID as piggybacked ShardID
|
|
gspec := core.Genesis{
|
|
Config: chainConfig,
|
|
Alloc: genesisAlloc,
|
|
ShardID: uint32(node.Consensus.ShardID),
|
|
}
|
|
|
|
// Store genesis block into db.
|
|
gspec.MustCommit(db)
|
|
return core.NewBlockChain(db, nil, gspec.Config, node.Consensus, vm.Config{}, nil)
|
|
}
|
|
|
|
// CreateGenesisAllocWithTestingAddresses create the genesis block allocation that contains deterministically
|
|
// generated testing addressess with tokens.
|
|
// TODO: Remove it later when moving to production.
|
|
func (node *Node) CreateGenesisAllocWithTestingAddresses(numAddress int) core.GenesisAlloc {
|
|
rand.Seed(0)
|
|
len := 1000000
|
|
bytes := make([]byte, len)
|
|
for i := 0; i < len; i++ {
|
|
bytes[i] = byte(rand.Intn(100))
|
|
}
|
|
reader := strings.NewReader(string(bytes))
|
|
genesisAloc := make(core.GenesisAlloc)
|
|
for i := 0; i < numAddress; i++ {
|
|
testBankKey, _ := ecdsa.GenerateKey(crypto.S256(), reader)
|
|
testBankAddress := crypto.PubkeyToAddress(testBankKey.PublicKey)
|
|
testBankFunds := big.NewInt(1000)
|
|
testBankFunds = testBankFunds.Mul(testBankFunds, big.NewInt(params.Ether))
|
|
genesisAloc[testBankAddress] = core.GenesisAccount{Balance: testBankFunds}
|
|
node.TestBankKeys = append(node.TestBankKeys, testBankKey)
|
|
}
|
|
return genesisAloc
|
|
}
|
|
|