evm

package
v0.4.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jun 30, 2026 License: GPL-3.0, LGPL-3.0, LGPL-3.0 Imports: 97 Imported by: 0

README

EVM Package

The EVM package implements the Luxd VM interface.

VM

The VM creates the Ethereum backend and provides basic block building, parsing, and retrieval logic to the consensus engine.

APIs

The VM creates APIs for the node through the function CreateHandlers(). CreateHandlers returns the Service struct to serve EVM specific APIs. Additionally, the Ethereum backend APIs are also returned at the /rpc extension.

Block Handling

The VM implements buildBlock, parseBlock, and getBlock and uses the chain package from Luxd to construct a metered state, which uses these functions to implement an efficient caching layer and maintain the required invariants for blocks that get returned to the consensus engine.

To do this, the VM uses a modified version of the Ethereum RLP block type here and uses the core package's BlockChain type here to handle the insertion and storage of blocks into the chain.

Block

The Block type implements the Luxd ChainVM Block interface. The key functions for this interface are Verify(), Accept(), Reject(), and Status().

The Block type wraps the stateless block type here and implements these functions to allow the consensus engine to verify blocks as valid, perform consensus, and mark them as accepted or rejected. See the documentation in Luxd for the more detailed VM invariants that are maintained here.

Documentation

Index

Constants

View Source
const (
	VMUnknown       = vm.Unknown       // 0
	VMStarting      = vm.Starting      // 1
	VMStateSyncing  = vm.Syncing       // 2
	VMBootstrapping = vm.Bootstrapping // 3
	VMNormalOp      = vm.Ready         // 4
	VMDegraded      = vm.Degraded      // 5
	VMStopping      = vm.Stopping      // 6
	VMStopped       = vm.Stopped       // 7
)

Re-export canonical state constants from github.com/luxfi/vm. One and only one definition — these are aliases, not copies.

View Source
const (

	// TxGossipHandlerID is the handler ID for transaction gossip
	TxGossipHandlerID = uint64(0x1)
)

Variables

View Source
var (
	// ID this VM should be referenced by
	IDStr = "evm"
	ID    = ids.ID{'e', 'v', 'm'}
)
View Source
var (
	// GitCommit is set by the build script
	GitCommit string
	// Version is the version of Lux EVM (set by build script via ldflags)
	Version string = "v0.8.12"
)

Functions

This section is empty.

Types

type Admin

type Admin struct {
	// contains filtered or unexported fields
}

Admin is the API service for admin API calls (legacy Gorilla RPC handler). Import functionality is handled by AdminAPI in admin_api.go via geth RPC.

func NewAdminService

func NewAdminService(vm *VM, performanceDir string) *Admin

func (*Admin) GetVMConfig

func (p *Admin) GetVMConfig(_ *http.Request, _ *struct{}, reply *client.ConfigReply) error

func (*Admin) LockProfile

func (p *Admin) LockProfile(_ *http.Request, _ *struct{}, _ *api.EmptyReply) error

LockProfile runs a mutex profile writing to the specified file

func (*Admin) MemoryProfile

func (p *Admin) MemoryProfile(_ *http.Request, _ *struct{}, _ *api.EmptyReply) error

MemoryProfile runs a memory profile writing to the specified file

func (*Admin) SetLogLevel

func (p *Admin) SetLogLevel(_ *http.Request, args *client.SetLogLevelArgs, reply *api.EmptyReply) error

func (*Admin) StartCPUProfiler

func (p *Admin) StartCPUProfiler(_ *http.Request, _ *struct{}, _ *api.EmptyReply) error

StartCPUProfiler starts a cpu profile writing to the specified file

func (*Admin) StopCPUProfiler

func (p *Admin) StopCPUProfiler(r *http.Request, _ *struct{}, _ *api.EmptyReply) error

StopCPUProfiler stops the cpu profile

type AdminAPI

type AdminAPI struct {
	// contains filtered or unexported fields
}

AdminAPI provides admin-level RPC methods using geth's RPC server This enables underscore notation: admin_importChain, admin_exportChain, etc.

func NewAdminAPI

func NewAdminAPI(vm *VM, performanceDir string) *AdminAPI

NewAdminAPI creates a new AdminAPI instance for geth RPC server

func (*AdminAPI) ExportChain

func (api *AdminAPI) ExportChain(ctx context.Context, file string, first, last uint64) (bool, error)

ExportChain exports a blockchain to a local file RPC: admin_exportChain

