consensus

package
v1.4.2 Latest Latest
Warning

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

Go to latest
Published: Oct 18, 2023 License: GPL-3.0 Imports: 23 Imported by: 0

Documentation

Overview

Package consensus implements different Ethereum consensus engines.

Index

Constants

This section is empty.

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 (
	// ExtraSeal fixed number of extra-data suffix bytes reserved for signer seal
	ExtraSeal = 65
	// ErrMissingSignature is returned if a block's extra-data section doesn't seem
	// to contain a 65 byte secp256k1 signature.
	ErrMissingSignature = errors.New("extra-data 65 byte signature suffix missing")
)

Functions

func Ecrecover added in v0.7.0

func Ecrecover(header *types.Header, sigcache *lru.ARCCache) (common.Address, error)

Ecrecover extracts the Ethereum account address from a signed header.

func SigHash added in v0.7.0

func SigHash(header *types.Header) (hash common.Hash)

SigHash returns the hash which is used as input for the proof-of-authority signing. It is the hash of the entire header apart from the 65 byte signature contained at the end of the extra data.

Note, the method requires the extra data to be at least 65 bytes, otherwise it panics. This is done to avoid accidentally using both forms (signature present or not), which could be abused to produce different hashes for the same header.

Types

type Agency added in v0.7.1

type Agency interface {
	Sign(msg interface{}) error
	VerifySign(msg interface{}) error
	Flush(header *types.Header) error
	VerifyHeader(header *types.Header, stateDB *state.StateDB) error
	GetLastNumber(blockNumber uint64) uint64
	GetValidator(blockNumber uint64) (*cbfttypes.Validators, error)
	IsCandidateNode(nodeID enode.IDv0) bool
	OnCommit(block *types.Block) error
}

Agency defines the interface that the authentication mechanism must implement.

type Bft added in v0.7.0

type Bft interface {
	Engine

	Start(chain ChainReader, blockCacheWriter BlockCacheWriter, pool TxPoolReset, agency Agency) error

	// Returns the current consensus node address list.
	ConsensusNodes() ([]enode.ID, error)

	// Returns whether the current node is out of the block
	ShouldSeal(curTime time.Time) (bool, error)

	CalcBlockDeadline(timePoint time.Time) time.Time

	CalcNextBlockTime(timePoint time.Time) time.Time

	IsConsensusNode() bool

	GetBlock(hash common.Hash, number uint64) *types.Block

	GetBlockWithoutLock(hash common.Hash, number uint64) *types.Block

	IsSignedBySelf(sealHash common.Hash, header *types.Header) bool

	Evidences() string

	TracingSwitch(flag int8)

	// NodeID is temporary.
	Node() *enode.Node
}

Bft defines the functions that BFT consensus must implement.

type BftMock added in v0.7.0

type BftMock struct {
	EventMux *event.TypeMux
	Blocks   []*types.Block

	Next    uint32
	Current *types.Block
	Base    *types.Block
	// contains filtered or unexported fields
}

BftMock represents a simulated consensus structure.

func NewFailFaker added in v0.7.5

func NewFailFaker(number uint64) *BftMock

func NewFaker added in v0.7.5

func NewFaker() *BftMock

func NewFakerWithDataBase added in v1.2.0

func NewFakerWithDataBase(database ethdb.Database) *BftMock

func (*BftMock) APIs added in v0.7.0

func (bm *BftMock) APIs(chain ChainReader) []rpc.API

APIs returns the RPC APIs this consensus engine provides.

func (*BftMock) Author added in v0.7.0

func (bm *BftMock) Author(header *types.Header) (common.Address, error)

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.

func (*BftMock) CalcBlockDeadline added in v0.7.1

func (bm *BftMock) CalcBlockDeadline(timePoint time.Time) time.Time

CalcBlockDeadline is a fake interface, no need to implement.

func (*BftMock) CalcDifficulty added in v0.7.0

func (bm *BftMock) CalcDifficulty(chain ChainReader, time uint64, parent *types.Header) *big.Int

CalcDifficulty is the difficulty adjustment algorithm. It returns the difficulty that a new block should have.

func (*BftMock) CalcNextBlockTime added in v0.7.1

func (bm *BftMock) CalcNextBlockTime(timePoint time.Time) time.Time

CalcNextBlockTime is a fake interface, no need to implement.

func (*BftMock) CheckConsensusNode added in v0.7.0

func (bm *BftMock) CheckConsensusNode(nodeID enode.IDv0) (bool, error)

CheckConsensusNode is a fake interface, no need to implement.

func (*BftMock) Close added in v0.7.0

func (bm *BftMock) Close() error

Close terminates any background threads maintained by the consensus engine.

func (*BftMock) ConsensusNodes added in v0.7.0

