mirror of https://github.com/poanetwork/gecko.git
76 lines
2.9 KiB
Go
76 lines
2.9 KiB
Go
|
// (c) 2019-2020, Ava Labs, Inc. All rights reserved.
|
||
|
// See the file LICENSE for licensing terms.
|
||
|
|
||
|
package common
|
||
|
|
||
|
import (
|
||
|
"github.com/ava-labs/gecko/database"
|
||
|
"github.com/ava-labs/gecko/snow"
|
||
|
)
|
||
|
|
||
|
// VM describes the interface that all consensus VMs must implement
|
||
|
type VM interface {
|
||
|
// Initialize this VM.
|
||
|
// [ctx]: Metadata about this VM.
|
||
|
// [ctx.networkID]: The ID of the network this VM's chain is running
|
||
|
// on.
|
||
|
// [ctx.chainID]: The unique ID of the chain this VM is running on.
|
||
|
// [ctx.Log]: Used to log messages
|
||
|
// [ctx.NodeID]: The unique staker ID of this node.
|
||
|
// [ctx.Lock]: A Read/Write lock shared by this VM and the consensus
|
||
|
// engine that manages this VM. The write lock is held
|
||
|
// whenever code in the consensus engine calls the VM.
|
||
|
// [db]: The database this VM will persist data to.
|
||
|
// [genesisBytes]: The byte-encoding of the genesis information of this
|
||
|
// VM. The VM uses it to initialize its state. For
|
||
|
// example, if this VM were an account-based payments
|
||
|
// system, `genesisBytes` would probably contain a genesis
|
||
|
// transaction that gives coins to some accounts, and this
|
||
|
// transaction would be in the genesis block.
|
||
|
// [toEngine]: The channel used to send messages to the consensus engine.
|
||
|
// [fxs]: Feature extensions that attach to this VM.
|
||
|
Initialize(
|
||
|
ctx *snow.Context,
|
||
|
db database.Database,
|
||
|
genesisBytes []byte,
|
||
|
toEngine chan<- Message,
|
||
|
fxs []*Fx,
|
||
|
) error
|
||
|
|
||
|
// Shutdown is called when the node is shutting down.
|
||
|
Shutdown()
|
||
|
|
||
|
// Creates the HTTP handlers for custom chain network calls.
|
||
|
//
|
||
|
// This exposes handlers that the outside world can use to communicate with
|
||
|
// the chain. Each handler has the path:
|
||
|
// [Address of node]/ext/bc/[chain ID]/[extension]
|
||
|
//
|
||
|
// Returns a mapping from [extension]s to HTTP handlers.
|
||
|
//
|
||
|
// Each extension can specify how locking is managed for convenience.
|
||
|
//
|
||
|
// For example, if this VM implements an account-based payments system,
|
||
|
// it have an extension called `accounts`, where clients could get
|
||
|
// information about their accounts.
|
||
|
CreateHandlers() map[string]*HTTPHandler
|
||
|
}
|
||
|
|
||
|
// StaticVM describes the functionality that allows a user to interact with a VM
|
||
|
// statically.
|
||
|
type StaticVM interface {
|
||
|
// Creates the HTTP handlers for custom VM network calls.
|
||
|
//
|
||
|
// This exposes handlers that the outside world can use to communicate with
|
||
|
// a static reference to the VM. Each handler has the path:
|
||
|
// [Address of node]/ext/VM/[VM ID]/[extension]
|
||
|
//
|
||
|
// Returns a mapping from [extension]s to HTTP handlers.
|
||
|
//
|
||
|
// Each extension can specify how locking is managed for convenience.
|
||
|
//
|
||
|
// For example, it might make sense to have an extension for creating
|
||
|
// genesis bytes this VM can interpret.
|
||
|
CreateStaticHandlers() map[string]*HTTPHandler
|
||
|
}
|