node

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

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

Go to latest
Published: Jun 16, 2022 License: LGPL-3.0 Imports: 70 Imported by: 0

README

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

	AstraConfig *astraconfig.AstraConfig
	// 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{},
	localAccounts []common.Address,
	isArchival map[uint32]bool,
	astraconfig *astraconfig.AstraConfig,
) *Node

New creates a new node.

func (*Node) APIs

func (node *Node) APIs(astra *astra.Astra) []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) BroadcastCrossLinkFromShardsToBeacon

func (node *Node) BroadcastCrossLinkFromShardsToBeacon()

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

func (*Node) BroadcastCrosslinkHeartbeatSignalFromBeaconToShards

func (node *Node) BroadcastCrosslinkHeartbeatSignalFromBeaconToShards()

BroadcastCrosslinkHeartbeatSignalFromBeaconToShards is called by consensus leader or 1% validators to send last cross link to shard chains.

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

func (node *Node) GetTraceResultByHash(hash common.Hash) (json.RawMessage, error)

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

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

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

ProcessCrossLinkHeartbeatMessage process crosslink heart beat signal.

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

func (node *Node) TraceLoopForExplorer()
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