How runtime runs for a block or extrinsic
ImportBlock
Originated from Consensus and invoked by NetworkWorker
Client as BlockImport::ImportBlock -> prepare_block_storage_changes -> runtime_api.execute_block_with_context
--------------- Enter Runtime ----------------
Executive::execute_block_with_context -> execute_extrinsics_with_book_keeping -> apply_extrinsic(each extrinsic) -> CheckedExtrinsic::apply -> dispatch
/// Import a checked and validated block. If a justification is provided in
/// `BlockImportParams` then `finalized` *must* be true.
///
/// NOTE: only use this implementation when there are NO consensus-level BlockImport
/// objects. Otherwise, importing blocks directly into the client would be bypassing
/// important verification work.
///
/// If you are not sure that there are no BlockImport objects provided by the consensus
/// algorithm, don't use this function.
async fn import_block(
&mut self,
mut import_block: BlockImportParams<Block, backend::TransactionFor<B, Block>>,
new_cache: HashMap<CacheKeyId, Vec<u8>>,
) -> Result<ImportResult, Self::Error> {
let span = tracing::span!(tracing::Level::DEBUG, "import_block");
let _enter = span.enter();
let storage_changes =
match self.prepare_block_storage_changes(&mut import_block).map_err(|e| {
warn!("Block prepare storage changes error:\n{:?}", e);
ConsensusError::ClientImport(e.to_string())
})? {
PrepareStorageChangesResult::Discard(res) => return Ok(res),
PrepareStorageChangesResult::Import(storage_changes) => storage_changes,
};
self.lock_import_and_run(|operation| {
self.apply_block(operation, import_block, new_cache, storage_changes)
})
.map_err(|e| {
warn!("Block import error:\n{:?}", e);
ConsensusError::ClientImport(e.to_string()).into()
})
}
Execute a single Extrinsic
Invoked by SimpleSlotWorker::on_slot when authoring block
sc-basic-authorship::Proposer::propose_with -> sc_block_builder::BlockBuilder::push(pending_tx_data) -> runtime_api.apply_extrinsic_with_context
--------------- Enter Runtime ----------------
Executive::apply_extrinsic -> CheckedExtrinsic::apply -> dispatch
See sc-basic-authorship::Proposer::propose_with