From 471790e722992660ddb7f9e7976ad320149dc9af Mon Sep 17 00:00:00 2001 From: Seun Date: Tue, 23 Apr 2019 13:50:25 +0100 Subject: [PATCH 1/3] adds parity_getRawBlockByNumber (cherry picked from commit 1b418f592a03d45997f54304ca10889a96199509) --- rpc/src/v1/impls/light/parity.rs | 5 +++++ rpc/src/v1/impls/parity.rs | 6 ++++++ rpc/src/v1/traits/parity.rs | 4 ++++ 3 files changed, 15 insertions(+) diff --git a/rpc/src/v1/impls/light/parity.rs b/rpc/src/v1/impls/light/parity.rs index 0486366de62..79a69cbd96f 100644 --- a/rpc/src/v1/impls/light/parity.rs +++ b/rpc/src/v1/impls/light/parity.rs @@ -47,6 +47,7 @@ use v1::types::{ Log, Filter, }; use Host; +use v1::helpers::errors::light_unimplemented; /// Parity implementation for light client. pub struct ParityClient @@ -407,4 +408,8 @@ where fn verify_signature(&self, is_prefixed: bool, message: Bytes, r: H256, s: H256, v: U64) -> Result { verify_signature(is_prefixed, message, r, s, v, self.light_dispatch.client.signing_chain_id()) } + + fn get_raw_block_by_number(&self, _: BlockNumber) -> Result> { + Err(light_unimplemented(None)) + } } diff --git a/rpc/src/v1/impls/parity.rs b/rpc/src/v1/impls/parity.rs index 796b3f9f5e2..ffdca0b29bf 100644 --- a/rpc/src/v1/impls/parity.rs +++ b/rpc/src/v1/impls/parity.rs @@ -462,4 +462,10 @@ impl Parity for ParityClient where fn verify_signature(&self, is_prefixed: bool, message: Bytes, r: H256, s: H256, v: U64) -> Result { verify_signature(is_prefixed, message, r, s, v, self.client.signing_chain_id()) } + + fn get_raw_block_by_number(&self, block_number: BlockNumber) -> Result> { + Ok( + self.client.block(block_number_to_id(block_number)).map(|block| Bytes::from(block.raw().to_vec())) + ) + } } diff --git a/rpc/src/v1/traits/parity.rs b/rpc/src/v1/traits/parity.rs index e3821355eee..9cf9edc98fb 100644 --- a/rpc/src/v1/traits/parity.rs +++ b/rpc/src/v1/traits/parity.rs @@ -232,4 +232,8 @@ pub trait Parity { /// Is allowed to skip filling transaction hash for faster query. #[rpc(name = "parity_getLogsNoTransactionHash")] fn logs_no_tx_hash(&self, Filter) -> BoxFuture>; + + /// Returns raw block RLP with given number. + #[rpc(name = "parity_getRawBlockByNumber")] + fn get_raw_block_by_number(&self, BlockNumber) -> Result>; } From 1136edbfe3e0860d96b9ea05c6cc8acfd41d7c05 Mon Sep 17 00:00:00 2001 From: Seun Date: Wed, 8 May 2019 12:23:45 +0100 Subject: [PATCH 2/3] added parity_submitRawBlock --- rpc/src/v1/helpers/errors.rs | 9 +++++++++ rpc/src/v1/impls/light/parity.rs | 11 ++++++++++- rpc/src/v1/impls/parity.rs | 21 +++++++++++++++++---- rpc/src/v1/traits/parity.rs | 6 +++++- 4 files changed, 41 insertions(+), 6 deletions(-) diff --git a/rpc/src/v1/helpers/errors.rs b/rpc/src/v1/helpers/errors.rs index 4845f76f561..023f7df3ccc 100644 --- a/rpc/src/v1/helpers/errors.rs +++ b/rpc/src/v1/helpers/errors.rs @@ -39,6 +39,7 @@ mod codes { pub const NO_NEW_WORK: i64 = -32003; pub const NO_WORK_REQUIRED: i64 = -32004; pub const CANNOT_SUBMIT_WORK: i64 = -32005; + pub const CANNOT_SUBMIT_BLOCK: i64 = -32006; pub const UNKNOWN_ERROR: i64 = -32009; pub const TRANSACTION_ERROR: i64 = -32010; pub const EXECUTION_ERROR: i64 = -32015; @@ -246,6 +247,14 @@ pub fn unavailable_block(no_ancient_block: bool, by_hash: bool) -> Error { } } +pub fn cannot_submit_block(err: EthcoreError) -> Error { + Error { + code: ErrorCode::ServerError(codes::CANNOT_SUBMIT_BLOCK), + message: "Cannot submit block.".into(), + data: Some(Value::String(err.to_string())), + } +} + pub fn check_block_number_existence<'a, T, C>( client: &'a C, num: BlockNumber, diff --git a/rpc/src/v1/impls/light/parity.rs b/rpc/src/v1/impls/light/parity.rs index 79a69cbd96f..f3dea5485db 100644 --- a/rpc/src/v1/impls/light/parity.rs +++ b/rpc/src/v1/impls/light/parity.rs @@ -48,6 +48,7 @@ use v1::types::{ }; use Host; use v1::helpers::errors::light_unimplemented; +use v1::types::block_number_to_id; /// Parity implementation for light client. pub struct ParityClient @@ -409,7 +410,15 @@ where verify_signature(is_prefixed, message, r, s, v, self.light_dispatch.client.signing_chain_id()) } - fn get_raw_block_by_number(&self, _: BlockNumber) -> Result> { + fn get_raw_block_by_number(&self, block: BlockNumber) -> BoxFuture> { + Box::new( + self.fetcher() + .block(block_number_to_id(block)) + .map(|block| Some(Bytes::from(block.raw().to_vec()))) + ) + } + + fn submit_raw_block(&self, _block: Bytes) -> Result { Err(light_unimplemented(None)) } } diff --git a/rpc/src/v1/impls/parity.rs b/rpc/src/v1/impls/parity.rs index ffdca0b29bf..6476a5f1e6c 100644 --- a/rpc/src/v1/impls/parity.rs +++ b/rpc/src/v1/impls/parity.rs @@ -49,6 +49,7 @@ use v1::types::{ block_number_to_id }; use Host; +use ethcore::verification::queue::kind::blocks::Unverified; /// Parity implementation. pub struct ParityClient { @@ -463,9 +464,21 @@ impl Parity for ParityClient where verify_signature(is_prefixed, message, r, s, v, self.client.signing_chain_id()) } - fn get_raw_block_by_number(&self, block_number: BlockNumber) -> Result> { - Ok( - self.client.block(block_number_to_id(block_number)).map(|block| Bytes::from(block.raw().to_vec())) - ) + fn get_raw_block_by_number(&self, block_number: BlockNumber) -> BoxFuture> { + Box::new(futures::done( + Ok( + self.client + .block(block_number_to_id(block_number)) + .map(|block| Bytes::from(block.raw().to_vec())) + ) + )) + } + + + fn submit_raw_block(&self, block: Bytes) -> Result { + let result = self.client.import_block( + Unverified::from_rlp(block.into_vec()).map_err(errors::rlp )? + ); + Ok(result.map_err(errors::cannot_submit_block)?) } } diff --git a/rpc/src/v1/traits/parity.rs b/rpc/src/v1/traits/parity.rs index 9cf9edc98fb..a89e1317191 100644 --- a/rpc/src/v1/traits/parity.rs +++ b/rpc/src/v1/traits/parity.rs @@ -235,5 +235,9 @@ pub trait Parity { /// Returns raw block RLP with given number. #[rpc(name = "parity_getRawBlockByNumber")] - fn get_raw_block_by_number(&self, BlockNumber) -> Result>; + fn get_raw_block_by_number(&self, BlockNumber) -> BoxFuture>; + + /// Submit raw block to be published to the network + #[rpc(name = "parity_submitRawBlock")] + fn submit_raw_block(&self, Bytes) -> Result; } From 4858c3ae8116298c5e944bb319034b282e6bb574 Mon Sep 17 00:00:00 2001 From: Seun LanLege Date: Fri, 10 May 2019 11:41:43 +0100 Subject: [PATCH 3/3] remove space Co-Authored-By: Andronik Ordian --- rpc/src/v1/impls/parity.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rpc/src/v1/impls/parity.rs b/rpc/src/v1/impls/parity.rs index 6476a5f1e6c..0430acb7568 100644 --- a/rpc/src/v1/impls/parity.rs +++ b/rpc/src/v1/impls/parity.rs @@ -477,7 +477,7 @@ impl Parity for ParityClient where fn submit_raw_block(&self, block: Bytes) -> Result { let result = self.client.import_block( - Unverified::from_rlp(block.into_vec()).map_err(errors::rlp )? + Unverified::from_rlp(block.into_vec()).map_err(errors::rlp)? ); Ok(result.map_err(errors::cannot_submit_block)?) }