func (bm *BftMock) ConsensusNodes() ([]enode.ID, error)

ConsensusNodes returns the current consensus node address list.

func (*BftMock) CurrentBlock added in v0.7.0

func (bm *BftMock) CurrentBlock() *types.Block

CurrentBlock is a fake interface, no need to implement.

func (*BftMock) DecodeExtra added in v0.7.3

func (bm *BftMock) DecodeExtra(extra []byte) (common.Hash, uint64, error)

func (*BftMock) Evidences added in v0.7.1

func (bm *BftMock) Evidences() string

Evidences is a fake interface, no need to implement.

func (*BftMock) FastSyncCommitHead added in v0.7.0

func (bm *BftMock) FastSyncCommitHead(block *types.Block) error

FastSyncCommitHead is a fake interface, no need to implement.

func (*BftMock) Finalize added in v0.7.0

func (bm *BftMock) Finalize(chain ChainReader, header *types.Header, state *state.StateDB, txs []*types.Transaction,
	receipts []*types.Receipt) (*types.Block, 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).

func (*BftMock) GetBlock added in v0.7.0

func (bm *BftMock) GetBlock(hash common.Hash, number uint64) *types.Block

GetBlock is a fake interface, no need to implement.

func (*BftMock) GetBlockByHash added in v0.7.0

func (bm *BftMock) GetBlockByHash(hash common.Hash) *types.Block

GetBlockByHash is a fake interface, no need to implement.

func (*BftMock) GetBlockByHashAndNum added in v1.0.0

func (bm *BftMock) GetBlockByHashAndNum(hash common.Hash, number uint64) *types.Block

GetBlockByHash get the specified block by hash and number.

func (*BftMock) GetBlockWithoutLock added in v0.7.1

func (bm *BftMock) GetBlockWithoutLock(hash common.Hash, number uint64) *types.Block

GetBlockWithoutLock is a fake interface, no need to implement.

func (*BftMock) GetPrepareQC added in v1.0.0

func (bm *BftMock) GetPrepareQC(number uint64) *ctypes.QuorumCert

func (*BftMock) HasBlock added in v0.7.0

func (bm *BftMock) HasBlock(hash common.Hash, number uint64) bool

HasBlock is a fake interface, no need to implement.

func (*BftMock) HighestConfirmedBlock added in v0.7.0

func (bm *BftMock) HighestConfirmedBlock() *types.Block

HighestConfirmedBlock is a fake interface, no need to implement.

func (*BftMock) HighestLogicalBlock added in v0.7.0

func (bm *BftMock) HighestLogicalBlock() *types.Block

HighestLogicalBlock is a fake interface, no need to implement.

func (*BftMock) InsertChain added in v0.7.0

func (bm *BftMock) InsertChain(block *types.Block) error

InsertChain is a fake interface, no need to implement.

func (*BftMock) IsConsensusNode added in v0.7.0

func (bm *BftMock) IsConsensusNode() bool

IsConsensusNode is a fake interface, no need to implement.

func (*BftMock) IsSignedBySelf added in v0.7.1

func (bm *BftMock) IsSignedBySelf(sealHash common.Hash, header *types.Header) bool

IsSignedBySelf is a fake interface, no need to implement.

func (*BftMock) NextBaseBlock added in v0.7.0

func (bm *BftMock) NextBaseBlock() *types.Block

NextBaseBlock is a fake interface, no need to implement.

func (*BftMock) Node added in v1.4.1

func (bm *BftMock) Node() *enode.Node

func (*BftMock) OnBlockSignature added in v0.7.0

func (bm *BftMock) OnBlockSignature(chain ChainReader, nodeID enode.IDv0, sig *cbfttypes.BlockSignature) error

OnBlockSignature received a new block signature Need to verify if the signature is signed by nodeID

func (*BftMock) OnBlockSynced added in v0.7.0

func (bm *BftMock) OnBlockSynced()

OnBlockSynced sends a signal if a block synced from other peer.

func (*BftMock) OnNewBlock added in v0.7.0

func (bm *BftMock) OnNewBlock(chain ChainReader, block *types.Block) error

OnNewBlock processes the BFT signatures

func (*BftMock) OnPong added in v0.7.0

func (bm *BftMock) OnPong(nodeID enode.IDv0, netLatency int64) error

OnPong processes the BFT signatures

func (*BftMock) Pause added in v0.7.1

func (bm *BftMock) Pause()

func (*BftMock) Prepare added in v0.7.0

