5a184fd7dc
## Changes ### High Impact Fixes (RED) - Fix radium git URL (https://https:// → github.com/paritytech/radium-0.7-fork) - Fix rustc-rv32e-toolchain URL (nickvidal → paritytech) - Fix chainextension-registry URL (nickvidal/substrate-contracts-node → paritytech/chainextension-registry) ### Medium Impact Fixes (YELLOW) - Fix docs.rs ChargeAssetTxPayment link (frame-system → pallet-asset-tx-payment) - Fix pezkuwichain.github.io → paritytech.github.io for: - json-rpc-interface-spec - substrate docs - try-runtime-cli - Fix subxt issue reference (pezkuwichain → paritytech) ### Zero Impact Excludes (GREEN) - Add 40+ defunct chain websites to lychee exclude list - Add commit-specific GitHub URLs to exclude (cannot migrate) - Add rate-limited/403 sites to exclude ### Documentation - Refactor .claude/domains_repositories.md structure - Add tracking issue mapping and creation scripts - Update external repo links to use original URLs Result: 🔍 9610 Total ✅ 6747 OK 🚫 0 Errors
89 lines
4.9 KiB
Rust
89 lines
4.9 KiB
Rust
//! # Enable storage weight reclaiming
|
|
//!
|
|
//! This guide will teach you how to enable storage weight reclaiming for a teyrchain. The
|
|
//! explanations in this guide assume a project structure similar to the one detailed in
|
|
//! the [bizinikiwi documentation](crate::pezkuwi_sdk::bizinikiwi#anatomy-of-a-binary-crate). Full
|
|
//! technical details are available in the original [pull request](https://github.com/pezkuwichain/pezkuwi-sdk/issues/257).
|
|
//!
|
|
//! # What is PoV reclaim?
|
|
//! When a teyrchain submits a block to a relay chain like Pezkuwi or Kusama, it sends the block
|
|
//! itself and a storage proof. Together they form the Proof-of-Validity (PoV). The PoV allows the
|
|
//! relay chain to validate the teyrchain block by re-executing it. Relay chain
|
|
//! validators distribute this PoV among themselves over the network. This distribution is costly
|
|
//! and limits the size of the storage proof. The storage weight dimension of FRAME weights reflects
|
|
//! this cost and limits the size of the storage proof. However, the storage weight determined
|
|
//! during [benchmarking](crate::reference_docs::pezframe_benchmarking_weight) represents the worst
|
|
//! case. In reality, runtime operations often consume less space in the storage proof. PoV reclaim
|
|
//! offers a mechanism to reclaim the difference between the benchmarked worst-case and the real
|
|
//! proof-size consumption.
|
|
//!
|
|
//!
|
|
//! # How to enable PoV reclaim
|
|
//! ## 1. Add the host function to your node
|
|
//!
|
|
//! To reclaim excess storage weight, a teyrchain runtime needs the
|
|
//! ability to fetch the size of the storage proof from the node. The reclaim
|
|
//! mechanism uses the
|
|
//! [`storage_proof_size`](pezcumulus_primitives_proof_size_hostfunction::storage_proof_size)
|
|
//! host function for this purpose. For convenience, pezcumulus provides
|
|
//! [`TeyrchainHostFunctions`](pezcumulus_client_service::TeyrchainHostFunctions), a set of
|
|
//! host functions typically used by pezcumulus-based teyrchains. In the binary crate of your
|
|
//! teyrchain, find the instantiation of the [`WasmExecutor`](pezsc_executor::WasmExecutor) and set
|
|
//! the correct generic type.
|
|
//!
|
|
//! This example from the teyrchain-template shows a type definition that includes the correct
|
|
//! host functions.
|
|
#![doc = docify::embed!("../../templates/teyrchain/node/src/service.rs", wasm_executor)]
|
|
//!
|
|
//! > **Note:**
|
|
//! >
|
|
//! > If you see error `runtime requires function imports which are not present on the host:
|
|
//! > 'env:ext_storage_proof_size_storage_proof_size_version_1'`, it is likely
|
|
//! > that this step in the guide was not set up correctly.
|
|
//!
|
|
//! ## 2. Enable storage proof recording during import
|
|
//!
|
|
//! The reclaim mechanism reads the size of the currently recorded storage proof multiple times
|
|
//! during block authoring and block import. Proof recording during authoring is already enabled on
|
|
//! teyrchains. You must also ensure that storage proof recording is enabled during block import.
|
|
//! Find where your node builds the fundamental bizinikiwi components by calling
|
|
//! [`new_full_parts`](pezsc_service::new_full_parts). Replace this
|
|
//! with [`new_full_parts_record_import`](pezsc_service::new_full_parts_record_import) and
|
|
//! pass `true` as the last parameter to enable import recording.
|
|
#![doc = docify::embed!("../../templates/teyrchain/node/src/service.rs", component_instantiation)]
|
|
//!
|
|
//! > **Note:**
|
|
//! >
|
|
//! > If you see error `Storage root must match that calculated.` during block import, it is likely
|
|
//! > that this step in the guide was not
|
|
//! > set up correctly.
|
|
//!
|
|
//! ## 3. Add the TransactionExtension to your runtime
|
|
//!
|
|
//! In your runtime, you will find a list of TransactionExtensions.
|
|
//! To enable the reclaiming,
|
|
//! set [`StorageWeightReclaim`](pezcumulus_pezpallet_weight_reclaim::StorageWeightReclaim)
|
|
//! as a warpper of that list.
|
|
//! It is necessary that this extension wraps all the other transaction extensions in order to catch
|
|
//! the whole PoV size of the transactions.
|
|
//! The extension will check the size of the storage proof before and after an extrinsic execution.
|
|
//! It reclaims the difference between the calculated size and the benchmarked size.
|
|
#![doc = docify::embed!("../../templates/teyrchain/runtime/src/lib.rs", template_signed_extra)]
|
|
//!
|
|
//! ## Optional: Verify that reclaim works
|
|
//!
|
|
//! Start your node with the log target `runtime::storage_reclaim` set to `trace` to enable full
|
|
//! logging for `StorageWeightReclaim`. The following log is an example from a local testnet. To
|
|
//! trigger the log, execute any extrinsic on the network.
|
|
//!
|
|
//! ```ignore
|
|
//! ...
|
|
//! 2024-04-22 17:31:48.014 TRACE runtime::storage_reclaim: [ferdie] Reclaiming storage weight. benchmarked: 3593, consumed: 265 unspent: 0
|
|
//! ...
|
|
//! ```
|
|
//!
|
|
//! In the above example we see a benchmarked size of 3593 bytes, while the extrinsic only consumed
|
|
//! 265 bytes of proof size. This results in 3328 bytes of reclaim.
|
|
#![deny(rustdoc::broken_intra_doc_links)]
|
|
#![deny(rustdoc::private_intra_doc_links)]
|