WIP. Blockchain creation works in simple cases but still very buggy.

This commit is contained in:
Dan Laine 2020-03-16 17:21:38 -04:00
parent 45805cbac7
commit 5ca0a909e4
6 changed files with 68 additions and 4 deletions

View File

@ -92,6 +92,7 @@ type manager struct {
// That is, [chainID].String() is an alias for the chain, too
ids.Aliaser
stakingEnabled bool // True iff the network has staking enabled
log logging.Logger
logFactory logging.Factory
vmManager vms.Manager // Manage mappings from vm ID --> vm
@ -120,6 +121,7 @@ type manager struct {
// <validators> validate this chain
// TODO: Make this function take less arguments
func New(
stakingEnabled bool,
log logging.Logger,
logFactory logging.Factory,
vmManager vms.Manager,
@ -143,6 +145,7 @@ func New(
router.Initialize(log, &timeoutManager)
m := &manager{
stakingEnabled: stakingEnabled,
log: log,
logFactory: logFactory,
vmManager: vmManager,
@ -256,7 +259,13 @@ func (m *manager) ForceCreateChain(chain ChainParameters) {
}
// The validators of this blockchain
validators, ok := m.validators.GetValidatorSet(ids.Empty) // TODO: Change argument to chain.SubnetID
var validators validators.Set // Validators validating this blockchain
var ok bool
if m.stakingEnabled {
validators, ok = m.validators.GetValidatorSet(chain.SubnetID)
} else { // Staking is disabled. Every peer validates every subnet.
validators, ok = m.validators.GetValidatorSet(ids.Empty) // ids.Empty is the default subnet ID. TODO: Move to const package so we can use it here.
}
if !ok {
m.log.Error("couldn't get validator set of subnet with ID %s. The subnet may not exist", chain.SubnetID)
return
@ -353,7 +362,7 @@ func (m *manager) createAvalancheChain(
msgChan := make(chan common.Message, defaultChannelSize)
if err := vm.Initialize(ctx, vmDB, genesisData, msgChan, fxs); err != nil {
return err
return fmt.Errorf("error during vm's Initialize: %v", err)
}
// Handles serialization/deserialization of vertices and also the

View File

@ -342,6 +342,7 @@ func Genesis(networkID uint32) ([]byte, error) {
platformvmArgs.Chains = []platformvm.APIChain{
platformvm.APIChain{
GenesisData: avmReply.Bytes,
SubnetID: platformvm.DefaultSubnetID,
VMID: avm.ID,
FxIDs: []ids.ID{
secp256k1fx.ID,
@ -350,21 +351,25 @@ func Genesis(networkID uint32) ([]byte, error) {
},
platformvm.APIChain{
GenesisData: evmReply,
SubnetID: platformvm.DefaultSubnetID,
VMID: evm.ID,
Name: "Athereum",
},
platformvm.APIChain{
GenesisData: spdagvmReply.Bytes,
SubnetID: platformvm.DefaultSubnetID,
VMID: spdagvm.ID,
Name: "Simple DAG Payments",
},
platformvm.APIChain{
GenesisData: spchainvmReply.Bytes,
SubnetID: platformvm.DefaultSubnetID,
VMID: spchainvm.ID,
Name: "Simple Chain Payments",
},
platformvm.APIChain{
GenesisData: formatting.CB58{Bytes: []byte{}}, // There is no genesis data
SubnetID: platformvm.DefaultSubnetID,
VMID: timestampvm.ID,
Name: "Simple Timestamp Server",
},

View File

@ -351,8 +351,13 @@ func (n *Node) initChains() {
n.Log.Info("initializing chains")
vdrs := n.vdrs
// If staking is disabled, ignore updates to Subnets' validator sets
// Instead of updating node's validator manager, platform chain makes changes
// to its own local validator manager (which isn't used for sampling)
if !n.Config.EnableStaking {
defaultSubnetValidators := validators.NewSet()
defaultSubnetValidators.Add(validators.NewValidator(n.ID, 1))
vdrs = validators.NewManager()
vdrs.PutValidatorSet(platformvm.DefaultSubnetID, defaultSubnetValidators)
}
@ -375,6 +380,7 @@ func (n *Node) initChains() {
// Create the Platform Chain
n.chainManager.ForceCreateChain(chains.ChainParameters{
ID: ids.Empty,
SubnetID: platformvm.DefaultSubnetID,
GenesisData: genesisBytes, // Specifies other chains to create
VMAlias: platformvm.ID.String(),
CustomBeacons: beacons,
@ -404,6 +410,7 @@ func (n *Node) initAPIServer() {
// Assumes n.DB, n.vdrs all initialized (non-nil)
func (n *Node) initChainManager() {
n.chainManager = chains.New(
n.Config.EnableStaking,
n.Log,
n.LogFactory,
n.vmManager,

View File

@ -7,6 +7,8 @@ import (
"errors"
"fmt"
"github.com/ava-labs/gecko/snow/validators"
"github.com/ava-labs/gecko/database"
"github.com/ava-labs/gecko/ids"
@ -128,7 +130,12 @@ func (tx *CreateSubnetTx) SemanticVerify(db database.Database) (func(), error) {
return nil, err
}
return nil, nil
// Register new subnet in validator manager
onAccept := func() {
tx.vm.Validators.PutValidatorSet(tx.ID, validators.NewSet())
}
return onAccept, nil
}
// Bytes returns the byte representation of [tx]

View File

@ -845,6 +845,14 @@ func (service *Service) IssueTx(_ *http.Request, args *IssueTxArgs, response *Is
defer service.vm.resetTimer()
response.TxID = tx.ID
return nil
case *CreateChainTx:
if err := tx.initialize(service.vm); err != nil {
return fmt.Errorf("error initializing tx: %s", err)
}
service.vm.unissuedDecisionTxs = append(service.vm.unissuedDecisionTxs, tx)
defer service.vm.resetTimer()
response.TxID = tx.ID()
return nil
default:
return errors.New("Could not parse given tx. Must be one of: addDefaultSubnetValidatorTx, addDefaultSubnetDelegatorTx, addNonDefaultSubnetValidatorTx, createSubnetTx")
}

View File

@ -265,8 +265,13 @@ 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 the current validator set: %s", err)
ctx.Log.Error("failed to initialize default Subnet validator set: %s", err)
return err
}
@ -292,6 +297,7 @@ func (vm *VM) initBlockchains() error {
for _, chain := range existingChains { // Create each blockchain
chainParams := chains.ChainParameters{
ID: chain.ID(),
SubnetID: chain.SubnetID,
GenesisData: chain.GenesisData,
VMAlias: chain.VMID.String(),
}
@ -303,6 +309,27 @@ func (vm *VM) initBlockchains() error {
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")
subnets, err := vm.getSubnets(vm.DB)
if err != nil {
return err
}
if err := vm.updateValidators(DefaultSubnetID); err != nil {
return err
}
for _, subnet := range subnets {
if err := vm.updateValidators(subnet.ID); err != nil {
return err
}
}
return nil
}
// Shutdown this blockchain
func (vm *VM) Shutdown() {
vm.timer.Stop()
@ -671,6 +698,7 @@ 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
func (vm *VM) updateValidators(subnetID ids.ID) error {
validatorSet, ok := vm.Validators.GetValidatorSet(subnetID)
if !ok {