Documentation ¶
Index ¶
- Constants
- Variables
- func ValidateMsg(pb proto.Message) error
- type BlockPool
- func (pool *BlockPool) AddBlock(peerID p2p.ID, block *types.Block, extCommit *types.ExtendedCommit, ...) error
- func (pool *BlockPool) GetStatus() (height int64, numPending int32, lenRequesters int)
- func (pool *BlockPool) IsCaughtUp() bool
- func (pool *BlockPool) MaxPeerHeight() int64
- func (pool *BlockPool) OnStart() error
- func (pool *BlockPool) PeekTwoBlocks() (first, second *types.Block, firstExtCommit *types.ExtendedCommit)
- func (pool *BlockPool) PopRequest()
- func (pool *BlockPool) RedoRequest(height int64) p2p.ID
- func (pool *BlockPool) RemovePeer(peerID p2p.ID)
- func (pool *BlockPool) SetPeerRange(peerID p2p.ID, base int64, height int64)
- type BlockRequest
- type ErrInvalidBase
- type ErrInvalidHeight
- type ErrReactorValidation
- type ErrUnknownMessageType
- type Metrics
- type Reactor
- func (bcR *Reactor) AddPeer(peer p2p.Peer)
- func (bcR *Reactor) BroadcastStatusRequest()
- func (bcR *Reactor) GetChannels() []*p2p.ChannelDescriptor
- func (bcR *Reactor) OnStart() error
- func (bcR *Reactor) OnStop()
- func (bcR *Reactor) Receive(e p2p.Envelope)
- func (bcR *Reactor) RemovePeer(peer p2p.Peer, _ interface{})
- func (bcR *Reactor) SetLogger(l log.Logger)
- func (bcR *Reactor) SwitchToBlockSync(state sm.State) error
Constants ¶
const ( // NOTE: keep up to date with bcproto.BlockResponse BlockResponseMessagePrefixSize = 4 BlockResponseMessageFieldKeySize = 1 MaxMsgSize = types.MaxBlockSizeBytes + BlockResponseMessagePrefixSize + BlockResponseMessageFieldKeySize )
const ( // BlocksyncChannel is a channel for blocks and status updates (`BlockStore` height) BlocksyncChannel = byte(0x40) )
const ( // MetricsSubsystem is a subsystem shared by all metrics exposed by this // package. MetricsSubsystem = "blocksync" )
Variables ¶
var ( // ErrNilMessage is returned when provided message is empty ErrNilMessage = errors.New("message cannot be nil") )
Functions ¶
Types ¶
type BlockPool ¶
type BlockPool struct { service.BaseService // contains filtered or unexported fields }
BlockPool keeps track of the block sync peers, block requests and block responses.
func NewBlockPool ¶
func NewBlockPool(start int64, requestsCh chan<- BlockRequest, errorsCh chan<- peerError) *BlockPool
NewBlockPool returns a new BlockPool with the height equal to start. Block requests and errors will be sent to requestsCh and errorsCh accordingly.
func (*BlockPool) AddBlock ¶
func (pool *BlockPool) AddBlock(peerID p2p.ID, block *types.Block, extCommit *types.ExtendedCommit, blockSize int) error
AddBlock validates that the block comes from the peer it was expected from and calls the requester to store it.
This requires an extended commit at the same height as the supplied block - the block contains the last commit, but we need the latest commit in case we need to switch over from block sync to consensus at this height. If the height of the extended commit and the height of the block do not match, we do not add the block and return an error. TODO: ensure that blocks come in order for each peer.
func (*BlockPool) GetStatus ¶
GetStatus returns pool's height, numPending requests and the number of requesters.
func (*BlockPool) IsCaughtUp ¶
IsCaughtUp returns true if this node is caught up, false - otherwise. TODO: relax conditions, prevent abuse.
func (*BlockPool) MaxPeerHeight ¶
MaxPeerHeight returns the highest reported height.
func (*BlockPool) OnStart ¶
OnStart implements service.Service by spawning requesters routine and recording pool's start time.
func (*BlockPool) PeekTwoBlocks ¶
func (pool *BlockPool) PeekTwoBlocks() (first, second *types.Block, firstExtCommit *types.ExtendedCommit)
PeekTwoBlocks returns blocks at pool.height and pool.height+1. We need to see the second block's Commit to validate the first block. So we peek two blocks at a time. We return an extended commit, containing vote extensions and their associated signatures, as this is critical to consensus in ABCI++ as we switch from block sync to consensus mode.
The caller will verify the commit.
func (*BlockPool) PopRequest ¶
func (pool *BlockPool) PopRequest()
PopRequest pops the first block at pool.height. It must have been validated by the second Commit from PeekTwoBlocks. TODO(thane): (?) and its corresponding ExtendedCommit.
func (*BlockPool) RedoRequest ¶
RedoRequest invalidates the block at pool.height, Remove the peer and redo request from others. Returns the ID of the removed peer.
func (*BlockPool) RemovePeer ¶
RemovePeer removes the peer with peerID from the pool. If there's no peer with peerID, function is a no-op.
type BlockRequest ¶
BlockRequest stores a block request identified by the block Height and the PeerID responsible for delivering the block
type ErrInvalidBase ¶
ErrInvalidBase is returned when peer informs of a status with invalid base
func (ErrInvalidBase) Error ¶
func (e ErrInvalidBase) Error() string
type ErrInvalidHeight ¶
ErrInvalidBase is returned when peer informs of a status with invalid height
func (ErrInvalidHeight) Error ¶
func (e ErrInvalidHeight) Error() string
type ErrReactorValidation ¶
type ErrReactorValidation struct {
Err error
}
func (ErrReactorValidation) Error ¶
func (e ErrReactorValidation) Error() string
func (ErrReactorValidation) Unwrap ¶
func (e ErrReactorValidation) Unwrap() error
type ErrUnknownMessageType ¶
func (ErrUnknownMessageType) Error ¶
func (e ErrUnknownMessageType) Error() string
type Metrics ¶
type Metrics struct { // Whether or not a node is block syncing. 1 if yes, 0 if no. Syncing metrics.Gauge // Number of transactions in the latest block. NumTxs metrics.Gauge // Total number of transactions. TotalTxs metrics.Gauge // Size of the latest block. BlockSizeBytes metrics.Gauge // The height of the latest block. LatestBlockHeight metrics.Gauge }
Metrics contains metrics exposed by this package.
func NopMetrics ¶
func NopMetrics() *Metrics
func PrometheusMetrics ¶
type Reactor ¶
type Reactor struct { p2p.BaseReactor // contains filtered or unexported fields }
Reactor handles long-term catchup syncing.
func NewReactor ¶
func NewReactor(state sm.State, blockExec *sm.BlockExecutor, store *store.BlockStore, blockSync bool, metrics *Metrics, offlineStateSyncHeight int64, ) *Reactor
NewReactor returns new reactor instance.
func (*Reactor) BroadcastStatusRequest ¶
func (bcR *Reactor) BroadcastStatusRequest()
BroadcastStatusRequest broadcasts `BlockStore` base and height.
func (*Reactor) GetChannels ¶
func (bcR *Reactor) GetChannels() []*p2p.ChannelDescriptor
GetChannels implements Reactor
func (*Reactor) RemovePeer ¶
RemovePeer implements Reactor by removing peer from the pool.