node

package
v0.0.0-...-3a5d5d8 Latest Latest
Warning

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

Go to latest
Published: Mar 13, 2024 License: LGPL-3.0 Imports: 69 Imported by: 0

README

Node struct is the core entity that represents a network node participating in the Feechain protocol.

A node is the main message handler to all kinds of protocol messages such as consensus message, block sync, transactions etc. A node contains all the necessary references to other objects (e.g. blockchain object and consensus object) to handle the incoming messages.

Documentation

Index

Constants

View Source
const (
	// NumTryBroadCast is the number of times trying to broadcast
	NumTryBroadCast = 3
	// MsgChanBuffer is the buffer of consensus message handlers.
	MsgChanBuffer = 1024
)
View Source
const (
	SleepPeriod           = 20 * time.Millisecond
	IncomingReceiptsLimit = 6000 // 2000 * (numShards - 1)
)

Constants of proposing a new block

View Source
const (
	SyncFrequency = 60
)

Constants related to doing syncing.

View Source
const (

	//SyncIDLength is the length of bytes for syncID
	SyncIDLength = 20
)

Variables

This section is empty.

Functions

func GenerateRandomString

func GenerateRandomString(n int) string

GenerateRandomString generates a random string with given length

Types

type DNSSyncingPeerProvider

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

DNSSyncingPeerProvider uses the given DNS zone to resolve syncing peers.

func NewDNSSyncingPeerProvider

func NewDNSSyncingPeerProvider(zone, port string) *DNSSyncingPeerProvider

NewDNSSyncingPeerProvider returns a provider that uses given DNS name and port number to resolve syncing peers.

func (*DNSSyncingPeerProvider) SyncingPeers

func (p *DNSSyncingPeerProvider) SyncingPeers(shardID uint32) (peers []p2p.Peer, err error)

SyncingPeers resolves DNS name into peers and returns them.

type LegacySyncingPeerProvider

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

LegacySyncingPeerProvider uses neighbor lists stored in a Node to serve syncing peer list query.

func NewLegacySyncingPeerProvider

func NewLegacySyncingPeerProvider(node *Node) *LegacySyncingPeerProvider

NewLegacySyncingPeerProvider creates and returns a new node-based syncing peer provider.

func (*LegacySyncingPeerProvider) SyncingPeers

func (p *LegacySyncingPeerProvider) SyncingPeers(shardID uint32) (peers []p2p.Peer, err error)

SyncingPeers returns peers stored in neighbor maps in the node structure.

type LocalSyncingPeerProvider

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

LocalSyncingPeerProvider uses localnet deployment convention to synthesize syncing peers.

func NewLocalSyncingPeerProvider

func NewLocalSyncingPeerProvider(
	basePort, selfPort uint16, numShards, shardSize uint32,
) *LocalSyncingPeerProvider

NewLocalSyncingPeerProvider returns a provider that synthesizes syncing peers given the network configuration

func (*LocalSyncingPeerProvider) SyncingPeers

func (p *LocalSyncingPeerProvider) SyncingPeers(shardID uint32) (peers []p2p.Peer, err error)

SyncingPeers returns local syncing peers using the sharding configuration.

type Node

type Node struct {
	Consensus             *consensus.Consensus // Consensus object containing all Consensus related data (e.g. committee members, signatures, commits)
	BlockChannel          chan *types.Block    // The channel to send newly proposed blocks
	ConfirmedBlockChannel chan *types.Block    // The channel to send confirmed blocks
	BeaconBlockChannel    chan *types.Block    // The channel to send beacon blocks for non-beaconchain nodes

	SelfPeer p2p.Peer
	// TODO: Neighbors should store only neighbor nodes in the same shard
	Neighbors sync.Map // All the neighbor nodes, key is the sha256 of Peer IP/Port, value is the p2p.Peer

	// BeaconNeighbors store only neighbor nodes in the beacon chain shard
	BeaconNeighbors      sync.Map // All the neighbor nodes, key is the sha256 of Peer IP/Port, value is the p2p.Peer
	TxPool               *core.TxPool
	CxPool               *core.CxPool // pool for missing cross shard receipts resend
	Worker, BeaconWorker *worker.Worker

	SyncingPeerProvider SyncingPeerProvider

	ContractDeployerCurrentNonce uint64 // The nonce of the deployer contract at current block
	ContractAddresses            []common.Address

	FeechainConfig *feechainconfig.FeechainConfig
	// node configuration, including group ID, shard ID, etc
	NodeConfig *nodeconfig.ConfigType

	// KeysToAddrs holds the addresses of bls keys run by the node
	KeysToAddrs map[string]common.Address

	// TransactionErrorSink contains error messages for any failed transaction, in memory only
	TransactionErrorSink *types.TransactionErrorSink
	// BroadcastInvalidTx flag is considered when adding pending tx to tx-pool
	BroadcastInvalidTx bool
	// InSync flag indicates the node is in-sync or not
	IsInSync *abool.AtomicBool

	Metrics metrics.Registry
	// contains filtered or unexported fields
}

