Fix transaction submission for hex (#259)

* Fix transaction submission for hex

* Fix grumbles.
This commit is contained in:
Gav Wood
2018-06-28 16:42:25 +02:00
committed by GitHub
parent 079a448454
commit 5ed1549bee
7 changed files with 54 additions and 5 deletions
+1
View File
@@ -2279,6 +2279,7 @@ dependencies = [
"log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
"parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
"substrate-client 0.1.0",
"substrate-codec 0.1.0",
"substrate-executor 0.1.0",
"substrate-extrinsic-pool 0.1.0",
"substrate-primitives 0.1.0",
+16
View File
@@ -61,6 +61,8 @@ macro_rules! map {
)
}
use rstd::prelude::*;
use rstd::ops::Deref;
#[cfg(feature = "std")]
pub mod bytes;
@@ -87,3 +89,17 @@ pub type AuthorityId = [u8; 32];
/// A 512-bit value interpreted as a signature.
pub type Signature = hash::H512;
/// Hex-serialised shim for `Vec<u8>`.
#[derive(PartialEq, Eq, Clone)]
#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug, Hash, PartialOrd, Ord))]
pub struct Bytes(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec<u8>);
impl From<Vec<u8>> for Bytes {
fn from(s: Vec<u8>) -> Self { Bytes(s) }
}
impl Deref for Bytes {
type Target = [u8];
fn deref(&self) -> &[u8] { &self.0[..] }
}
+1
View File
@@ -10,6 +10,7 @@ jsonrpc-macros = { git="https://github.com/paritytech/jsonrpc.git" }
jsonrpc-pubsub = { git="https://github.com/paritytech/jsonrpc.git" }
log = "0.3"
parking_lot = "0.4"
substrate-codec = { path = "../codec" }
substrate-client = { path = "../client" }
substrate-executor = { path = "../executor" }
substrate-extrinsic-pool = { path = "../extrinsic-pool" }
@@ -24,6 +24,11 @@ error_chain! {
Pool(txpool::Error, txpool::ErrorKind) #[doc = "Pool error"];
}
errors {
/// Incorrect transaction format.
BadFormat {
description("bad format"),
display("Invalid transaction format"),
}
/// Not implemented yet
Unimplemented {
description("not yet implemented"),
+12 -3
View File
@@ -20,7 +20,9 @@ use std::sync::Arc;
use client::{self, Client};
use extrinsic_pool::api::{Error, ExtrinsicPool};
use codec::Slicable;
use primitives::Bytes;
use runtime_primitives::{generic, traits::Block as BlockT};
use state_machine;
@@ -35,8 +37,11 @@ build_rpc_trait! {
/// Substrate authoring RPC API
pub trait AuthorApi<Hash, Extrinsic> {
/// Submit extrinsic for inclusion in block.
#[rpc(name = "author_submitRichExtrinsic")]
fn submit_rich_extrinsic(&self, Extrinsic) -> Result<Hash>;
/// Submit hex-encoded extrinsic for inclusion in block.
#[rpc(name = "author_submitExtrinsic")]
fn submit_extrinsic(&self, Extrinsic) -> Result<Hash>;
fn submit_extrinsic(&self, Bytes) -> Result<Hash>;
}
}
@@ -55,7 +60,6 @@ impl<B, E, Block: BlockT, P> Author<B, E, Block, P> {
}
}
impl<B, E, Block, P, Ex, Hash> AuthorApi<Hash, Ex> for Author<B, E, Block, P> where
B: client::backend::Backend<Block> + Send + Sync + 'static,
E: client::CallExecutor<Block> + Send + Sync + 'static,
@@ -63,8 +67,13 @@ impl<B, E, Block, P, Ex, Hash> AuthorApi<Hash, Ex> for Author<B, E, Block, P> wh
client::error::Error: From<<<B as client::backend::Backend<Block>>::State as state_machine::backend::Backend>::Error>,
P: ExtrinsicPool<Ex, generic::BlockId<Block>, Hash>,
P::Error: 'static,
Ex: Slicable,
{
fn submit_extrinsic(&self, xt: Ex) -> Result<Hash> {
fn submit_extrinsic(&self, xt: Bytes) -> Result<Hash> {
self.submit_rich_extrinsic(Ex::decode(&mut &xt[..]).ok_or(error::Error::from(error::ErrorKind::BadFormat))?)
}
fn submit_rich_extrinsic(&self, xt: Ex) -> Result<Hash> {
let best_block_hash = self.client.info().unwrap().chain.best_hash;
self.pool
.submit(generic::BlockId::hash(best_block_hash), vec![xt])
+18 -2
View File
@@ -65,10 +65,26 @@ fn submit_transaction_should_not_cause_error() {
};
assert_matches!(
AuthorApi::submit_extrinsic(&p, 5),
AuthorApi::submit_extrinsic(&p, u64::encode(&5).into()),
Ok(1)
);
assert!(
AuthorApi::submit_extrinsic(&p, 5).is_err()
AuthorApi::submit_extrinsic(&p, u64::encode(&5).into()).is_err()
);
}
#[test]
fn submit_rich_transaction_should_not_cause_error() {
let p = Author {
client: Arc::new(test_client::new()),
pool: Arc::new(DummyTxPool::default()),
};
assert_matches!(
AuthorApi::submit_rich_extrinsic(&p, 5),
Ok(1)
);
assert!(
AuthorApi::submit_rich_extrinsic(&p, 5).is_err()
);
}
+1
View File
@@ -21,6 +21,7 @@
extern crate jsonrpc_core as rpc;
extern crate jsonrpc_pubsub;
extern crate parking_lot;
extern crate substrate_codec as codec;
extern crate substrate_client as client;
extern crate substrate_extrinsic_pool as extrinsic_pool;
extern crate substrate_primitives as primitives;