pub trait Application: Send + Sync {
Show 14 methods
// Provided methods
fn create_payload(&self, _ctx: &BlockContext<'_>) -> Vec<u8> ⓘ { ... }
fn validate_block(&self, _block: &Block, _ctx: &BlockContext<'_>) -> bool { ... }
fn validate_tx(
&self,
_tx: &[u8],
_ctx: Option<&TxContext>,
) -> TxValidationResult { ... }
fn execute_block(
&self,
_txs: &[&[u8]],
_ctx: &BlockContext<'_>,
) -> Result<EndBlockResponse> { ... }
fn on_commit(&self, _block: &Block, _ctx: &BlockContext<'_>) -> Result<()> { ... }
fn on_evidence(&self, _proof: &EquivocationProof) -> Result<()> { ... }
fn extend_vote(
&self,
_block: &Block,
_ctx: &BlockContext<'_>,
) -> Option<Vec<u8>> { ... }
fn verify_vote_extension(
&self,
_extension: &[u8],
_block_hash: &BlockHash,
_validator: ValidatorId,
) -> bool { ... }
fn query(&self, _path: &str, _data: &[u8]) -> Result<Vec<u8>> { ... }
fn list_snapshots(&self) -> Vec<SnapshotInfo> { ... }
fn load_snapshot_chunk(&self, _height: Height, _chunk_index: u32) -> Vec<u8> ⓘ { ... }
fn offer_snapshot(&self, _snapshot: &SnapshotInfo) -> SnapshotOfferResult { ... }
fn apply_snapshot_chunk(
&self,
_chunk: Vec<u8>,
_chunk_index: u32,
) -> ChunkApplyResult { ... }
fn tracks_app_hash(&self) -> bool { ... }
}Expand description
Application interface for the consensus engine.
The lifecycle for each committed block:
execute_block— receives all decoded transactions at once; returns validator updates and eventson_commit— notification after the block is finalized
For block proposal:
create_payload— build the payload bytes for a new block
For validation (before voting):
validate_block— full block validationvalidate_tx— individual transaction validation for mempool
For evidence:
on_evidence— called when equivocation is detected
All methods have default no-op implementations.
Provided Methods§
Sourcefn create_payload(&self, _ctx: &BlockContext<'_>) -> Vec<u8> ⓘ
fn create_payload(&self, _ctx: &BlockContext<'_>) -> Vec<u8> ⓘ
Create a payload for a new block proposal. Typically pulls transactions from the mempool.
If your mempool is async, use tokio::runtime::Handle::current().block_on(..)
to bridge into this synchronous callback.
Sourcefn validate_block(&self, _block: &Block, _ctx: &BlockContext<'_>) -> bool
fn validate_block(&self, _block: &Block, _ctx: &BlockContext<'_>) -> bool
Validate a proposed block before voting.
Sourcefn validate_tx(
&self,
_tx: &[u8],
_ctx: Option<&TxContext>,
) -> TxValidationResult
fn validate_tx( &self, _tx: &[u8], _ctx: Option<&TxContext>, ) -> TxValidationResult
Validate a single transaction for mempool admission.
Returns a TxValidationResult with valid and priority.
Priority determines ordering in the mempool (higher = included first).
An optional TxContext provides the current chain height and epoch,
which can be useful for state-dependent validation (nonce checks, etc.).
Sourcefn execute_block(
&self,
_txs: &[&[u8]],
_ctx: &BlockContext<'_>,
) -> Result<EndBlockResponse>
fn execute_block( &self, _txs: &[&[u8]], _ctx: &BlockContext<'_>, ) -> Result<EndBlockResponse>
Execute an entire block in one call.
Receives all decoded transactions from the block payload at once, allowing batch-optimised processing (bulk DB writes, parallel signature verification, etc.).
Return EndBlockResponse with validator_updates to schedule an
epoch transition, and/or events to emit application-defined events.
Sourcefn on_commit(&self, _block: &Block, _ctx: &BlockContext<'_>) -> Result<()>
fn on_commit(&self, _block: &Block, _ctx: &BlockContext<'_>) -> Result<()>
Called when a block is committed to the chain (notification).
Sourcefn on_evidence(&self, _proof: &EquivocationProof) -> Result<()>
fn on_evidence(&self, _proof: &EquivocationProof) -> Result<()>
Called when equivocation (double-voting) is detected. The application can use this to implement slashing.
Sourcefn extend_vote(
&self,
_block: &Block,
_ctx: &BlockContext<'_>,
) -> Option<Vec<u8>>
fn extend_vote( &self, _block: &Block, _ctx: &BlockContext<'_>, ) -> Option<Vec<u8>>
Generate a vote extension for the given block (ABCI++ Vote Extensions). Called before casting a Vote2 (second-phase vote). Returns None to skip extension (default behavior).
Sourcefn verify_vote_extension(
&self,
_extension: &[u8],
_block_hash: &BlockHash,
_validator: ValidatorId,
) -> bool
fn verify_vote_extension( &self, _extension: &[u8], _block_hash: &BlockHash, _validator: ValidatorId, ) -> bool
Verify a vote extension received from another validator. Called when processing Vote2 messages that carry extensions. Returns true if the extension is valid (default: accept all).
Sourcefn query(&self, _path: &str, _data: &[u8]) -> Result<Vec<u8>>
fn query(&self, _path: &str, _data: &[u8]) -> Result<Vec<u8>>
Query application state (returns opaque bytes).
Sourcefn list_snapshots(&self) -> Vec<SnapshotInfo>
fn list_snapshots(&self) -> Vec<SnapshotInfo>
List available state snapshots for state sync.
Sourcefn load_snapshot_chunk(&self, _height: Height, _chunk_index: u32) -> Vec<u8> ⓘ
fn load_snapshot_chunk(&self, _height: Height, _chunk_index: u32) -> Vec<u8> ⓘ
Load a chunk of a snapshot at the given height.
Sourcefn offer_snapshot(&self, _snapshot: &SnapshotInfo) -> SnapshotOfferResult
fn offer_snapshot(&self, _snapshot: &SnapshotInfo) -> SnapshotOfferResult
Offer a snapshot to the application for state sync.
Sourcefn apply_snapshot_chunk(
&self,
_chunk: Vec<u8>,
_chunk_index: u32,
) -> ChunkApplyResult
fn apply_snapshot_chunk( &self, _chunk: Vec<u8>, _chunk_index: u32, ) -> ChunkApplyResult
Apply a snapshot chunk received during state sync.
Sourcefn tracks_app_hash(&self) -> bool
fn tracks_app_hash(&self) -> bool
Whether this application produces and verifies app_hash state roots.
Applications that do not maintain a deterministic state root (e.g. the
embedded NoopApplication used by fullnodes without an ABCI backend)
should return false. Sync will then bypass the app_hash equality
check and accept the chain’s authoritative value, allowing the node to
follow a chain produced by peers running a real application.