Add missing interfaces for EVM compatibility

- Add AppSender interface to engine/core for VM plugin communication
- Add AppHandler interface with message handling methods
- Add Fx struct for feature extensions
- Add AppSender interface to engine/chain/block for node integration
- Fix GetValidatorState to return typed ValidatorState instead of interface{}
- Add appsender package in core for consensus-level app messaging

These interfaces are required by the EVM package to build successfully
with the consensus package.
This commit is contained in:
2025-12-16 12:03:37 -08:00
parent 4f5d1351b7
commit 7febfe80c5
4 changed files with 125 additions and 2 deletions
+4 -2
View File
@@ -121,9 +121,11 @@ func GetNetworkID(ctx context.Context) uint32 {
}
// GetValidatorState gets the validator state from context
func GetValidatorState(ctx context.Context) interface{} {
func GetValidatorState(ctx context.Context) ValidatorState {
if c, ok := ctx.Value(contextKey).(*Context); ok {
return c.ValidatorState
if vs, ok := c.ValidatorState.(ValidatorState); ok {
return vs
}
}
return nil
}
+30
View File
@@ -0,0 +1,30 @@
// Copyright (C) 2019-2025, Lux Industries Inc. All rights reserved.
// See the file LICENSE for licensing terms.
// Package appsender provides application-level message sending interfaces
package appsender
import (
"context"
"github.com/luxfi/ids"
"github.com/luxfi/math/set"
)
// AppSender sends application-level messages.
type AppSender interface {
// SendAppRequest sends an application-level request to the given nodes.
SendAppRequest(ctx context.Context, nodeIDs set.Set[ids.NodeID], requestID uint32, appRequestBytes []byte) error
// SendAppResponse sends an application-level response to the given node.
SendAppResponse(ctx context.Context, nodeID ids.NodeID, requestID uint32, appResponseBytes []byte) error
// SendAppError sends an application-level error to the given node.
SendAppError(ctx context.Context, nodeID ids.NodeID, requestID uint32, errorCode int32, errorMessage string) error
// SendAppGossip sends an application-level gossip to all connected nodes.
SendAppGossip(ctx context.Context, nodeIDs set.Set[ids.NodeID], appGossipBytes []byte) error
// SendAppGossipSpecific sends an application-level gossip to specific nodes.
SendAppGossipSpecific(ctx context.Context, nodeIDs set.Set[ids.NodeID], appGossipBytes []byte) error
}
+18
View File
@@ -57,3 +57,21 @@ const (
PendingTxs = core.PendingTxs
StateSyncDone = core.StateSyncDone
)
// AppSender sends application-level messages
type AppSender interface {
// SendAppRequest sends an application-level request to the given nodes
SendAppRequest(ctx context.Context, nodeIDs []ids.NodeID, requestID uint32, appRequestBytes []byte) error
// SendAppResponse sends an application-level response to the given node
SendAppResponse(ctx context.Context, nodeID ids.NodeID, requestID uint32, appResponseBytes []byte) error
// SendAppError sends an application-level error to the given node
SendAppError(ctx context.Context, nodeID ids.NodeID, requestID uint32, errorCode int32, errorMessage string) error
// SendAppGossip sends an application-level gossip to peers
SendAppGossip(ctx context.Context, nodeIDs []ids.NodeID, appGossipBytes []byte) error
// SendAppGossipSpecific sends an application-level gossip to specific peers
SendAppGossipSpecific(ctx context.Context, nodeIDs []ids.NodeID, appGossipBytes []byte) error
}
+73
View File
@@ -0,0 +1,73 @@
// Copyright (C) 2019-2025, Lux Industries Inc. All rights reserved.
// See the file LICENSE for licensing terms.
// Package core provides core interfaces for the Lux consensus engine
package core
import (
"context"
"time"
"github.com/luxfi/ids"
"github.com/luxfi/math/set"
)
// AppError represents an application-level error
type AppError struct {
Code int32
Message string
}
// Error implements error interface
func (e *AppError) Error() string {
return e.Message
}
// AppSender sends application-level messages.
type AppSender interface {
// SendAppRequest sends an application-level request to the given nodes.
SendAppRequest(ctx context.Context, nodeIDs set.Set[ids.NodeID], requestID uint32, appRequestBytes []byte) error
// SendAppResponse sends an application-level response to the given node.
SendAppResponse(ctx context.Context, nodeID ids.NodeID, requestID uint32, appResponseBytes []byte) error
// SendAppError sends an application-level error to the given node.
SendAppError(ctx context.Context, nodeID ids.NodeID, requestID uint32, errorCode int32, errorMessage string) error
// SendAppGossip sends an application-level gossip to all connected nodes.
SendAppGossip(ctx context.Context, nodeIDs set.Set[ids.NodeID], appGossipBytes []byte) error
// SendAppGossipSpecific sends an application-level gossip to specific nodes.
SendAppGossipSpecific(ctx context.Context, nodeIDs set.Set[ids.NodeID], appGossipBytes []byte) error
}
// AppHandler handles application-level messages from nodes.
type AppHandler interface {
// AppRequest handles an application-level request from a node.
AppRequest(ctx context.Context, nodeID ids.NodeID, requestID uint32, deadline time.Time, request []byte) error
// AppRequestFailed handles a failed application-level request.
AppRequestFailed(ctx context.Context, nodeID ids.NodeID, requestID uint32, appErr *AppError) error
// AppResponse handles an application-level response from a node.
AppResponse(ctx context.Context, nodeID ids.NodeID, requestID uint32, response []byte) error
// AppGossip handles an application-level gossip from a node.
AppGossip(ctx context.Context, nodeID ids.NodeID, msg []byte) error
}
// FxInterface is a feature extension interface
type FxInterface interface {
// Initialize initializes the Fx
Initialize(vm interface{}) error
// Bootstrapping is called when the chain is bootstrapping
Bootstrapping() error
// Bootstrapped is called when the chain is done bootstrapping
Bootstrapped() error
}
// Fx is a feature extension wrapper with ID
type Fx struct {
ID ids.ID
Fx FxInterface
}