mirror of https://github.com/poanetwork/gecko.git
Merge branch 'custom-genesis' of github.com:danlaine/gecko into custom-genesis
This commit is contained in:
commit
4f432cbb73
|
@ -0,0 +1,37 @@
|
|||
package chains
|
||||
|
||||
import (
|
||||
"github.com/ava-labs/gecko/ids"
|
||||
"github.com/ava-labs/gecko/snow/networking/router"
|
||||
)
|
||||
|
||||
// MockManager implements Manager but does nothing. Always returns nil error.
|
||||
// To be used only in tests (namely in package platformvm)
|
||||
type MockManager struct{}
|
||||
|
||||
// Router ...
|
||||
func (mm MockManager) Router() router.Router { return nil }
|
||||
|
||||
// CreateChain ...
|
||||
func (mm MockManager) CreateChain(ChainParameters) {}
|
||||
|
||||
// ForceCreateChain ...
|
||||
func (mm MockManager) ForceCreateChain(ChainParameters) {}
|
||||
|
||||
// AddRegistrant ...
|
||||
func (mm MockManager) AddRegistrant(Registrant) {}
|
||||
|
||||
// Lookup ...
|
||||
func (mm MockManager) Lookup(string) (ids.ID, error) { return ids.ID{}, nil }
|
||||
|
||||
// LookupVM ...
|
||||
func (mm MockManager) LookupVM(string) (ids.ID, error) { return ids.ID{}, nil }
|
||||
|
||||
// Aliases ...
|
||||
func (mm MockManager) Aliases(ids.ID) []string { return nil }
|
||||
|
||||
// Alias ...
|
||||
func (mm MockManager) Alias(ids.ID, string) error { return nil }
|
||||
|
||||
// Shutdown ...
|
||||
func (mm MockManager) Shutdown() {}
|
|
@ -7,7 +7,6 @@ import (
|
|||
"errors"
|
||||
"fmt"
|
||||
|
||||
"github.com/ava-labs/gecko/chains"
|
||||
"github.com/ava-labs/gecko/database"
|
||||
"github.com/ava-labs/gecko/ids"
|
||||
"github.com/ava-labs/gecko/utils/crypto"
|
||||
|
@ -197,19 +196,7 @@ func (tx *CreateChainTx) SemanticVerify(db database.Database) (func(), error) {
|
|||
|
||||
// If this proposal is committed, create the new blockchain using the chain manager
|
||||
onAccept := func() {
|
||||
chainParams := chains.ChainParameters{
|
||||
ID: tx.ID(),
|
||||
SubnetID: tx.SubnetID,
|
||||
GenesisData: tx.GenesisData,
|
||||
VMAlias: tx.VMID.String(),
|
||||
}
|
||||
for _, fxID := range tx.FxIDs {
|
||||
chainParams.FxAliases = append(chainParams.FxAliases, fxID.String())
|
||||
}
|
||||
// TODO: Not sure how else to make this not nil pointer error during tests
|
||||
if tx.vm.ChainManager != nil {
|
||||
tx.vm.ChainManager.CreateChain(chainParams)
|
||||
}
|
||||
tx.vm.createChain(tx)
|
||||
}
|
||||
|
||||
return onAccept, nil
|
||||
|
|
|
@ -22,7 +22,7 @@ func TestAddDefaultSubnetValidator(t *testing.T) {
|
|||
}
|
||||
|
||||
func TestCreateBlockchainArgsParsing(t *testing.T) {
|
||||
jsonString := `{"vmID":"lol","chainName":"awesome","genesisData":{"key":"value"}}`
|
||||
jsonString := `{"vmID":"lol","fxIDs":["secp256k1"], "name":"awesome", "payerNonce":5, "genesisData":"SkB92YpWm4Q2iPnLGCuDPZPgUQMxajqQQuz91oi3xD984f8r"}`
|
||||
args := CreateBlockchainArgs{}
|
||||
err := json.Unmarshal([]byte(jsonString), &args)
|
||||
if err != nil {
|
||||
|
|
|
@ -265,13 +265,8 @@ func (vm *VM) Initialize(
|
|||
})
|
||||
go ctx.Log.RecoverAndPanic(vm.timer.Dispatch)
|
||||
|
||||
if err := vm.initValidators(); err != nil {
|
||||
ctx.Log.Error("failed to initialize validator manager: %s", err)
|
||||
return err
|
||||
}
|
||||
|
||||
if err := vm.updateValidators(DefaultSubnetID); err != nil {
|
||||
ctx.Log.Error("failed to initialize default Subnet validator set: %s", err)
|
||||
if err := vm.initSubnets(); err != nil {
|
||||
ctx.Log.Error("failed to initialize Subnets: %s", err)
|
||||
return err
|
||||
}
|
||||
|
||||
|
@ -287,31 +282,32 @@ func (vm *VM) Initialize(
|
|||
return nil
|
||||
}
|
||||
|
||||
// Create all of the chains that the database says should exist
|
||||
// Create all chains that exist that this node validates
|
||||
// Can only be called after initSubnets()
|
||||
func (vm *VM) initBlockchains() error {
|
||||
vm.Ctx.Log.Verbo("platform chain initializing existing blockchains")
|
||||
existingChains, err := vm.getChains(vm.DB)
|
||||
vm.Ctx.Log.Info("initializing blockchains")
|
||||
blockchains, err := vm.getChains(vm.DB) // get blockchains that exist
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
for _, chain := range existingChains { // Create each blockchain
|
||||
chainParams := chains.ChainParameters{
|
||||
ID: chain.ID(),
|
||||
SubnetID: chain.SubnetID,
|
||||
GenesisData: chain.GenesisData,
|
||||
VMAlias: chain.VMID.String(),
|
||||
|
||||
for _, chain := range blockchains { // Create each blockchain
|
||||
// The validators that compose the Subnet that validates this chain
|
||||
validators, subnetExists := vm.Validators.GetValidatorSet(chain.SubnetID)
|
||||
if !subnetExists {
|
||||
vm.Ctx.Log.Error("blockchain %s validated by Subnet %s but couldn't get that Subnet. Blockchain not created")
|
||||
}
|
||||
for _, fxID := range chain.FxIDs {
|
||||
chainParams.FxAliases = append(chainParams.FxAliases, fxID.String())
|
||||
if !validators.Contains(vm.Ctx.NodeID) { // This node doesn't validate this blockchain
|
||||
continue
|
||||
}
|
||||
vm.ChainManager.CreateChain(chainParams)
|
||||
vm.createChain(chain)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// Set the node's validator manager to be up to date
|
||||
func (vm *VM) initValidators() error {
|
||||
vm.Ctx.Log.Verbo("platform chain initializing Subnet validators")
|
||||
func (vm *VM) initSubnets() error {
|
||||
vm.Ctx.Log.Info("initializing Subnets")
|
||||
subnets, err := vm.getSubnets(vm.DB)
|
||||
if err != nil {
|
||||
return err
|
||||
|
@ -330,6 +326,20 @@ func (vm *VM) initValidators() error {
|
|||
return nil
|
||||
}
|
||||
|
||||
// Create a blockchain
|
||||
func (vm *VM) createChain(tx *CreateChainTx) {
|
||||
chainParams := chains.ChainParameters{
|
||||
ID: tx.ID(),
|
||||
SubnetID: tx.SubnetID,
|
||||
GenesisData: tx.GenesisData,
|
||||
VMAlias: tx.VMID.String(),
|
||||
}
|
||||
for _, fxID := range tx.FxIDs {
|
||||
chainParams.FxAliases = append(chainParams.FxAliases, fxID.String())
|
||||
}
|
||||
vm.ChainManager.CreateChain(chainParams)
|
||||
}
|
||||
|
||||
// Shutdown this blockchain
|
||||
func (vm *VM) Shutdown() {
|
||||
vm.timer.Stop()
|
||||
|
@ -698,11 +708,12 @@ func (vm *VM) getValidators(validatorEvents *EventHeap) []validators.Validator {
|
|||
return vdrList
|
||||
}
|
||||
|
||||
// Update the node's validator manager to reflect the current validator set of the given Subnet
|
||||
// update the node's validator manager to contain the current validator set of the given Subnet
|
||||
func (vm *VM) updateValidators(subnetID ids.ID) error {
|
||||
validatorSet, ok := vm.Validators.GetValidatorSet(subnetID)
|
||||
if !ok {
|
||||
return fmt.Errorf("couldn't get the validator sampler of the %s subnet", subnetID)
|
||||
validatorSet, subnetInitialized := vm.Validators.GetValidatorSet(subnetID)
|
||||
if !subnetInitialized { // validator manager doesn't know about this subnet yet
|
||||
validatorSet = validators.NewSet()
|
||||
vm.Validators.PutValidatorSet(subnetID, validatorSet)
|
||||
}
|
||||
|
||||
currentValidators, err := vm.getCurrentValidators(vm.DB, subnetID)
|
||||
|
|
|
@ -10,6 +10,8 @@ import (
|
|||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/ava-labs/gecko/chains"
|
||||
|
||||
"github.com/ava-labs/gecko/database/memdb"
|
||||
"github.com/ava-labs/gecko/ids"
|
||||
"github.com/ava-labs/gecko/snow"
|
||||
|
@ -113,7 +115,8 @@ func defaultVM() *VM {
|
|||
}
|
||||
|
||||
vm := &VM{
|
||||
SnowmanVM: &core.SnowmanVM{},
|
||||
SnowmanVM: &core.SnowmanVM{},
|
||||
ChainManager: chains.MockManager{},
|
||||
}
|
||||
|
||||
defaultSubnet := validators.NewSet()
|
||||
|
|
Loading…
Reference in New Issue