func (*AdminAPI) GetVMConfig

func (api *AdminAPI) GetVMConfig(ctx context.Context) (interface{}, error)

GetVMConfig returns the VM configuration RPC: admin_getVMConfig

func (*AdminAPI) ImportChain

func (api *AdminAPI) ImportChain(ctx context.Context, file string) (*ImportChainResult, error)

ImportChain imports a blockchain from a local file. State is committed periodically during import for restart-safety. RPC: admin_importChain

func (*AdminAPI) LockProfile

func (api *AdminAPI) LockProfile(ctx context.Context) error

LockProfile runs a mutex profile writing to the specified file RPC: admin_lockProfile

func (*AdminAPI) MemoryProfile

func (api *AdminAPI) MemoryProfile(ctx context.Context) error

MemoryProfile runs a memory profile writing to the specified file RPC: admin_memoryProfile

func (*AdminAPI) SetLogLevel

func (api *AdminAPI) SetLogLevel(ctx context.Context, level string) error

SetLogLevel sets the log level RPC: admin_setLogLevel

func (*AdminAPI) StartCPUProfiler

func (api *AdminAPI) StartCPUProfiler(ctx context.Context) error

StartCPUProfiler starts a cpu profile writing to the specified file RPC: admin_startCPUProfiler

func (*AdminAPI) StopCPUProfiler

func (api *AdminAPI) StopCPUProfiler(ctx context.Context) error

StopCPUProfiler stops the cpu profile RPC: admin_stopCPUProfiler

type AutominingConfig

type AutominingConfig struct {
	// BuildBlock builds a new block and returns it wrapped for consensus.
	// The block must implement both Verify() and Accept() methods.
	BuildBlock func(ctx context.Context) (interface {
		Verify(context.Context) error
		Accept(context.Context) error
	}, error)
	// Interval is the minimum time between block builds.
	Interval time.Duration
}

AutominingConfig contains configuration for automining.

type Block

type Block struct {
	// contains filtered or unexported fields
}

Block implements the chain.Block interface

func (*Block) Accept

func (b *Block) Accept(context.Context) error

Accept implements the chain.Block interface

func (*Block) Bytes

func (b *Block) Bytes() []byte

Bytes implements the chain.Block interface

func (*Block) Height

func (b *Block) Height() uint64

Height implements the chain.Block interface

func (*Block) ID

func (b *Block) ID() ids.ID

ID implements the chain.Block interface

func (*Block) Parent

func (b *Block) Parent() ids.ID

Parent implements the chain.Block interface

func (*Block) ParentID

func (b *Block) ParentID() ids.ID

ParentID implements the chain.Block interface (same as Parent)

func (*Block) Reject

func (b *Block) Reject(context.Context) error

Reject implements the chain.Block interface

func (*Block) SetStatus

func (b *Block) SetStatus(status choices.Status)

SetStatus implements the chain.Block interface This is required for chain.Block but not used in our implementation

func (*Block) ShouldVerifyWithContext

func (b *Block) ShouldVerifyWithContext(context.Context) (bool, error)

ShouldVerifyWithContext implements the block.WithVerifyContext interface

func (*Block) Status

func (b *Block) Status() uint8

Status implements the chain.Block interface

func (*Block) String

func (b *Block) String() string

func (*Block) Timestamp

func (b *Block) Timestamp() time.Time

Timestamp implements the chain.Block interface

func (*Block) Verify

func (b *Block) Verify(context.Context) error

Verify implements the chain.Block interface

func (*Block) VerifyWithContext

func (b *Block) VerifyWithContext(ctx context.Context, proposerVMBlockCtx *block.Context) error

VerifyWithContext implements the block.WithVerifyContext interface

type BlockValidator

type BlockValidator interface {
	SyntacticVerify(b *Block, rules params.Rules) error
}

func NewBlockValidator

func NewBlockValidator() BlockValidator

type DatabaseConfig

type DatabaseConfig struct {
	// If true, all writes are to memory and are discarded at shutdown.
	ReadOnly bool `json:"readOnly"`

	// Path to database
	Path string `json:"path"`

	// Name of the database type to use
	Name string `json:"name"`

	// Config bytes (JSON) for the database
	// See relevant (pebbledb, leveldb) config options
	Config []byte `json:"-"`
}

type EthPushGossiper

type EthPushGossiper struct {
	// contains filtered or unexported fields
}

