diff --git a/k8s/blockchain.go b/k8s/blockchain.go index f3a6b879..e2145b6d 100644 --- a/k8s/blockchain.go +++ b/k8s/blockchain.go @@ -17,21 +17,36 @@ package k8s import ( + "crypto/ecdsa" "errors" "fmt" "time" + "github.com/ethereum/go-ethereum/common" + "github.com/getamis/istanbul-tools/charts" istcommon "github.com/getamis/istanbul-tools/common" "github.com/getamis/istanbul-tools/container" ) -func NewBlockchain(numOfValidators int, gaslimit uint64, options ...Option) (bc *blockchain) { +func NewBlockchain(numOfValidators int, numOfExtraAccounts int, gaslimit uint64, options ...Option) (bc *blockchain) { _, nodekeys, addrs := istcommon.GenerateKeys(numOfValidators) ips := istcommon.GenerateIPs(len(nodekeys)) + extraKeys := make([][]*ecdsa.PrivateKey, numOfValidators) + extraAddrs := make([][]common.Address, numOfValidators) + + allAddrs := addrs + + if numOfExtraAccounts > 0 { + for i := 0; i < numOfValidators; i++ { + extraKeys[i], _, extraAddrs[i] = istcommon.GenerateKeys(numOfExtraAccounts) + allAddrs = append(allAddrs, extraAddrs[i]...) + } + } + bc = &blockchain{ - genesis: charts.NewGenesisChart(addrs, uint64(gaslimit)), + genesis: charts.NewGenesisChart(allAddrs, uint64(gaslimit)), staticNodes: charts.NewStaticNodesChart(nodekeys, ips), } @@ -44,7 +59,7 @@ func NewBlockchain(numOfValidators int, gaslimit uint64, options ...Option) (bc bc.genesis.Uninstall() return nil } - bc.setupValidators(numOfValidators, nodekeys, ips, options...) + bc.setupValidators(numOfValidators, extraKeys, nodekeys, ips, options...) return bc } @@ -104,7 +119,7 @@ func (bc *blockchain) Validators() []container.Ethereum { // ---------------------------------------------------------------------------- -func (bc *blockchain) setupValidators(num int, nodekeys []string, ips []string, options ...Option) { +func (bc *blockchain) setupValidators(num int, extraKeys [][]*ecdsa.PrivateKey, nodekeys []string, ips []string, options ...Option) { for i := 0; i < num; i++ { var opts []Option opts = append(opts, options...) @@ -112,6 +127,7 @@ func (bc *blockchain) setupValidators(num int, nodekeys []string, ips []string, opts = append(opts, Name(fmt.Sprintf("%d", i))) opts = append(opts, NodeKeyHex(nodekeys[i])) opts = append(opts, IPAddress(ips[i])) + opts = append(opts, ExtraAccounts(extraKeys[i])) geth := NewEthereum( opts..., diff --git a/k8s/blockchain_example.go b/k8s/blockchain_example.go index 2ca175c1..47be6c3b 100644 --- a/k8s/blockchain_example.go +++ b/k8s/blockchain_example.go @@ -23,6 +23,7 @@ import ( func ExampleK8SBlockchain() { chain := NewBlockchain( 4, + 0, 21000*1000, ImageRepository("quay.io/amis/geth"), ImageTag("istanbul_develop"), diff --git a/k8s/option.go b/k8s/option.go index 96c0732f..d1c755a2 100644 --- a/k8s/option.go +++ b/k8s/option.go @@ -16,7 +16,10 @@ package k8s -import "fmt" +import ( + "crypto/ecdsa" + "fmt" +) type Option func(*ethereum) @@ -86,3 +89,9 @@ func Verbosity(verbosity int) Option { eth.args = append(eth.args, fmt.Sprintf("ethereum.verbosity=%d", verbosity)) } } + +func ExtraAccounts(keys []*ecdsa.PrivateKey) Option { + return func(eth *ethereum) { + eth.accounts = keys + } +}