rpc: stabilize chainhead backend (#1802)

* rpc: stabilize ChainHeadBackend

* remove noise from example

* add missing features

* make tests compile

* make tests compile v2

* revert stop event

* feature-gate runtime

* Update subxt/Cargo.toml

* add docsrs feature stuff

* Update subxt/src/backend/chain_head/mod.rs

* Update subxt/src/backend/chain_head/mod.rs

* Update subxt/src/backend/chain_head/mod.rs
This commit is contained in:
Niklas Adolfsson
2024-10-03 18:14:38 +02:00
committed by GitHub
parent 7f9a1a17c0
commit 3807b29f36
22 changed files with 302 additions and 184 deletions
@@ -77,8 +77,8 @@ async fn storage_iter() {
async fn storage_child_values_same_across_backends() {
let ctx = test_context().await;
let unstable_client = ctx.unstable_client().await;
let legacy_client = ctx.legacy_client().await;
let chainhead_client = ctx.chainhead_backend().await;
let legacy_client = ctx.legacy_backend().await;
let addr = node_runtime::storage().system().account_iter();
let block_ref = legacy_client
@@ -88,7 +88,7 @@ async fn storage_child_values_same_across_backends() {
.unwrap()
.reference();
let a: Vec<_> = unstable_client
let a: Vec<_> = chainhead_client
.storage()
.at(block_ref.clone())
.iter(addr.clone())
@@ -215,9 +215,9 @@ async fn external_signing() {
}
#[cfg(fullclient)]
// TODO: Investigate and fix this test failure when using the UnstableBackend.
// TODO: Investigate and fix this test failure when using the ChainHeadBackend.
// (https://github.com/paritytech/subxt/issues/1308)
#[cfg(not(feature = "unstable-backend-client"))]
#[cfg(legacy_backend)]
#[subxt_test]
async fn submit_large_extrinsic() {
let ctx = test_context().await;
@@ -415,8 +415,8 @@ async fn partial_fee_estimate_correct() {
#[subxt_test]
async fn legacy_and_unstable_block_subscription_reconnect() {
let ctx = test_context_reconnecting_rpc_client().await;
let api = ctx.unstable_client().await;
let unstable_client_blocks = move |num: usize| {
let api = ctx.chainhead_backend().await;
let chainhead_client_blocks = move |num: usize| {
let api = api.clone();
async move {
let mut missed_blocks = false;
@@ -445,17 +445,17 @@ async fn legacy_and_unstable_block_subscription_reconnect() {
}
};
let (blocks, _) = unstable_client_blocks(3).await;
let (blocks, _) = chainhead_client_blocks(3).await;
let blocks: HashSet<String> = HashSet::from_iter(blocks.into_iter());
assert!(blocks.len() == 3);
let ctx = ctx.restart().await;
// Make client aware that connection was dropped and force them to reconnect
let _ = ctx.unstable_client().await.backend().genesis_hash().await;
// Make client aware that connection was dropped and force them to reconnect
let _ = ctx.chainhead_backend().await.backend().genesis_hash().await;
let (unstable_blocks, blocks_missed) = unstable_client_blocks(6).await;
let (unstable_blocks, blocks_missed) = chainhead_client_blocks(6).await;
if !blocks_missed {
let unstable_blocks: HashSet<String> = HashSet::from_iter(unstable_blocks.into_iter());
@@ -13,7 +13,7 @@ use assert_matches::assert_matches;
use codec::Encode;
use futures::Stream;
use subxt::{
backend::unstable::rpc_methods::{
backend::chain_head::rpc_methods::{
FollowEvent, Initialized, MethodResponse, RuntimeEvent, RuntimeVersionEvent, StorageQuery,
StorageQueryType,
},
@@ -27,7 +27,7 @@ use subxt_signer::sr25519::dev;
#[subxt_test]
async fn chainhead_v1_follow() {
let ctx = test_context().await;
let rpc = ctx.unstable_rpc_methods().await;
let rpc = ctx.chainhead_rpc_methods().await;
let legacy_rpc = ctx.legacy_rpc_methods().await;
// Check subscription with runtime updates set on false.
@@ -67,7 +67,7 @@ async fn chainhead_v1_follow() {
#[subxt_test]
async fn chainhead_v1_body() {
let ctx = test_context().await;
let rpc = ctx.unstable_rpc_methods().await;
let rpc = ctx.chainhead_rpc_methods().await;
let mut blocks = rpc.chainhead_v1_follow(false).await.unwrap();
let event = blocks.next().await.unwrap().unwrap();
@@ -95,7 +95,7 @@ async fn chainhead_v1_body() {
#[subxt_test]
async fn chainhead_v1_header() {
let ctx = test_context().await;
let rpc = ctx.unstable_rpc_methods().await;
let rpc = ctx.chainhead_rpc_methods().await;
let legacy_rpc = ctx.legacy_rpc_methods().await;
let mut blocks = rpc.chainhead_v1_follow(false).await.unwrap();
@@ -124,7 +124,7 @@ async fn chainhead_v1_header() {
async fn chainhead_v1_storage() {
let ctx = test_context().await;
let api = ctx.client();
let rpc = ctx.unstable_rpc_methods().await;
let rpc = ctx.chainhead_rpc_methods().await;
let mut blocks = rpc.chainhead_v1_follow(false).await.unwrap();
let event = blocks.next().await.unwrap().unwrap();
@@ -169,7 +169,7 @@ async fn chainhead_v1_storage() {
#[subxt_test]
async fn chainhead_v1_call() {
let ctx = test_context().await;
let rpc = ctx.unstable_rpc_methods().await;
let rpc = ctx.chainhead_rpc_methods().await;
let mut blocks = rpc.chainhead_v1_follow(true).await.unwrap();
let event = blocks.next().await.unwrap().unwrap();
@@ -206,7 +206,7 @@ async fn chainhead_v1_call() {
#[subxt_test]
async fn chainhead_v1_unpin() {
let ctx = test_context().await;
let rpc = ctx.unstable_rpc_methods().await;
let rpc = ctx.chainhead_rpc_methods().await;
let mut blocks = rpc.chainhead_v1_follow(true).await.unwrap();
let event = blocks.next().await.unwrap().unwrap();
@@ -226,7 +226,7 @@ async fn chainhead_v1_unpin() {
async fn chainspec_v1_genesishash() {
let ctx = test_context().await;
let old_rpc = ctx.legacy_rpc_methods().await;
let rpc = ctx.unstable_rpc_methods().await;
let rpc = ctx.chainhead_rpc_methods().await;
let a = old_rpc.genesis_hash().await.unwrap();
let b = rpc.chainspec_v1_genesis_hash().await.unwrap();
@@ -239,7 +239,7 @@ async fn chainspec_v1_genesishash() {
async fn chainspec_v1_chainname() {
let ctx = test_context().await;
let old_rpc = ctx.legacy_rpc_methods().await;
let rpc = ctx.unstable_rpc_methods().await;
let rpc = ctx.chainhead_rpc_methods().await;
let a = old_rpc.system_chain().await.unwrap();
let b = rpc.chainspec_v1_chain_name().await.unwrap();
@@ -252,7 +252,7 @@ async fn chainspec_v1_chainname() {
async fn chainspec_v1_properties() {
let ctx = test_context().await;
let old_rpc = ctx.legacy_rpc_methods().await;
let rpc = ctx.unstable_rpc_methods().await;
let rpc = ctx.chainhead_rpc_methods().await;
let a = old_rpc.system_properties().await.unwrap();
let b = rpc.chainspec_v1_properties().await.unwrap();
@@ -264,7 +264,7 @@ async fn chainspec_v1_properties() {
#[subxt_test]
async fn transactionwatch_v1_submit_and_watch() {
let ctx = test_context().await;
let rpc = ctx.unstable_rpc_methods().await;
let rpc = ctx.chainhead_rpc_methods().await;
// Build and sign some random tx, just to get some appropriate bytes:
let payload = node_runtime::tx().system().remark(b"hello".to_vec());
@@ -327,7 +327,7 @@ async fn transaction_v1_broadcast() {
let ctx = test_context().await;
let api = ctx.client();
let rpc = ctx.unstable_rpc_methods().await;
let rpc = ctx.chainhead_rpc_methods().await;
let tx_payload = node_runtime::tx()
.balances()
@@ -391,7 +391,7 @@ async fn transaction_v1_stop() {
let bob_address: MultiAddress<AccountId32, u32> = bob.public_key().into();
let ctx = test_context().await;
let rpc = ctx.unstable_rpc_methods().await;
let rpc = ctx.chainhead_rpc_methods().await;
// Cannot stop an operation that was not started.
let _err = rpc