EthPushGossiper is used by the ETH backend to push transactions issued over the RPC and added to the mempool to peers.

func (*EthPushGossiper) Add

func (e *EthPushGossiper) Add(tx *types.Transaction)

type Factory

type Factory struct{}

func (*Factory) New

func (*Factory) New(log.Logger) (interface{}, error)

type GossipEthTx

type GossipEthTx struct {
	Tx *types.Transaction
}

func (*GossipEthTx) GossipID

func (tx *GossipEthTx) GossipID() ids.ID

type GossipEthTxMarshaller

type GossipEthTxMarshaller struct{}

func (GossipEthTxMarshaller) MarshalGossip

func (GossipEthTxMarshaller) MarshalGossip(tx *GossipEthTx) ([]byte, error)

func (GossipEthTxMarshaller) UnmarshalGossip

func (GossipEthTxMarshaller) UnmarshalGossip(bytes []byte) (*GossipEthTx, error)

type GossipEthTxPool

type GossipEthTxPool struct {
	// contains filtered or unexported fields
}

func NewGossipEthTxPool

func NewGossipEthTxPool(mempool *txpool.TxPool, registerer metric.Registerer) (*GossipEthTxPool, error)

func (*GossipEthTxPool) Add

func (g *GossipEthTxPool) Add(tx *GossipEthTx) error

Add enqueues the transaction to the mempool. Subscribe should be called to receive an event if tx is actually added to the mempool or not.

func (*GossipEthTxPool) GetFilter

func (g *GossipEthTxPool) GetFilter() ([]byte, []byte)

func (*GossipEthTxPool) Has

func (g *GossipEthTxPool) Has(txID ids.ID) bool

Has should just return whether or not the [txID] is still in the mempool, not whether it is in the mempool AND pending.

func (*GossipEthTxPool) IsSubscribed

func (g *GossipEthTxPool) IsSubscribed() bool

IsSubscribed returns whether or not the gossip subscription is active.

func (*GossipEthTxPool) Iterate

func (g *GossipEthTxPool) Iterate(f func(tx *GossipEthTx) bool)

func (*GossipEthTxPool) Subscribe

func (g *GossipEthTxPool) Subscribe(ctx context.Context)

type ImportChainResult

type ImportChainResult struct {
	Success        bool   `json:"success"`
	BlocksImported int    `json:"blocksImported,omitempty"`
	HeightBefore   uint64 `json:"heightBefore,omitempty"`
	HeightAfter    uint64 `json:"heightAfter,omitempty"`
	Message        string `json:"message,omitempty"`
}

ImportChainResult represents the response from admin_importChain

type StateSyncClient

type StateSyncClient interface {
	// methods that implement the client side of [block.StateSyncableVM]
	StateSyncEnabled(context.Context) (bool, error)
	GetOngoingSyncStateSummary(context.Context) (block.StateSummary, error)
	ParseStateSummary(ctx context.Context, summaryBytes []byte) (block.StateSummary, error)

	// additional methods required by the evm package
	ClearOngoingSummary() error
	Shutdown() error
	Error() error
}

func NewStateSyncClient

func NewStateSyncClient(config *stateSyncClientConfig) StateSyncClient

type StateSyncServer

type StateSyncServer interface {
	GetLastStateSummary(context.Context) (block.StateSummary, error)
	GetStateSummary(context.Context, uint64) (block.StateSummary, error)
}

func NewStateSyncServer

func NewStateSyncServer(config *stateSyncServerConfig) StateSyncServer

type Status

type Status uint32

Status ...

const (
	Unknown Status = iota
	Dropped
	Processing
	Accepted
)

List of possible status values Unknown Zero value, means the status is not known Dropped means the transaction was in the mempool, but was dropped because it failed verification Processing means the transaction is in the mempool Accepted means the transaction was accepted

func (Status) MarshalJSON

func (s Status) MarshalJSON() ([]byte, error)

MarshalJSON ...

func (Status) String

func (s Status) String() string

func (*Status) UnmarshalJSON

func (s *Status) UnmarshalJSON(b []byte) error

UnmarshalJSON ...

func (Status) Valid

func (s Status) Valid() error

Valid returns nil if the status is a valid status.

type Syncer

type Syncer interface {
	Start(ctx context.Context) error
	Wait(ctx context.Context) error
}

Syncer represents a step in state sync, along with Start/Done methods to control and monitor progress. Error returns an error if any was encountered.

type TestSender