func (bm *BftMock) Prepare(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.

func (*BftMock) Protocols added in v0.7.0

func (bm *BftMock) Protocols() []p2p.Protocol

Protocols is a fake interface, no need to implement.

func (*BftMock) Resume added in v0.7.1

func (bm *BftMock) Resume()

func (*BftMock) Seal added in v0.7.0

func (bm *BftMock) Seal(chain ChainReader, block *types.Block, results chan<- *types.Block, stop <-chan struct{}, complete chan<- struct{}) error

Seal generates a new sealing request for the given input block and pushes the result into the given channel.

Note, the method returns immediately and will send the result async. More than one result may also be returned depending on the consensus algorithm.

func (*BftMock) SealHash added in v0.7.0

func (bm *BftMock) SealHash(header *types.Header) common.Hash

SealHash returns the hash of a block prior to it being sealed.

func (*BftMock) ShouldSeal added in v0.7.0

func (bm *BftMock) ShouldSeal(curTime time.Time) (bool, error)

ShouldSeal returns whether the current node is out of the block

func (*BftMock) Start added in v0.7.1

func (bm *BftMock) Start(chain ChainReader, blockCacheWriter BlockCacheWriter, pool TxPoolReset, agency Agency) error

Start is a fake interface, no need to implement.

func (*BftMock) Status added in v0.7.0

func (bm *BftMock) Status() string

Status is a fake interface, no need to implement.

func (*BftMock) Stop added in v1.3.1

func (bm *BftMock) Stop() error

func (*BftMock) Syncing added in v1.0.0

func (bm *BftMock) Syncing() bool

func (*BftMock) TracingSwitch added in v0.7.1

func (bm *BftMock) TracingSwitch(flag int8)

TracingSwitch is a fake interface, no need to implement.

func (*BftMock) UnmarshalEvidence added in v0.7.1

func (bm *BftMock) UnmarshalEvidence(data []byte) (consensus.Evidences, error)

UnmarshalEvidence is a fake interface, no need to implement.

func (*BftMock) VerifyHeader added in v0.7.0

func (bm *BftMock) VerifyHeader(chain ChainReader, header *types.Header, seal bool) 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.

func (*BftMock) VerifyHeaders added in v0.7.0

func (bm *BftMock) VerifyHeaders(chain ChainReader, headers []*types.Header, seals []bool) (chan<- struct{}, <-chan 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).

func (*BftMock) VerifySeal added in v0.7.0

func (bm *BftMock) VerifySeal(chain ChainReader, header *types.Header) error

VerifySeal checks whether the crypto seal on a header is valid according to the consensus rules of the given engine.

type BlockCacheWriter added in v0.7.1

type BlockCacheWriter interface {
	Execute(block *types.Block, parent *types.Block) error
	ClearCache(block *types.Block)
	WriteBlock(block *types.Block) error
	Stop()
}

BlockCacheWriter executions block, you need to pass in the parent block to find the parent block state

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

	// CurrentBlock retrieves the current head block of the canonical chain.
	CurrentBlock() *types.Block
}

ChainReader defines a small collection of methods needed to access the local blockchain during header verification.

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)

	// 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 sealing request for the given input block and pushes
	// the result into the given channel.
	//
	// Note, the method returns immediately and will send the result async. More
	// than one result may also be returned depending on the consensus algorithm.
	Seal(chain ChainReader, block *types.Block, results chan<- *types.Block, stop <-chan struct{}, complete chan<- struct{}) error

	// SealHash returns the hash of a block prior to it being sealed.
	SealHash(header *types.Header) common.Hash

	// APIs returns the RPC APIs this consensus engine provides.
	APIs(chain ChainReader) []rpc.API

	Protocols() []p2p.Protocol

	NextBaseBlock() *types.Block

	InsertChain(block *types.Block) error

	HasBlock(hash common.Hash, number uint64) bool

	GetBlockByHash(hash common.Hash) *types.Block

	GetBlockByHashAndNum(hash common.Hash, number uint64) *types.Block

	CurrentBlock() *types.Block

	FastSyncCommitHead(block *types.Block) error

	// Close terminates any background threads maintained by the consensus engine.
	Close() error

	Stop() error

	// Pause consensus
	Pause()

	// Resume consensus
	Resume()

	DecodeExtra(extra []byte) (common.Hash, uint64, error)

	Syncing() bool
}

Engine is an algorithm agnostic consensus engine.

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 TxPoolReset added in v0.7.1

type TxPoolReset interface {
	ForkedReset(newHeader *types.Header, rollback []*types.Block)
	Reset(newBlock *types.Block)
}

TxPoolReset stands for transaction pool.

Directories

Path Synopsis
evidence
Package evidence implements recording duplicate blocks and votes for cbft consensus.
Package evidence implements recording duplicate blocks and votes for cbft consensus.
network
Package network implements a concrete consensus engines.
Package network implements a concrete consensus engines.
wal
Package wal implements the similar write-ahead logging for cbft consensus.
Package wal implements the similar write-ahead logging for cbft consensus.

Jump to

Keyboard shortcuts

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