openethereum/crates/rpc/src/v1/impls/debug.rs

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

116 lines
4.5 KiB
Rust
Raw Normal View History

2020-09-22 14:53:52 +02:00
// Copyright 2015-2020 Parity Technologies (UK) Ltd.
// This file is part of OpenEthereum.
2020-09-22 14:53:52 +02:00
// OpenEthereum 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.
2020-09-22 14:53:52 +02:00
// OpenEthereum 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
2020-09-22 14:53:52 +02:00
// along with OpenEthereum. If not, see <http://www.gnu.org/licenses/>.
//! Debug APIs RPC implementation
use std::sync::Arc;
use ethcore::client::BlockChainClient;
use types::{header::Header, transaction::LocalizedTransaction};
use jsonrpc_core::Result;
use v1::{
traits::Debug,
types::{Block, BlockTransactions, Bytes, RichBlock, Transaction},
};
/// Debug rpc implementation.
pub struct DebugClient<C> {
client: Arc<C>,
}
impl<C> DebugClient<C> {
/// Creates new debug client.
pub fn new(client: Arc<C>) -> Self {
Self { client }
}
}
impl<C: BlockChainClient + 'static> Debug for DebugClient<C> {
fn bad_blocks(&self) -> Result<Vec<RichBlock>> {
fn cast<O, T: Copy + Into<O>>(t: &T) -> O {
(*t).into()
}
Ok(self
.client
.bad_blocks()
.into_iter()
.map(|(block, reason)| {
let number = block.header.number();
let hash = block.header.hash();
RichBlock {
inner: Block {
hash: Some(hash),
size: Some(block.bytes.len().into()),
parent_hash: cast(block.header.parent_hash()),
uncles_hash: cast(block.header.uncles_hash()),
author: cast(block.header.author()),
miner: cast(block.header.author()),
state_root: cast(block.header.state_root()),
receipts_root: cast(block.header.receipts_root()),
number: Some(number.into()),
gas_used: cast(block.header.gas_used()),
gas_limit: cast(block.header.gas_limit()),
logs_bloom: Some(cast(block.header.log_bloom())),
timestamp: block.header.timestamp().into(),
difficulty: cast(block.header.difficulty()),
total_difficulty: None,
seal_fields: block
.header
.seal()
.iter()
.cloned()
.map(Into::into)
.collect(),
Sunce86/eip 1559 (#393) * eip1559 hard fork activation * eip1559 hard fork activation 2 * added new transaction type for eip1559 * added base fee field to block header * fmt fix * added base fee calculation. added block header validation against base fee * fmt * temporarily added modified transaction pool * tx pool fix of PendingIterator * tx pool fix of UnorderedIterator * tx pool added test for set_scoring * transaction pool changes * added tests for eip1559 transaction and eip1559 receipt * added test for eip1559 transaction execution * block gas limit / block gas target handling * base fee verification moved out of engine * calculate_base_fee moved to EthereumMachine * handling of base_fee_per_gas as part of seal * handling of base_fee_per_gas changed. Different encoding/decoding of block header * eip1559 transaction execution - gas price handling * eip1559 transaction execution - verification, fee burning * effectiveGasPrice removed from the receipt payload (specs) * added support for 1559 txs in tx pool verification * added Aleut test network configuration * effective_tip_scaled replaced by typed_gas_price * eip 3198 - Basefee opcode * rpc - updated structs Block and Header * rpc changes for 1559 * variable renaming according to spec * - typed_gas_price renamed to effective_gas_price - elasticity_multiplier definition moved to update_schedule() * calculate_base_fee simplified * Evm environment context temporary fix for gas limit * fmt fix * fixed fake_sign::sign_call * temporary fix for GASLIMIT opcode to provide gas_target actually * gas_target removed from block header according to spec change: https://github.com/ethereum/EIPs/pull/3566 * tx pool verification fix * env_info base fee changed to Option * fmt fix * pretty format * updated ethereum tests * cache_pending refresh on each update of score * code review fixes * fmt fix * code review fix - changed handling of eip1559_base_fee_max_change_denominator * code review fix - modification.gas_price * Skip gas_limit_bump for Aura * gas_limit calculation changed to target ceil * gas_limit calculation will target ceil on 1559 activation block * transaction verification updated according spec: https://github.com/ethereum/EIPs/pull/3594 * updated json tests * ethereum json tests fix for base_fee
2021-06-04 12:12:24 +02:00
base_fee_per_gas: block.header.base_fee(),
uncles: block.uncles.iter().map(Header::hash).collect(),
transactions: BlockTransactions::Full(
block
.transactions
.into_iter()
.enumerate()
.map(|(transaction_index, signed)| {
Transaction::from_localized(LocalizedTransaction {
block_number: number,
block_hash: hash,
transaction_index,
signed,
cached_sender: None,
})
2020-08-05 06:08:03 +02:00
})
.collect(),
),
transactions_root: cast(block.header.transactions_root()),
extra_data: block.header.extra_data().clone().into(),
},
extra_info: vec![
("reason".to_owned(), reason),
("rlp".to_owned(), serialize(&Bytes(block.bytes))),
("hash".to_owned(), format!("{:#x}", hash)),
]
.into_iter()
.collect(),
}
})
.collect())
}
}
fn serialize<T: ::serde::Serialize>(t: &T) -> String {
::serde_json::to_string(t).expect("RPC types serialization is non-fallible.")
}