diff --git a/client/rpc-spec/src/chain_spec/chain_spec.rs b/client/rpc-spec/src/chain_spec/chain_spec.rs
new file mode 100644
index 0000000000000..4ec796c4a72f0
--- /dev/null
+++ b/client/rpc-spec/src/chain_spec/chain_spec.rs
@@ -0,0 +1,68 @@
+// This file is part of Substrate.
+
+// Copyright (C) 2020-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 .
+
+//! 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.
+ ///
+ /// # Note
+ ///
+ /// This can be empty, or prefixed with "0x".
+ genesis_hash: String,
+ /// Chain properties.
+ properties: Properties,
+}
+
+impl ChainSpec {
+ /// Creates a new [`ChainSpec`].
+ pub fn new>(
+ name: String,
+ genesis_hash: Hash,
+ properties: Properties,
+ ) -> Self {
+ let genesis_hash = if genesis_hash.as_ref().is_empty() {
+ "".into()
+ } else {
+ format!("0x{}", hex::encode(genesis_hash))
+ };
+
+ Self { name, properties, genesis_hash }
+ }
+}
+
+impl ChainSpecApiServer for ChainSpec {
+ fn chain_spec_unstable_chain_name(&self) -> RpcResult {
+ Ok(self.name.clone())
+ }
+
+ fn chain_spec_unstable_genesis_hash(&self) -> RpcResult {
+ Ok(self.genesis_hash.clone())
+ }
+
+ fn chain_spec_unstable_properties(&self) -> RpcResult {
+ Ok(self.properties.clone())
+ }
+}
diff --git a/client/rpc-spec/src/chain_spec/mod.rs b/client/rpc-spec/src/chain_spec/mod.rs
index 43e27e52e77f8..af11c8ca4af16 100644
--- a/client/rpc-spec/src/chain_spec/mod.rs
+++ b/client/rpc-spec/src/chain_spec/mod.rs
@@ -29,5 +29,7 @@
//! Methods are prefixed by `chainSpec`.
pub mod api;
+pub mod chain_spec;
pub use api::ChainSpecApiServer;
+pub use chain_spec::ChainSpec;