consensus

package
Version: v1.7.0 Latest Latest
Warning

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

Go to latest
Published: Oct 19, 2021 License: GPL-3.0 Imports: 8 Imported by: 37

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

View Source
const (
	Klay62 = 62
	Klay63 = 63
)

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")
)
View Source
var (
	KlayProtocol = Protocol{
		Name:     "klay",
		Versions: []uint{Klay63, Klay62},
		Lengths:  []uint64{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

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

	// 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
}

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

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