Help us shape the future of Go! Take the 2026 Go Developer Survey

node

package
v1.3.12 Latest Latest
Warning

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

Go to latest
Published: May 10, 2020 License: MIT Imports: 72 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
	// ClientRxQueueSize is the number of client messages to queue before tail-dropping.
	ClientRxQueueSize = 16384
	// ShardRxQueueSize is the number of shard messages to queue before tail-dropping.
	ShardRxQueueSize = 16384
	// GlobalRxQueueSize is the number of global messages to queue before tail-dropping.
	GlobalRxQueueSize = 16384
	// ClientRxWorkers is the number of concurrent client message handlers.
	ClientRxWorkers = 8
	// ShardRxWorkers is the number of concurrent shard message handlers.
	ShardRxWorkers = 32
	// GlobalRxWorkers is the number of concurrent global message handlers.
	GlobalRxWorkers = 32
)
View Source
const (
	// GenesisONEToken is the initial total number of ONE in the genesis block for mainnet.
	GenesisONEToken = 12600000000
	// TestAccountNumber is the number of test accounts for testnet/devnet/
	TestAccountNumber = 100
	// ContractDeployerInitFund is the initial fund for the contract deployer account in testnet/devnet.
	ContractDeployerInitFund = 10000000000
	// InitFreeFund is the initial fund for permissioned accounts for testnet/devnet/
	InitFreeFund = 100
)
View Source
const (
	SleepPeriod           = 20 * time.Millisecond
	IncomingReceiptsLimit = 6000 // 2000 * (numShards - 1)
)

Constants of proposing a new block

View Source
const (
	SyncFrequency     = 60
	MinConnectedPeers = 10 // minimum number of peers connected to in node syncing
)

Constants related to doing syncing.

View Source
const (
	FaucetContractFund = 80000000
)

Constants related to smart contract.

View Source
const (

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

Variables

View Source
var (
	// GenesisFund is the initial total number of ONE (in Nano) in the genesis block for mainnet.
	GenesisFund = new(big.Int).Mul(big.NewInt(GenesisONEToken), big.NewInt(denominations.One))
)

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

	Client   *client.Client // The presence of a client object means this node will also act as a client
	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
	State     State    // State of the Node

	// 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

	ContractDeployerKey          *ecdsa.PrivateKey
	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
	// 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 bool,
) *Node

New creates a new node.

func (*Node) APIs

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

APIs return the collection of RPC services the ethereum package offers. 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) AddFaucetContractToPendingTransactions

func (node *Node) AddFaucetContractToPendingTransactions()

AddFaucetContractToPendingTransactions adds the faucet contract the genesis block.

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) 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(newBlock *types.Block)

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

func (node *Node) CallFaucetContract(address common.Address) common.Hash

CallFaucetContract invokes the faucet contract to give the walletAddress initial money

func (*Node) ConsensusMessageHandler

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

ConsensusMessageHandler passes received message in node_handler to consensus

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

func (node *Node) ExplorerMessageHandler(payload []byte)

ExplorerMessageHandler passes received message in node_handler to explorer service

func (*Node) GetAddressForBLSKey added in v1.3.8

func (node *Node) GetAddressForBLSKey(blskey *bls.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) GetBalanceOfAddress

func (node *Node) GetBalanceOfAddress(address common.Address) (*big.Int, error)

GetBalanceOfAddress returns balance of an address.

func (*Node) GetHost

func (node *Node) GetHost() p2p.Host

GetHost returns the p2p host

func (*Node) GetNodeBootTime added in v1.3.8

func (node *Node) GetNodeBootTime() int64

GetNodeBootTime ..

func (*Node) GetNonceOfAddress

func (node *Node) GetNonceOfAddress(address common.Address) uint64

GetNonceOfAddress returns nonce of an address.

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

func (node *Node) HandleMessage(content []byte, sender libp2p_peer.ID)

HandleMessage 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) IsSameHeight

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

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

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

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) ReportPlainErrorSink added in v1.3.11

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

ReportPlainErrorSink is the report of failed transactions this node has (held inmemory 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 inmemory 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) StartRPC

func (node *Node) StartRPC(nodePort string) error

StartRPC start RPC service

func (*Node) StartSyncingServer

func (node *Node) StartSyncingServer()

StartSyncingServer starts syncing server.

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 struct{}, 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 TODO: clean pending transactions for validators; or validators not prepare pending transactions

type State

type State byte

State is a state of a node.

const (
	NodeInit              State = iota // Node just started, before contacting BeaconChain
	NodeWaitToJoin                     // Node contacted BeaconChain, wait to join Shard
	NodeNotInSync                      // Node out of sync, might be just joined Shard or offline for a period of time
	NodeOffline                        // Node is offline
	NodeReadyForConsensus              // Node is ready for doing consensus
	NodeDoingConsensus                 // Node is already doing consensus
	NodeLeader                         // Node is the leader of some shard.
)

All constants except the NodeLeader below are for validators only.

func (State) String

func (state State) String() string

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