-
Notifications
You must be signed in to change notification settings - Fork 248
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
lightclient: Add support for multi-chain usecase #1238
Conversation
Signed-off-by: Alexandru Vasile <[email protected]>
Signed-off-by: Alexandru Vasile <[email protected]>
Signed-off-by: Alexandru Vasile <[email protected]>
Signed-off-by: Alexandru Vasile <[email protected]>
Signed-off-by: Alexandru Vasile <[email protected]>
interface Signed-off-by: Alexandru Vasile <[email protected]>
Signed-off-by: Alexandru Vasile <[email protected]>
Signed-off-by: Alexandru Vasile <[email protected]>
Signed-off-by: Alexandru Vasile <[email protected]>
Signed-off-by: Alexandru Vasile <[email protected]>
Signed-off-by: Alexandru Vasile <[email protected]>
Signed-off-by: Alexandru Vasile <[email protected]>
Signed-off-by: Alexandru Vasile <[email protected]>
Signed-off-by: Alexandru Vasile <[email protected]>
Signed-off-by: Alexandru Vasile <[email protected]>
Signed-off-by: Alexandru Vasile <[email protected]>
Signed-off-by: Alexandru Vasile <[email protected]>
Signed-off-by: Alexandru Vasile <[email protected]>
Signed-off-by: Alexandru Vasile <[email protected]>
Signed-off-by: Alexandru Vasile <[email protected]>
Signed-off-by: Alexandru Vasile <[email protected]>
Signed-off-by: Alexandru Vasile <[email protected]>
Signed-off-by: Alexandru Vasile <[email protected]>
…multi-chain Signed-off-by: Alexandru Vasile <[email protected]>
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I wonder if it's possible to obtain a more condensed version of this file; there's one here for polkadot which is much smaller:
It'd be great to know how to programmatically get hold of the smallest ones possible!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I have created this issue that I ll tackle shortly 👍
println!("Added AssetHub parachain"); | ||
|
||
// Step 4. Turn the smoldot client into a subxt light client using the builder. | ||
let polkadot_api = builder |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
As a nit, I think I'd find the example a little easier to follow if all of the builder stuff was in one place, like:
let polkadot_api = builder
.add_chain(polkadot_chain_id, polkadot_json_rpc_responses)
.add_chain(parachain_chain_id, parachain_json_rpc_responses)
.build(client, polkadot_chain_id)
.await?;
I guess that client
is used to make requests, but we also need to hold onto those json_rpc_responses
for each chain, but looking at this I do wonder if it's possible to do any better here, eg avoid those .add_chain
steps because that information can be extracted from the client
on the .build
step or something (I guess I'll know better when I read the rest of the PR :D)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Client
can be indexed on a chain Id for instance to get some stuff (I didn't check what); I wonder if that helps at all:
https://docs.rs/smoldot-light/latest/src/smoldot_light/lib.rs.html#1097
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I believe regarding the json_rpc_responses object, if the user drops this object, than the backend might not provide any responses:
pub struct JsonRpcResponses {
/// Receiving side for responses.
///
/// As long as this object is alive, the JSON-RPC service will continue running. In order
/// to prevent that from happening, we destroy it as soon as the
/// [`JsonRpcResponses::public_api_chain_destroyed`] is notified of the destruction of
/// the sender.
inner: Option<json_rpc_service::Frontend>,
/// Notified when the [`PublicApiChain`] is destroyed.
public_api_chain_destroyed: pin::Pin<Box<event_listener::EventListener>>,
}
Extracted from smolodot.
Wrt https://docs.rs/smoldot-light/latest/src/smoldot_light/lib.rs.html#1097, I believe that returns the user data that we provided as ()
for default purposes. I couldn't dig anything that's related to the frontend channel that gets responses back
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nice and great to have this for sure
as I said in the review, this API is low-level and would be nice with
some high-level API because one would need understand some configurations
from smoldot to use it.
lightclient/src/client.rs
Outdated
/// | ||
/// ### Native | ||
/// | ||
/// Panics when called outside of `tokio` runtime context for native context. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I wonder if there's any sensible way to hide tokio, so that users don't need to care, and we can potentially remove it as a dependency in the future. Possibly not though; nothing comes to mind offhand!
self | ||
} | ||
|
||
/// Construct a [`RawLightClient`] from a raw smoldot instance. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Just to check, is this a smoldot
instance or specifically just a smoldot_lightclient::Client
instance?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The subxt_lightclient::Client
in this case is a re-export of smoldot_light::Client
. Will modify the docs to say client
instead of instance here and everywhere else, thanks!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
See my other comment re renaming exports a bit (#1238 (comment)) :)
Co-authored-by: James Wilson <[email protected]>
Signed-off-by: Alexandru Vasile <[email protected]>
Signed-off-by: Alexandru Vasile <[email protected]>
lightclient/src/lib.rs
Outdated
pub use smoldot_light::{ | ||
platform::PlatformRef, AddChainConfig, AddChainConfigJsonRpc, ChainId, Client, JsonRpcResponses, | ||
}; | ||
|
||
#[cfg(feature = "native")] | ||
pub use smoldot_light::platform::default::DefaultPlatform; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm generally thinking if it's better to expose all of the smoldot
things behind it's own name; when reading the PR I wasn't sure which of the types actually came from smoldot
and which were our own.
I think the ideal place to be here is:
subxt_lightclient
doesn't need to ever be explicitly depended on; it's just internal logic that Subxt leans on and re-exports as needed.- It's easy to tell which types are from
smoldot_lightclient
and which types are from our crates (this way, it's super obvious in the example for instance that the RawLightClientBuilder is takingsmoldot
args for instance).
So maybe here we could expose all of the smoldot stuff via a subxt_lightclient::smoldot::...
and perhaps in subxt we expose our own types in subxt::client::light_client
, and maybe the smoldot types via either subxt::ext::smoldot
(or smoldot_light
.. not sure which makes more sense) or maybe subxt::client::light_client::smoldot
(or smoldot_light
) if we prefer to export specific types only and want to namespace them into the light client stuff.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yep that makes sense to have different exports.
I modified the exports as:
- subxt_lightclient::smoldot { .. } where smoldot and smoldot_light objects are exported
- then I exported this in subxt::client::light_client::smoldot
subxt/src/client/light_client/mod.rs
Outdated
|
||
/// Returns the chain ID of the current light-client. | ||
pub fn chain_id(&self) -> subxt_lightclient::ChainId { | ||
self.raw_rpc.chain_id() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Does it make more sense now to save just the actual chain_id
in LightClient
instead of the raw_rpc
thing now?
Signed-off-by: Alexandru Vasile <[email protected]>
/// The panic behaviour depends on the feature flag being used: | ||
/// | ||
/// ### Native | ||
/// | ||
/// Panics when called outside of a `tokio` runtime context. | ||
/// |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Same comment as others :)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Think this should be updated now 🤔 Might be a github race somewhere
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This looks great! Nice clean code :)
I left some comments, mostly small and one regarding jigging some exports around a bit but happy to approve and let you merge when you're happy with everything!
Signed-off-by: Alexandru Vasile <[email protected]>
Signed-off-by: Alexandru Vasile <[email protected]>
Signed-off-by: Alexandru Vasile <[email protected]>
EDIT: nvm, the request ID will just be incremented for every request so the same request ID shouldn't be used anyway. |
Signed-off-by: Alexandru Vasile <[email protected]>
* lightclient: Make `smoldot::chainID` part of the RPC requests Signed-off-by: Alexandru Vasile <[email protected]> * lightclient: Make `BackgroundTask` generic over `PlatformRef` and chain Signed-off-by: Alexandru Vasile <[email protected]> * lightclient: Construct from raw smoldot and target different chains Signed-off-by: Alexandru Vasile <[email protected]> * testing: Update cargo lock for wasm tests Signed-off-by: Alexandru Vasile <[email protected]> * lightclient: Reuse `new_from_client` method and removed unused imports Signed-off-by: Alexandru Vasile <[email protected]> * lightclient: Reexport smoldot client and RPC objects used in pub interface Signed-off-by: Alexandru Vasile <[email protected]> * lightclient: Adjust `new_from_client` interface Signed-off-by: Alexandru Vasile <[email protected]> * lightclient: Extend background to poll over multiple RPC objects Signed-off-by: Alexandru Vasile <[email protected]> * subxt: Build light client from raw and target different chains Signed-off-by: Alexandru Vasile <[email protected]> * artifacts: Add demo chain specs Signed-off-by: Alexandru Vasile <[email protected]> * artifacts: Move artifacts to dedicated folder Signed-off-by: Alexandru Vasile <[email protected]> * lightclient: Use SelectAll to drive all streams Signed-off-by: Alexandru Vasile <[email protected]> * lightclient: Fetch initial data from the target chain Signed-off-by: Alexandru Vasile <[email protected]> * lightclient: Reexport other smoldot objects Signed-off-by: Alexandru Vasile <[email protected]> * subxt: Target chain with potentially different config Signed-off-by: Alexandru Vasile <[email protected]> * subxt/rpc: Log chainID for debugging Signed-off-by: Alexandru Vasile <[email protected]> * subxt/examples: Add smoldot client with parachain example Signed-off-by: Alexandru Vasile <[email protected]> * lightclient: Propagate chain ID together with rpc responses object Signed-off-by: Alexandru Vasile <[email protected]> * lightclient: Multiplex responses by request ID and chain ID Signed-off-by: Alexandru Vasile <[email protected]> * subxt: Add raw light client builder Signed-off-by: Alexandru Vasile <[email protected]> * subxt: Add cargo feature flag for parachains example Signed-off-by: Alexandru Vasile <[email protected]> * lightclient: Derive default for internal structure Signed-off-by: Alexandru Vasile <[email protected]> * lightclient: Guard reexports by std feature flag Signed-off-by: Alexandru Vasile <[email protected]> * Update subxt/src/client/light_client/mod.rs Co-authored-by: James Wilson <[email protected]> * lightclient: Update the builder pattern and chain targetting Signed-off-by: Alexandru Vasile <[email protected]> * lightclient: Fix documentation Signed-off-by: Alexandru Vasile <[email protected]> * Provide more insightful docs wrt native/wasm panics Signed-off-by: Alexandru Vasile <[email protected]> * examples: Adjust comment location Signed-off-by: Alexandru Vasile <[email protected]> * lightclient: Refactor UniqueChainId into the background task Signed-off-by: Alexandru Vasile <[email protected]> * Update lightclient/src/background.rs Co-authored-by: Niklas Adolfsson <[email protected]> * Update subxt/src/client/light_client/builder.rs Co-authored-by: James Wilson <[email protected]> * lightclient: Update docs wrt panics Signed-off-by: Alexandru Vasile <[email protected]> * subxt: Update docs wrt to smoldot instance -> client Signed-off-by: Alexandru Vasile <[email protected]> * lightclient: Use IntoIter instead of Iterator Signed-off-by: Alexandru Vasile <[email protected]> * subxt: Adjsut docs wrt [`Self::new_from_client`] Signed-off-by: Alexandru Vasile <[email protected]> * subxt: Remove RawRpc from LightClient in favor of chainID Signed-off-by: Alexandru Vasile <[email protected]> * lightclient: Reexport everything under smoldot module Signed-off-by: Alexandru Vasile <[email protected]> * artifacts: Use stateRootHash instead of genesis.raw Signed-off-by: Alexandru Vasile <[email protected]> --------- Signed-off-by: Alexandru Vasile <[email protected]> Co-authored-by: James Wilson <[email protected]> Co-authored-by: Niklas Adolfsson <[email protected]>
…ale-typegen integration (#1290) * restructure cli commands * config: Add `SkipCheckIfFeeless` signed extension (#1264) * config: Add `SkipCheckIfFeeless` signed extension Signed-off-by: Alexandru Vasile <[email protected]> * config: Add extra extension to the default params Signed-off-by: Alexandru Vasile <[email protected]> * examples: Adjust signed extension example Signed-off-by: Alexandru Vasile <[email protected]> * config: Extend SkipCheckIfFeeless with inner signed extension Signed-off-by: Alexandru Vasile <[email protected]> * config: Configure SkipCheck with inner signed extension params Signed-off-by: Alexandru Vasile <[email protected]> * config: Implement Deafult for SkipCheckIfFeelessParams with Option Signed-off-by: Alexandru Vasile <[email protected]> * examples: Fix example with proper extension Signed-off-by: Alexandru Vasile <[email protected]> * config: Extend <T as Config>::AssetId with EncodeAsType and Clone Signed-off-by: Alexandru Vasile <[email protected]> * config: Add SkipCheck with AssetTx Signed-off-by: Alexandru Vasile <[email protected]> * config: Encode as type from metadata the inner signed extensions Signed-off-by: Alexandru Vasile <[email protected]> * Adjust examples Signed-off-by: Alexandru Vasile <[email protected]> * blocks: Use `SkipCheckIfFeeless` for decoding the tip of extensions Signed-off-by: Alexandru Vasile <[email protected]> * config: Decode `SkipCheckIfFeeless` with `Self` Signed-off-by: Alexandru Vasile <[email protected]> * tests: Adjust testing Signed-off-by: Alexandru Vasile <[email protected]> * config: Descriptive errors for building `SkipCheckIfFeeless` Signed-off-by: Alexandru Vasile <[email protected]> * config: Add docs for extra error types Signed-off-by: Alexandru Vasile <[email protected]> * subxt: Add extra derives to signed extensions Signed-off-by: Alexandru Vasile <[email protected]> * config: Use `Default::default` to simplify type init Signed-off-by: Alexandru Vasile <[email protected]> --------- Signed-off-by: Alexandru Vasile <[email protected]> * subxt: Replace removed lint (#1270) Signed-off-by: Alexandru Vasile <[email protected]> * lightclient: Add support for multi-chain usecase (#1238) * lightclient: Make `smoldot::chainID` part of the RPC requests Signed-off-by: Alexandru Vasile <[email protected]> * lightclient: Make `BackgroundTask` generic over `PlatformRef` and chain Signed-off-by: Alexandru Vasile <[email protected]> * lightclient: Construct from raw smoldot and target different chains Signed-off-by: Alexandru Vasile <[email protected]> * testing: Update cargo lock for wasm tests Signed-off-by: Alexandru Vasile <[email protected]> * lightclient: Reuse `new_from_client` method and removed unused imports Signed-off-by: Alexandru Vasile <[email protected]> * lightclient: Reexport smoldot client and RPC objects used in pub interface Signed-off-by: Alexandru Vasile <[email protected]> * lightclient: Adjust `new_from_client` interface Signed-off-by: Alexandru Vasile <[email protected]> * lightclient: Extend background to poll over multiple RPC objects Signed-off-by: Alexandru Vasile <[email protected]> * subxt: Build light client from raw and target different chains Signed-off-by: Alexandru Vasile <[email protected]> * artifacts: Add demo chain specs Signed-off-by: Alexandru Vasile <[email protected]> * artifacts: Move artifacts to dedicated folder Signed-off-by: Alexandru Vasile <[email protected]> * lightclient: Use SelectAll to drive all streams Signed-off-by: Alexandru Vasile <[email protected]> * lightclient: Fetch initial data from the target chain Signed-off-by: Alexandru Vasile <[email protected]> * lightclient: Reexport other smoldot objects Signed-off-by: Alexandru Vasile <[email protected]> * subxt: Target chain with potentially different config Signed-off-by: Alexandru Vasile <[email protected]> * subxt/rpc: Log chainID for debugging Signed-off-by: Alexandru Vasile <[email protected]> * subxt/examples: Add smoldot client with parachain example Signed-off-by: Alexandru Vasile <[email protected]> * lightclient: Propagate chain ID together with rpc responses object Signed-off-by: Alexandru Vasile <[email protected]> * lightclient: Multiplex responses by request ID and chain ID Signed-off-by: Alexandru Vasile <[email protected]> * subxt: Add raw light client builder Signed-off-by: Alexandru Vasile <[email protected]> * subxt: Add cargo feature flag for parachains example Signed-off-by: Alexandru Vasile <[email protected]> * lightclient: Derive default for internal structure Signed-off-by: Alexandru Vasile <[email protected]> * lightclient: Guard reexports by std feature flag Signed-off-by: Alexandru Vasile <[email protected]> * Update subxt/src/client/light_client/mod.rs Co-authored-by: James Wilson <[email protected]> * lightclient: Update the builder pattern and chain targetting Signed-off-by: Alexandru Vasile <[email protected]> * lightclient: Fix documentation Signed-off-by: Alexandru Vasile <[email protected]> * Provide more insightful docs wrt native/wasm panics Signed-off-by: Alexandru Vasile <[email protected]> * examples: Adjust comment location Signed-off-by: Alexandru Vasile <[email protected]> * lightclient: Refactor UniqueChainId into the background task Signed-off-by: Alexandru Vasile <[email protected]> * Update lightclient/src/background.rs Co-authored-by: Niklas Adolfsson <[email protected]> * Update subxt/src/client/light_client/builder.rs Co-authored-by: James Wilson <[email protected]> * lightclient: Update docs wrt panics Signed-off-by: Alexandru Vasile <[email protected]> * subxt: Update docs wrt to smoldot instance -> client Signed-off-by: Alexandru Vasile <[email protected]> * lightclient: Use IntoIter instead of Iterator Signed-off-by: Alexandru Vasile <[email protected]> * subxt: Adjsut docs wrt [`Self::new_from_client`] Signed-off-by: Alexandru Vasile <[email protected]> * subxt: Remove RawRpc from LightClient in favor of chainID Signed-off-by: Alexandru Vasile <[email protected]> * lightclient: Reexport everything under smoldot module Signed-off-by: Alexandru Vasile <[email protected]> * artifacts: Use stateRootHash instead of genesis.raw Signed-off-by: Alexandru Vasile <[email protected]> --------- Signed-off-by: Alexandru Vasile <[email protected]> Co-authored-by: James Wilson <[email protected]> Co-authored-by: Niklas Adolfsson <[email protected]> * Bump futures from 0.3.28 to 0.3.29 (#1272) Bumps [futures](https://github.com/rust-lang/futures-rs) from 0.3.28 to 0.3.29. - [Release notes](https://github.com/rust-lang/futures-rs/releases) - [Changelog](https://github.com/rust-lang/futures-rs/blob/master/CHANGELOG.md) - [Commits](rust-lang/futures-rs@0.3.28...0.3.29) --- updated-dependencies: - dependency-name: futures dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump zeroize from 1.6.0 to 1.7.0 (#1274) Bumps [zeroize](https://github.com/RustCrypto/utils) from 1.6.0 to 1.7.0. - [Commits](https://github.com/RustCrypto/utils/commits) --- updated-dependencies: - dependency-name: zeroize dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump tracing-subscriber from 0.3.17 to 0.3.18 (#1275) Bumps [tracing-subscriber](https://github.com/tokio-rs/tracing) from 0.3.17 to 0.3.18. - [Release notes](https://github.com/tokio-rs/tracing/releases) - [Commits](tokio-rs/tracing@tracing-subscriber-0.3.17...tracing-subscriber-0.3.18) --- updated-dependencies: - dependency-name: tracing-subscriber dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump tracing-subscriber from 0.3.17 to 0.3.18 (#1275) Bumps [tracing-subscriber](https://github.com/tokio-rs/tracing) from 0.3.17 to 0.3.18. - [Release notes](https://github.com/tokio-rs/tracing/releases) - [Commits](tokio-rs/tracing@tracing-subscriber-0.3.17...tracing-subscriber-0.3.18) --- updated-dependencies: - dependency-name: tracing-subscriber dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump getrandom from 0.2.10 to 0.2.11 (#1273) Bumps [getrandom](https://github.com/rust-random/getrandom) from 0.2.10 to 0.2.11. - [Changelog](https://github.com/rust-random/getrandom/blob/master/CHANGELOG.md) - [Commits](rust-random/getrandom@v0.2.10...v0.2.11) --- updated-dependencies: - dependency-name: getrandom dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * impl RpcClientT for Arc<T> and Box<T> (#1277) * impl RpcClientT for Arc<WsClient> * fix grumbles: impl for Box<T> and Arc<T> * grumbles: move RpcClientT impls * first iteration of using scale_typegen * introduce indoc for formatting * calls, constants and home are cleaner now * added event subcommand * show runtime apis working * add better code formatting * fix style * adjust tests, use owo_colorize to not add extra dependency * fmt * adjust docs * move scale-typegen-description dependency to workspace * improve `substrate-compat` (#1265) * improve `substrate-compat` * From => Into --------- Co-authored-by: James Wilson <[email protected]> * Bump proc-macro2 from 1.0.69 to 1.0.70 (#1292) Bumps [proc-macro2](https://github.com/dtolnay/proc-macro2) from 1.0.69 to 1.0.70. - [Release notes](https://github.com/dtolnay/proc-macro2/releases) - [Commits](dtolnay/proc-macro2@1.0.69...1.0.70) --- updated-dependencies: - dependency-name: proc-macro2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump serde from 1.0.192 to 1.0.193 (#1291) Bumps [serde](https://github.com/serde-rs/serde) from 1.0.192 to 1.0.193. - [Release notes](https://github.com/serde-rs/serde/releases) - [Commits](serde-rs/serde@v1.0.192...v1.0.193) --- updated-dependencies: - dependency-name: serde dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * lightclient: Fix wasm socket closure called after being dropped (#1289) * lightclient: Close wasm socket while dropping from connecting state Signed-off-by: Alexandru Vasile <[email protected]> * lightclient: Construct one time only closures Signed-off-by: Alexandru Vasile <[email protected]> * testing: Enable console logs for lightclient WASM testing Signed-off-by: Alexandru Vasile <[email protected]> * lightclient: Separate wakes and check connectivity on poll_read Signed-off-by: Alexandru Vasile <[email protected]> * lightclient: Close the socket depending on internal state Signed-off-by: Alexandru Vasile <[email protected]> * Revert "lightclient: Separate wakes and check connectivity on poll_read" This reverts commit 8660940. * lightclient: Return pending if socket is opening from poll_read Signed-off-by: Alexandru Vasile <[email protected]> * lightclient: Close the socket on `poll_close` Signed-off-by: Alexandru Vasile <[email protected]> * lightclient: Reset closures on Drop to avoid recursive invokation Signed-off-by: Alexandru Vasile <[email protected]> * lightclient: Close the socket if not already closing Signed-off-by: Alexandru Vasile <[email protected]> --------- Signed-off-by: Alexandru Vasile <[email protected]> * workflows: Install rustup component for building substrate (#1295) Signed-off-by: Alexandru Vasile <[email protected]> * cli: Command to fetch chainSpec and optimise its size (#1278) * cli: Add chainSpec command Signed-off-by: Alexandru Vasile <[email protected]> * cli/chainSpec: Move to dedicated module Signed-off-by: Alexandru Vasile <[email protected]> * cli: Compute the state root hash Signed-off-by: Alexandru Vasile <[email protected]> * cli: Remove code substitutes Signed-off-by: Alexandru Vasile <[email protected]> * artifacts: Update polkadot.json Signed-off-by: Alexandru Vasile <[email protected]> * scripts: Generate the chain spec Signed-off-by: Alexandru Vasile <[email protected]> * cli: Remove testing artifacts Signed-off-by: Alexandru Vasile <[email protected]> * cli: Fix clippy Signed-off-by: Alexandru Vasile <[email protected]> * cli: Apply rustfmt Signed-off-by: Alexandru Vasile <[email protected]> * cli: Introduce feature flag for smoldot dependency Signed-off-by: Alexandru Vasile <[email protected]> * cli: Rename chain-spec to chain-spec-pruning Signed-off-by: Alexandru Vasile <[email protected]> * scripts: Update chain-spec command Signed-off-by: Alexandru Vasile <[email protected]> --------- Signed-off-by: Alexandru Vasile <[email protected]> * update to new scale-typegen interfaces * use released version of scale-typegen * Merge branch 'master' into tadeohepperle/cli-support-runtime-apis * remove unused debug file * resolve merge errors * adjustments * constants file adjustment * method renaming * fix issue with encoding runtime api params * Add logging to submit_transaction and unstable driver, and ensure unpin evs complete * panic if None returned from subscription too, also with stats * change panic to Err just to be on the safe side * clippy * make long tests run only after clippy + fmt pass * megre in light client test change pr * chore(subxt/src): typo fix (#1370) * rpcmethods * followstr * mod and else * Weekly Cronjob fetching artifacts and generating polkadot.rs file. (#1352) * github CI action cronjob * add commit message * fix the CI yml files * binary crate for CI script with substrate-runner * update the CI script * correct the artifacts script * remove bash script * lightclient(fix): Ensure lightclient chainSpec is at least one block old (#1372) * testing(fix): Ensure lightclient chainSpec is at least one block old Signed-off-by: Alexandru Vasile <[email protected]> * Revert "testing(fix): Ensure lightclient chainSpec is at least one block old" This reverts commit 0eafcb2. * lightclient(fix): Ensure lightclient chainSpec is at least one block old Signed-off-by: Alexandru Vasile <[email protected]> * lightclient: Link smoldot issue Signed-off-by: Alexandru Vasile <[email protected]> * subxt: Use tokio under lightclient feature flag Signed-off-by: Alexandru Vasile <[email protected]> * lightclient: Do not sleep on errors to fetch the chainSpec Signed-off-by: Alexandru Vasile <[email protected]> * artifacts: Remove test file Signed-off-by: Alexandru Vasile <[email protected]> * lightclient: Subscribe to two finalized blocks Signed-off-by: Alexandru Vasile <[email protected]> * subxt: Revert cargo toml Signed-off-by: Alexandru Vasile <[email protected]> --------- Signed-off-by: Alexandru Vasile <[email protected]> * ci: Reduce the light client timeout to 15 minutes (#1373) * ci: Reduce the light client timpeut to 15 seconds Signed-off-by: Alexandru Vasile <[email protected]> * ci: Use ubuntu-latest for light-client tests Signed-off-by: Alexandru Vasile <[email protected]> --------- Signed-off-by: Alexandru Vasile <[email protected]> * actually only wait for machete+fmt, clippy can be much slower * update CI file from Alex PR * resolve clippy err * Try a few RPC nodes in case one of them is not working * fix submit_transaction debug logging of message * Improve Signed Extension and Block Decoding Examples/Book (#1357) * asset hub example and book adjustment * formatting * recursive derives * polkadot monitor example and book adjustments * formatting * adjust docs and examples, add dynamic example * james suggestions * fmt * chore(subxt/src): typo fix (#1370) * rpcmethods * followstr * mod and else * Weekly Cronjob fetching artifacts and generating polkadot.rs file. (#1352) * github CI action cronjob * add commit message * fix the CI yml files * binary crate for CI script with substrate-runner * update the CI script * correct the artifacts script * remove bash script --------- Co-authored-by: James Wilson <[email protected]> Co-authored-by: Pan chao <[email protected]> * fix formatting of returned sections * make storage use execute flag as well --------- Signed-off-by: Alexandru Vasile <[email protected]> Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: Alexandru Vasile <[email protected]> Co-authored-by: James Wilson <[email protected]> Co-authored-by: Niklas Adolfsson <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: yjh <[email protected]> Co-authored-by: Pan chao <[email protected]>
* restructure cli commands * config: Add `SkipCheckIfFeeless` signed extension (#1264) * config: Add `SkipCheckIfFeeless` signed extension Signed-off-by: Alexandru Vasile <[email protected]> * config: Add extra extension to the default params Signed-off-by: Alexandru Vasile <[email protected]> * examples: Adjust signed extension example Signed-off-by: Alexandru Vasile <[email protected]> * config: Extend SkipCheckIfFeeless with inner signed extension Signed-off-by: Alexandru Vasile <[email protected]> * config: Configure SkipCheck with inner signed extension params Signed-off-by: Alexandru Vasile <[email protected]> * config: Implement Deafult for SkipCheckIfFeelessParams with Option Signed-off-by: Alexandru Vasile <[email protected]> * examples: Fix example with proper extension Signed-off-by: Alexandru Vasile <[email protected]> * config: Extend <T as Config>::AssetId with EncodeAsType and Clone Signed-off-by: Alexandru Vasile <[email protected]> * config: Add SkipCheck with AssetTx Signed-off-by: Alexandru Vasile <[email protected]> * config: Encode as type from metadata the inner signed extensions Signed-off-by: Alexandru Vasile <[email protected]> * Adjust examples Signed-off-by: Alexandru Vasile <[email protected]> * blocks: Use `SkipCheckIfFeeless` for decoding the tip of extensions Signed-off-by: Alexandru Vasile <[email protected]> * config: Decode `SkipCheckIfFeeless` with `Self` Signed-off-by: Alexandru Vasile <[email protected]> * tests: Adjust testing Signed-off-by: Alexandru Vasile <[email protected]> * config: Descriptive errors for building `SkipCheckIfFeeless` Signed-off-by: Alexandru Vasile <[email protected]> * config: Add docs for extra error types Signed-off-by: Alexandru Vasile <[email protected]> * subxt: Add extra derives to signed extensions Signed-off-by: Alexandru Vasile <[email protected]> * config: Use `Default::default` to simplify type init Signed-off-by: Alexandru Vasile <[email protected]> --------- Signed-off-by: Alexandru Vasile <[email protected]> * subxt: Replace removed lint (#1270) Signed-off-by: Alexandru Vasile <[email protected]> * lightclient: Add support for multi-chain usecase (#1238) * lightclient: Make `smoldot::chainID` part of the RPC requests Signed-off-by: Alexandru Vasile <[email protected]> * lightclient: Make `BackgroundTask` generic over `PlatformRef` and chain Signed-off-by: Alexandru Vasile <[email protected]> * lightclient: Construct from raw smoldot and target different chains Signed-off-by: Alexandru Vasile <[email protected]> * testing: Update cargo lock for wasm tests Signed-off-by: Alexandru Vasile <[email protected]> * lightclient: Reuse `new_from_client` method and removed unused imports Signed-off-by: Alexandru Vasile <[email protected]> * lightclient: Reexport smoldot client and RPC objects used in pub interface Signed-off-by: Alexandru Vasile <[email protected]> * lightclient: Adjust `new_from_client` interface Signed-off-by: Alexandru Vasile <[email protected]> * lightclient: Extend background to poll over multiple RPC objects Signed-off-by: Alexandru Vasile <[email protected]> * subxt: Build light client from raw and target different chains Signed-off-by: Alexandru Vasile <[email protected]> * artifacts: Add demo chain specs Signed-off-by: Alexandru Vasile <[email protected]> * artifacts: Move artifacts to dedicated folder Signed-off-by: Alexandru Vasile <[email protected]> * lightclient: Use SelectAll to drive all streams Signed-off-by: Alexandru Vasile <[email protected]> * lightclient: Fetch initial data from the target chain Signed-off-by: Alexandru Vasile <[email protected]> * lightclient: Reexport other smoldot objects Signed-off-by: Alexandru Vasile <[email protected]> * subxt: Target chain with potentially different config Signed-off-by: Alexandru Vasile <[email protected]> * subxt/rpc: Log chainID for debugging Signed-off-by: Alexandru Vasile <[email protected]> * subxt/examples: Add smoldot client with parachain example Signed-off-by: Alexandru Vasile <[email protected]> * lightclient: Propagate chain ID together with rpc responses object Signed-off-by: Alexandru Vasile <[email protected]> * lightclient: Multiplex responses by request ID and chain ID Signed-off-by: Alexandru Vasile <[email protected]> * subxt: Add raw light client builder Signed-off-by: Alexandru Vasile <[email protected]> * subxt: Add cargo feature flag for parachains example Signed-off-by: Alexandru Vasile <[email protected]> * lightclient: Derive default for internal structure Signed-off-by: Alexandru Vasile <[email protected]> * lightclient: Guard reexports by std feature flag Signed-off-by: Alexandru Vasile <[email protected]> * Update subxt/src/client/light_client/mod.rs Co-authored-by: James Wilson <[email protected]> * lightclient: Update the builder pattern and chain targetting Signed-off-by: Alexandru Vasile <[email protected]> * lightclient: Fix documentation Signed-off-by: Alexandru Vasile <[email protected]> * Provide more insightful docs wrt native/wasm panics Signed-off-by: Alexandru Vasile <[email protected]> * examples: Adjust comment location Signed-off-by: Alexandru Vasile <[email protected]> * lightclient: Refactor UniqueChainId into the background task Signed-off-by: Alexandru Vasile <[email protected]> * Update lightclient/src/background.rs Co-authored-by: Niklas Adolfsson <[email protected]> * Update subxt/src/client/light_client/builder.rs Co-authored-by: James Wilson <[email protected]> * lightclient: Update docs wrt panics Signed-off-by: Alexandru Vasile <[email protected]> * subxt: Update docs wrt to smoldot instance -> client Signed-off-by: Alexandru Vasile <[email protected]> * lightclient: Use IntoIter instead of Iterator Signed-off-by: Alexandru Vasile <[email protected]> * subxt: Adjsut docs wrt [`Self::new_from_client`] Signed-off-by: Alexandru Vasile <[email protected]> * subxt: Remove RawRpc from LightClient in favor of chainID Signed-off-by: Alexandru Vasile <[email protected]> * lightclient: Reexport everything under smoldot module Signed-off-by: Alexandru Vasile <[email protected]> * artifacts: Use stateRootHash instead of genesis.raw Signed-off-by: Alexandru Vasile <[email protected]> --------- Signed-off-by: Alexandru Vasile <[email protected]> Co-authored-by: James Wilson <[email protected]> Co-authored-by: Niklas Adolfsson <[email protected]> * Bump futures from 0.3.28 to 0.3.29 (#1272) Bumps [futures](https://github.com/rust-lang/futures-rs) from 0.3.28 to 0.3.29. - [Release notes](https://github.com/rust-lang/futures-rs/releases) - [Changelog](https://github.com/rust-lang/futures-rs/blob/master/CHANGELOG.md) - [Commits](rust-lang/futures-rs@0.3.28...0.3.29) --- updated-dependencies: - dependency-name: futures dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump zeroize from 1.6.0 to 1.7.0 (#1274) Bumps [zeroize](https://github.com/RustCrypto/utils) from 1.6.0 to 1.7.0. - [Commits](https://github.com/RustCrypto/utils/commits) --- updated-dependencies: - dependency-name: zeroize dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump tracing-subscriber from 0.3.17 to 0.3.18 (#1275) Bumps [tracing-subscriber](https://github.com/tokio-rs/tracing) from 0.3.17 to 0.3.18. - [Release notes](https://github.com/tokio-rs/tracing/releases) - [Commits](tokio-rs/tracing@tracing-subscriber-0.3.17...tracing-subscriber-0.3.18) --- updated-dependencies: - dependency-name: tracing-subscriber dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump tracing-subscriber from 0.3.17 to 0.3.18 (#1275) Bumps [tracing-subscriber](https://github.com/tokio-rs/tracing) from 0.3.17 to 0.3.18. - [Release notes](https://github.com/tokio-rs/tracing/releases) - [Commits](tokio-rs/tracing@tracing-subscriber-0.3.17...tracing-subscriber-0.3.18) --- updated-dependencies: - dependency-name: tracing-subscriber dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump getrandom from 0.2.10 to 0.2.11 (#1273) Bumps [getrandom](https://github.com/rust-random/getrandom) from 0.2.10 to 0.2.11. - [Changelog](https://github.com/rust-random/getrandom/blob/master/CHANGELOG.md) - [Commits](rust-random/getrandom@v0.2.10...v0.2.11) --- updated-dependencies: - dependency-name: getrandom dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * impl RpcClientT for Arc<T> and Box<T> (#1277) * impl RpcClientT for Arc<WsClient> * fix grumbles: impl for Box<T> and Arc<T> * grumbles: move RpcClientT impls * first iteration of using scale_typegen * introduce indoc for formatting * calls, constants and home are cleaner now * added event subcommand * show runtime apis working * add better code formatting * fix style * adjust tests, use owo_colorize to not add extra dependency * fmt * adjust docs * move scale-typegen-description dependency to workspace * improve `substrate-compat` (#1265) * improve `substrate-compat` * From => Into --------- Co-authored-by: James Wilson <[email protected]> * Bump proc-macro2 from 1.0.69 to 1.0.70 (#1292) Bumps [proc-macro2](https://github.com/dtolnay/proc-macro2) from 1.0.69 to 1.0.70. - [Release notes](https://github.com/dtolnay/proc-macro2/releases) - [Commits](dtolnay/proc-macro2@1.0.69...1.0.70) --- updated-dependencies: - dependency-name: proc-macro2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump serde from 1.0.192 to 1.0.193 (#1291) Bumps [serde](https://github.com/serde-rs/serde) from 1.0.192 to 1.0.193. - [Release notes](https://github.com/serde-rs/serde/releases) - [Commits](serde-rs/serde@v1.0.192...v1.0.193) --- updated-dependencies: - dependency-name: serde dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * lightclient: Fix wasm socket closure called after being dropped (#1289) * lightclient: Close wasm socket while dropping from connecting state Signed-off-by: Alexandru Vasile <[email protected]> * lightclient: Construct one time only closures Signed-off-by: Alexandru Vasile <[email protected]> * testing: Enable console logs for lightclient WASM testing Signed-off-by: Alexandru Vasile <[email protected]> * lightclient: Separate wakes and check connectivity on poll_read Signed-off-by: Alexandru Vasile <[email protected]> * lightclient: Close the socket depending on internal state Signed-off-by: Alexandru Vasile <[email protected]> * Revert "lightclient: Separate wakes and check connectivity on poll_read" This reverts commit 8660940. * lightclient: Return pending if socket is opening from poll_read Signed-off-by: Alexandru Vasile <[email protected]> * lightclient: Close the socket on `poll_close` Signed-off-by: Alexandru Vasile <[email protected]> * lightclient: Reset closures on Drop to avoid recursive invokation Signed-off-by: Alexandru Vasile <[email protected]> * lightclient: Close the socket if not already closing Signed-off-by: Alexandru Vasile <[email protected]> --------- Signed-off-by: Alexandru Vasile <[email protected]> * workflows: Install rustup component for building substrate (#1295) Signed-off-by: Alexandru Vasile <[email protected]> * cli: Command to fetch chainSpec and optimise its size (#1278) * cli: Add chainSpec command Signed-off-by: Alexandru Vasile <[email protected]> * cli/chainSpec: Move to dedicated module Signed-off-by: Alexandru Vasile <[email protected]> * cli: Compute the state root hash Signed-off-by: Alexandru Vasile <[email protected]> * cli: Remove code substitutes Signed-off-by: Alexandru Vasile <[email protected]> * artifacts: Update polkadot.json Signed-off-by: Alexandru Vasile <[email protected]> * scripts: Generate the chain spec Signed-off-by: Alexandru Vasile <[email protected]> * cli: Remove testing artifacts Signed-off-by: Alexandru Vasile <[email protected]> * cli: Fix clippy Signed-off-by: Alexandru Vasile <[email protected]> * cli: Apply rustfmt Signed-off-by: Alexandru Vasile <[email protected]> * cli: Introduce feature flag for smoldot dependency Signed-off-by: Alexandru Vasile <[email protected]> * cli: Rename chain-spec to chain-spec-pruning Signed-off-by: Alexandru Vasile <[email protected]> * scripts: Update chain-spec command Signed-off-by: Alexandru Vasile <[email protected]> --------- Signed-off-by: Alexandru Vasile <[email protected]> * update to new scale-typegen interfaces * use released version of scale-typegen * Merge branch 'master' into tadeohepperle/cli-support-runtime-apis * remove unused debug file * resolve merge errors * adjustments * constants file adjustment * method renaming * fix issue with encoding runtime api params * Add logging to submit_transaction and unstable driver, and ensure unpin evs complete * panic if None returned from subscription too, also with stats * change panic to Err just to be on the safe side * clippy * make long tests run only after clippy + fmt pass * megre in light client test change pr * chore(subxt/src): typo fix (#1370) * rpcmethods * followstr * mod and else * Weekly Cronjob fetching artifacts and generating polkadot.rs file. (#1352) * github CI action cronjob * add commit message * fix the CI yml files * binary crate for CI script with substrate-runner * update the CI script * correct the artifacts script * remove bash script * lightclient(fix): Ensure lightclient chainSpec is at least one block old (#1372) * testing(fix): Ensure lightclient chainSpec is at least one block old Signed-off-by: Alexandru Vasile <[email protected]> * Revert "testing(fix): Ensure lightclient chainSpec is at least one block old" This reverts commit 0eafcb2. * lightclient(fix): Ensure lightclient chainSpec is at least one block old Signed-off-by: Alexandru Vasile <[email protected]> * lightclient: Link smoldot issue Signed-off-by: Alexandru Vasile <[email protected]> * subxt: Use tokio under lightclient feature flag Signed-off-by: Alexandru Vasile <[email protected]> * lightclient: Do not sleep on errors to fetch the chainSpec Signed-off-by: Alexandru Vasile <[email protected]> * artifacts: Remove test file Signed-off-by: Alexandru Vasile <[email protected]> * lightclient: Subscribe to two finalized blocks Signed-off-by: Alexandru Vasile <[email protected]> * subxt: Revert cargo toml Signed-off-by: Alexandru Vasile <[email protected]> --------- Signed-off-by: Alexandru Vasile <[email protected]> * ci: Reduce the light client timeout to 15 minutes (#1373) * ci: Reduce the light client timpeut to 15 seconds Signed-off-by: Alexandru Vasile <[email protected]> * ci: Use ubuntu-latest for light-client tests Signed-off-by: Alexandru Vasile <[email protected]> --------- Signed-off-by: Alexandru Vasile <[email protected]> * actually only wait for machete+fmt, clippy can be much slower * update CI file from Alex PR * resolve clippy err * Try a few RPC nodes in case one of them is not working * fix submit_transaction debug logging of message * Improve Signed Extension and Block Decoding Examples/Book (#1357) * asset hub example and book adjustment * formatting * recursive derives * polkadot monitor example and book adjustments * formatting * adjust docs and examples, add dynamic example * james suggestions * fmt * chore(subxt/src): typo fix (#1370) * rpcmethods * followstr * mod and else * Weekly Cronjob fetching artifacts and generating polkadot.rs file. (#1352) * github CI action cronjob * add commit message * fix the CI yml files * binary crate for CI script with substrate-runner * update the CI script * correct the artifacts script * remove bash script --------- Co-authored-by: James Wilson <[email protected]> Co-authored-by: Pan chao <[email protected]> * fix formatting of returned sections * add recursive derive and attribute options in the cli * format tuples uncaught * add tests and rename type map parser * make parsing more strict --------- Signed-off-by: Alexandru Vasile <[email protected]> Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: Alexandru Vasile <[email protected]> Co-authored-by: James Wilson <[email protected]> Co-authored-by: Niklas Adolfsson <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: yjh <[email protected]> Co-authored-by: Pan chao <[email protected]>
The subxt lightclient support enforced users to spawn one smoldot instance per chain.
With this PR, users can reuse the same smoldot instance to communicate with multiple chains and parachains.
API design for multi chain usecase:
RawLightClientBuilder
object in terms of chain ID and RPC object that produces method responsesRawLightClientBuilder
is turned into aLightClient
and the smoldot instance is spawned on a background task that handles requests and multiplexes responses back to the internal RPC objects of subxtLightClient
instance is mapped to one chain. To interact with a different chain, users can callLightClient::target_chain
method. This fetches under the hood the needed info of theOnlineClient
(metadata, spec, runtime) and receives a customConfig
. The newly created light client communicates with the same background instance of smoldot.The changes include:
RawLightClientBuilder
target_chain
APIReview notes:
Next steps (possibly in another PR):
subxt_lightclient::fetch_spec
via aChainSpecBuilder
to avoid demo-chain-specs artifacts and the need to keep them in sync (currently taken from smoldot)Closes: #1213.