consensus

package
v1.0.3 Latest Latest
Warning

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

Go to latest
Published: Sep 26, 2024 License: GPL-3.0 Imports: 8 Imported by: 1

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

View Source
const (
	Kaia62 = 62
	Kaia63 = 63
	Kaia64 = 64
	Kaia65 = 65
)

Constants to match up protocol versions and messages

Variables

View Source
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")
)
View Source
var KaiaProtocol = Protocol{
	Name:     "kaia",
	Versions: []uint{Kaia65, Kaia64, Kaia63, Kaia62},
	Lengths:  []uint64{21, 19, 17, 8},
}

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.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL