node

package
v1.10.2 Latest Latest
Warning

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

Go to latest
Published: Jan 29, 2021 License: MIT Imports: 70 Imported by: 0

README

Node struct is the core entity that represents a network node participating in the Harmony 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 AddNodeAddressesToGenesisAlloc

func AddNodeAddressesToGenesisAlloc(genesisAlloc core.GenesisAlloc)

AddNodeAddressesToGenesisAlloc adds to the genesis block allocation the accounts used for network validators/nodes, including the account used by the nodes of the initial beacon chain and later new nodes.

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

	// 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,
) *Node

New creates a new node.

func (*Node) APIs

func (node *Node) APIs(harmony *hmy.Harmony) []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) 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 added in v1.10.0

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 added in v1.3.0

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) DoBeaconSyncing

func (node *Node) DoBeaconSyncing()

DoBeaconSyncing update received beaconchain blocks and downloads missing beacon chain blocks

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 added in v1.3.8

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 added in v1.3.8

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

GetAddresses retrieves all ECDSA addresses of the bls keys for epoch

func (*Node) GetConsensusBlockNum added in v1.10.0

func (node *Node) GetConsensusBlockNum() uint64

GetConsensusBlockNum returns the current block number of the consensus

func (*Node) GetConsensusCurViewID added in v1.10.0

func (node *Node) GetConsensusCurViewID() uint64

GetConsensusCurViewID returns the current view ID

func (*Node) GetConsensusInternal added in v1.10.0

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

GetConsensusInternal returns consensus internal data

func (*Node) GetConsensusMode added in v1.10.0

func (node *Node) GetConsensusMode() string

GetConsensusMode returns the current consensus mode

func (*Node) GetConsensusPhase added in v1.10.0

func (node *Node) GetConsensusPhase() string

GetConsensusPhase returns the current consensus phase

func (*Node) GetConsensusViewChangingID added in v1.10.0

func (node *Node) GetConsensusViewChangingID() uint64

GetConsensusViewChangingID returns the view changing ID

func (*Node) GetMaxPeerHeight added in v1.10.0

func (node *Node) GetMaxPeerHeight() uint64

GetMaxPeerHeight ...

func (*Node) GetNodeBootTime added in v1.3.8

func (node *Node) GetNodeBootTime() int64

GetNodeBootTime ..

func (*Node) GetStakingTransactionsCount added in v1.3.8

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 added in v1.3.7

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 added in v1.3.8

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 added in v1.10.0

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 added in v1.3.0

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()

InitSyncingServer starts downloader server.

func (*Node) IsCurrentlyLeader

func (node *Node) IsCurrentlyLeader() bool

IsCurrentlyLeader exposes if node is currently the leader node

func (*Node) IsOutOfSync added in v1.10.0

func (node *Node) IsOutOfSync(bc *core.BlockChain) bool

IsOutOfSync ...

func (*Node) IsSameHeight

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

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

func (*Node) ListBlockedPeer added in v1.10.0

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

ListBlockedPeer return list of blocked peers

func (*Node) ListPeer added in v1.10.0

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

ListPeer return list of peers for a certain topic

func (*Node) ListTopic added in v1.10.0

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

ListTopic return list of topics the node subscribed

func (*Node) PeerConnectivity added in v1.3.11

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

PeerConnectivity ..

func (*Node) PendingCXReceipts added in v1.1.1

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 added in v1.3.0

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 added in v1.10.0

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

ProposeNewBlock proposes a new block...

func (*Node) ReportPlainErrorSink added in v1.3.11

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

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

func (*Node) ReportStakingErrorSink added in v1.3.11

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

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

func (*Node) RunServices

func (node *Node) RunServices()

RunServices runs registered services.

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) ServiceManagerSetup

func (node *Node) ServiceManagerSetup()

ServiceManagerSetup setups service store.

func (*Node) SetupGenesisBlock

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

SetupGenesisBlock sets up a genesis blockchain.

func (*Node) ShutDown added in v1.2.4

func (node *Node) ShutDown()

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

func (*Node) Start added in v1.3.8

func (node *Node) Start() error

Start kicks off the node message handling

func (*Node) StartPrometheus added in v1.10.0

func (node *Node) StartPrometheus(cfg prometheus.Config) error

StartPrometheus start promtheus metrics service

func (*Node) StartRPC

func (node *Node) StartRPC() error

StartRPC start RPC service

func (*Node) StartRosetta added in v1.10.0

func (node *Node) StartRosetta() error

StartRosetta start rosetta service

func (*Node) StartSyncingServer

func (node *Node) StartSyncingServer()

StartSyncingServer starts syncing server.

func (*Node) StopPrometheus added in v1.10.0

func (node *Node) StopPrometheus() error

StopPrometheus stop prometheus metrics service

func (*Node) StopRPC added in v1.10.0

func (node *Node) StopRPC() error

StopRPC stop RPC service

func (*Node) StopRosetta added in v1.10.0

func (node *Node) StopRosetta() error

StopRosetta stops rosetta service

func (*Node) StopServices

func (node *Node) StopServices()

StopServices runs registered services.

func (*Node) SupportBeaconSyncing

func (node *Node) SupportBeaconSyncing()

SupportBeaconSyncing sync with beacon chain for archival node in beacon chan or non-beacon node

func (*Node) SupportSyncing

func (node *Node) SupportSyncing()

SupportSyncing keeps sleeping until it's doing consensus or it's a leader.

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