From 8dc443dc5bddee463118878a73b1eceecec406cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Drwi=C4=99ga?= <tomusdrw@users.noreply.github.com> Date: Wed, 23 Oct 2019 13:17:53 +0200 Subject: [PATCH] Support `account_nextIndex` RPC. (#460) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Use node-rpc extensions to support account_nextIndex. * Remove todo. * Update lock. * Use new srml_system_rpc crate. * Update to substrate=master * Update lockfile. * Update to polkadot-master. * Apply suggestions from code review Co-Authored-By: Bastian Köcher <bkchr@users.noreply.github.com> --- polkadot/Cargo.lock | 44 ++++++++++++++++++++++++++++++++++++ polkadot/rpc/Cargo.toml | 15 +++++++++++++ polkadot/rpc/src/lib.rs | 45 +++++++++++++++++++++++++++++++++++++ polkadot/runtime/Cargo.toml | 2 ++ polkadot/runtime/src/lib.rs | 6 +++++ polkadot/service/Cargo.toml | 1 + polkadot/service/src/lib.rs | 6 +++++ 7 files changed, 119 insertions(+) create mode 100644 polkadot/rpc/Cargo.toml create mode 100644 polkadot/rpc/src/lib.rs diff --git a/polkadot/Cargo.lock b/polkadot/Cargo.lock index 7a8f9eaac14..dad51e1181e 100644 --- a/polkadot/Cargo.lock +++ b/polkadot/Cargo.lock @@ -2777,6 +2777,19 @@ dependencies = [ "substrate-serializer 2.0.0 (git+https://github.com/paritytech/substrate?branch=polkadot-master)", ] +[[package]] +name = "polkadot-rpc" +version = "0.6.0" +dependencies = [ + "jsonrpc-core 13.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "polkadot-primitives 0.6.0", + "sr-primitives 2.0.0 (git+https://github.com/paritytech/substrate?branch=polkadot-master)", + "srml-system-rpc 2.0.0 (git+https://github.com/paritytech/substrate?branch=polkadot-master)", + "substrate-client 2.0.0 (git+https://github.com/paritytech/substrate?branch=polkadot-master)", + "substrate-rpc 2.0.0 (git+https://github.com/paritytech/substrate?branch=polkadot-master)", + "substrate-transaction-pool 2.0.0 (git+https://github.com/paritytech/substrate?branch=polkadot-master)", +] + [[package]] name = "polkadot-runtime" version = "0.6.0" @@ -2819,6 +2832,7 @@ dependencies = [ "srml-sudo 2.0.0 (git+https://github.com/paritytech/substrate?branch=polkadot-master)", "srml-support 2.0.0 (git+https://github.com/paritytech/substrate?branch=polkadot-master)", "srml-system 2.0.0 (git+https://github.com/paritytech/substrate?branch=polkadot-master)", + "srml-system-rpc-runtime-api 2.0.0 (git+https://github.com/paritytech/substrate?branch=polkadot-master)", "srml-timestamp 2.0.0 (git+https://github.com/paritytech/substrate?branch=polkadot-master)", "srml-transaction-payment 2.0.0 (git+https://github.com/paritytech/substrate?branch=polkadot-master)", "srml-treasury 2.0.0 (git+https://github.com/paritytech/substrate?branch=polkadot-master)", @@ -2851,6 +2865,7 @@ dependencies = [ "polkadot-executor 0.6.0", "polkadot-network 0.6.0", "polkadot-primitives 0.6.0", + "polkadot-rpc 0.6.0", "polkadot-runtime 0.6.0", "polkadot-validation 0.6.0", "slog 2.5.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4159,6 +4174,33 @@ dependencies = [ "substrate-primitives 2.0.0 (git+https://github.com/paritytech/substrate?branch=polkadot-master)", ] +[[package]] +name = "srml-system-rpc" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-master#5fde6d0882bd9943da28df6d40dc78714672dcca" +dependencies = [ + "jsonrpc-core 13.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-core-client 13.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-derive 13.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 2.0.0 (git+https://github.com/paritytech/substrate?branch=polkadot-master)", + "srml-system-rpc-runtime-api 2.0.0 (git+https://github.com/paritytech/substrate?branch=polkadot-master)", + "substrate-client 2.0.0 (git+https://github.com/paritytech/substrate?branch=polkadot-master)", + "substrate-primitives 2.0.0 (git+https://github.com/paritytech/substrate?branch=polkadot-master)", + "substrate-transaction-pool 2.0.0 (git+https://github.com/paritytech/substrate?branch=polkadot-master)", +] + +[[package]] +name = "srml-system-rpc-runtime-api" +version = "2.0.0" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-master#5fde6d0882bd9943da28df6d40dc78714672dcca" +dependencies = [ + "parity-scale-codec 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "substrate-client 2.0.0 (git+https://github.com/paritytech/substrate?branch=polkadot-master)", +] + [[package]] name = "srml-timestamp" version = "2.0.0" @@ -6306,6 +6348,8 @@ dependencies = [ "checksum srml-support-procedural-tools 2.0.0 (git+https://github.com/paritytech/substrate?branch=polkadot-master)" = "<none>" "checksum srml-support-procedural-tools-derive 2.0.0 (git+https://github.com/paritytech/substrate?branch=polkadot-master)" = "<none>" "checksum srml-system 2.0.0 (git+https://github.com/paritytech/substrate?branch=polkadot-master)" = "<none>" +"checksum srml-system-rpc 2.0.0 (git+https://github.com/paritytech/substrate?branch=polkadot-master)" = "<none>" +"checksum srml-system-rpc-runtime-api 2.0.0 (git+https://github.com/paritytech/substrate?branch=polkadot-master)" = "<none>" "checksum srml-timestamp 2.0.0 (git+https://github.com/paritytech/substrate?branch=polkadot-master)" = "<none>" "checksum srml-transaction-payment 2.0.0 (git+https://github.com/paritytech/substrate?branch=polkadot-master)" = "<none>" "checksum srml-treasury 2.0.0 (git+https://github.com/paritytech/substrate?branch=polkadot-master)" = "<none>" diff --git a/polkadot/rpc/Cargo.toml b/polkadot/rpc/Cargo.toml new file mode 100644 index 00000000000..d4bc83e0bbc --- /dev/null +++ b/polkadot/rpc/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "polkadot-rpc" +version = "0.6.0" +authors = ["Parity Technologies <admin@parity.io>"] +edition = "2018" + +[dependencies] +client = { package = "substrate-client", git = "https://github.com/paritytech/substrate", branch = "polkadot-master" } +jsonrpc-core = "13.2.0" +polkadot-primitives = { path = "../primitives" } +sr-primitives = { git = "https://github.com/paritytech/substrate", branch = "polkadot-master" } +substrate-rpc = { git = "https://github.com/paritytech/substrate", branch = "polkadot-master" } +transaction_pool = { package = "substrate-transaction-pool", git = "https://github.com/paritytech/substrate", branch = "polkadot-master" } +srml-system-rpc = { git = "https://github.com/paritytech/substrate", branch = "polkadot-master" } + diff --git a/polkadot/rpc/src/lib.rs b/polkadot/rpc/src/lib.rs new file mode 100644 index 00000000000..5b86a900126 --- /dev/null +++ b/polkadot/rpc/src/lib.rs @@ -0,0 +1,45 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see <http://www.gnu.org/licenses/>. + +//! Polkadot-specific RPCs implementation. + +#![warn(missing_docs)] + +use std::sync::Arc; + +use polkadot_primitives::{Block, AccountId, Nonce}; +use sr_primitives::traits::ProvideRuntimeApi; +use transaction_pool::txpool::{ChainApi, Pool}; + +/// A type representing all RPC extensions. +pub type RpcExtension = jsonrpc_core::IoHandler<substrate_rpc::Metadata>; + +/// Instantiate all RPC extensions. +pub fn create<C, P>(client: Arc<C>, pool: Arc<Pool<P>>) -> RpcExtension where + C: ProvideRuntimeApi, + C: client::blockchain::HeaderBackend<Block>, + C: Send + Sync + 'static, + C::Api: srml_system_rpc::AccountNonceApi<Block, AccountId, Nonce>, + P: ChainApi + Sync + Send + 'static, +{ + use srml_system_rpc::{System, SystemApi}; + + let mut io = jsonrpc_core::IoHandler::default(); + io.extend_with( + SystemApi::to_delegate(System::new(client.clone(), pool)) + ); + io +} diff --git a/polkadot/runtime/Cargo.toml b/polkadot/runtime/Cargo.toml index 728759596e4..c9a0ce679b9 100644 --- a/polkadot/runtime/Cargo.toml +++ b/polkadot/runtime/Cargo.toml @@ -50,6 +50,7 @@ staking = { package = "srml-staking", git = "https://github.com/paritytech/subst srml-staking-reward-curve = { git = "https://github.com/paritytech/substrate", branch = "polkadot-master" } sudo = { package = "srml-sudo", git = "https://github.com/paritytech/substrate", default-features = false, branch = "polkadot-master" } system = { package = "srml-system", git = "https://github.com/paritytech/substrate", default-features = false, branch = "polkadot-master" } +system_rpc_runtime_api = { package = "srml-system-rpc-runtime-api", git = "https://github.com/paritytech/substrate", default-features = false, branch = "polkadot-master" } timestamp = { package = "srml-timestamp", git = "https://github.com/paritytech/substrate", default-features = false, branch = "polkadot-master" } treasury = { package = "srml-treasury", git = "https://github.com/paritytech/substrate", default-features = false, branch = "polkadot-master" } @@ -106,6 +107,7 @@ std = [ "staking/std", "sudo/std", "system/std", + "system_rpc_runtime_api/std", "timestamp/std", "treasury/std", "version/std", diff --git a/polkadot/runtime/src/lib.rs b/polkadot/runtime/src/lib.rs index c87b2d0952f..d1906ce94ff 100644 --- a/polkadot/runtime/src/lib.rs +++ b/polkadot/runtime/src/lib.rs @@ -759,4 +759,10 @@ impl_runtime_apis! { SessionKeys::generate(seed) } } + + impl system_rpc_runtime_api::AccountNonceApi<Block, AccountId, Nonce> for Runtime { + fn account_nonce(account: AccountId) -> Nonce { + System::account_nonce(account) + } + } } diff --git a/polkadot/service/Cargo.toml b/polkadot/service/Cargo.toml index 3059af36be9..808aef0f48a 100644 --- a/polkadot/service/Cargo.toml +++ b/polkadot/service/Cargo.toml @@ -18,6 +18,7 @@ polkadot-primitives = { path = "../primitives" } polkadot-runtime = { path = "../runtime" } polkadot-executor = { path = "../executor" } polkadot-network = { path = "../network" } +polkadot-rpc = { path = "../rpc" } sr-io = { git = "https://github.com/paritytech/substrate", branch = "polkadot-master" } sr-primitives = { git = "https://github.com/paritytech/substrate", branch = "polkadot-master" } primitives = { package = "substrate-primitives", git = "https://github.com/paritytech/substrate", branch = "polkadot-master" } diff --git a/polkadot/service/src/lib.rs b/polkadot/service/src/lib.rs index 616d521d651..2c705faa015 100644 --- a/polkadot/service/src/lib.rs +++ b/polkadot/service/src/lib.rs @@ -117,6 +117,9 @@ macro_rules! new_full_start { import_setup = Some((block_import, grandpa_link, babe_link)); Ok(import_queue) + })? + .with_rpc_extensions(|client, pool| -> polkadot_rpc::RpcExtension { + polkadot_rpc::create(client, pool) })?; (builder, import_setup, inherent_data_providers) @@ -369,5 +372,8 @@ pub fn new_light(config: Configuration<CustomConfiguration, GenesisConfig>) .with_finality_proof_provider(|client, backend| Ok(Arc::new(GrandpaFinalityProofProvider::new(backend, client)) as _) )? + .with_rpc_extensions(|client, pool| -> polkadot_rpc::RpcExtension { + polkadot_rpc::create(client, pool) + })? .build() } -- GitLab