Node represents a protocol-participating node in the network

func New

func New(
	host p2p.Host,
	consensusObj *consensus.Consensus,
	chainDBFactory shardchain.DBFactory,
	blacklist map[common.Address]struct{},
	isArchival map[uint32]bool,
	feechainconfig *feechainconfig.FeechainConfig,
) *Node

New creates a new node.

func (*Node) APIs

func (node *Node) APIs(feechain *fch.Feechain) []rpc.API

APIs return the collection of local RPC services. NOTE, some of these services probably need to be moved to somewhere else.

func (*Node) AddBeaconPeer

func (node *Node) AddBeaconPeer(p *p2p.Peer) bool

AddBeaconPeer adds beacon chain neighbors nodes Return false means new neighbor peer was added Return true means redundant neighbor peer wasn't added

func (*Node) AddNewBlockForExplorer

func (node *Node) AddNewBlockForExplorer(block *types.Block)

AddNewBlockForExplorer add new block for explorer.

func (*Node) AddPeers

func (node *Node) AddPeers(peers []*p2p.Peer) int

AddPeers adds neighbors nodes

func (*Node) AddPendingReceipts

func (node *Node) AddPendingReceipts(receipts *types.CXReceiptsProof)

AddPendingReceipts adds one receipt message to pending list.

func (*Node) AddPendingStakingTransaction

func (node *Node) AddPendingStakingTransaction(
	newStakingTx *staking.StakingTransaction,
) error

AddPendingStakingTransaction staking transactions

func (*Node) AddPendingTransaction

func (node *Node) AddPendingTransaction(newTx *types.Transaction) error

AddPendingTransaction adds one new transaction to the pending transaction list. This is only called from SDK.

func (*Node) BeaconSyncHook

func (node *Node) BeaconSyncHook()

BeaconSyncHook is the hook function called after inserted beacon in downloader TODO: This is a small misc piece of consensus logic. Better put it to consensus module.

func (*Node) Beaconchain

func (node *Node) Beaconchain() *core.BlockChain

Beaconchain returns the beaconchain from node.

func (*Node) Blockchain

func (node *Node) Blockchain() *core.BlockChain

Blockchain returns the blockchain for the node's current shard.

func (*Node) BootstrapConsensus

func (node *Node) BootstrapConsensus() error

BootstrapConsensus is the a goroutine to check number of peers and start the consensus

func (*Node) BroadcastCXReceipts

func (node *Node) BroadcastCXReceipts(newBlock *types.Block)

BroadcastCXReceipts broadcasts cross shard receipts to correspoding destination shards

func (*Node) BroadcastCXReceiptsWithShardID

func (node *Node) BroadcastCXReceiptsWithShardID(block *types.Block, commitSig []byte, commitBitmap []byte, toShardID uint32)

BroadcastCXReceiptsWithShardID broadcasts cross shard receipts to given ToShardID

func (node *Node) BroadcastCrossLink()

BroadcastCrossLink is called by consensus leader to send the new header as cross link to beacon chain.

func (*Node) BroadcastMissingCXReceipts

func (node *Node) BroadcastMissingCXReceipts()

BroadcastMissingCXReceipts broadcasts missing cross shard receipts per request

func (*Node) BroadcastNewBlock

func (node *Node) BroadcastNewBlock(newBlock *types.Block)

BroadcastNewBlock is called by consensus leader to sync new blocks with other clients/nodes. NOTE: For now, just send to the client (basically not broadcasting) TODO (lc): broadcast the new blocks to new nodes doing state sync

func (*Node) BroadcastSlash

func (node *Node) BroadcastSlash(witness *slash.Record)

BroadcastSlash ..

func (*Node) CalculateResponse

func (node *Node) CalculateResponse(request *downloader_pb.DownloaderRequest, incomingPeer string) (*downloader_pb.DownloaderResponse, error)

CalculateResponse implements DownloadInterface on Node object.

func (*Node) DoSyncWithoutConsensus

func (node *Node) DoSyncWithoutConsensus()

DoSyncWithoutConsensus gets sync-ed to blockchain without joining consensus

func (*Node) DoSyncing

func (node *Node) DoSyncing(bc *core.BlockChain, worker *worker.Worker, willJoinConsensus bool)

DoSyncing keep the node in sync with other peers, willJoinConsensus means the node will try to join consensus after catch up

func (*Node) GetAddressForBLSKey

func (node *Node) GetAddressForBLSKey(blskey *bls_core.PublicKey, epoch *big.Int) common.Address

GetAddressForBLSKey retrieves the ECDSA address associated with bls key for epoch

