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"
|
"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
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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()
|
||||||
|
|
Loading…
Reference in New Issue