Documentation ¶
Overview ¶
Package consensus defines interfaces for consensus engines and ChainReader.
Klaytn 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 Klaytn.
ChainReader interface defines a small collection of methods needed to access the local blockchain during a block header verification.
Index ¶
Constants ¶
const ( Klay62 = 62 Klay63 = 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 FindCNPeers(map[common.Address]bool) map[common.Address]Peer GetCNPeers() map[common.Address]Peer GetENPeers() map[common.Address]Peer RegisterValidator(conType p2p.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 // 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) }
ChainReader defines a small collection of methods needed to access the local blockchain during header verification.
type Engine ¶
type Engine interface { // Author retrieves the Klaytn address of the account that minted the given // block. 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) // 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 }
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, p2p.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 }
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) }
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 klaytn 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 implements the istanbul consensus engine.
|
Package istanbul implements the istanbul consensus engine. |
backend
Package backend implements backend for istanbul consensus engine.
|
Package backend implements backend for istanbul consensus engine. |
core
Package core implements core functionality of istanbul consensus engine.
|
Package core implements core functionality of istanbul consensus engine. |
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. |