This repository has been archived by the owner on Nov 15, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 2.6k
rpc: Implement chainSpec
RPC API
#12261
Merged
Merged
Changes from all commits
Commits
Show all changes
10 commits
Select commit
Hold shift + click to select a range
976dd85
rpc/chain_spec: Add traits for `chainSpec` API
lexnv 4fb98e9
rpc/chain_spec: Implement `chainSpec` RPC methods
lexnv 5096fca
rpc/chain_spec: Add tests
lexnv cca0c81
bin/node: Enable `chainSpec` API
lexnv f7fa649
rpc/chain_spec: Assume `genesis_hash` as non-empty
lexnv e9031c7
Update client/rpc-spec/Cargo.toml
lexnv eb120ad
Update client/rpc-spec/src/lib.rs
lexnv 780815a
client/rpc_spec: Rename crate to `rpc_spec_v2`
lexnv 3aac01c
rpc-servers: Remove the `version` field from `rpc_methods`
lexnv f71602d
rpc/chain_spec: Fix copyright years
lexnv File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
[package] | ||
name = "sc-rpc-spec-v2" | ||
version = "0.10.0-dev" | ||
authors = ["Parity Technologies <[email protected]>"] | ||
edition = "2021" | ||
license = "GPL-3.0-or-later WITH Classpath-exception-2.0" | ||
homepage = "https://substrate.io" | ||
repository = "https://github.com/paritytech/substrate/" | ||
description = "Substrate RPC interface v2." | ||
readme = "README.md" | ||
|
||
[package.metadata.docs.rs] | ||
targets = ["x86_64-unknown-linux-gnu"] | ||
|
||
[dependencies] | ||
jsonrpsee = { version = "0.15.1", features = ["server", "macros"] } | ||
# Internal chain structures for "chain_spec". | ||
sc-chain-spec = { version = "4.0.0-dev", path = "../chain-spec" } | ||
hex = "0.4" | ||
|
||
[dev-dependencies] | ||
serde_json = "1.0" | ||
tokio = { version = "1.17.0", features = ["macros"] } |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
Substrate RPC interfaces. | ||
|
||
A collection of RPC methods and subscriptions supported by all substrate clients. | ||
|
||
License: GPL-3.0-or-later WITH Classpath-exception-2.0 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,53 @@ | ||
// This file is part of Substrate. | ||
|
||
// Copyright (C) 2022 Parity Technologies (UK) Ltd. | ||
// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 | ||
|
||
// This program 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. | ||
|
||
// This program 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 this program. If not, see <https://www.gnu.org/licenses/>. | ||
|
||
//! API trait of the chain spec. | ||
|
||
use jsonrpsee::{core::RpcResult, proc_macros::rpc}; | ||
use sc_chain_spec::Properties; | ||
|
||
#[rpc(client, server)] | ||
pub trait ChainSpecApi { | ||
/// Get the chain name, as present in the chain specification. | ||
/// | ||
/// # Unstable | ||
/// | ||
/// This method is unstable and subject to change in the future. | ||
#[method(name = "chainSpec_unstable_chainName")] | ||
fn chain_spec_unstable_chain_name(&self) -> RpcResult<String>; | ||
|
||
/// Get the chain's genesis hash. | ||
/// | ||
/// # Unstable | ||
/// | ||
/// This method is unstable and subject to change in the future. | ||
#[method(name = "chainSpec_unstable_genesisHash")] | ||
fn chain_spec_unstable_genesis_hash(&self) -> RpcResult<String>; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Tiny thing; I think of Not bothered either way though :) |
||
|
||
/// Get the properties of the chain, as present in the chain specification. | ||
/// | ||
/// # Note | ||
/// | ||
/// The json whitespaces are not guaranteed to persist. | ||
/// | ||
/// # Unstable | ||
/// | ||
/// This method is unstable and subject to change in the future. | ||
#[method(name = "chainSpec_unstable_properties")] | ||
fn chain_spec_unstable_properties(&self) -> RpcResult<Properties>; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,60 @@ | ||
// This file is part of Substrate. | ||
|
||
// Copyright (C) 2022 Parity Technologies (UK) Ltd. | ||
// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 | ||
|
||
// This program 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. | ||
|
||
// This program 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 this program. If not, see <https://www.gnu.org/licenses/>. | ||
|
||
//! API implementation for the specification of a chain. | ||
|
||
use crate::chain_spec::api::ChainSpecApiServer; | ||
use jsonrpsee::core::RpcResult; | ||
use sc_chain_spec::Properties; | ||
|
||
/// An API for chain spec RPC calls. | ||
pub struct ChainSpec { | ||
/// The name of the chain. | ||
name: String, | ||
/// The hexadecimal encoded hash of the genesis block. | ||
genesis_hash: String, | ||
/// Chain properties. | ||
properties: Properties, | ||
} | ||
|
||
impl ChainSpec { | ||
/// Creates a new [`ChainSpec`]. | ||
pub fn new<Hash: AsRef<[u8]>>( | ||
name: String, | ||
genesis_hash: Hash, | ||
properties: Properties, | ||
) -> Self { | ||
let genesis_hash = format!("0x{}", hex::encode(genesis_hash)); | ||
|
||
Self { name, properties, genesis_hash } | ||
} | ||
} | ||
|
||
impl ChainSpecApiServer for ChainSpec { | ||
fn chain_spec_unstable_chain_name(&self) -> RpcResult<String> { | ||
Ok(self.name.clone()) | ||
} | ||
|
||
fn chain_spec_unstable_genesis_hash(&self) -> RpcResult<String> { | ||
Ok(self.genesis_hash.clone()) | ||
} | ||
|
||
fn chain_spec_unstable_properties(&self) -> RpcResult<Properties> { | ||
Ok(self.properties.clone()) | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
// This file is part of Substrate. | ||
|
||
// Copyright (C) 2022 Parity Technologies (UK) Ltd. | ||
// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 | ||
|
||
// This program 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. | ||
|
||
// This program 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 this program. If not, see <https://www.gnu.org/licenses/>. | ||
|
||
//! Substrate chain specification API. | ||
//! | ||
//! The *chain spec* (short for *chain specification*) allows inspecting the content of | ||
//! the specification of the chain that a JSON-RPC server is targeting. | ||
//! | ||
//! The values returned by the API are guaranteed to never change during the lifetime of the | ||
//! JSON-RPC server. | ||
//! | ||
//! # Note | ||
//! | ||
//! Methods are prefixed by `chainSpec`. | ||
|
||
#[cfg(test)] | ||
mod tests; | ||
|
||
pub mod api; | ||
pub mod chain_spec; | ||
|
||
pub use api::ChainSpecApiServer; | ||
pub use chain_spec::ChainSpec; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,61 @@ | ||
// This file is part of Substrate. | ||
|
||
// Copyright (C) 2022 Parity Technologies (UK) Ltd. | ||
// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 | ||
|
||
// This program 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. | ||
|
||
// This program 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 this program. If not, see <https://www.gnu.org/licenses/>. | ||
|
||
use super::*; | ||
use jsonrpsee::{types::EmptyParams, RpcModule}; | ||
use sc_chain_spec::Properties; | ||
|
||
const CHAIN_NAME: &'static str = "TEST_CHAIN_NAME"; | ||
const CHAIN_GENESIS: [u8; 32] = [0; 32]; | ||
const CHAIN_PROPERTIES: &'static str = r#"{"three": "123", "one": 1, "two": 12}"#; | ||
|
||
fn api() -> RpcModule<ChainSpec> { | ||
ChainSpec::new( | ||
CHAIN_NAME.to_string(), | ||
CHAIN_GENESIS, | ||
serde_json::from_str(CHAIN_PROPERTIES).unwrap(), | ||
) | ||
.into_rpc() | ||
} | ||
|
||
#[tokio::test] | ||
async fn chain_spec_chain_name_works() { | ||
let name = api() | ||
.call::<_, String>("chainSpec_unstable_chainName", EmptyParams::new()) | ||
.await | ||
.unwrap(); | ||
assert_eq!(name, CHAIN_NAME); | ||
} | ||
|
||
#[tokio::test] | ||
async fn chain_spec_genesis_hash_works() { | ||
let genesis = api() | ||
.call::<_, String>("chainSpec_unstable_genesisHash", EmptyParams::new()) | ||
.await | ||
.unwrap(); | ||
assert_eq!(genesis, format!("0x{}", hex::encode(CHAIN_GENESIS))); | ||
} | ||
|
||
#[tokio::test] | ||
async fn chain_spec_properties_works() { | ||
let properties = api() | ||
.call::<_, Properties>("chainSpec_unstable_properties", EmptyParams::new()) | ||
.await | ||
.unwrap(); | ||
assert_eq!(properties, serde_json::from_str(CHAIN_PROPERTIES).unwrap()); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
// This file is part of Substrate. | ||
|
||
// Copyright (C) 2022 Parity Technologies (UK) Ltd. | ||
// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 | ||
|
||
// This program 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. | ||
|
||
// This program 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 this program. If not, see <https://www.gnu.org/licenses/>. | ||
|
||
//! Substrate JSON-RPC interface v2. | ||
//! | ||
//! Specification [document](https://paritytech.github.io/json-rpc-interface-spec/). | ||
|
||
#![warn(missing_docs)] | ||
#![deny(unused_crate_dependencies)] | ||
|
||
pub mod chain_spec; |
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
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.
why are these all unstable?
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.
Although they will be part of the final RPC, these methods are expected to go through a testing phase before standardizing and replacing the old API. During this time (1-2months TBD), we can still add breaking changes. At least, that's how I interpret the
unstable
from the specThere 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.
That is my understanding of Pierre's suggestion with this spec; we get them in marked as unstable and then have the opporunity to stabilise them when we're happy.