--- a/Cargo.lock +++ b/Cargo.lock @@ -12847,6 +12847,8 @@ "sp-rpc", "sp-runtime", "sp-state-machine", + "sp-trie", + "trie-db", "unique-runtime", "up-common", "up-data-structs", --- a/client/rpc/Cargo.toml +++ b/client/rpc/Cargo.toml @@ -16,6 +16,7 @@ jsonrpsee = { version = "0.16.2", features = ["server", "macros"] } anyhow = "1.0.57" zstd = { version = "0.11.2", default-features = false } +trie-db = { version = "0.24.0", default-features = false } sc-rpc-api = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.36" } sc-service = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.36" } @@ -27,6 +28,7 @@ sp-core = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.36" } sp-keystore = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.36" } sp-rpc = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.36" } +sp-trie = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.36" } sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.36" } pallet-evm = { default-features = false, git = "https://github.com/uniquenetwork/frontier", branch = "unique-polkadot-v0.9.36" } --- a/client/rpc/src/pov_estimate.rs +++ b/client/rpc/src/pov_estimate.rs @@ -24,6 +24,7 @@ use sc_service::{NativeExecutionDispatch, config::ExecutionStrategy}; use sp_state_machine::{StateMachine, TrieBackendBuilder}; +use trie_db::{Trie, TrieDBBuilder}; use jsonrpsee::{core::RpcResult as Result, proc_macros::rpc}; use anyhow::anyhow; @@ -47,7 +48,7 @@ use sp_runtime::traits::Header; -use up_pov_estimate_rpc::PovInfo; +use up_pov_estimate_rpc::{PovInfo, TrieKeyValue}; use crate::define_struct_for_server_api; @@ -244,10 +245,31 @@ results.push(xt_result); } + let root = proving_backend.root().clone(); + let proof = proving_backend .extract_proof() .expect("A recorder was set and thus, a storage proof can be extracted; qed"); let proof_size = proof.encoded_size(); + + let memory_db = proof.clone().into_memory_db(); + + let tree_db = + TrieDBBuilder::>>::new(&memory_db, &root).build(); + + let key_values = tree_db + .iter() + .map_err(|e| anyhow!("failed to retrieve tree db key values: {:?}", e))? + .filter_map(|item| { + let item = item.ok()?; + + Some(TrieKeyValue { + key: item.0, + value: item.1, + }) + }) + .collect(); + let compact_proof = proof .clone() .into_compact_proof::>(pre_root) @@ -263,5 +285,6 @@ compact_proof_size: compact_proof_size as u64, compressed_proof_size: compressed_proof_size as u64, results, + key_values, }) } --- a/primitives/pov-estimate-rpc/src/lib.rs +++ b/primitives/pov-estimate-rpc/src/lib.rs @@ -32,6 +32,14 @@ pub compact_proof_size: u64, pub compressed_proof_size: u64, pub results: Vec, + pub key_values: Vec, +} + +#[cfg_attr(feature = "std", derive(Serialize))] +#[derive(Debug, TypeInfo)] +pub struct TrieKeyValue { + pub key: Vec, + pub value: Vec, } sp_api::decl_runtime_apis! {