type TestSender struct {
	T *testing.T

	CantSendGossip         bool
	CantSendGossipSpecific bool
	CantSendRequest        bool
	CantSendResponse       bool
	CantSendError          bool

	SendGossipF             func(context.Context, p2p.SendConfig, []byte) error
	SendGossipSpecificF     func(context.Context, set.Set[ids.NodeID], []byte) error
	SendRequestF            func(context.Context, set.Set[ids.NodeID], uint32, []byte) error
	SendResponseF           func(context.Context, ids.NodeID, uint32, []byte) error
	SendErrorF              func(context.Context, ids.NodeID, uint32, int32, string) error
	SendCrossChainRequestF  func(context.Context, ids.ID, uint32, []byte) error
	SendCrossChainResponseF func(context.Context, ids.ID, uint32, []byte) error
	SendCrossChainErrorF    func(context.Context, ids.ID, uint32, int32, string) error

	// Channel for capturing sent gossip messages
	SentGossip chan []byte
}

TestSender is a test implementation of the p2p.Sender interface

func (*TestSender) SendCrossChainError

func (s *TestSender) SendCrossChainError(ctx context.Context, chainID ids.ID, requestID uint32, errorCode int32, errorMessage string) error

SendCrossChainError sends a cross-chain error

func (*TestSender) SendCrossChainRequest

func (s *TestSender) SendCrossChainRequest(ctx context.Context, chainID ids.ID, requestID uint32, requestBytes []byte) error

SendCrossChainRequest sends a cross-chain request

func (*TestSender) SendCrossChainResponse

func (s *TestSender) SendCrossChainResponse(ctx context.Context, chainID ids.ID, requestID uint32, responseBytes []byte) error

SendCrossChainResponse sends a cross-chain response

func (*TestSender) SendError

func (s *TestSender) SendError(ctx context.Context, nodeID ids.NodeID, requestID uint32, errorCode int32, errorMessage string) error

SendError implements p2p.Sender

func (*TestSender) SendGossip

func (s *TestSender) SendGossip(ctx context.Context, config p2p.SendConfig, msg []byte) error

SendGossip implements p2p.Sender

func (*TestSender) SendGossipSpecific

func (s *TestSender) SendGossipSpecific(ctx context.Context, nodeIDs set.Set[ids.NodeID], msg []byte) error

SendGossipSpecific sends gossip to specific nodes

func (*TestSender) SendRequest

func (s *TestSender) SendRequest(ctx context.Context, nodeIDs set.Set[ids.NodeID], requestID uint32, request []byte) error

SendRequest implements p2p.Sender

func (*TestSender) SendResponse

func (s *TestSender) SendResponse(ctx context.Context, nodeID ids.NodeID, requestID uint32, response []byte) error

SendResponse implements p2p.Sender

type VM

type VM struct {

	// *nodeChain.State helps to implement the VM interface by wrapping blocks
	// with an efficient caching layer.
	*nodeChain.State

	Network *network.Network

	// State sync server and client
	StateSyncServer
	StateSyncClient
	// contains filtered or unexported fields
}

func (*VM) AppRequestFailed

func (vm *VM) AppRequestFailed(ctx context.Context, nodeID ids.NodeID, requestID uint32, appErr *warp.AppError) error

AppRequestFailed implements the VM interface

func (*VM) BuildBlock

func (vm *VM) BuildBlock(ctx context.Context) (nodeblock.Block, error)

BuildBlock implements the ChainVM interface Uses State.BuildBlock to ensure proper block tracking (for LastAccepted, etc.)

func (*VM) BuildBlockWithContext

func (vm *VM) BuildBlockWithContext(ctx context.Context, proposerVMBlockCtx *nodeblock.Context) (nodeblock.Block, error)

BuildBlockWithContext implements the BuildBlockWithContextChainVM interface

func (*VM) Connected

func (vm *VM) Connected(ctx context.Context, nodeID ids.NodeID, ver *nodeblock.VersionInfo) error

func (*VM) CreateHTTP2Handler

func (vm *VM) CreateHTTP2Handler(context.Context) (http.Handler, error)

func (*VM) CreateHandlers

func (vm *VM) CreateHandlers(context.Context) (map[string]http.Handler, error)

CreateHandlers makes new http handlers that can handle API calls

func (*VM) CrossChainAppRequestFailed

func (vm *VM) CrossChainAppRequestFailed(ctx context.Context, chainID ids.ID, requestID uint32, appErr *warp.AppError) error

