Unknit rpc from polkadot.

This commit is contained in:
Gav
2018-02-07 22:31:22 +01:00
parent 652b5705d6
commit b1537185fa
12 changed files with 110 additions and 32 deletions
+24
View File
@@ -0,0 +1,24 @@
[package]
name = "polkadot-cli"
version = "0.1.0"
authors = ["Parity Technologies <admin@parity.io>"]
description = "Polkadot node implementation in Rust."
[dependencies]
clap = { version = "2.27", features = ["yaml"] }
env_logger = "0.4"
error-chain = "0.11"
log = "0.3"
hex-literal = "0.1"
ed25519 = { path = "../ed25519" }
triehash = { version = "0.1" }
substrate-client = { path = "../client" }
substrate-codec = { path = "../codec" }
substrate-runtime-io = { path = "../runtime-io" }
substrate-state-machine = { path = "../state-machine" }
substrate-executor = { path = "../executor" }
substrate-primitives = { path = "../primitives" }
polkadot-rpc-servers = { path = "../rpc-servers" }
polkadot-primitives = { path = "../polkadot-primitives" }
polkadot-executor = { path = "../polkadot-executor" }
native-runtime = { path = "../native-runtime" }
+2
View File
@@ -30,6 +30,8 @@ pub trait BlockImportOperation {
fn state(&self) -> error::Result<Self::State>;
/// Append block data to the transaction.
fn import_block(&mut self, header: block::Header, body: Option<block::Body>, is_new_best: bool) -> error::Result<()>;
/// Inject storage data into the database.
fn reset_storage<I: Iterator<Item=(Vec<u8>, Vec<u8>)>>(&mut self, iter: I) -> error::Result<()>;
}
/// Client backend. Manages the data layer.
+5
View File
@@ -146,6 +146,11 @@ impl backend::BlockImportOperation for BlockImportOperation {
});
Ok(())
}
fn reset_storage<I: Iterator<Item=(Vec<u8>, Vec<u8>)>>(&mut self, iter: I) -> error::Result<()> {
self.pending_state = state_machine::backend::InMemory::from(iter.collect());
Ok(())
}
}
/// In-memory backend. Keeps all states and blocks in memory. Useful for testing.
+19 -16
View File
@@ -30,10 +30,6 @@ extern crate parking_lot;
#[macro_use] extern crate error_chain;
#[macro_use] extern crate log;
#[cfg(test)]
#[macro_use]
extern crate hex_literal;
pub mod error;
pub mod blockchain;
pub mod backend;
@@ -104,8 +100,15 @@ pub enum BlockStatus {
}
/// Create an instance of in-memory client.
pub fn new_in_mem<E>(executor: E) -> error::Result<Client<in_mem::Backend, E>> where E: state_machine::CodeExecutor {
Client::new(in_mem::Backend::new(), executor)
pub fn new_in_mem<E, F>(
executor: E,
build_genesis: F
) -> error::Result<Client<in_mem::Backend, E>>
where
E: state_machine::CodeExecutor,
F: FnOnce() -> (block::Header, Vec<(Vec<u8>, Vec<u8>)>)
{
Client::new(in_mem::Backend::new(), executor, build_genesis)
}
impl<B, E> Client<B, E> where
@@ -114,19 +117,19 @@ impl<B, E> Client<B, E> where
error::Error: From<<<B as backend::Backend>::State as state_machine::backend::Backend>::Error>,
{
/// Creates new Polkadot Client with given blockchain and code executor.
pub fn new(backend: B, executor: E) -> error::Result<Self> {
pub fn new<F>(
backend: B,
executor: E,
build_genesis: F
) -> error::Result<Self>
where
F: FnOnce() -> (block::Header, Vec<(Vec<u8>, Vec<u8>)>)
{
if backend.blockchain().header(BlockId::Number(0))?.is_none() {
trace!("Empty database, writing genesis block");
// TODO: spec, coming in from new_in_mem's params.
let genesis_header = block::Header {
parent_hash: Default::default(),
number: 0,
state_root: Default::default(),
transaction_root: Default::default(),
digest: Default::default(),
};
let (genesis_header, genesis_store) = build_genesis();
let mut tx = backend.begin_transaction(BlockId::Hash(block::HeaderHash::default()))?;
tx.reset_storage(genesis_store.into_iter())?;
tx.import_block(genesis_header, None, true)?;
backend.commit_transaction(tx)?;
}