Documentation ¶
Index ¶
- Variables
- type Backend
- type Config
- func (cfg *Config) Commit(t time.Time) time.Time
- func (cfg *Config) PrecommitCatchupTimeout(round int64) time.Duration
- func (cfg *Config) PrecommitTimeout(round int64) time.Duration
- func (cfg *Config) PrevoteCatchupTimeout(round int64) time.Duration
- func (cfg *Config) PrevoteTimeout(round int64) time.Duration
- func (cfg Config) ProposeTimeout(round int64) time.Duration
- type FaultyMode
- type FinalCommittedEvent
- type MessageEvent
- type NewBlockEvent
- type ProposalSelector
- type ProposerPolicy
- type StopCoreEvent
- type Validator
- type ValidatorSet
- type Validators
- type View
Constants ¶
This section is empty.
Variables ¶
var ( // ErrStartedEngine is returned if the engine is already started ErrStartedEngine = errors.New("engine is already started") // ErrStoppedEngine is returned if the engine is stopped ErrStoppedEngine = errors.New("engine is already stopped") // ErrEmptyCommittedSeals is returned if the field of committed seals is zero. ErrEmptyCommittedSeals = errors.New("zero committed seals") // ErrEmptyValSet is returned if the field of validator set is zero. ErrEmptyValSet = errors.New("zero validator set") // ErrMismatchValSet is returned if the field of validator set is mismatch. ErrMismatchValSet = errors.New("mismatch validator set") // ErrMismatchTxhashes is returned if the TxHash in header is mismatch. ErrMismatchTxhashes = errors.New("mismatch transaction hashes") // errInvalidSignature is returned when given signature is not signed by given // address. ErrInvalidSignature = errors.New("invalid signature") // errUnknownBlock is returned when the list of validators is requested for a block // that is not part of the local blockchain. ErrUnknownBlock = errors.New("unknown block") ErrUnauthorized = errors.New("unauthorized") // errInvalidDifficulty is returned if the difficulty of a block is not 1 ErrInvalidDifficulty = errors.New("invalid difficulty") // errInvalidExtraDataFormat is returned when the extra data format is incorrect ErrInvalidExtraDataFormat = errors.New("invalid extra data format") // errInvalidMixDigest is returned if a block's mix digest is not Tendermint digest. ErrInvalidMixDigest = errors.New("invalid Tendermint mix digest") // errInvalidCommittedSeals is returned if the committed seal is not signed by any of parent validators. ErrInvalidCommittedSeals = errors.New("invalid committed seals") // errInvalidVotingChain is returned if an authorization list is attempted to // be modified via out-of-range or non-contiguous headers. ErrInvalidVotingChain = errors.New("invalid voting chain") // errCoinBaseInvalid is returned if the value of coin base is not equals proposer's address in header ErrCoinBaseInvalid = errors.New("invalid coin base address") // errInvalidUncleHash is returned if a block contains an non-empty uncle list. ErrInvalidUncleHash = errors.New("non empty uncle hash") // errInvalidVote is returned if a nonce value is something else that the two // allowed constants of 0x00..0 or 0xff..f. ErrInvalidVote = errors.New("vote nonce not 0x0000000000000000 or 0xffffffffffffffff") // errInvalidCandidate is return if the extra data's modifiedValidator is empty or nil ErrInvalidCandidate = errors.New("candidate for validator is invalid") // ErrUnknownParent is return when a proposal is sent with unknown parent hash ErrUnknownParent = errors.New("unknown parent") // ErrFinalizeZeroBlock is returned if node finalize with block number = 0 ErrFinalizeZeroBlock = errors.New("finalize zero block") )
var DefaultConfig = &Config{ ProposerPolicy: RoundRobin, Epoch: 30000, StakingSCAddress: &common.Address{}, BlockPeriod: 1, TimeoutPropose: 3000 * time.Millisecond, TimeoutProposeDelta: 500 * time.Millisecond, TimeoutPrevote: 1000 * time.Millisecond, TimeoutPrevoteDelta: 500 * time.Millisecond, TimeoutPrecommit: 1000 * time.Millisecond, TimeoutPrecommitDelta: 500 * time.Millisecond, TimeoutCommit: 1000 * time.Millisecond, FaultyMode: Disabled.Uint64(), UseEVMCaller: false, IndexStateVariables: staking.DefaultConfig, }
Functions ¶
This section is empty.
Types ¶
type Backend ¶
type Backend interface { // Address returns the NeuralChain address of the node running this backend Address() common.Address // EventMux returns the event mux used for Core to subscribe/ send events back to Backend. // Think of it as pub/sub models EventMux() *event.TypeMux // Sign signs input data with the backend's private key Sign([]byte) ([]byte, error) // Gossip sends a message to all validators (exclude self) // these message are send via p2p network interface. Gossip(valSet ValidatorSet, blockNumber *big.Int, round int64, msgType uint64, payload []byte) error // Broadcast sends a message to all validators (including self) // It will call gossip and post an identical event to its EventMux(). Broadcast(valSet ValidatorSet, blockNumber *big.Int, round int64, msgType uint64, payload []byte) error // Multicast sends a message to a group of given address // returns error if sending is failed, or not found the targets address Multicast(targets map[common.Address]bool, payload []byte) error // Validators returns the validator set // we should only use this method when core is started. Validators(blockNumber *big.Int) ValidatorSet // CurrentHeadBlock get the current block of from the canonical chain. CurrentHeadBlock() *types.Block // FindExistingPeers check validator peers exist or not by address FindExistingPeers(targets ValidatorSet) map[common.Address]consensus.Peer //Commit send the consensus block back to miner, it should also handle the logic after a block get enough vote to be the next block in chain Commit(block *types.Block) //Cancel send the consensus block back to miner if it is invalid for consensus. Cancel(block *types.Block) // VerifyProposalHeader 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. VerifyProposalHeader(header *types.Header) error // VerifyProposalBlock verify post-processor state of proposal block (txs, Root, receipt). // If success, the result will be send to the pending tasks of miner VerifyProposalBlock(block *types.Block) error }
Backend provides application specific functions for Tendermint core
type Config ¶
type Config struct { ProposerPolicy ProposerPolicy `toml:",omitempty"` // The policy for proposer selection Epoch uint64 `toml:",omitempty"` // The number of blocks after which to checkpoint and reset the pending votes StakingSCAddress *common.Address `toml:",omitempty"` // The staking SC address for validating when deploy SC BlockPeriod uint64 `toml:",omitempty"` // Default minimum difference between two consecutive block's timestamps in second TimeoutPropose time.Duration //Duration waiting a propose TimeoutProposeDelta time.Duration //Increment if timeout happens at propose step to reach eventually synchronous TimeoutPrevote time.Duration //Duration waiting for more prevote after 2/3 received TimeoutPrevoteDelta time.Duration //Increment if timeout happens at prevoteWait to reach eventually synchronous TimeoutPrecommit time.Duration //Duration waiting for more precommit after 2/3 received TimeoutPrecommitDelta time.Duration //Duration waiting to increase if precommit wait expired to reach eventually synchronous TimeoutCommit time.Duration //Duration waiting to start round with new height FixedValidators []common.Address // The fixed validators BlockReward *big.Int //BlockReward for accumulating reward FaultyMode uint64 `toml:",omitempty"` // The faulty node indicates the faulty node's behavior UseEVMCaller bool IndexStateVariables *staking.IndexConfigs //The index of state variables has stored in stateDB }
Config store all the configuration required for a Tendermint consensus
func (*Config) Commit ¶
Commit returns the amount of time to wait for straggler votes after receiving +2/3 precommits for a single block (ie. a commit).
func (*Config) PrecommitCatchupTimeout ¶
PrecommitCatchupTimeout returns the amount of time to wait for precommit msgs before sending catchup msg Notes: if node 1 did not receive a polka of prevote msg, it will delay max = prevoteWaitTimeout before sending precommit So node 2 received a polka of prevote msg, it will entered precommit earlier than node 1 by prevoteWaitTimeout In here, node 2 sleep about 2 times of prevoteWaitTimeout before assuming that sending precommit message of node 1 has problem
func (*Config) PrecommitTimeout ¶
PrecommitTimeout returns the amount of time to wait for straggler votes after receiving any +2/3 precommits
func (*Config) PrevoteCatchupTimeout ¶
PrevoteCatchupTimeout returns the amount of time to wait for prevote msgs before sending catchup msg Notes: if node 1 did not receive propose msg, it will delay max = proposeTimeout before sending prevote So node 2 received propose msg, it will entered prevote earlier than node 1 by proposeTimeout In here, node 2 sleep about 2 times of proposeTimeout before assuming that sending prevote message of node 1 has problem
func (*Config) PrevoteTimeout ¶
PrevoteTimeout returns the amount of time to wait for straggler votes after receiving any +2/3 prevotes
type FaultyMode ¶
type FaultyMode uint64
FaultyMode is the config mode to enable fauty node
const ( // Disabled disables the faulty mode Disabled FaultyMode = iota // SendFakeProposal sends the proposal with the fake info SendFakeProposal // RandomlyStopSendingMsg randomly stop message sending RandomlyStopSendingMsg )
func (FaultyMode) Uint64 ¶
func (f FaultyMode) Uint64() uint64
type FinalCommittedEvent ¶
FinalCommittedEvent is posted when a proposal is committed
type MessageEvent ¶
type MessageEvent struct {
Payload []byte
}
MessageEvent is posted for Tendermint engine communication
type NewBlockEvent ¶
NewBlockEvent is the event sent from Backend to Core after engine.Seal() is called. It included the latest eligible block from tx_pool
type ProposalSelector ¶
type ProposalSelector func(ValidatorSet, common.Address, int64) Validator
type ValidatorSet ¶
type ValidatorSet interface { // Return the validator size Size() int // Return the validator array List() []Validator // Get validator by index GetByIndex(i int64) Validator // Get validator by given address // If the address does not exist in the validator set, it will return -1 GetByAddress(addr common.Address) (int, Validator) // AddValidator add the input validator to a list validators. It return false if this validator existed. AddValidator(address common.Address) bool // RemoveValidator remove the input validator from a list. It return false if the validator exist and is removed. // If the validator is not in the set, this function will return false RemoveValidator(address common.Address) bool // Copy validator set Copy() ValidatorSet // Get the minimum number of votes for a polka MinMajority() int // Get the minimum number of peers to archive consensus MinPeers() int // Get the maximum number of faulty nodes F() int // V get the minimum number of vote nodes V() int // Get proposer policy Policy() ProposerPolicy // Check whether the validator with given address is a proposer IsProposer(address common.Address) bool // CalcProposer return the proposer for the different of round number indicated CalcProposer(lastProposer common.Address, roundDiff int64) // GetProposer return the current proposer GetProposer() Validator // Height return block height when valSet is init Height() int64 // GetNeighbors returns address of neighbor to rebroadcast tendermint message GetNeighbors(addr common.Address) map[common.Address]bool }
ValidatorSet interface handles validator, proposer for defaultSet
type Validators ¶
type Validators []Validator
Validators type is list of Validator
func (Validators) Less ¶
func (slice Validators) Less(i, j int) bool
Less must be implemented for sort.Sort()
func (Validators) Swap ¶
func (slice Validators) Swap(i, j int)
Swap must be implemented for sort.Sort()