Documentation
¶
Overview ¶
Package consensus implements different NEAT Blockchain consensus engines.
Package consensus implements different NEAT Blockchain consensus engines.
Index ¶
Constants ¶
const ( Eth62 = 62 Eth63 = 63 )
Constants to match up protocol versions and messages
Variables ¶
var ( // ErrUnknownAncestor is returned when validating a block requires an ancestor // that is unknown. ErrUnknownAncestor = errors.New("unknown ancestor") // ErrPrunedAncestor is returned when validating a block requires an ancestor // that is known, but the state of which is not available. ErrPrunedAncestor = errors.New("pruned ancestor") // ErrFutureBlock is returned when a block's timestamp is in the future according // to the current node. ErrFutureBlock = errors.New("block in the future") // ErrInvalidNumber is returned if a block's number doesn't equal it's parent's // plus one. ErrInvalidNumber = errors.New("invalid block number") )
Functions ¶
This section is empty.
Types ¶
type Broadcaster ¶
type Broadcaster interface {
// Enqueue add a block into fetcher queue
Enqueue(id string, block *types.Block)
// FindPeers retrives peers by addresses
FindPeers(map[common.Address]bool) map[common.Address]Peer
// BroadcastBlock broadcast Block
BroadcastBlock(block *types.Block, propagate bool)
// BroadcastMessage broadcast Message to P2P network
BroadcastMessage(msgcode uint64, data interface{})
// Find the Bad Preimages and send request to best peer for correction
TryFixBadPreimages()
}
Broadcaster defines the interface to enqueue blocks to fetcher and find peer
type ChainReader ¶
type ChainReader interface {
// Config retrieves the blockchain's chain configuration.
Config() *params.ChainConfig
// CurrentHeader retrieves the current header from the local chain.
CurrentHeader() *types.Header
// GetHeader retrieves a block header from the database by hash and number.
GetHeader(hash common.Hash, number uint64) *types.Header
// GetHeaderByNumber retrieves a block header from the database by number.
GetHeaderByNumber(number uint64) *types.Header
// GetHeaderByHash retrieves a block header from the database by its hash.
GetHeaderByHash(hash common.Hash) *types.Header
// GetBlock retrieves a block from the database by hash and number.
GetBlock(hash common.Hash, number uint64) *types.Block
// GetBlockByNumber retrieves a block from the database by number, caching it
// (associated with its hash) if found.
GetBlockByNumber(number uint64) *types.Block
// GetTd retrieves a block's total difficulty in the canonical chain from the
// database by hash and number, caching it if found.
GetTd(hash common.Hash, number uint64) *big.Int
// CurrentBlock retrieves the current head block of the canonical chain. The
// block is retrieved from the blockchain's internal cache.
CurrentBlock() *types.Block
// State retrieves the current state of the canonical chain.
State() (*state.StateDB, error)
}
ChainReader defines a small collection of methods needed to access the local blockchain during header and/or uncle verification.
type ChainValidator ¶
type ChainValidator interface {
ValidateBlock(block *types.Block) (*state.StateDB, types.Receipts, *types.PendingOps, error)
}
ChainValidator execute and validate the block with the current latest block as parent.
type Engine ¶
type Engine interface {
// Author retrieves the Ethereum address of the account that minted the given
// block, which may be different from the header's coinbase if a consensus
// engine is based on signatures.
Author(header *types.Header) (common.Address, error)
// VerifyHeader checks whether a header conforms to the consensus rules of a
// given engine. Verifying the seal may be done optionally here, or explicitly
// via the VerifySeal method.
VerifyHeader(chain ChainReader, header *types.Header, seal bool) error
// VerifyHeaders is similar to VerifyHeader, but verifies a batch of headers
// concurrently. The method returns a quit channel to abort the operations and
// a results channel to retrieve the async verifications (the order is that of
// the input slice).
VerifyHeaders(chain ChainReader, headers []*types.Header, seals []bool) (chan<- struct{}, <-chan error)
// VerifyUncles verifies that the given block's uncles conform to the consensus
// rules of a given engine.
VerifyUncles(chain ChainReader, block *types.Block) error
// VerifySeal checks whether the crypto seal on a header is valid according to
// the consensus rules of the given engine.
VerifySeal(chain ChainReader, header *types.Header) error
// Prepare initializes the consensus fields of a block header according to the
// rules of a particular engine. The changes are executed inline.
Prepare(chain ChainReader, header *types.Header) error
// Finalize runs any post-transaction state modifications (e.g. block rewards)
// and assembles the final block.
// Note: The block header and state database might be updated to reflect any
// consensus rules that happen at finalization (e.g. block rewards).
Finalize(chain ChainReader, header *types.Header, state *state.StateDB, txs []*types.Transaction, totalGasFee *big.Int,
uncles []*types.Header, receipts []*types.Receipt, ops *types.PendingOps) (*types.Block, error)
// Seal generates a new block for the given input block with the local miner's
// seal place on top.
Seal(chain ChainReader, block *types.Block, stop <-chan struct{}) (interface{}, error)
// CalcDifficulty is the difficulty adjustment algorithm. It returns the difficulty
// that a new block should have.
CalcDifficulty(chain ChainReader, time uint64, parent *types.Header) *big.Int
// APIs returns the RPC APIs this consensus engine provides.
APIs(chain ChainReader) []rpc.API
// Close terminates any background threads maintained by the consensus engine.
Close() error
// Protocol returns the protocol for this consensus
Protocol() Protocol
}
Engine is an algorithm agnostic consensus engine.
type EngineStartStop ¶
type Handler ¶
type Handler interface {
// NewChainHead handles a new head block comes
NewChainHead(block *types.Block) error
// HandleMsg handles a message from peer
HandleMsg(chID uint64, src Peer, msgBytes []byte) (bool, error)
// SetBroadcaster sets the broadcaster to send message to peers
SetBroadcaster(Broadcaster)
// GetBroadcaster gets the broadcaster to send message to peers
GetBroadcaster() Broadcaster
AddPeer(src Peer)
RemovePeer(src Peer)
}
Handler should be implemented is the consensus needs to handle and send peer's message
type NeatCon ¶
type NeatCon interface {
Engine
EngineStartStop
ShouldStart() bool
IsStarted() bool
// Normally Should Start flag will be set depends on the validator set
// Force Start only set the Should Start Flag to true, when node join the validator before epoch switch
ForceStart()
GetEpoch() *epoch.Epoch
SetEpoch(ep *epoch.Epoch)
PrivateValidator() common.Address
// VerifyHeader checks whether a header conforms to the consensus rules of a given engine.
VerifyHeaderBeforeConsensus(chain ChainReader, header *types.Header, seal bool) error
}
NeatCon is a consensus engine to avoid byzantine failure
type Peer ¶
type Peer interface {
// Send sends the message to this peer
Send(msgcode uint64, data interface{}) error
//Send block to this peer
SendNewBlock(block *types.Block, td *big.Int) error
// GetPeerState return the Peer State during consensus
GetPeerState() PeerState
// GetKey return the short Public Key of peer
GetKey() string
// GetConsensusKey return the publicc key of peer for consensus
GetConsensusKey() string
// PeerState set the Peer State
SetPeerState(ps PeerState)
}
Peer defines the interface to communicate with peer
type Protocol ¶
type Protocol struct {
// Official short name of the protocol used during capability negotiation.
Name string
// Supported versions of the neatptc protocol (first is primary).
Versions []uint
// Number of implemented message corresponding to different protocol versions.
Lengths []uint64
}
Protocol defines the protocol of the consensus