Merge branch 'custom-genesis' of github.com:danlaine/gecko into custom-genesis

This commit is contained in:
Stephen Buttolph 2020-03-17 12:21:03 -04:00
commit 4f432cbb73
5 changed files with 79 additions and 41 deletions

37
chains/mock_manager.go Normal file
View File

@ -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() {}

View File

@ -7,7 +7,6 @@ import (
"errors" "errors"
"fmt" "fmt"
"github.com/ava-labs/gecko/chains"
"github.com/ava-labs/gecko/database" "github.com/ava-labs/gecko/database"
"github.com/ava-labs/gecko/ids" "github.com/ava-labs/gecko/ids"
"github.com/ava-labs/gecko/utils/crypto" "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 // If this proposal is committed, create the new blockchain using the chain manager
onAccept := func() { onAccept := func() {
chainParams := chains.ChainParameters{ tx.vm.createChain(tx)
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)
}
} }
return onAccept, nil return onAccept, nil

View File

@ -22,7 +22,7 @@ func TestAddDefaultSubnetValidator(t *testing.T) {
} }
func TestCreateBlockchainArgsParsing(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{} args := CreateBlockchainArgs{}
err := json.Unmarshal([]byte(jsonString), &args) err := json.Unmarshal([]byte(jsonString), &args)
if err != nil { if err != nil {

View File

@ -265,13 +265,8 @@ func (vm *VM) Initialize(
}) })
go ctx.Log.RecoverAndPanic(vm.timer.Dispatch) go ctx.Log.RecoverAndPanic(vm.timer.Dispatch)
if err := vm.initValidators(); err != nil { if err := vm.initSubnets(); err != nil {
ctx.Log.Error("failed to initialize validator manager: %s", err) ctx.Log.Error("failed to initialize Subnets: %s", err)
return err
}
if err := vm.updateValidators(DefaultSubnetID); err != nil {
ctx.Log.Error("failed to initialize default Subnet validator set: %s", err)
return err return err
} }
@ -287,31 +282,32 @@ func (vm *VM) Initialize(
return nil 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 { func (vm *VM) initBlockchains() error {
vm.Ctx.Log.Verbo("platform chain initializing existing blockchains") vm.Ctx.Log.Info("initializing blockchains")
existingChains, err := vm.getChains(vm.DB) blockchains, err := vm.getChains(vm.DB) // get blockchains that exist
if err != nil { if err != nil {
return err return err
} }
for _, chain := range existingChains { // Create each blockchain
chainParams := chains.ChainParameters{ for _, chain := range blockchains { // Create each blockchain
ID: chain.ID(), // The validators that compose the Subnet that validates this chain
SubnetID: chain.SubnetID, validators, subnetExists := vm.Validators.GetValidatorSet(chain.SubnetID)
GenesisData: chain.GenesisData, if !subnetExists {
VMAlias: chain.VMID.String(), vm.Ctx.Log.Error("blockchain %s validated by Subnet %s but couldn't get that Subnet. Blockchain not created")
} }
for _, fxID := range chain.FxIDs { if !validators.Contains(vm.Ctx.NodeID) { // This node doesn't validate this blockchain
chainParams.FxAliases = append(chainParams.FxAliases, fxID.String()) continue
} }
vm.ChainManager.CreateChain(chainParams) vm.createChain(chain)
} }
return nil return nil
} }
// Set the node's validator manager to be up to date // Set the node's validator manager to be up to date
func (vm *VM) initValidators() error { func (vm *VM) initSubnets() error {
vm.Ctx.Log.Verbo("platform chain initializing Subnet validators") vm.Ctx.Log.Info("initializing Subnets")
subnets, err := vm.getSubnets(vm.DB) subnets, err := vm.getSubnets(vm.DB)
if err != nil { if err != nil {
return err return err
@ -330,6 +326,20 @@ func (vm *VM) initValidators() error {
return nil 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 // Shutdown this blockchain
func (vm *VM) Shutdown() { func (vm *VM) Shutdown() {
vm.timer.Stop() vm.timer.Stop()
@ -698,11 +708,12 @@ func (vm *VM) getValidators(validatorEvents *EventHeap) []validators.Validator {
return vdrList 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 { func (vm *VM) updateValidators(subnetID ids.ID) error {
validatorSet, ok := vm.Validators.GetValidatorSet(subnetID) validatorSet, subnetInitialized := vm.Validators.GetValidatorSet(subnetID)
if !ok { if !subnetInitialized { // validator manager doesn't know about this subnet yet
return fmt.Errorf("couldn't get the validator sampler of the %s subnet", subnetID) validatorSet = validators.NewSet()
vm.Validators.PutValidatorSet(subnetID, validatorSet)
} }
currentValidators, err := vm.getCurrentValidators(vm.DB, subnetID) currentValidators, err := vm.getCurrentValidators(vm.DB, subnetID)

View File

@ -10,6 +10,8 @@ import (
"testing" "testing"
"time" "time"
"github.com/ava-labs/gecko/chains"
"github.com/ava-labs/gecko/database/memdb" "github.com/ava-labs/gecko/database/memdb"
"github.com/ava-labs/gecko/ids" "github.com/ava-labs/gecko/ids"
"github.com/ava-labs/gecko/snow" "github.com/ava-labs/gecko/snow"
@ -113,7 +115,8 @@ func defaultVM() *VM {
} }
vm := &VM{ vm := &VM{
SnowmanVM: &core.SnowmanVM{}, SnowmanVM: &core.SnowmanVM{},
ChainManager: chains.MockManager{},
} }
defaultSubnet := validators.NewSet() defaultSubnet := validators.NewSet()