CrossChainAppRequestFailed implements the VM interface

func (*VM) Disconnected

func (vm *VM) Disconnected(ctx context.Context, nodeID ids.NodeID) error

func (*VM) GetAcceptedBlock

func (vm *VM) GetAcceptedBlock(ctx context.Context, blkID ids.ID) (nodeblock.Block, error)

GetAcceptedBlock attempts to retrieve block [blkID] from the VM. This method only returns accepted blocks.

func (*VM) GetBlock

func (vm *VM) GetBlock(ctx context.Context, id ids.ID) (nodeblock.Block, error)

getBlock attempts to retrieve block [id] from the VM to be wrapped by ChainState. GetBlock implements the ChainVM interface

func (*VM) GetBlockIDAtHeight

func (vm *VM) GetBlockIDAtHeight(_ context.Context, height uint64) (ids.ID, error)

GetBlockIDAtHeight returns the canonical block at [height]. Note: the engine assumes that if a block is not found at [height], then database.ErrNotFound will be returned. This indicates that the VM has state synced and does not have all historical blocks available.

func (*VM) GetCurrentNonce

func (vm *VM) GetCurrentNonce(address common.Address) (uint64, error)

GetCurrentNonce returns the nonce associated with the address at the preferred block

func (*VM) GetLastStateSummary

func (vm *VM) GetLastStateSummary(ctx context.Context) (nodeblock.StateSummary, error)

GetLastStateSummary implements the StateSyncableVM interface

func (*VM) GetOngoingSyncStateSummary

func (vm *VM) GetOngoingSyncStateSummary(ctx context.Context) (nodeblock.StateSummary, error)

GetOngoingSyncStateSummary implements the StateSyncableVM interface

func (*VM) GetStateSummary

func (vm *VM) GetStateSummary(ctx context.Context, height uint64) (nodeblock.StateSummary, error)

GetStateSummary implements the StateSyncableVM interface

func (*VM) HealthCheck

func (vm *VM) HealthCheck(context.Context) (chain.HealthResult, error)

HealthCheck returns the health status of this chain.

func (*VM) Initialize

func (vm *VM) Initialize(ctx context.Context, init block.Init) error

Initialize implements the chain.ChainVM interface

func (*VM) NewBlockBuilder

func (vm *VM) NewBlockBuilder() *blockBuilder

func (*VM) NewHTTPHandler

func (vm *VM) NewHTTPHandler(ctx context.Context) (http.Handler, error)

NewHTTPHandler implements the chain.ChainVM interface

func (*VM) ParseBlock

func (vm *VM) ParseBlock(ctx context.Context, b []byte) (nodeblock.Block, error)

ParseBlock implements nodeblock.ChainVM interface

func (*VM) ParseEthBlock

func (vm *VM) ParseEthBlock(b []byte) (*types.Block, error)

func (*VM) ParseStateSummary

func (vm *VM) ParseStateSummary(ctx context.Context, summaryBytes []byte) (nodeblock.StateSummary, error)

ParseStateSummary implements the StateSyncableVM interface

func (*VM) SetPreference

func (vm *VM) SetPreference(ctx context.Context, blkID ids.ID) error

SetPreference sets what the current tail of the chain is

func (*VM) SetState

func (vm *VM) SetState(_ context.Context, state uint32) error

func (*VM) Shutdown

func (vm *VM) Shutdown(context.Context) error

Shutdown implements the chain.ChainVM interface

func (*VM) StateSyncEnabled

func (vm *VM) StateSyncEnabled(ctx context.Context) (bool, error)

StateSyncEnabled implements the StateSyncableVM interface

func (*VM) Version

func (vm *VM) Version(context.Context) (string, error)

func (*VM) WaitForEvent

func (vm *VM) WaitForEvent(ctx context.Context) (block.Message, error)

type VMState

type VMState = vm.State

VMState is the canonical VM lifecycle state from github.com/luxfi/vm.

type ValidatorsAPI

type ValidatorsAPI struct {
	// contains filtered or unexported fields
}

func (*ValidatorsAPI) GetCurrentValidators

Directories

Path Synopsis
blockgascost implements the block gas cost logic
blockgascost implements the block gas cost logic
upgrade
feewindow
feewindow defines the dynamic fee window used by EVM.
feewindow defines the dynamic fee window used by EVM.
state/interfaces
Package interfaces is a generated GoMock package.
Package interfaces is a generated GoMock package.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL