Documentation ¶
Overview ¶
Package consensus defines interfaces for consensus engines and ChainReader.
Kaia currently uses istanbul BFT engine on the mainnet, but PoA based clique engine also can be used. Traditional PoW engine(gxhash) is used by legacy test codes but it is deprecated and is not recommended to use.
By implementing the Engine interface, new consensus engine can be added and used in Kaia.
ChainReader interface defines a small collection of methods needed to access the local blockchain during a block header verification.
Index ¶
Constants ¶
const ( Kaia62 = 62 Kaia63 = 63 Kaia64 = 64 Kaia65 = 65 )
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") // ErrInvalidBaseFee is returned if a block before fork has a base fee field, not nil ErrInvalidBaseFee = errors.New("invalid baseFee before fork") )
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 FindCNPeers(map[common.Address]bool) map[common.Address]Peer GetCNPeers() map[common.Address]Peer GetENPeers() map[common.Address]Peer RegisterValidator(conType common.ConnType, validator p2p.PeerTypeValidator) }
istanbul BFT 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 // CurrentBlock revrieves the current block from the local chain. CurrentBlock() *types.Block // Engine retrieves the header chain's consensus engine. Engine() Engine // 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 // State() retrieves statedb State() (*state.StateDB, error) // StateAt() retrieves statedb on a particular point in time StateAt(root common.Hash) (*state.StateDB, error) }
ChainReader defines a small collection of methods needed to access the local blockchain during header verification.
type ConsensusInfo ¶
type ConsensusInfo struct { // Proposer signs [sigHash] to make seal; Validators signs [block.Hash + msgCommit] to make committedSeal SigHash common.Hash Proposer common.Address OriginProposer common.Address // the proposer of 0th round at the same block number Committee []common.Address Committers []common.Address Round byte }
type Engine ¶
type Engine interface { // Author retrieves the Kaia address of the account that minted the given // block. Author(header *types.Header) (common.Address, error) // CanVerifyHeadersConcurrently returns true if concurrent header verification possible, otherwise returns false. CanVerifyHeadersConcurrently() bool // PreprocessHeaderVerification prepares header verification for heavy computation before synchronous header verification such as ecrecover. PreprocessHeaderVerification(headers []*types.Header) (chan<- struct{}, <-chan 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) // 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, receipts []*types.Receipt) (*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{}) (*types.Block, error) // CalcBlockScore is the blockscore adjustment algorithm. It returns the blockscore // that a new block should have. CalcBlockScore(chain ChainReader, time uint64, parent *types.Header) *big.Int // APIs returns the RPC APIs this consensus engine provides. APIs(chain ChainReader) []rpc.API // Protocol returns the protocol for this consensus Protocol() Protocol // CreateSnapshot does not return a snapshot but creates a new snapshot if not exists at a given point in time. CreateSnapshot(chain ChainReader, number uint64, hash common.Hash, parents []*types.Header) error // GetKaiaHeadersForSnapshotApply returns the headers need to be applied to calculate snapshot for the given block number. GetKaiaHeadersForSnapshotApply(chain ChainReader, number uint64, hash common.Hash, parents []*types.Header) ([]*types.Header, error) // GetConsensusInfo returns consensus information regarding the given block number. GetConsensusInfo(block *types.Block) (ConsensusInfo, error) InitSnapshot() }
Engine is an algorithm agnostic consensus engine.
type Handler ¶
type Handler interface { // NewChainHead handles a new head block comes NewChainHead() error // HandleMsg handles a message from peer HandleMsg(address common.Address, data p2p.Msg) (bool, error) // SetBroadcaster sets the broadcaster to send message to peers SetBroadcaster(Broadcaster, common.ConnType) // RegisterConsensusMsgCode registers the channel of consensus msg. RegisterConsensusMsgCode(Peer) }
Handler should be implemented is the consensus needs to handle and send peer's message
type Istanbul ¶
type Istanbul interface { Engine // Start starts the engine Start(chain ChainReader, currentBlock func() *types.Block, hasBadBlock func(hash common.Hash) bool) error // Stop stops the engine Stop() error // SetChain sets chain of the Istanbul backend SetChain(chain ChainReader) // UpdateParam updates the governance parameter UpdateParam(num uint64) error }
Istanbul 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 // RegisterConsensusMsgCode registers the channel of consensus msg. RegisterConsensusMsgCode(msgCode uint64) error }
Peer defines the interface to communicate with peer
type PoW ¶
type PoW interface { Engine // Hashrate returns the current mining hashrate of a PoW consensus engine. Hashrate() float64 }
PoW is a consensus engine based on proof-of-work.
type Protocol ¶
type Protocol struct { // Official short name of the protocol used during capability negotiation. Name string // Supported versions of the Kaia protocol (first is primary). Versions []uint // Number of implemented message corresponding to different protocol versions. Lengths []uint64 }
Protocol defines the protocol of the consensus
Directories ¶
Path | Synopsis |
---|---|
Package clique implements PoA (Proof of Authority) consensus engine which is mainly for private chains.
|
Package clique implements PoA (Proof of Authority) consensus engine which is mainly for private chains. |
Package gxhash implements the gxhash proof-of-work consensus engine.
|
Package gxhash implements the gxhash proof-of-work consensus engine. |
Package istanbul is a BFT based consensus engine which implements consensus/Engine interface.
|
Package istanbul is a BFT based consensus engine which implements consensus/Engine interface. |
backend
Package backend defines backend struct which implements Backend interface of Istanbul consensus engine.
|
Package backend defines backend struct which implements Backend interface of Istanbul consensus engine. |
core
Package core implements the core functionality of Istanbul consensus engine.
|
Package core implements the core functionality of Istanbul consensus engine. |
mocks
Package mock_istanbul is a generated GoMock package.
|
Package mock_istanbul is a generated GoMock package. |
validator
Package validator implements the types related to the validators participating in consensus.
|
Package validator implements the types related to the validators participating in consensus. |
Package mocks is a generated GoMock package.
|
Package mocks is a generated GoMock package. |