Documentation ¶
Index ¶
- Constants
- Variables
- type ChainConfig
- type Head
- type MultiNode
- type Node
- type NodeClient
- type NodeConfig
- type NodeSelector
- func NewHighestHeadNodeSelector[CHAIN_ID types.ID, HEAD Head, RPC NodeClient[CHAIN_ID, HEAD]](nodes []Node[CHAIN_ID, HEAD, RPC]) NodeSelector[CHAIN_ID, HEAD, RPC]
- func NewPriorityLevelNodeSelector[CHAIN_ID types.ID, HEAD Head, RPC NodeClient[CHAIN_ID, HEAD]](nodes []Node[CHAIN_ID, HEAD, RPC]) NodeSelector[CHAIN_ID, HEAD, RPC]
- func NewRoundRobinSelector[CHAIN_ID types.ID, HEAD Head, RPC NodeClient[CHAIN_ID, HEAD]](nodes []Node[CHAIN_ID, HEAD, RPC]) NodeSelector[CHAIN_ID, HEAD, RPC]
- func NewTotalDifficultyNodeSelector[CHAIN_ID types.ID, HEAD Head, RPC NodeClient[CHAIN_ID, HEAD]](nodes []Node[CHAIN_ID, HEAD, RPC]) NodeSelector[CHAIN_ID, HEAD, RPC]
- type NodeTier
- type Poller
- type RPC
- type SendOnlyNode
- type SendTxReturnCode
Constants ¶
const ( Primary = NodeTier(iota) Secondary )
const ( NodeSelectionModeHighestHead = "HighestHead" NodeSelectionModeRoundRobin = "RoundRobin" NodeSelectionModeTotalDifficulty = "TotalDifficulty" NodeSelectionModePriorityLevel = "PriorityLevel" )
const QueryTimeout = 10 * time.Second
Variables ¶
var ( // PromMultiNodeRPCNodeStates reports current RPC node state PromMultiNodeRPCNodeStates = promauto.NewGaugeVec(prometheus.GaugeOpts{ Name: "multi_node_states", Help: "The number of RPC nodes currently in the given state for the given chain", }, []string{"network", "chainId", "state"}) // PromMultiNodeInvariantViolations reports violation of our assumptions PromMultiNodeInvariantViolations = promauto.NewCounterVec(prometheus.CounterOpts{ Name: "multi_node_invariant_violations", Help: "The number of invariant violations", }, []string{"network", "chainId", "invariant"}) ErroringNodeError = fmt.Errorf("no live nodes available") )
Functions ¶
This section is empty.
Types ¶
type ChainConfig ¶ added in v2.11.0
type MultiNode ¶
type MultiNode[ CHAIN_ID types.ID, SEQ types.Sequence, ADDR types.Hashable, BLOCK_HASH types.Hashable, TX any, TX_HASH types.Hashable, EVENT any, EVENT_OPS any, TX_RECEIPT types.Receipt[TX_HASH, BLOCK_HASH], FEE feetypes.Fee, HEAD types.Head[BLOCK_HASH], RPC_CLIENT RPC[CHAIN_ID, SEQ, ADDR, BLOCK_HASH, TX, TX_HASH, EVENT, EVENT_OPS, TX_RECEIPT, FEE, HEAD, BATCH_ELEM], BATCH_ELEM any, ] interface { Close() error NodeStates() map[string]string SelectNodeRPC() (RPC_CLIENT, error) BatchCallContextAll(ctx context.Context, b []BATCH_ELEM) error ConfiguredChainID() CHAIN_ID IsL2() bool // contains filtered or unexported methods }
MultiNode is a generalized multi node client interface that includes methods to interact with different chains. It also handles multiple node RPC connections simultaneously.
func NewMultiNode ¶
func NewMultiNode[ CHAIN_ID types.ID, SEQ types.Sequence, ADDR types.Hashable, BLOCK_HASH types.Hashable, TX any, TX_HASH types.Hashable, EVENT any, EVENT_OPS any, TX_RECEIPT types.Receipt[TX_HASH, BLOCK_HASH], FEE feetypes.Fee, HEAD types.Head[BLOCK_HASH], RPC_CLIENT RPC[CHAIN_ID, SEQ, ADDR, BLOCK_HASH, TX, TX_HASH, EVENT, EVENT_OPS, TX_RECEIPT, FEE, HEAD, BATCH_ELEM], BATCH_ELEM any, ]( lggr logger.Logger, selectionMode string, leaseDuration time.Duration, noNewHeadsThreshold time.Duration, nodes []Node[CHAIN_ID, HEAD, RPC_CLIENT], sendonlys []SendOnlyNode[CHAIN_ID, RPC_CLIENT], chainID CHAIN_ID, chainType config.ChainType, chainFamily string, classifySendTxError func(tx TX, err error) SendTxReturnCode, sendTxSoftTimeout time.Duration, ) MultiNode[CHAIN_ID, SEQ, ADDR, BLOCK_HASH, TX, TX_HASH, EVENT, EVENT_OPS, TX_RECEIPT, FEE, HEAD, RPC_CLIENT, BATCH_ELEM]
type Node ¶
type Node[ CHAIN_ID types.ID, HEAD Head, RPC NodeClient[CHAIN_ID, HEAD], ] interface { // State returns nodeState State() nodeState // StateAndLatest returns nodeState with the latest received block number & total difficulty. StateAndLatest() (nodeState, int64, *big.Int) // Name is a unique identifier for this node. Name() string String() string RPC() RPC SubscribersCount() int32 UnsubscribeAllExceptAliveLoop() ConfiguredChainID() CHAIN_ID Order() int32 Start(context.Context) error Close() error }
type NodeClient ¶
type NodeClient[ CHAIN_ID types.ID, HEAD Head, ] interface { DialHTTP() error DisconnectAll() Close() ClientVersion(context.Context) (string, error) SubscribersCount() int32 SetAliveLoopSub(types.Subscription) UnsubscribeAllExceptAliveLoop() IsSyncing(ctx context.Context) (bool, error) LatestFinalizedBlock(ctx context.Context) (HEAD, error) // contains filtered or unexported methods }
NodeClient includes all the necessary RPC methods required by a node.
type NodeConfig ¶
type NodeSelector ¶
type NodeSelector[ CHAIN_ID types.ID, HEAD Head, RPC NodeClient[CHAIN_ID, HEAD], ] interface { // Select returns a Node, or nil if none can be selected. // Implementation must be thread-safe. Select() Node[CHAIN_ID, HEAD, RPC] // Name returns the strategy name, e.g. "HighestHead" or "RoundRobin" Name() string }
func NewHighestHeadNodeSelector ¶
func NewHighestHeadNodeSelector[ CHAIN_ID types.ID, HEAD Head, RPC NodeClient[CHAIN_ID, HEAD], ](nodes []Node[CHAIN_ID, HEAD, RPC]) NodeSelector[CHAIN_ID, HEAD, RPC]
func NewPriorityLevelNodeSelector ¶
func NewPriorityLevelNodeSelector[ CHAIN_ID types.ID, HEAD Head, RPC NodeClient[CHAIN_ID, HEAD], ](nodes []Node[CHAIN_ID, HEAD, RPC]) NodeSelector[CHAIN_ID, HEAD, RPC]
func NewRoundRobinSelector ¶
func NewRoundRobinSelector[ CHAIN_ID types.ID, HEAD Head, RPC NodeClient[CHAIN_ID, HEAD], ](nodes []Node[CHAIN_ID, HEAD, RPC]) NodeSelector[CHAIN_ID, HEAD, RPC]
func NewTotalDifficultyNodeSelector ¶
func NewTotalDifficultyNodeSelector[ CHAIN_ID types.ID, HEAD Head, RPC NodeClient[CHAIN_ID, HEAD], ](nodes []Node[CHAIN_ID, HEAD, RPC]) NodeSelector[CHAIN_ID, HEAD, RPC]
type Poller ¶ added in v2.12.0
type Poller[T any] struct { services.StateMachine // contains filtered or unexported fields }
Poller is a component that polls a function at a given interval and delivers the result to a channel. It is used by multinode to poll for new heads and implements the Subscription interface.
func NewPoller ¶ added in v2.12.0
func NewPoller[ T any, ](pollingInterval time.Duration, pollingFunc func(ctx context.Context) (T, error), pollingTimeout time.Duration, channel chan<- T, logger logger.Logger) Poller[T]
NewPoller creates a new Poller instance
func (*Poller[T]) Unsubscribe ¶ added in v2.12.0
func (p *Poller[T]) Unsubscribe()
Unsubscribe cancels the sending of events to the data channel
type RPC ¶
type RPC[ CHAIN_ID types.ID, SEQ types.Sequence, ADDR types.Hashable, BLOCK_HASH types.Hashable, TX any, TX_HASH types.Hashable, EVENT any, EVENT_OPS any, TX_RECEIPT types.Receipt[TX_HASH, BLOCK_HASH], FEE feetypes.Fee, HEAD types.Head[BLOCK_HASH], BATCH_ELEM any, ] interface { NodeClient[ CHAIN_ID, HEAD, ] // contains filtered or unexported methods }
RPC includes all the necessary methods for a multi-node client to interact directly with any RPC endpoint.
type SendOnlyNode ¶
type SendOnlyNode[ CHAIN_ID types.ID, RPC sendOnlyClient[CHAIN_ID], ] interface { // Start may attempt to connect to the node, but should only return error for misconfiguration - never for temporary errors. Start(context.Context) error Close() error ConfiguredChainID() CHAIN_ID RPC() RPC String() string // State returns nodeState State() nodeState // Name is a unique identifier for this node. Name() string }
SendOnlyNode represents one node used as a sendonly
func NewSendOnlyNode ¶
func NewSendOnlyNode[ CHAIN_ID types.ID, RPC sendOnlyClient[CHAIN_ID], ]( lggr logger.Logger, httpuri url.URL, name string, chainID CHAIN_ID, rpc RPC, ) SendOnlyNode[CHAIN_ID, RPC]
NewSendOnlyNode returns a new sendonly node
type SendTxReturnCode ¶
type SendTxReturnCode int
const ( Successful SendTxReturnCode = iota + 1 Fatal // Unrecoverable error. Most likely the attempt should be thrown away. Retryable // The error returned by the RPC indicates that if we retry with the same attempt, the tx will eventually go through. Underpriced // Attempt was underpriced. New estimation is needed with bumped gas price. Unknown // Tx failed with an error response that is not recognized by the client. Unsupported // Attempt failed with an error response that is not supported by the client for the given chain. TransactionAlreadyKnown // The transaction that was sent has already been received by the RPC. InsufficientFunds // Tx was rejected due to insufficient funds. ExceedsMaxFee // Attempt's fee was higher than the node's limit and got rejected. FeeOutOfValidRange // This error is returned when we use a fee price suggested from an RPC, but the network rejects the attempt due to an invalid range(mostly used by L2 chains). Retry by requesting a new suggested fee price. OutOfCounters // The error returned when a transaction is too complex to be proven by zk circuits. This error is mainly returned by zk chains. )
SendTxReturnCode is a generalized client error that dictates what should be the next action, depending on the RPC error response.
func (SendTxReturnCode) String ¶ added in v2.12.0
func (c SendTxReturnCode) String() string