func (*Node) GetAddresses

func (node *Node) GetAddresses(epoch *big.Int) map[string]common.Address

GetAddresses retrieves all ECDSA addresses of the bls keys for epoch

func (*Node) GetConfig

func (node *Node) GetConfig() rpc_common.Config

func (*Node) GetConsensusBlockNum

func (node *Node) GetConsensusBlockNum() uint64

GetConsensusBlockNum returns the current block number of the consensus

func (*Node) GetConsensusCurViewID

func (node *Node) GetConsensusCurViewID() uint64

GetConsensusCurViewID returns the current view ID

func (*Node) GetConsensusInternal

func (node *Node) GetConsensusInternal() rpc_common.ConsensusInternal

GetConsensusInternal returns consensus internal data

func (*Node) GetConsensusMode

func (node *Node) GetConsensusMode() string

GetConsensusMode returns the current consensus mode

func (*Node) GetConsensusPhase

func (node *Node) GetConsensusPhase() string

GetConsensusPhase returns the current consensus phase

func (*Node) GetConsensusViewChangingID

func (node *Node) GetConsensusViewChangingID() uint64

GetConsensusViewChangingID returns the view changing ID

func (*Node) GetLastSigningPower

func (node *Node) GetLastSigningPower() (float64, error)

GetLastSigningPower get last signed power

func (*Node) GetNodeBootTime

func (node *Node) GetNodeBootTime() int64

GetNodeBootTime ..

func (*Node) GetStakingTransactionsCount

func (node *Node) GetStakingTransactionsCount(address, txType string) (uint64, error)

GetStakingTransactionsCount returns the number of staking transactions hashes of address for input type.

func (*Node) GetStakingTransactionsHistory

func (node *Node) GetStakingTransactionsHistory(address, txType, order string) ([]common.Hash, error)

GetStakingTransactionsHistory returns list of staking transactions hashes of address.

func (*Node) GetSyncID

func (node *Node) GetSyncID() [SyncIDLength]byte

GetSyncID returns the syncID of this node

func (*Node) GetTransactionsCount

func (node *Node) GetTransactionsCount(address, txType string) (uint64, error)

GetTransactionsCount returns the number of regular transactions hashes of address for input type.

func (*Node) GetTransactionsHistory

func (node *Node) GetTransactionsHistory(address, txType, order string) ([]common.Hash, error)

GetTransactionsHistory returns list of transactions hashes of address.

func (*Node) HandleNodeMessage

func (node *Node) HandleNodeMessage(
	ctx context.Context,
	msgPayload []byte,
	actionType proto_node.MessageType,
) error

HandleNodeMessage parses the message and dispatch the actions.

func (*Node) InitConsensusWithValidators

func (node *Node) InitConsensusWithValidators() (err error)

InitConsensusWithValidators initialize shard state from latest epoch and update committee pub keys for consensus

func (*Node) InitSyncingServer

func (node *Node) InitSyncingServer(port int)

InitSyncingServer starts downloader server.

func (*Node) IsBackup

func (node *Node) IsBackup() bool

IsBackup returns the node is in backup mode

func (*Node) IsCurrentlyLeader

func (node *Node) IsCurrentlyLeader() bool

IsCurrentlyLeader exposes if node is currently the leader node

func (*Node) IsOutOfSync

func (node *Node) IsOutOfSync(shardID uint32) bool

IsOutOfSync return whether the node is out of sync of the given hsardID

func (*Node) IsRunningBeaconChain

func (node *Node) IsRunningBeaconChain() bool

IsRunningBeaconChain returns whether the node is running on beacon chain.

func (*Node) IsSameHeight

func (node *Node) IsSameHeight() (uint64, bool)

IsSameHeight tells whether node is at same bc height as a peer

func (*Node) ListBlockedPeer

func (node *Node) ListBlockedPeer() []peer.ID

ListBlockedPeer return list of blocked peers

func (*Node) ListPeer

func (node *Node) ListPeer(topic string) []peer.ID

ListPeer return list of peers for a certain topic

func (*Node) ListTopic

func (node *Node) ListTopic() []string

ListTopic return list of topics the node subscribed

func (*Node) PeerConnectivity

func (node *Node) PeerConnectivity() (int, int, int)

PeerConnectivity ..

func (*Node) PendingCXReceipts

func (node *Node) PendingCXReceipts() []*types.CXReceiptsProof

PendingCXReceipts returns node.pendingCXReceiptsProof

func (*Node) PostConsensusProcessing

func (node *Node) PostConsensusProcessing(newBlock *types.Block) error

PostConsensusProcessing is called by consensus participants, after consensus is done, to: 1. add the new block to blockchain 2. [leader] send new block to the client 3. [leader] send cross shard tx receipts to destination shard

func (*Node) ProcessCrossLinkMessage

