consensus

package
v0.7.6 Latest Latest
Warning

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

Go to latest
Published: Jan 14, 2020 License: GPL-3.0 Imports: 19 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

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

Ecrecover extracts the Ethereum account address from a signed header.

func SigHash

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

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 discover.NodeID) bool
	OnCommit(block *types.Block) error
}

Agency defines the interface that the authentication mechanism must implement.

type Bft

type Bft interface {
	Engine

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

	// Returns the current consensus node address list.
	ConsensusNodes() ([]discover.NodeID, 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.
	NodeID() discover.NodeID
}

Bft defines the functions that BFT consensus must implement.

type BftMock

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

func NewFailFaker(number uint64) *BftMock

func NewFaker

func NewFaker() *BftMock

func (*BftMock) APIs

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

APIs returns the RPC APIs this consensus engine provides.

func (*BftMock) Author

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

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

CalcBlockDeadline is a fake interface, no need to implement.

func (*BftMock) CalcDifficulty

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

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

CalcNextBlockTime is a fake interface, no need to implement.

func (*BftMock) CheckConsensusNode

func (bm *BftMock) CheckConsensusNode(nodeID discover.NodeID) (bool, error)

CheckConsensusNode is a fake interface, no need to implement.

func (*BftMock) Close

func (bm *BftMock) Close() error

Close terminates any background threads maintained by the consensus engine.

func (*BftMock) ConsensusNodes

func (bm *BftMock) ConsensusNodes() ([]discover.NodeID, error)

ConsensusNodes returns the current consensus node address list.

func (*BftMock) CurrentBlock

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

CurrentBlock is a fake interface, no need to implement.

func (*BftMock) DecodeExtra

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

func (*BftMock) Evidences

func (bm *BftMock) Evidences() string

Evidences is a fake interface, no need to implement.

func (*BftMock) FastSyncCommitHead

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

FastSyncCommitHead is a fake interface, no need to implement.

func (*BftMock) Finalize

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

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

GetBlock is a fake interface, no need to implement.

func (*BftMock) GetBlockByHash

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

GetBlockByHash is a fake interface, no need to implement.

func (*BftMock) GetBlockWithoutLock

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

GetBlockWithoutLock is a fake interface, no need to implement.

func (*BftMock) HasBlock

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

HasBlock is a fake interface, no need to implement.

func (*BftMock) HighestConfirmedBlock

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

HighestConfirmedBlock is a fake interface, no need to implement.

func (*BftMock) HighestLogicalBlock

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

HighestLogicalBlock is a fake interface, no need to implement.

func (*BftMock) InsertChain

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

InsertChain is a fake interface, no need to implement.

func (*BftMock) IsConsensusNode

func (bm *BftMock) IsConsensusNode() bool

IsConsensusNode is a fake interface, no need to implement.

func (*BftMock) IsSignedBySelf

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

IsSignedBySelf is a fake interface, no need to implement.

func (*BftMock) NextBaseBlock

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

NextBaseBlock is a fake interface, no need to implement.

func (*BftMock) NodeID

func (bm *BftMock) NodeID() discover.NodeID

func (*BftMock) OnBlockSignature

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

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

func (*BftMock) OnBlockSynced

func (bm *BftMock) OnBlockSynced()

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

func (*BftMock) OnNewBlock

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

OnNewBlock processes the BFT signatures

func (*BftMock) OnPong

func (bm *BftMock) OnPong(nodeID discover.NodeID, netLatency int64) error

OnPong processes the BFT signatures

func (*BftMock) Pause

func (bm *BftMock) Pause()

func (*BftMock) Prepare

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

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

Protocols is a fake interface, no need to implement.

func (*BftMock) Resume

func (bm *BftMock) Resume()

func (*BftMock) Seal

func (bm *BftMock) Seal(chain ChainReader, block *types.Block, results chan<- *types.Block, stop <-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

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

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

func (*BftMock) ShouldSeal

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

ShouldSeal returns whether the current node is out of the block

func (*BftMock) Start

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

func (bm *BftMock) Status() string

Status is a fake interface, no need to implement.

func (*BftMock) TracingSwitch

func (bm *BftMock) TracingSwitch(flag int8)

TracingSwitch is a fake interface, no need to implement.

func (*BftMock) UnmarshalEvidence

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

UnmarshalEvidence is a fake interface, no need to implement.

func (*BftMock) VerifyHeader

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

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

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

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

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

	CurrentBlock() *types.Block

	FastSyncCommitHead(block *types.Block) error

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

	// Pause consensus
	Pause()
	// Resume consensus
	Resume()

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

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

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