Client api cleaning - uncles are returned as rlp (#1516)
* uncle as rlp in the api * uncle rlp in block view * fix warning
This commit is contained in:
parent
d8a4cca817
commit
8102fb9306
@ -22,7 +22,7 @@ use util::*;
|
|||||||
use util::panics::*;
|
use util::panics::*;
|
||||||
use views::BlockView;
|
use views::BlockView;
|
||||||
use error::{Error, ImportError, ExecutionError, BlockError, ImportResult};
|
use error::{Error, ImportError, ExecutionError, BlockError, ImportResult};
|
||||||
use header::{BlockNumber, Header};
|
use header::{BlockNumber};
|
||||||
use state::State;
|
use state::State;
|
||||||
use spec::Spec;
|
use spec::Spec;
|
||||||
use engine::Engine;
|
use engine::Engine;
|
||||||
@ -585,9 +585,9 @@ impl BlockChainClient for Client {
|
|||||||
self.transaction_address(id).and_then(|address| self.chain.transaction(&address))
|
self.transaction_address(id).and_then(|address| self.chain.transaction(&address))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn uncle(&self, id: UncleID) -> Option<Header> {
|
fn uncle(&self, id: UncleID) -> Option<Bytes> {
|
||||||
let index = id.1;
|
let index = id.position;
|
||||||
self.block(id.0).and_then(|block| BlockView::new(&block).uncle_at(index))
|
self.block(id.block).and_then(|block| BlockView::new(&block).uncle_rlp_at(index))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn transaction_receipt(&self, id: TransactionID) -> Option<LocalizedReceipt> {
|
fn transaction_receipt(&self, id: TransactionID) -> Option<LocalizedReceipt> {
|
||||||
|
@ -38,7 +38,7 @@ use util::Itertools;
|
|||||||
use blockchain::TreeRoute;
|
use blockchain::TreeRoute;
|
||||||
use block_queue::BlockQueueInfo;
|
use block_queue::BlockQueueInfo;
|
||||||
use block::{OpenBlock, SealedBlock};
|
use block::{OpenBlock, SealedBlock};
|
||||||
use header::{BlockNumber, Header};
|
use header::{BlockNumber};
|
||||||
use transaction::{LocalizedTransaction, SignedTransaction};
|
use transaction::{LocalizedTransaction, SignedTransaction};
|
||||||
use log_entry::LocalizedLogEntry;
|
use log_entry::LocalizedLogEntry;
|
||||||
use filter::Filter;
|
use filter::Filter;
|
||||||
@ -126,7 +126,7 @@ pub trait BlockChainClient : Sync + Send {
|
|||||||
fn transaction(&self, id: TransactionID) -> Option<LocalizedTransaction>;
|
fn transaction(&self, id: TransactionID) -> Option<LocalizedTransaction>;
|
||||||
|
|
||||||
/// Get uncle with given id.
|
/// Get uncle with given id.
|
||||||
fn uncle(&self, id: UncleID) -> Option<Header>;
|
fn uncle(&self, id: UncleID) -> Option<Bytes>;
|
||||||
|
|
||||||
/// Get transaction receipt with given hash.
|
/// Get transaction receipt with given hash.
|
||||||
fn transaction_receipt(&self, id: TransactionID) -> Option<LocalizedReceipt>;
|
fn transaction_receipt(&self, id: TransactionID) -> Option<LocalizedReceipt>;
|
||||||
|
@ -298,7 +298,7 @@ impl BlockChainClient for TestBlockChainClient {
|
|||||||
unimplemented!();
|
unimplemented!();
|
||||||
}
|
}
|
||||||
|
|
||||||
fn uncle(&self, _id: UncleID) -> Option<BlockHeader> {
|
fn uncle(&self, _id: UncleID) -> Option<Bytes> {
|
||||||
unimplemented!();
|
unimplemented!();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -55,10 +55,10 @@ pub struct TraceId {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Uniquely identifies Uncle.
|
/// Uniquely identifies Uncle.
|
||||||
#[derive(Debug)]
|
#[derive(Debug, Binary)]
|
||||||
pub struct UncleID (
|
pub struct UncleID {
|
||||||
/// Block id.
|
/// Block id.
|
||||||
pub BlockID,
|
pub block: BlockID,
|
||||||
/// Position in block.
|
/// Position in block.
|
||||||
pub usize
|
pub position: usize
|
||||||
);
|
}
|
||||||
|
@ -139,6 +139,11 @@ impl<'a> BlockView<'a> {
|
|||||||
pub fn uncle_at(&self, index: usize) -> Option<Header> {
|
pub fn uncle_at(&self, index: usize) -> Option<Header> {
|
||||||
self.rlp.at(2).iter().nth(index).map(|rlp| rlp.as_val())
|
self.rlp.at(2).iter().nth(index).map(|rlp| rlp.as_val())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Return nth uncle rlp.
|
||||||
|
pub fn uncle_rlp_at(&self, index: usize) -> Option<Bytes> {
|
||||||
|
self.rlp.at(2).iter().nth(index).map(|rlp| rlp.as_raw().to_vec())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> Hashable for BlockView<'a> {
|
impl<'a> Hashable for BlockView<'a> {
|
||||||
|
@ -41,6 +41,7 @@ use v1::traits::Eth;
|
|||||||
use v1::types::{Block, BlockTransactions, BlockNumber, Bytes, SyncStatus, SyncInfo, Transaction, CallRequest, OptionalValue, Index, Filter, Log, Receipt};
|
use v1::types::{Block, BlockTransactions, BlockNumber, Bytes, SyncStatus, SyncInfo, Transaction, CallRequest, OptionalValue, Index, Filter, Log, Receipt};
|
||||||
use v1::impls::{default_gas_price, dispatch_transaction, error_codes};
|
use v1::impls::{default_gas_price, dispatch_transaction, error_codes};
|
||||||
use serde;
|
use serde;
|
||||||
|
use ethcore::header::Header as BlockHeader;
|
||||||
|
|
||||||
/// Eth rpc implementation.
|
/// Eth rpc implementation.
|
||||||
pub struct EthClient<C, S, M, EM> where
|
pub struct EthClient<C, S, M, EM> where
|
||||||
@ -126,8 +127,16 @@ impl<C, S, M, EM> EthClient<C, S, M, EM> where
|
|||||||
|
|
||||||
fn uncle(&self, id: UncleID) -> Result<Value, Error> {
|
fn uncle(&self, id: UncleID) -> Result<Value, Error> {
|
||||||
let client = take_weak!(self.client);
|
let client = take_weak!(self.client);
|
||||||
match client.uncle(id).and_then(|u| client.block_total_difficulty(BlockID::Hash(u.parent_hash().clone())).map(|diff| (diff, u))) {
|
|
||||||
Some((parent_difficulty, uncle)) => {
|
let uncle: BlockHeader = match client.uncle(id) {
|
||||||
|
Some(rlp) => decode(&rlp),
|
||||||
|
None => { return Ok(Value::Null); }
|
||||||
|
};
|
||||||
|
let parent_difficulty = match client.block_total_difficulty(BlockID::Hash(uncle.parent_hash().clone())) {
|
||||||
|
Some(difficulty) => difficulty,
|
||||||
|
None => { return Ok(Value::Null); }
|
||||||
|
};
|
||||||
|
|
||||||
let block = Block {
|
let block = Block {
|
||||||
hash: OptionalValue::Value(uncle.hash()),
|
hash: OptionalValue::Value(uncle.hash()),
|
||||||
parent_hash: uncle.parent_hash,
|
parent_hash: uncle.parent_hash,
|
||||||
@ -150,9 +159,6 @@ impl<C, S, M, EM> EthClient<C, S, M, EM> where
|
|||||||
transactions: BlockTransactions::Hashes(vec![]),
|
transactions: BlockTransactions::Hashes(vec![]),
|
||||||
};
|
};
|
||||||
to_value(&block)
|
to_value(&block)
|
||||||
},
|
|
||||||
None => Ok(Value::Null)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn sign_call(&self, request: CallRequest) -> Result<SignedTransaction, Error> {
|
fn sign_call(&self, request: CallRequest) -> Result<SignedTransaction, Error> {
|
||||||
@ -435,12 +441,12 @@ impl<C, S, M, EM> Eth for EthClient<C, S, M, EM> where
|
|||||||
|
|
||||||
fn uncle_by_block_hash_and_index(&self, params: Params) -> Result<Value, Error> {
|
fn uncle_by_block_hash_and_index(&self, params: Params) -> Result<Value, Error> {
|
||||||
from_params::<(H256, Index)>(params)
|
from_params::<(H256, Index)>(params)
|
||||||
.and_then(|(hash, index)| self.uncle(UncleID(BlockID::Hash(hash), index.value())))
|
.and_then(|(hash, index)| self.uncle(UncleID { block: BlockID::Hash(hash), position: index.value() }))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn uncle_by_block_number_and_index(&self, params: Params) -> Result<Value, Error> {
|
fn uncle_by_block_number_and_index(&self, params: Params) -> Result<Value, Error> {
|
||||||
from_params::<(BlockNumber, Index)>(params)
|
from_params::<(BlockNumber, Index)>(params)
|
||||||
.and_then(|(number, index)| self.uncle(UncleID(number.into(), index.value())))
|
.and_then(|(number, index)| self.uncle(UncleID { block: number.into(), position: index.value() }))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn compilers(&self, params: Params) -> Result<Value, Error> {
|
fn compilers(&self, params: Params) -> Result<Value, Error> {
|
||||||
|
Loading…
Reference in New Issue
Block a user