Documentation ¶
Index ¶
- Constants
- Variables
- func EventQueryTxFor(tx Tx) tmpubsub.Query
- func HashSignBytes(chainID string, o Signable) []byte
- func IsVoteTypeValid(type_ byte) bool
- func MakeBlock(height int64, chainID string, txs []Tx, commit *Commit, prevBlockID BlockID, ...) (*Block, *PartSet)
- func RandValidator(randPower bool, minPower int64) (*Validator, *PrivValidatorFS)
- func RandValidatorSet(numValidators int, votingPower int64) (*ValidatorSet, []*PrivValidatorFS)
- func SignBytes(chainID string, o Signable) []byte
- type Block
- func (b *Block) FillHeader()
- func (b *Block) Hash() data.Bytes
- func (b *Block) HashesTo(hash []byte) bool
- func (b *Block) MakePartSet(partSize int) *PartSet
- func (b *Block) String() string
- func (b *Block) StringIndented(indent string) string
- func (b *Block) StringShort() string
- func (b *Block) ValidateBasic(chainID string, lastBlockHeight int64, lastBlockID BlockID, ...) error
- type BlockGossipParams
- type BlockID
- type BlockMeta
- type BlockSizeParams
- type BlockStore
- type BlockStoreRPC
- type CanonicalJSONBlockID
- type CanonicalJSONHeartbeat
- type CanonicalJSONOnceHeartbeat
- type CanonicalJSONOnceProposal
- type CanonicalJSONOnceVote
- type CanonicalJSONPartSetHeader
- type CanonicalJSONProposal
- type CanonicalJSONVote
- type Commit
- func (commit *Commit) BitArray() *cmn.BitArray
- func (commit *Commit) FirstPrecommit() *Vote
- func (commit *Commit) GetByIndex(index int) *Vote
- func (commit *Commit) Hash() data.Bytes
- func (commit *Commit) Height() int64
- func (commit *Commit) IsCommit() bool
- func (commit *Commit) Round() int
- func (commit *Commit) Size() int
- func (commit *Commit) StringIndented(indent string) string
- func (commit *Commit) Type() byte
- func (commit *Commit) ValidateBasic() error
- type ConsensusParams
- type Data
- type DefaultSigner
- type ErrVoteConflictingVotes
- type EventBus
- func (b *EventBus) OnStart() error
- func (b *EventBus) OnStop()
- func (b *EventBus) Publish(eventType string, eventData TMEventData) error
- func (b *EventBus) PublishEventCompleteProposal(event EventDataRoundState) error
- func (b *EventBus) PublishEventLock(event EventDataRoundState) error
- func (b *EventBus) PublishEventNewBlock(event EventDataNewBlock) error
- func (b *EventBus) PublishEventNewBlockHeader(event EventDataNewBlockHeader) error
- func (b *EventBus) PublishEventNewRound(event EventDataRoundState) error
- func (b *EventBus) PublishEventNewRoundStep(event EventDataRoundState) error
- func (b *EventBus) PublishEventPolka(event EventDataRoundState) error
- func (b *EventBus) PublishEventProposalHeartbeat(event EventDataProposalHeartbeat) error
- func (b *EventBus) PublishEventRelock(event EventDataRoundState) error
- func (b *EventBus) PublishEventTimeoutPropose(event EventDataRoundState) error
- func (b *EventBus) PublishEventTimeoutWait(event EventDataRoundState) error
- func (b *EventBus) PublishEventTx(event EventDataTx) error
- func (b *EventBus) PublishEventUnlock(event EventDataRoundState) error
- func (b *EventBus) PublishEventVote(event EventDataVote) error
- func (b *EventBus) SetLogger(l log.Logger)
- func (b *EventBus) Subscribe(ctx context.Context, subscriber string, query tmpubsub.Query, ...) error
- func (b *EventBus) Unsubscribe(ctx context.Context, subscriber string, query tmpubsub.Query) error
- func (b *EventBus) UnsubscribeAll(ctx context.Context, subscriber string) error
- type EventDataNewBlock
- type EventDataNewBlockHeader
- type EventDataProposalHeartbeat
- type EventDataRoundState
- type EventDataTx
- type EventDataVote
- type GenesisDoc
- type GenesisValidator
- type Header
- type Heartbeat
- type Mempool
- type MockMempool
- func (m MockMempool) CheckTx(tx Tx, cb func(*abci.Response)) error
- func (m MockMempool) EnableTxsAvailable()
- func (m MockMempool) Flush()
- func (m MockMempool) Lock()
- func (m MockMempool) Reap(n int) Txs
- func (m MockMempool) Size() int
- func (m MockMempool) TxsAvailable() <-chan int64
- func (m MockMempool) Unlock()
- func (m MockMempool) Update(height int64, txs Txs) error
- type NopEventBus
- func (NopEventBus) PublishEventCompleteProposal(rs EventDataRoundState) error
- func (NopEventBus) PublishEventLock(rs EventDataRoundState) error
- func (NopEventBus) PublishEventNewBlock(block EventDataNewBlock) error
- func (NopEventBus) PublishEventNewBlockHeader(header EventDataNewBlockHeader) error
- func (NopEventBus) PublishEventNewRound(rs EventDataRoundState) error
- func (NopEventBus) PublishEventNewRoundStep(rs EventDataRoundState) error
- func (NopEventBus) PublishEventPolka(rs EventDataRoundState) error
- func (NopEventBus) PublishEventRelock(rs EventDataRoundState) error
- func (NopEventBus) PublishEventTimeoutPropose(rs EventDataRoundState) error
- func (NopEventBus) PublishEventTimeoutWait(rs EventDataRoundState) error
- func (NopEventBus) PublishEventTx(tx EventDataTx) error
- func (NopEventBus) PublishEventUnlock(rs EventDataRoundState) error
- func (NopEventBus) PublishEventVote(vote EventDataVote) error
- func (NopEventBus) Subscribe(ctx context.Context, subscriber string, query tmpubsub.Query, ...) error
- func (NopEventBus) Unsubscribe(ctx context.Context, subscriber string, query tmpubsub.Query) error
- func (NopEventBus) UnsubscribeAll(ctx context.Context, subscriber string) error
- type Part
- type PartSet
- func (ps *PartSet) AddPart(part *Part, verify bool) (bool, error)
- func (ps *PartSet) BitArray() *cmn.BitArray
- func (ps *PartSet) Count() int
- func (ps *PartSet) GetPart(index int) *Part
- func (ps *PartSet) GetReader() io.Reader
- func (ps *PartSet) HasHeader(header PartSetHeader) bool
- func (ps *PartSet) Hash() []byte
- func (ps *PartSet) HashesTo(hash []byte) bool
- func (ps *PartSet) Header() PartSetHeader
- func (ps *PartSet) IsComplete() bool
- func (ps *PartSet) StringShort() string
- func (ps *PartSet) Total() int
- type PartSetHeader
- type PartSetReader
- type PrivValidator
- type PrivValidatorFS
- func (pv *PrivValidatorFS) GetAddress() data.Bytes
- func (pv *PrivValidatorFS) GetPubKey() crypto.PubKey
- func (privVal *PrivValidatorFS) Reset()
- func (privVal *PrivValidatorFS) Save()
- func (privVal *PrivValidatorFS) SignHeartbeat(chainID string, heartbeat *Heartbeat) error
- func (privVal *PrivValidatorFS) SignProposal(chainID string, proposal *Proposal) error
- func (privVal *PrivValidatorFS) SignVote(chainID string, vote *Vote) error
- func (privVal *PrivValidatorFS) String() string
- type PrivValidatorsByAddress
- type Proposal
- type Signable
- type SignedHeader
- type Signer
- type TMEventData
- type TMEventDataInner
- type Tx
- type TxEventBuffer
- type TxEventPublisher
- type TxProof
- type TxResult
- type TxSizeParams
- type Txs
- type Validator
- type ValidatorSet
- func (valSet *ValidatorSet) Add(val *Validator) (added bool)
- func (valSet *ValidatorSet) Copy() *ValidatorSet
- func (valSet *ValidatorSet) GetByAddress(address []byte) (index int, val *Validator)
- func (valSet *ValidatorSet) GetByIndex(index int) (address []byte, val *Validator)
- func (valSet *ValidatorSet) GetProposer() (proposer *Validator)
- func (valSet *ValidatorSet) HasAddress(address []byte) bool
- func (valSet *ValidatorSet) Hash() []byte
- func (valSet *ValidatorSet) IncrementAccum(times int)
- func (valSet *ValidatorSet) Iterate(fn func(index int, val *Validator) bool)
- func (valSet *ValidatorSet) Remove(address []byte) (val *Validator, removed bool)
- func (valSet *ValidatorSet) Size() int
- func (valSet *ValidatorSet) String() string
- func (valSet *ValidatorSet) StringIndented(indent string) string
- func (valSet *ValidatorSet) TotalVotingPower() int64
- func (valSet *ValidatorSet) Update(val *Validator) (updated bool)
- func (valSet *ValidatorSet) VerifyCommit(chainID string, blockID BlockID, height int64, commit *Commit) error
- func (valSet *ValidatorSet) VerifyCommitAny(newSet *ValidatorSet, chainID string, blockID BlockID, height int64, ...) error
- type ValidatorsByAddress
- type Vote
- type VoteSet
- func (voteSet *VoteSet) AddVote(vote *Vote) (added bool, err error)
- func (voteSet *VoteSet) BitArray() *cmn.BitArray
- func (voteSet *VoteSet) BitArrayByBlockID(blockID BlockID) *cmn.BitArray
- func (voteSet *VoteSet) ChainID() string
- func (voteSet *VoteSet) GetByAddress(address []byte) *Vote
- func (voteSet *VoteSet) GetByIndex(valIndex int) *Vote
- func (voteSet *VoteSet) HasAll() bool
- func (voteSet *VoteSet) HasTwoThirdsAny() bool
- func (voteSet *VoteSet) HasTwoThirdsMajority() bool
- func (voteSet *VoteSet) Height() int64
- func (voteSet *VoteSet) IsCommit() bool
- func (voteSet *VoteSet) MakeCommit() *Commit
- func (voteSet *VoteSet) Round() int
- func (voteSet *VoteSet) SetPeerMaj23(peerID string, blockID BlockID)
- func (voteSet *VoteSet) Size() int
- func (voteSet *VoteSet) String() string
- func (voteSet *VoteSet) StringIndented(indent string) string
- func (voteSet *VoteSet) StringShort() string
- func (voteSet *VoteSet) TwoThirdsMajority() (blockID BlockID, ok bool)
- func (voteSet *VoteSet) Type() byte
- type VoteSetReader
Constants ¶
const ( EventBond = "Bond" EventCompleteProposal = "CompleteProposal" EventDupeout = "Dupeout" EventFork = "Fork" EventLock = "Lock" EventNewBlock = "NewBlock" EventNewBlockHeader = "NewBlockHeader" EventNewRound = "NewRound" EventNewRoundStep = "NewRoundStep" EventPolka = "Polka" EventRebond = "Rebond" EventRelock = "Relock" EventTimeoutPropose = "TimeoutPropose" EventTimeoutWait = "TimeoutWait" EventTx = "Tx" EventUnbond = "Unbond" EventUnlock = "Unlock" EventVote = "Vote" EventProposalHeartbeat = "ProposalHeartbeat" )
Reserved event types
const ( EventDataTypeNewBlock = byte(0x01) EventDataTypeFork = byte(0x02) EventDataTypeTx = byte(0x03) EventDataTypeNewBlockHeader = byte(0x04) EventDataTypeRoundState = byte(0x11) EventDataTypeVote = byte(0x12) EventDataTypeProposalHeartbeat = byte(0x20) )
const ( // EventTypeKey is a reserved key, used to specify event type in tags. EventTypeKey = "tm.event" // TxHashKey is a reserved key, used to specify transaction's hash. // see EventBus#PublishEventTx TxHashKey = "tx.hash" // TxHeightKey is a reserved key, used to specify transaction block's height. // see EventBus#PublishEventTx TxHeightKey = "tx.height" )
const ( VoteTypePrevote = byte(0x01) VoteTypePrecommit = byte(0x02) )
Types of votes TODO Make a new type "VoteType"
Variables ¶
var ( EventDataNameNewBlock = "new_block" EventDataNameNewBlockHeader = "new_block_header" EventDataNameTx = "tx" EventDataNameRoundState = "round_state" EventDataNameVote = "vote" EventDataNameProposalHeartbeat = "proposal_heartbeat" )
var ( EventQueryBond = queryForEvent(EventBond) EventQueryUnbond = queryForEvent(EventUnbond) EventQueryRebond = queryForEvent(EventRebond) EventQueryDupeout = queryForEvent(EventDupeout) EventQueryFork = queryForEvent(EventFork) EventQueryNewBlock = queryForEvent(EventNewBlock) EventQueryNewBlockHeader = queryForEvent(EventNewBlockHeader) EventQueryNewRound = queryForEvent(EventNewRound) EventQueryNewRoundStep = queryForEvent(EventNewRoundStep) EventQueryTimeoutPropose = queryForEvent(EventTimeoutPropose) EventQueryCompleteProposal = queryForEvent(EventCompleteProposal) EventQueryPolka = queryForEvent(EventPolka) EventQueryUnlock = queryForEvent(EventUnlock) EventQueryLock = queryForEvent(EventLock) EventQueryRelock = queryForEvent(EventRelock) EventQueryTimeoutWait = queryForEvent(EventTimeoutWait) EventQueryVote = queryForEvent(EventVote) EventQueryProposalHeartbeat = queryForEvent(EventProposalHeartbeat) EventQueryTx = queryForEvent(EventTx) )
var ( PeerStateKey = "ConsensusReactor.peerState" PeerMempoolChKey = "MempoolReactor.peerMempoolCh" )
UNSTABLE
var ( ErrPartSetUnexpectedIndex = errors.New("Error part set unexpected index") ErrPartSetInvalidProof = errors.New("Error part set invalid proof") )
var ( ErrInvalidBlockPartSignature = errors.New("Error invalid block part signature") ErrInvalidBlockPartHash = errors.New("Error invalid block part hash") )
var ( ErrVoteUnexpectedStep = errors.New("Unexpected step") ErrVoteInvalidValidatorIndex = errors.New("Invalid validator index") ErrVoteInvalidValidatorAddress = errors.New("Invalid validator address") ErrVoteInvalidSignature = errors.New("Invalid signature") ErrVoteInvalidBlockHash = errors.New("Invalid block hash") ErrVoteNil = errors.New("Nil vote") )
var TM2PB = tm2pb{}
TM2PB is used for converting Tendermint types to protobuf types. UNSTABLE
var ValidatorCodec = validatorCodec{}
Functions ¶
func EventQueryTxFor ¶
func HashSignBytes ¶ added in v0.7.0
HashSignBytes is a convenience method for getting the hash of the bytes of a signable
func IsVoteTypeValid ¶
func MakeBlock ¶
func MakeBlock(height int64, chainID string, txs []Tx, commit *Commit, prevBlockID BlockID, valHash, appHash []byte, partSize int) (*Block, *PartSet)
MakeBlock returns a new block and corresponding partset from the given information. TODO: Add version information to the Block struct.
func RandValidator ¶
func RandValidator(randPower bool, minPower int64) (*Validator, *PrivValidatorFS)
RandValidator returns a randomized validator, useful for testing. UNSTABLE
func RandValidatorSet ¶
func RandValidatorSet(numValidators int, votingPower int64) (*ValidatorSet, []*PrivValidatorFS)
RandValidatorSet returns a randomized validator set, useful for testing. NOTE: PrivValidator are in order. UNSTABLE
Types ¶
type Block ¶
type Block struct { *Header `json:"header"` *Data `json:"data"` LastCommit *Commit `json:"last_commit"` }
Block defines the atomic unit of a Tendermint blockchain.
func (*Block) FillHeader ¶ added in v0.7.0
func (b *Block) FillHeader()
FillHeader fills in any remaining header fields that are a function of the block data
func (*Block) Hash ¶
Hash computes and returns the block hash. If the block is incomplete, block hash is nil for safety.
func (*Block) HashesTo ¶
HashesTo is a convenience function that checks if a block hashes to the given argument. A nil block never hashes to anything, and nothing hashes to a nil hash.
func (*Block) MakePartSet ¶
MakePartSet returns a PartSet containing parts of a serialized block. This is the form in which the block is gossipped to peers.
func (*Block) StringIndented ¶
StringIndented returns a string representation of the block
func (*Block) StringShort ¶
StringShort returns a shortened string representation of the block
type BlockGossipParams ¶ added in v0.11.0
type BlockGossipParams struct {
BlockPartSizeBytes int `json:"block_part_size_bytes"` // NOTE: must not be 0
}
BlockGossipParams determine consensus critical elements of how blocks are gossiped
func DefaultBlockGossipParams ¶ added in v0.11.0
func DefaultBlockGossipParams() BlockGossipParams
DefaultBlockGossipParams returns a default BlockGossipParams.
type BlockID ¶
type BlockID struct { Hash data.Bytes `json:"hash"` PartsHeader PartSetHeader `json:"parts"` }
BlockID defines the unique ID of a block as its Hash and its PartSetHeader
type BlockMeta ¶
type BlockMeta struct { BlockID BlockID `json:"block_id"` // the block hash and partsethash Header *Header `json:"header"` // The block's Header }
BlockMeta contains meta information about a block - namely, it's ID and Header.
func NewBlockMeta ¶
NewBlockMeta returns a new BlockMeta from the block and its blockParts.
type BlockSizeParams ¶ added in v0.11.0
type BlockSizeParams struct { MaxBytes int `json:"max_bytes"` // NOTE: must not be 0 nor greater than 100MB MaxTxs int `json:"max_txs"` MaxGas int `json:"max_gas"` }
BlockSizeParams contain limits on the block size.
func DefaultBlockSizeParams ¶ added in v0.11.0
func DefaultBlockSizeParams() BlockSizeParams
DefaultBlockSizeParams returns a default BlockSizeParams.
type BlockStore ¶ added in v0.9.0
type BlockStore interface { BlockStoreRPC SaveBlock(block *Block, blockParts *PartSet, seenCommit *Commit) }
BlockStore defines the BlockStore interface. UNSTABLE
type BlockStoreRPC ¶ added in v0.9.0
type BlockStoreRPC interface { Height() int64 LoadBlockMeta(height int64) *BlockMeta LoadBlock(height int64) *Block LoadBlockPart(height int64, index int) *Part LoadBlockCommit(height int64) *Commit LoadSeenCommit(height int64) *Commit }
BlockStoreRPC is the block store interface used by the RPC. UNSTABLE
type CanonicalJSONBlockID ¶ added in v0.8.0
type CanonicalJSONBlockID struct { Hash data.Bytes `json:"hash,omitempty"` PartsHeader CanonicalJSONPartSetHeader `json:"parts,omitempty"` }
func CanonicalBlockID ¶
func CanonicalBlockID(blockID BlockID) CanonicalJSONBlockID
type CanonicalJSONHeartbeat ¶ added in v0.10.3
type CanonicalJSONHeartbeat struct { Height int64 `json:"height"` Round int `json:"round"` Sequence int `json:"sequence"` ValidatorAddress data.Bytes `json:"validator_address"` ValidatorIndex int `json:"validator_index"` }
func CanonicalHeartbeat ¶ added in v0.10.3
func CanonicalHeartbeat(heartbeat *Heartbeat) CanonicalJSONHeartbeat
type CanonicalJSONOnceHeartbeat ¶ added in v0.10.3
type CanonicalJSONOnceHeartbeat struct { ChainID string `json:"chain_id"` Heartbeat CanonicalJSONHeartbeat `json:"heartbeat"` }
type CanonicalJSONOnceProposal ¶ added in v0.8.0
type CanonicalJSONOnceProposal struct { ChainID string `json:"chain_id"` Proposal CanonicalJSONProposal `json:"proposal"` }
type CanonicalJSONOnceVote ¶ added in v0.8.0
type CanonicalJSONOnceVote struct { ChainID string `json:"chain_id"` Vote CanonicalJSONVote `json:"vote"` }
type CanonicalJSONPartSetHeader ¶ added in v0.8.0
func CanonicalPartSetHeader ¶
func CanonicalPartSetHeader(psh PartSetHeader) CanonicalJSONPartSetHeader
type CanonicalJSONProposal ¶ added in v0.8.0
type CanonicalJSONProposal struct { BlockPartsHeader CanonicalJSONPartSetHeader `json:"block_parts_header"` Height int64 `json:"height"` POLBlockID CanonicalJSONBlockID `json:"pol_block_id"` POLRound int `json:"pol_round"` Round int `json:"round"` }
func CanonicalProposal ¶
func CanonicalProposal(proposal *Proposal) CanonicalJSONProposal
type CanonicalJSONVote ¶ added in v0.8.0
type CanonicalJSONVote struct { BlockID CanonicalJSONBlockID `json:"block_id"` Height int64 `json:"height"` Round int `json:"round"` Type byte `json:"type"` }
func CanonicalVote ¶
func CanonicalVote(vote *Vote) CanonicalJSONVote
type Commit ¶
type Commit struct { // NOTE: The Precommits are in order of address to preserve the bonded ValidatorSet order. // Any peer with a block can gossip precommits by index with a peer without recalculating the // active ValidatorSet. BlockID BlockID `json:"blockID"` Precommits []*Vote `json:"precommits"` // contains filtered or unexported fields }
Commit contains the evidence that a block was committed by a set of validators. NOTE: Commit is empty for height 1, but never nil.
func (*Commit) FirstPrecommit ¶ added in v0.7.0
FirstPrecommit returns the first non-nil precommit in the commit
func (*Commit) GetByIndex ¶
GetByIndex returns the vote corresponding to a given validator index
func (*Commit) StringIndented ¶
StringIndented returns a string representation of the commit
func (*Commit) ValidateBasic ¶
ValidateBasic performs basic validation that doesn't involve state data.
type ConsensusParams ¶
type ConsensusParams struct { BlockSizeParams `json:"block_size_params"` TxSizeParams `json:"tx_size_params"` BlockGossipParams `json:"block_gossip_params"` }
ConsensusParams contains consensus critical parameters that determine the validity of blocks.
func DefaultConsensusParams ¶
func DefaultConsensusParams() *ConsensusParams
DefaultConsensusParams returns a default ConsensusParams.
func (*ConsensusParams) Validate ¶
func (params *ConsensusParams) Validate() error
Validate validates the ConsensusParams to ensure all values are within their allowed limits, and returns an error if they are not.
type Data ¶
type Data struct { // Txs that will be applied by state @ block.Height+1. // NOTE: not all txs here are valid. We're just agreeing on the order first. // This means that block.AppHash does not include these txs. Txs Txs `json:"txs"` // contains filtered or unexported fields }
Data contains the set of transactions included in the block
func (*Data) StringIndented ¶
StringIndented returns a string representation of the transactions
type DefaultSigner ¶ added in v0.7.0
DefaultSigner implements Signer. It uses a standard, unencrypted crypto.PrivKey.
func NewDefaultSigner ¶ added in v0.7.0
func NewDefaultSigner(priv crypto.PrivKey) *DefaultSigner
NewDefaultSigner returns an instance of DefaultSigner.
type ErrVoteConflictingVotes ¶
func (*ErrVoteConflictingVotes) Error ¶
func (err *ErrVoteConflictingVotes) Error() string
type EventBus ¶
type EventBus struct { cmn.BaseService // contains filtered or unexported fields }
EventBus is a common bus for all events going through the system. All calls are proxied to underlying pubsub server. All events must be published using EventBus to ensure correct data types.
func NewEventBusWithBufferCapacity ¶
NewEventBusWithBufferCapacity returns a new event bus with the given buffer capacity.
func (*EventBus) Publish ¶
func (b *EventBus) Publish(eventType string, eventData TMEventData) error
func (*EventBus) PublishEventCompleteProposal ¶
func (b *EventBus) PublishEventCompleteProposal(event EventDataRoundState) error
func (*EventBus) PublishEventLock ¶
func (b *EventBus) PublishEventLock(event EventDataRoundState) error
func (*EventBus) PublishEventNewBlock ¶
func (b *EventBus) PublishEventNewBlock(event EventDataNewBlock) error
func (*EventBus) PublishEventNewBlockHeader ¶
func (b *EventBus) PublishEventNewBlockHeader(event EventDataNewBlockHeader) error
func (*EventBus) PublishEventNewRound ¶
func (b *EventBus) PublishEventNewRound(event EventDataRoundState) error
func (*EventBus) PublishEventNewRoundStep ¶
func (b *EventBus) PublishEventNewRoundStep(event EventDataRoundState) error
func (*EventBus) PublishEventPolka ¶
func (b *EventBus) PublishEventPolka(event EventDataRoundState) error
func (*EventBus) PublishEventProposalHeartbeat ¶ added in v0.13.0
func (b *EventBus) PublishEventProposalHeartbeat(event EventDataProposalHeartbeat) error
func (*EventBus) PublishEventRelock ¶
func (b *EventBus) PublishEventRelock(event EventDataRoundState) error
func (*EventBus) PublishEventTimeoutPropose ¶
func (b *EventBus) PublishEventTimeoutPropose(event EventDataRoundState) error
func (*EventBus) PublishEventTimeoutWait ¶
func (b *EventBus) PublishEventTimeoutWait(event EventDataRoundState) error
func (*EventBus) PublishEventTx ¶
func (b *EventBus) PublishEventTx(event EventDataTx) error
PublishEventTx publishes tx event with tags from Result. Note it will add predefined tags (EventTypeKey, TxHashKey). Existing tags with the same names will be overwritten.
func (*EventBus) PublishEventUnlock ¶
func (b *EventBus) PublishEventUnlock(event EventDataRoundState) error
func (*EventBus) PublishEventVote ¶
func (b *EventBus) PublishEventVote(event EventDataVote) error
func (*EventBus) Unsubscribe ¶
type EventDataNewBlock ¶
type EventDataNewBlock struct {
Block *Block `json:"block"`
}
type EventDataNewBlockHeader ¶
type EventDataNewBlockHeader struct {
Header *Header `json:"header"`
}
light weight event for benchmarking
type EventDataProposalHeartbeat ¶ added in v0.10.3
type EventDataProposalHeartbeat struct {
Heartbeat *Heartbeat
}
type EventDataRoundState ¶
type EventDataRoundState struct { Height int64 `json:"height"` Round int `json:"round"` Step string `json:"step"` // private, not exposed to websockets RoundState interface{} `json:"-"` }
NOTE: This goes into the replay WAL
type EventDataVote ¶
type EventDataVote struct {
Vote *Vote
}
type GenesisDoc ¶
type GenesisDoc struct { GenesisTime time.Time `json:"genesis_time"` ChainID string `json:"chain_id"` ConsensusParams *ConsensusParams `json:"consensus_params,omitempty"` Validators []GenesisValidator `json:"validators"` AppHash data.Bytes `json:"app_hash"` AppOptions interface{} `json:"app_options,omitempty"` }
GenesisDoc defines the initial conditions for a tendermint blockchain, in particular its validator set.
func GenesisDocFromFile ¶
func GenesisDocFromFile(genDocFile string) (*GenesisDoc, error)
GenesisDocFromFile reads JSON data from a file and unmarshalls it into a GenesisDoc.
func GenesisDocFromJSON ¶
func GenesisDocFromJSON(jsonBlob []byte) (*GenesisDoc, error)
GenesisDocFromJSON unmarshalls JSON data into a GenesisDoc.
func (*GenesisDoc) SaveAs ¶
func (genDoc *GenesisDoc) SaveAs(file string) error
SaveAs is a utility method for saving GenensisDoc as a JSON file.
func (*GenesisDoc) ValidateAndComplete ¶
func (genDoc *GenesisDoc) ValidateAndComplete() error
ValidateAndComplete checks that all necessary fields are present and fills in defaults for optional fields left empty
func (*GenesisDoc) ValidatorHash ¶
func (genDoc *GenesisDoc) ValidatorHash() []byte
ValidatorHash returns the hash of the validator set contained in the GenesisDoc
type GenesisValidator ¶
type GenesisValidator struct { PubKey crypto.PubKey `json:"pub_key"` Power int64 `json:"power"` Name string `json:"name"` }
GenesisValidator is an initial validator.
type Header ¶
type Header struct { ChainID string `json:"chain_id"` Height int64 `json:"height"` Time time.Time `json:"time"` NumTxs int `json:"num_txs"` // XXX: Can we get rid of this? LastBlockID BlockID `json:"last_block_id"` LastCommitHash data.Bytes `json:"last_commit_hash"` // commit from validators from the last block DataHash data.Bytes `json:"data_hash"` // transactions ValidatorsHash data.Bytes `json:"validators_hash"` // validators for the current block AppHash data.Bytes `json:"app_hash"` // state after txs from the previous block }
Header defines the structure of a Tendermint block header
func (*Header) StringIndented ¶
StringIndented returns a string representation of the header
type Heartbeat ¶ added in v0.10.3
type Heartbeat struct { ValidatorAddress data.Bytes `json:"validator_address"` ValidatorIndex int `json:"validator_index"` Height int64 `json:"height"` Round int `json:"round"` Sequence int `json:"sequence"` Signature crypto.Signature `json:"signature"` }
Heartbeat is a simple vote-like structure so validators can alert others that they are alive and waiting for transactions. Note: We aren't adding ",omitempty" to Heartbeat's json field tags because we always want the JSON representation to be in its canonical form.
type Mempool ¶ added in v0.9.0
type Mempool interface { Lock() Unlock() Size() int CheckTx(Tx, func(*abci.Response)) error Reap(int) Txs Update(height int64, txs Txs) error Flush() TxsAvailable() <-chan int64 EnableTxsAvailable() }
Mempool defines the mempool interface. Updates to the mempool need to be synchronized with committing a block so apps can reset their transient state on Commit UNSTABLE
type MockMempool ¶ added in v0.9.0
type MockMempool struct { }
MockMempool is an empty implementation of a Mempool, useful for testing. UNSTABLE
func (MockMempool) CheckTx ¶ added in v0.9.0
func (m MockMempool) CheckTx(tx Tx, cb func(*abci.Response)) error
func (MockMempool) EnableTxsAvailable ¶ added in v0.10.3
func (m MockMempool) EnableTxsAvailable()
func (MockMempool) Flush ¶ added in v0.9.0
func (m MockMempool) Flush()
func (MockMempool) Lock ¶ added in v0.9.0
func (m MockMempool) Lock()
func (MockMempool) Reap ¶ added in v0.9.0
func (m MockMempool) Reap(n int) Txs
func (MockMempool) Size ¶ added in v0.9.0
func (m MockMempool) Size() int
func (MockMempool) TxsAvailable ¶ added in v0.10.3
func (m MockMempool) TxsAvailable() <-chan int64
func (MockMempool) Unlock ¶ added in v0.9.0
func (m MockMempool) Unlock()
type NopEventBus ¶
type NopEventBus struct{}
func (NopEventBus) PublishEventCompleteProposal ¶
func (NopEventBus) PublishEventCompleteProposal(rs EventDataRoundState) error
func (NopEventBus) PublishEventLock ¶
func (NopEventBus) PublishEventLock(rs EventDataRoundState) error
func (NopEventBus) PublishEventNewBlock ¶
func (NopEventBus) PublishEventNewBlock(block EventDataNewBlock) error
func (NopEventBus) PublishEventNewBlockHeader ¶
func (NopEventBus) PublishEventNewBlockHeader(header EventDataNewBlockHeader) error
func (NopEventBus) PublishEventNewRound ¶
func (NopEventBus) PublishEventNewRound(rs EventDataRoundState) error
func (NopEventBus) PublishEventNewRoundStep ¶
func (NopEventBus) PublishEventNewRoundStep(rs EventDataRoundState) error
func (NopEventBus) PublishEventPolka ¶
func (NopEventBus) PublishEventPolka(rs EventDataRoundState) error
func (NopEventBus) PublishEventRelock ¶
func (NopEventBus) PublishEventRelock(rs EventDataRoundState) error
func (NopEventBus) PublishEventTimeoutPropose ¶
func (NopEventBus) PublishEventTimeoutPropose(rs EventDataRoundState) error
func (NopEventBus) PublishEventTimeoutWait ¶
func (NopEventBus) PublishEventTimeoutWait(rs EventDataRoundState) error
func (NopEventBus) PublishEventTx ¶
func (NopEventBus) PublishEventTx(tx EventDataTx) error
func (NopEventBus) PublishEventUnlock ¶
func (NopEventBus) PublishEventUnlock(rs EventDataRoundState) error
func (NopEventBus) PublishEventVote ¶
func (NopEventBus) PublishEventVote(vote EventDataVote) error
func (NopEventBus) Unsubscribe ¶
func (NopEventBus) UnsubscribeAll ¶
func (NopEventBus) UnsubscribeAll(ctx context.Context, subscriber string) error
type Part ¶
type Part struct { Index int `json:"index"` Bytes data.Bytes `json:"bytes"` Proof merkle.SimpleProof `json:"proof"` // contains filtered or unexported fields }
func (*Part) StringIndented ¶
type PartSet ¶
type PartSet struct {
// contains filtered or unexported fields
}
func NewPartSetFromData ¶
Returns an immutable, full PartSet from the data bytes. The data bytes are split into "partSize" chunks, and merkle tree computed.
func NewPartSetFromHeader ¶
func NewPartSetFromHeader(header PartSetHeader) *PartSet
Returns an empty PartSet ready to be populated.
func (*PartSet) HasHeader ¶
func (ps *PartSet) HasHeader(header PartSetHeader) bool
func (*PartSet) Header ¶
func (ps *PartSet) Header() PartSetHeader
func (*PartSet) IsComplete ¶
func (*PartSet) StringShort ¶
type PartSetHeader ¶
func (PartSetHeader) Equals ¶
func (psh PartSetHeader) Equals(other PartSetHeader) bool
func (PartSetHeader) IsZero ¶
func (psh PartSetHeader) IsZero() bool
func (PartSetHeader) String ¶
func (psh PartSetHeader) String() string
func (PartSetHeader) WriteSignBytes ¶ added in v0.7.0
func (psh PartSetHeader) WriteSignBytes(w io.Writer, n *int, err *error)
type PartSetReader ¶
type PartSetReader struct {
// contains filtered or unexported fields
}
func NewPartSetReader ¶
func NewPartSetReader(parts []*Part) *PartSetReader
type PrivValidator ¶
type PrivValidator interface { GetAddress() data.Bytes // redundant since .PubKey().Address() GetPubKey() crypto.PubKey SignVote(chainID string, vote *Vote) error SignProposal(chainID string, proposal *Proposal) error SignHeartbeat(chainID string, heartbeat *Heartbeat) error }
PrivValidator defines the functionality of a local Tendermint validator that signs votes, proposals, and heartbeats, and never double signs.
type PrivValidatorFS ¶ added in v0.11.0
type PrivValidatorFS struct { Address data.Bytes `json:"address"` PubKey crypto.PubKey `json:"pub_key"` LastHeight int64 `json:"last_height"` LastRound int `json:"last_round"` LastStep int8 `json:"last_step"` LastSignature crypto.Signature `json:"last_signature,omitempty"` // so we dont lose signatures LastSignBytes data.Bytes `json:"last_signbytes,omitempty"` // so we dont lose signatures // PrivKey should be empty if a Signer other than the default is being used. PrivKey crypto.PrivKey `json:"priv_key"` Signer `json:"-"` // contains filtered or unexported fields }
PrivValidatorFS implements PrivValidator using data persisted to disk to prevent double signing. The Signer itself can be mutated to use something besides the default, for instance a hardware signer.
func GenPrivValidatorFS ¶ added in v0.11.0
func GenPrivValidatorFS(filePath string) *PrivValidatorFS
GenPrivValidatorFS generates a new validator with randomly generated private key and sets the filePath, but does not call Save().
func LoadOrGenPrivValidatorFS ¶ added in v0.11.0
func LoadOrGenPrivValidatorFS(filePath string) *PrivValidatorFS
LoadOrGenPrivValidatorFS loads a PrivValidatorFS from the given filePath or else generates a new one and saves it to the filePath.
func LoadPrivValidatorFS ¶ added in v0.11.0
func LoadPrivValidatorFS(filePath string) *PrivValidatorFS
LoadPrivValidatorFS loads a PrivValidatorFS from the filePath.
func LoadPrivValidatorFSWithSigner ¶ added in v0.11.0
func LoadPrivValidatorFSWithSigner(filePath string, signerFunc func(PrivValidator) Signer) *PrivValidatorFS
LoadPrivValidatorWithSigner loads a PrivValidatorFS with a custom signer object. The PrivValidatorFS handles double signing prevention by persisting data to the filePath, while the Signer handles the signing. If the filePath does not exist, the PrivValidatorFS must be created manually and saved.
func (*PrivValidatorFS) GetAddress ¶ added in v0.11.0
func (pv *PrivValidatorFS) GetAddress() data.Bytes
GetAddress returns the address of the validator. Implements PrivValidator.
func (*PrivValidatorFS) GetPubKey ¶ added in v0.11.0
func (pv *PrivValidatorFS) GetPubKey() crypto.PubKey
GetPubKey returns the public key of the validator. Implements PrivValidator.
func (*PrivValidatorFS) Reset ¶ added in v0.11.0
func (privVal *PrivValidatorFS) Reset()
Reset resets all fields in the PrivValidatorFS. NOTE: Unsafe!
func (*PrivValidatorFS) Save ¶ added in v0.11.0
func (privVal *PrivValidatorFS) Save()
Save persists the PrivValidatorFS to disk.
func (*PrivValidatorFS) SignHeartbeat ¶ added in v0.11.0
func (privVal *PrivValidatorFS) SignHeartbeat(chainID string, heartbeat *Heartbeat) error
SignHeartbeat signs a canonical representation of the heartbeat, along with the chainID. Implements PrivValidator.
func (*PrivValidatorFS) SignProposal ¶ added in v0.11.0
func (privVal *PrivValidatorFS) SignProposal(chainID string, proposal *Proposal) error
SignProposal signs a canonical representation of the proposal, along with the chainID. Implements PrivValidator.
func (*PrivValidatorFS) SignVote ¶ added in v0.11.0
func (privVal *PrivValidatorFS) SignVote(chainID string, vote *Vote) error
SignVote signs a canonical representation of the vote, along with the chainID. Implements PrivValidator.
func (*PrivValidatorFS) String ¶ added in v0.11.0
func (privVal *PrivValidatorFS) String() string
String returns a string representation of the PrivValidatorFS.
type PrivValidatorsByAddress ¶
type PrivValidatorsByAddress []*PrivValidatorFS
func (PrivValidatorsByAddress) Len ¶
func (pvs PrivValidatorsByAddress) Len() int
func (PrivValidatorsByAddress) Less ¶
func (pvs PrivValidatorsByAddress) Less(i, j int) bool
func (PrivValidatorsByAddress) Swap ¶
func (pvs PrivValidatorsByAddress) Swap(i, j int)
type Proposal ¶
type Proposal struct { Height int64 `json:"height"` Round int `json:"round"` BlockPartsHeader PartSetHeader `json:"block_parts_header"` POLRound int `json:"pol_round"` // -1 if null. POLBlockID BlockID `json:"pol_block_id"` // zero if null. Signature crypto.Signature `json:"signature"` }
Proposal defines a block proposal for the consensus. It refers to the block only by its PartSetHeader. It must be signed by the correct proposer for the given Height/Round to be considered valid. It may depend on votes from a previous round, a so-called Proof-of-Lock (POL) round, as noted in the POLRound and POLBlockID.
func NewProposal ¶
func NewProposal(height int64, round int, blockPartsHeader PartSetHeader, polRound int, polBlockID BlockID) *Proposal
NewProposal returns a new Proposal. If there is no POLRound, polRound should be -1.
type Signable ¶
Signable is an interface for all signable things. It typically removes signatures before serializing.
type SignedHeader ¶
SignedHeader is a header along with the commits that prove it
type Signer ¶ added in v0.7.0
Signer is an interface that defines how to sign messages. It is the caller's duty to verify the msg before calling Sign, eg. to avoid double signing. Currently, the only callers are SignVote, SignProposal, and SignHeartbeat.
type TMEventData ¶
type TMEventData struct {
TMEventDataInner `json:"unwrap"`
}
func (TMEventData) Empty ¶ added in v0.10.0
func (tmr TMEventData) Empty() bool
func (TMEventData) MarshalJSON ¶ added in v0.10.0
func (tmr TMEventData) MarshalJSON() ([]byte, error)
func (*TMEventData) UnmarshalJSON ¶ added in v0.10.0
func (tmr *TMEventData) UnmarshalJSON(data []byte) (err error)
func (TMEventData) Unwrap ¶ added in v0.10.0
func (tmr TMEventData) Unwrap() TMEventDataInner
type TMEventDataInner ¶ added in v0.10.0
type TMEventDataInner interface { }
implements events.EventData
type Tx ¶
type Tx []byte
Tx represents a transaction, which may contain arbitrary bytes.
type TxEventBuffer ¶ added in v0.13.0
type TxEventBuffer struct {
// contains filtered or unexported fields
}
TxEventBuffer is a buffer of events, which uses a slice to temporarily store events.
func NewTxEventBuffer ¶ added in v0.13.0
func NewTxEventBuffer(next TxEventPublisher, capacity int) *TxEventBuffer
NewTxEventBuffer accepts a TxEventPublisher and returns a new buffer with the given capacity.
func (*TxEventBuffer) Flush ¶ added in v0.13.0
func (b *TxEventBuffer) Flush() error
Flush publishes events by running next.PublishWithTags on all cached events. Blocks. Clears cached events.
func (TxEventBuffer) Len ¶ added in v0.13.0
func (b TxEventBuffer) Len() int
Len returns the number of events cached.
func (*TxEventBuffer) PublishEventTx ¶ added in v0.13.0
func (b *TxEventBuffer) PublishEventTx(e EventDataTx) error
PublishEventTx buffers an event to be fired upon finality.
type TxEventPublisher ¶
type TxEventPublisher interface {
PublishEventTx(EventDataTx) error
}
type TxResult ¶
type TxResult struct { Height int64 `json:"height"` Index uint32 `json:"index"` Tx Tx `json:"tx"` Result abci.ResponseDeliverTx `json:"result"` }
TxResult contains results of executing the transaction.
One usage is indexing transaction results.
type TxSizeParams ¶ added in v0.11.0
TxSizeParams contain limits on the tx size.
func DefaultTxSizeParams ¶ added in v0.11.0
func DefaultTxSizeParams() TxSizeParams
DefaultTxSizeParams returns a default TxSizeParams.
type Txs ¶
type Txs []Tx
Txs is a slice of Tx.
func (Txs) IndexByHash ¶
IndexByHash returns the index of this transaction hash in the list, or -1 if not found
type Validator ¶
type Validator struct { Address data.Bytes `json:"address"` PubKey crypto.PubKey `json:"pub_key"` VotingPower int64 `json:"voting_power"` Accum int64 `json:"accum"` }
Volatile state for each Validator NOTE: The Accum is not included in Validator.Hash(); make sure to update that method if changes are made here
func NewValidator ¶
func (*Validator) CompareAccum ¶ added in v0.7.0
Returns the one with higher Accum.
func (*Validator) Copy ¶
Creates a new copy of the validator so we can mutate accum. Panics if the validator is nil.
type ValidatorSet ¶
type ValidatorSet struct { // NOTE: persisted via reflect, must be exported. Validators []*Validator `json:"validators"` Proposer *Validator `json:"proposer"` // contains filtered or unexported fields }
ValidatorSet represent a set of *Validator at a given height. The validators can be fetched by address or index. The index is in order of .Address, so the indices are fixed for all rounds of a given blockchain height. On the other hand, the .AccumPower of each validator and the designated .GetProposer() of a set changes every round, upon calling .IncrementAccum(). NOTE: Not goroutine-safe. NOTE: All get/set to validators should copy the value for safety. TODO: consider validator Accum overflow
func NewValidatorSet ¶
func NewValidatorSet(vals []*Validator) *ValidatorSet
func (*ValidatorSet) Add ¶ added in v0.7.0
func (valSet *ValidatorSet) Add(val *Validator) (added bool)
func (*ValidatorSet) Copy ¶
func (valSet *ValidatorSet) Copy() *ValidatorSet
func (*ValidatorSet) GetByAddress ¶
func (valSet *ValidatorSet) GetByAddress(address []byte) (index int, val *Validator)
func (*ValidatorSet) GetByIndex ¶
func (valSet *ValidatorSet) GetByIndex(index int) (address []byte, val *Validator)
GetByIndex returns the validator by index. It returns nil values if index < 0 or index >= len(ValidatorSet.Validators)
func (*ValidatorSet) GetProposer ¶
func (valSet *ValidatorSet) GetProposer() (proposer *Validator)
func (*ValidatorSet) HasAddress ¶
func (valSet *ValidatorSet) HasAddress(address []byte) bool
func (*ValidatorSet) Hash ¶
func (valSet *ValidatorSet) Hash() []byte
func (*ValidatorSet) IncrementAccum ¶ added in v0.7.0
func (valSet *ValidatorSet) IncrementAccum(times int)
incrementAccum and update the proposer TODO: mind the overflow when times and votingPower shares too large.
func (*ValidatorSet) Iterate ¶
func (valSet *ValidatorSet) Iterate(fn func(index int, val *Validator) bool)
func (*ValidatorSet) Remove ¶ added in v0.7.0
func (valSet *ValidatorSet) Remove(address []byte) (val *Validator, removed bool)
func (*ValidatorSet) Size ¶
func (valSet *ValidatorSet) Size() int
func (*ValidatorSet) String ¶
func (valSet *ValidatorSet) String() string
func (*ValidatorSet) StringIndented ¶
func (valSet *ValidatorSet) StringIndented(indent string) string
func (*ValidatorSet) TotalVotingPower ¶
func (valSet *ValidatorSet) TotalVotingPower() int64
func (*ValidatorSet) Update ¶ added in v0.7.0
func (valSet *ValidatorSet) Update(val *Validator) (updated bool)
func (*ValidatorSet) VerifyCommit ¶
func (valSet *ValidatorSet) VerifyCommit(chainID string, blockID BlockID, height int64, commit *Commit) error
Verify that +2/3 of the set had signed the given signBytes
func (*ValidatorSet) VerifyCommitAny ¶ added in v0.9.0
func (valSet *ValidatorSet) VerifyCommitAny(newSet *ValidatorSet, chainID string, blockID BlockID, height int64, commit *Commit) error
VerifyCommitAny will check to see if the set would be valid with a different validator set.
valSet is the validator set that we know * over 2/3 of the power in old signed this block
newSet is the validator set that signed this block
- only votes from old are sufficient for 2/3 majority in the new set as well
That means that: * 10% of the valset can't just declare themselves kings * If the validator set is 3x old size, we need more proof to trust
type ValidatorsByAddress ¶
type ValidatorsByAddress []*Validator
func (ValidatorsByAddress) Len ¶
func (vs ValidatorsByAddress) Len() int
func (ValidatorsByAddress) Less ¶
func (vs ValidatorsByAddress) Less(i, j int) bool
func (ValidatorsByAddress) Swap ¶
func (vs ValidatorsByAddress) Swap(i, j int)
type Vote ¶
type Vote struct { ValidatorAddress data.Bytes `json:"validator_address"` ValidatorIndex int `json:"validator_index"` Height int64 `json:"height"` Round int `json:"round"` Type byte `json:"type"` BlockID BlockID `json:"block_id"` // zero if vote is nil. Signature crypto.Signature `json:"signature"` }
Represents a prevote, precommit, or commit vote from validators for consensus.
type VoteSet ¶
type VoteSet struct {
// contains filtered or unexported fields
}
VoteSet helps collect signatures from validators at each height+round for a predefined vote type.
We need VoteSet to be able to keep track of conflicting votes when validators double-sign. Yet, we can't keep track of *all* the votes seen, as that could be a DoS attack vector.
There are two storage areas for votes. 1. voteSet.votes 2. voteSet.votesByBlock
`.votes` is the "canonical" list of votes. It always has at least one vote, if a vote from a validator had been seen at all. Usually it keeps track of the first vote seen, but when a 2/3 majority is found, votes for that get priority and are copied over from `.votesByBlock`.
`.votesByBlock` keeps track of a list of votes for a particular block. There are two ways a &blockVotes{} gets created in `.votesByBlock`. 1. the first vote seen by a validator was for the particular block. 2. a peer claims to have seen 2/3 majority for the particular block.
Since the first vote from a validator will always get added in `.votesByBlock` , all votes in `.votes` will have a corresponding entry in `.votesByBlock`.
When a &blockVotes{} in `.votesByBlock` reaches a 2/3 majority quorum, its votes are copied into `.votes`.
All this is memory bounded because conflicting votes only get added if a peer told us to track that block, each peer only gets to tell us 1 such block, and, there's only a limited number of peers.
NOTE: Assumes that the sum total of voting power does not exceed MaxUInt64.
func NewVoteSet ¶
Constructs a new VoteSet struct used to accumulate votes for given height/round.
func (*VoteSet) AddVote ¶
Returns added=true if vote is valid and new. Otherwise returns err=ErrVote[
UnexpectedStep | InvalidIndex | InvalidAddress | InvalidSignature | InvalidBlockHash | ConflictingVotes ]
Duplicate votes return added=false, err=nil. Conflicting votes return added=*, err=ErrVoteConflictingVotes. NOTE: vote should not be mutated after adding. NOTE: VoteSet must not be nil NOTE: Vote must not be nil
func (*VoteSet) BitArrayByBlockID ¶
func (*VoteSet) GetByAddress ¶
func (*VoteSet) GetByIndex ¶
NOTE: if validator has conflicting votes, returns "canonical" vote
func (*VoteSet) HasTwoThirdsAny ¶
func (*VoteSet) HasTwoThirdsMajority ¶
func (*VoteSet) MakeCommit ¶
func (*VoteSet) SetPeerMaj23 ¶
If a peer claims that it has 2/3 majority for given blockKey, call this. NOTE: if there are too many peers, or too much peer churn, this can cause memory issues. TODO: implement ability to remove peers too NOTE: VoteSet must not be nil
func (*VoteSet) StringIndented ¶
func (*VoteSet) StringShort ¶
func (*VoteSet) TwoThirdsMajority ¶
Returns either a blockhash (or nil) that received +2/3 majority. If there exists no such majority, returns (nil, PartSetHeader{}, false).