func (node *Node) ProcessCrossLinkMessage(msgPayload []byte)

ProcessCrossLinkMessage verify and process Node/CrossLink message into crosslink when it's valid

func (*Node) ProcessReceiptMessage

func (node *Node) ProcessReceiptMessage(msgPayload []byte)

ProcessReceiptMessage store the receipts and merkle proof in local data store

func (*Node) ProposeNewBlock

func (node *Node) ProposeNewBlock(commitSigs chan []byte) (*types.Block, error)

ProposeNewBlock proposes a new block...

func (*Node) RegisterExplorerServices

func (node *Node) RegisterExplorerServices()

RegisterExplorerServices register the explorer services

func (*Node) RegisterService

func (node *Node) RegisterService(st service.Type, s service.Service)

RegisterService register a service to the node service manager

func (*Node) RegisterValidatorServices

func (node *Node) RegisterValidatorServices()

RegisterValidatorServices register the validator services.

func (*Node) ReportPlainErrorSink

func (node *Node) ReportPlainErrorSink() types.TransactionErrorReports

ReportPlainErrorSink is the report of failed transactions this node has (held in memory only)

func (*Node) ReportStakingErrorSink

func (node *Node) ReportStakingErrorSink() types.TransactionErrorReports

ReportStakingErrorSink is the report of failed staking transactions this node has (held in memory only)

func (*Node) SendNewBlockToUnsync

func (node *Node) SendNewBlockToUnsync()

SendNewBlockToUnsync send latest verified block to unsync, registered nodes

func (*Node) ServiceManager

func (node *Node) ServiceManager() *service.Manager

ServiceManager ...

func (*Node) SetNodeBackupMode

func (node *Node) SetNodeBackupMode(isBackup bool) bool

SetNodeBackupMode change node backup mode

func (*Node) SetupGenesisBlock

func (node *Node) SetupGenesisBlock(db ethdb.Database, shardID uint32, myShardState *shard.State)

SetupGenesisBlock sets up a genesis blockchain.

func (*Node) ShutDown

func (node *Node) ShutDown()

ShutDown gracefully shut down the node server and dump the in-memory blockchain state into DB.

func (*Node) StartGRPCSyncClient

func (node *Node) StartGRPCSyncClient()

StartGRPCSyncClient start the legacy gRPC sync process

func (*Node) StartPubSub

func (node *Node) StartPubSub() error

StartPubSub kicks off the node message handling

func (*Node) StartRPC

func (node *Node) StartRPC() error

StartRPC start RPC service

func (*Node) StartRosetta

func (node *Node) StartRosetta() error

StartRosetta start rosetta service

func (*Node) StartServices

func (node *Node) StartServices() error

StartServices runs registered services.

func (*Node) StartSyncingServer

func (node *Node) StartSyncingServer(port int)

StartSyncingServer starts syncing server.

func (*Node) StopPubSub

func (node *Node) StopPubSub()

StopPubSub stops the pubsub handling

func (*Node) StopRPC

func (node *Node) StopRPC() error

StopRPC stop RPC service

func (*Node) StopRosetta

func (node *Node) StopRosetta() error

StopRosetta stops rosetta service

func (*Node) StopServices

func (node *Node) StopServices() error

StopServices runs registered services.

func (*Node) SupportGRPCSyncServer

func (node *Node) SupportGRPCSyncServer(port int)

SupportGRPCSyncServer do gRPC sync server

func (*Node) SyncPeers

func (node *Node) SyncPeers() map[string]int

SyncPeers return connected sync peers for each shard

func (*Node) SyncStatus

func (node *Node) SyncStatus(shardID uint32) (bool, uint64, uint64)

SyncStatus return the syncing status, including whether node is syncing and the target block number, and the difference between current block and target block.

func (node *Node) VerifyBlockCrossLinks(block *types.Block) error

VerifyBlockCrossLinks verifies the cross links of the block

func (node *Node) VerifyCrossLink(cl types.CrossLink) error

VerifyCrossLink verifies the header is valid

func (*Node) VerifyNewBlock

func (node *Node) VerifyNewBlock(newBlock *types.Block) error

VerifyNewBlock is called by consensus participants to verify the block (account model) they are running consensus on

func (*Node) WaitForConsensusReadyV2

func (node *Node) WaitForConsensusReadyV2(readySignal chan consensus.ProposalType, commitSigsChan chan []byte, stopChan chan struct{}, stoppedChan chan struct{})

WaitForConsensusReadyV2 listen for the readiness signal from consensus and generate new block for consensus. only leader will receive the ready signal

type SyncingPeerProvider

type SyncingPeerProvider interface {
	SyncingPeers(shardID uint32) (peers []p2p.Peer, err error)
}

SyncingPeerProvider is an interface for getting the peers in the given shard.

Directories

Path Synopsis

Jump to

Keyboard shortcuts

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