openethereum/ethcore/src/error.rs

302 lines
9.8 KiB
Rust
Raw Normal View History

// Copyright 2015-2019 Parity Technologies (UK) Ltd.
// This file is part of Parity Ethereum.
2016-02-05 13:40:41 +01:00
// Parity Ethereum is free software: you can redistribute it and/or modify
2016-02-05 13:40:41 +01:00
// 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.
// Parity Ethereum is distributed in the hope that it will be useful,
2016-02-05 13:40:41 +01:00
// 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
// along with Parity Ethereum. If not, see <http://www.gnu.org/licenses/>.
2016-02-05 13:40:41 +01:00
2016-01-10 14:05:39 +01:00
//! General error types for use in ethcore.
Private transactions integration pr (#6422) * Private transaction message added * Empty line removed * Private transactions logic removed from client into the separate module * Fixed compilation after merge with head * Signed private transaction message added as well * Comments after the review fixed * Private tx execution * Test update * Renamed some methods * Fixed some tests * Reverted submodules * Fixed build * Private transaction message added * Empty line removed * Private transactions logic removed from client into the separate module * Fixed compilation after merge with head * Signed private transaction message added as well * Comments after the review fixed * Encrypted private transaction message and signed reply added * Private tx execution * Test update * Main scenario completed * Merged with the latest head * Private transactions API * Comments after review fixed * Parameters for private transactions added to parity arguments * New files added * New API methods added * Do not process packets from unconfirmed peers * Merge with ptm_ss branch * Encryption and permissioning with key server added * Fixed compilation after merge * Version of Parity protocol incremented in order to support private transactions * Doc strings for constants added * Proper format for doc string added * fixed some encryptor.rs grumbles * Private transactions functionality moved to the separate crate * Refactoring in order to remove late initialisation * Tests fixed after moving to the separate crate * Fetch method removed * Sync test helpers refactored * Interaction with encryptor refactored * Contract address retrieving via substate removed * Sensible gas limit for private transactions implemented * New private contract with nonces added * Parsing of the response from key server fixed * Build fixed after the merge, native contracts removed * Crate renamed * Tests moved to the separate directory * Handling of errors reworked in order to use error chain * Encodable macro added, new constructor replaced with default * Native ethabi usage removed * Couple conversions optimized * Interactions with client reworked * Errors omitting removed * Fix after merge * Fix after the merge * private transactions improvements in progress * private_transactions -> ethcore/private-tx * making private transactions more idiomatic * private-tx encryptor uses shared FetchClient and is more idiomatic * removed redundant tests, moved integration tests to tests/ dir * fixed failing service test * reenable add_notify on private tx provider * removed private_tx tests from sync module * removed commented out code * Use plain password instead of unlocking account manager * remove dead code * Link to the contract changed * Transaction signature chain replay protection module created * Redundant type conversion removed * Contract address returned by private provider * Test fixed * Addressing grumbles in PrivateTransactions (#8249) * Tiny fixes part 1. * A bunch of additional comments and todos. * Fix ethsync tests. * resolved merge conflicts * final private tx pr (#8318) * added cli option that enables private transactions * fixed failing test * fixed failing test * fixed failing test * fixed failing test
2018-04-09 16:14:33 +02:00
use std::{fmt, error};
use std::time::SystemTime;
use derive_more::{Display, From};
use ethereum_types::{H256, U256, Address, Bloom};
use ethkey::Error as EthkeyError;
use ethtrie::TrieError;
use rlp;
use snappy::InvalidInput;
Snapshot creation and restoration (#1679) * to_rlp takes self by-reference * clean up some derefs * out-of-order insertion for blockchain * implement block rebuilder without verification * group block chunk header into struct * block rebuilder does verification * integrate snapshot service with client service; flesh out implementation more * initial implementation of snapshot service * remove snapshottaker trait * snapshot writer trait with packed and loose implementations * write chunks using "snapshotwriter" in service * have snapshot taking use snapshotwriter * implement snapshot readers * back up client dbs when replacing * use snapshot reader in snapshot service * describe offset format * use new get_db_path in parity, allow some errors in service * blockchain formatting * implement parity snapshot * implement snapshot restore * force blocks to be submitted in order * fix bug loading block hashes in packed reader * fix seal field loading * fix uncle hash computation * fix a few bugs * store genesis state in db. reverse block chunk order in packed writer * allow out-of-order import for blocks * bring restoration types together * only snapshot the last 30000 blocks * restore into overlaydb instead of journaldb * commit version to database * use memorydbs and commit directly * fix trie test compilation * fix failing tests * sha3_null_rlp, not H256::zero * move overlaydb to ref_overlaydb, add new overlaydb without on-disk rc * port archivedb to new overlaydb * add deletion mode tests for overlaydb * use new overlaydb, check state root at end * share chain info between state and block snapshotting * create blocks snapshot using blockchain directly * allow snapshot from arbitrary block, remove panickers from snapshot creation * begin test framework * blockchain chunking test * implement stateproducer::tick * state snapshot test * create block and state chunks concurrently, better restoration informant * fix tests * add deletion mode tests for overlaydb * address comments * more tests * Fix up tests. * remove a few printlns * add a little more documentation to `commit` * fix tests * fix ref_overlaydb test names * snapshot command skeleton * revert ref_overlaydb renaming * reimplement snapshot commands * fix many errors * everything but inject * get ethcore compiling * get snapshot tests passing again * instrument snapshot commands again * fix fallout from other changes, mark snapshots as experimental * optimize injection patterns * do two injections * fix up tests * take snapshots from 1000 blocks efore * address minor comments * fix a few io crate related errors * clarify names about total difficulty [ci skip]
2016-08-05 17:00:46 +02:00
use snapshot::Error as SnapshotError;
use types::BlockNumber;
use types::transaction::Error as TransactionError;
use unexpected::{Mismatch, OutOfBounds};
use engines::EngineError;
Snapshot creation and restoration (#1679) * to_rlp takes self by-reference * clean up some derefs * out-of-order insertion for blockchain * implement block rebuilder without verification * group block chunk header into struct * block rebuilder does verification * integrate snapshot service with client service; flesh out implementation more * initial implementation of snapshot service * remove snapshottaker trait * snapshot writer trait with packed and loose implementations * write chunks using "snapshotwriter" in service * have snapshot taking use snapshotwriter * implement snapshot readers * back up client dbs when replacing * use snapshot reader in snapshot service * describe offset format * use new get_db_path in parity, allow some errors in service * blockchain formatting * implement parity snapshot * implement snapshot restore * force blocks to be submitted in order * fix bug loading block hashes in packed reader * fix seal field loading * fix uncle hash computation * fix a few bugs * store genesis state in db. reverse block chunk order in packed writer * allow out-of-order import for blocks * bring restoration types together * only snapshot the last 30000 blocks * restore into overlaydb instead of journaldb * commit version to database * use memorydbs and commit directly * fix trie test compilation * fix failing tests * sha3_null_rlp, not H256::zero * move overlaydb to ref_overlaydb, add new overlaydb without on-disk rc * port archivedb to new overlaydb * add deletion mode tests for overlaydb * use new overlaydb, check state root at end * share chain info between state and block snapshotting * create blocks snapshot using blockchain directly * allow snapshot from arbitrary block, remove panickers from snapshot creation * begin test framework * blockchain chunking test * implement stateproducer::tick * state snapshot test * create block and state chunks concurrently, better restoration informant * fix tests * add deletion mode tests for overlaydb * address comments * more tests * Fix up tests. * remove a few printlns * add a little more documentation to `commit` * fix tests * fix ref_overlaydb test names * snapshot command skeleton * revert ref_overlaydb renaming * reimplement snapshot commands * fix many errors * everything but inject * get ethcore compiling * get snapshot tests passing again * instrument snapshot commands again * fix fallout from other changes, mark snapshots as experimental * optimize injection patterns * do two injections * fix up tests * take snapshots from 1000 blocks efore * address minor comments * fix a few io crate related errors * clarify names about total difficulty [ci skip]
2016-08-05 17:00:46 +02:00
pub use executed::{ExecutionError, CallError};
2016-01-11 17:37:22 +01:00
2016-02-03 12:18:12 +01:00
/// Errors concerning block processing.
#[derive(Debug, Display, PartialEq, Clone, Eq)]
2016-01-10 14:05:39 +01:00
pub enum BlockError {
2016-02-03 12:18:12 +01:00
/// Block has too many uncles.
#[display(fmt = "Block has too many uncles. {}", _0)]
TooManyUncles(OutOfBounds<usize>),
2016-02-03 12:18:12 +01:00
/// Extra data is of an invalid length.
#[display(fmt = "Extra block data too long. {}", _0)]
2016-01-10 14:05:39 +01:00
ExtraDataOutOfBounds(OutOfBounds<usize>),
2016-02-03 12:18:12 +01:00
/// Seal is incorrect format.
#[display(fmt = "Block seal in incorrect format: {}", _0)]
2016-01-10 14:05:39 +01:00
InvalidSealArity(Mismatch<usize>),
2016-02-03 12:18:12 +01:00
/// Block has too much gas used.
#[display(fmt = "Block has too much gas used. {}", _0)]
TooMuchGasUsed(OutOfBounds<U256>),
2016-02-03 12:18:12 +01:00
/// Uncles hash in header is invalid.
#[display(fmt = "Block has invalid uncles hash: {}", _0)]
InvalidUnclesHash(Mismatch<H256>),
2016-02-03 12:18:12 +01:00
/// An uncle is from a generation too old.
#[display(fmt = "Uncle block is too old. {}", _0)]
UncleTooOld(OutOfBounds<BlockNumber>),
2016-02-03 12:18:12 +01:00
/// An uncle is from the same generation as the block.
#[display(fmt = "Uncle from same generation as block. {}", _0)]
UncleIsBrother(OutOfBounds<BlockNumber>),
2016-02-03 12:18:12 +01:00
/// An uncle is already in the chain.
#[display(fmt = "Uncle {} already in chain", _0)]
UncleInChain(H256),
/// An uncle is included twice.
#[display(fmt = "Uncle {} already in the header", _0)]
DuplicateUncle(H256),
2016-02-03 12:18:12 +01:00
/// An uncle has a parent not in the chain.
#[display(fmt = "Uncle {} has a parent not in the chain", _0)]
UncleParentNotInChain(H256),
2016-02-03 12:18:12 +01:00
/// State root header field is invalid.
#[display(fmt = "Invalid state root in header: {}", _0)]
2016-01-14 19:03:48 +01:00
InvalidStateRoot(Mismatch<H256>),
2016-02-03 12:18:12 +01:00
/// Gas used header field is invalid.
#[display(fmt = "Invalid gas used in header: {}", _0)]
2016-01-14 19:03:48 +01:00
InvalidGasUsed(Mismatch<U256>),
2016-02-03 12:18:12 +01:00
/// Transactions root header field is invalid.
#[display(fmt = "Invalid transactions root in header: {}", _0)]
InvalidTransactionsRoot(Mismatch<H256>),
2016-02-03 12:18:12 +01:00
/// Difficulty is out of range; this can be used as an looser error prior to getting a definitive
/// value for difficulty. This error needs only provide bounds of which it is out.
#[display(fmt = "Difficulty out of bounds: {}", _0)]
2016-02-03 12:18:12 +01:00
DifficultyOutOfBounds(OutOfBounds<U256>),
/// Difficulty header field is invalid; this is a strong error used after getting a definitive
/// value for difficulty (which is provided).
#[display(fmt = "Invalid block difficulty: {}", _0)]
InvalidDifficulty(Mismatch<U256>),
2016-02-03 12:18:12 +01:00
/// Seal element of type H256 (max_hash for Ethash, but could be something else for
/// other seal engines) is out of bounds.
#[display(fmt = "Seal element out of bounds: {}", _0)]
2016-02-03 12:18:12 +01:00
MismatchedH256SealElement(Mismatch<H256>),
/// Proof-of-work aspect of seal, which we assume is a 256-bit value, is invalid.
#[display(fmt = "Block has invalid PoW: {}", _0)]
2016-02-03 12:18:12 +01:00
InvalidProofOfWork(OutOfBounds<U256>),
/// Some low-level aspect of the seal is incorrect.
#[display(fmt = "Block has invalid seal.")]
InvalidSeal,
2016-02-03 12:18:12 +01:00
/// Gas limit header field is invalid.
#[display(fmt = "Invalid gas limit: {}", _0)]
InvalidGasLimit(OutOfBounds<U256>),
2016-02-03 12:18:12 +01:00
/// Receipts trie root header field is invalid.
#[display(fmt = "Invalid receipts trie root in header: {}", _0)]
2016-02-03 12:18:12 +01:00
InvalidReceiptsRoot(Mismatch<H256>),
/// Timestamp header field is invalid.
#[display(fmt = "Invalid timestamp in header: {}", _0)]
InvalidTimestamp(OutOfBoundsTime),
/// Timestamp header field is too far in future.
#[display(fmt = "Future timestamp in header: {}", _0)]
TemporarilyInvalid(OutOfBoundsTime),
2016-02-03 12:18:12 +01:00
/// Log bloom header field is invalid.
#[display(fmt = "Invalid log bloom in header: {}", _0)]
InvalidLogBloom(Box<Mismatch<Bloom>>),
2016-02-03 12:18:12 +01:00
/// Number field of header is invalid.
#[display(fmt = "Invalid number in header: {}", _0)]
InvalidNumber(Mismatch<BlockNumber>),
/// Block number isn't sensible.
#[display(fmt = "Implausible block number. {}", _0)]
RidiculousNumber(OutOfBounds<BlockNumber>),
/// Timestamp header overflowed
#[display(fmt = "Timestamp overflow")]
TimestampOverflow,
/// Too many transactions from a particular address.
#[display(fmt = "Too many transactions from: {}", _0)]
TooManyTransactions(Address),
2016-02-03 12:18:12 +01:00
/// Parent given is unknown.
#[display(fmt = "Unknown parent: {}", _0)]
UnknownParent(H256),
2016-02-03 12:18:12 +01:00
/// Uncle parent given is unknown.
#[display(fmt = "Unknown uncle parent: {}", _0)]
UnknownUncleParent(H256),
/// No transition to epoch number.
#[display(fmt = "Unknown transition to epoch number: {}", _0)]
UnknownEpochTransition(u64),
2016-01-10 14:05:39 +01:00
}
/// Newtype for Display impl to show seconds
#[derive(Debug, Clone, From, PartialEq, Eq)]
pub struct OutOfBoundsTime(OutOfBounds<SystemTime>);
impl fmt::Display for OutOfBoundsTime {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let seconds = self.0
.map(|st| st.elapsed().unwrap_or_default().as_secs());
f.write_fmt(format_args!("{}", seconds))
}
}
impl error::Error for BlockError {
fn description(&self) -> &str {
"Block error"
}
2016-01-10 23:37:09 +01:00
}
/// Queue error
#[derive(Debug, Display, From)]
pub enum QueueError {
/// Queue is full
#[display(fmt = "Queue is full ({})", _0)]
Full(usize),
/// Io channel error
#[display(fmt = "Io channel error: {}", _0)]
Channel(::io::IoError)
}
impl error::Error for QueueError {
fn source(&self) -> Option<&(dyn error::Error + 'static)> {
match self {
QueueError::Channel(e) => Some(e),
_ => None,
}
}
}
/// Block import Error
#[derive(Debug, Display)]
pub enum ImportError {
/// Already in the block chain.
#[display(fmt = "Block already in chain")]
AlreadyInChain,
/// Already in the block queue
#[display(fmt = "block already in the block queue")]
AlreadyQueued,
/// Already marked as bad from a previous import (could mean parent is bad)
#[display(fmt = "block known to be bad")]
KnownBad,
}
impl error::Error for ImportError {}
/// Api-level error for transaction import
#[derive(Debug, Clone)]
pub enum TransactionImportError {
/// Transaction error
Transaction(TransactionError),
/// Other error
Other(String),
}
impl From<Error> for TransactionImportError {
fn from(e: Error) -> Self {
match e {
Error::Transaction(transaction_error) => TransactionImportError::Transaction(transaction_error),
_ => TransactionImportError::Other(format!("other block import error: {:?}", e)),
}
}
}
/// Ethcore Result
pub type EthcoreResult<T> = Result<T, Error>;
/// Ethcore Error
#[derive(Debug, Display, From)]
pub enum Error {
/// Error concerning block import.
#[display(fmt = "Import error: {}", _0)]
Import(ImportError),
/// Io channel queue error
#[display(fmt = "Queue error: {}", _0)]
Queue(QueueError),
/// Io create error
#[display(fmt = "Io error: {}", _0)]
Io(::io::IoError),
/// Error concerning the Rust standard library's IO subsystem.
#[display(fmt = "Std Io error: {}", _0)]
StdIo(::std::io::Error),
/// Error concerning TrieDBs.
#[display(fmt = "Trie error: {}", _0)]
Trie(TrieError),
/// Error concerning EVM code execution.
#[display(fmt = "Execution error: {}", _0)]
Execution(ExecutionError),
/// Error concerning block processing.
#[display(fmt = "Block error: {}", _0)]
Block(BlockError),
/// Error concerning transaction processing.
#[display(fmt = "Transaction error: {}", _0)]
Transaction(TransactionError),
/// Snappy error
#[display(fmt = "Snappy error: {}", _0)]
Snappy(InvalidInput),
/// Consensus vote error.
#[display(fmt = "Engine error: {}", _0)]
Engine(EngineError),
/// Ethkey error."
#[display(fmt = "Ethkey error: {}", _0)]
Ethkey(EthkeyError),
/// RLP decoding errors
#[display(fmt = "Decoder error: {}", _0)]
Decoder(rlp::DecoderError),
/// Snapshot error.
#[display(fmt = "Snapshot error {}", _0)]
Snapshot(SnapshotError),
/// PoW hash is invalid or out of date.
#[display(fmt = "PoW hash is invalid or out of date.")]
PowHashInvalid,
/// The value of the nonce or mishash is invalid.
#[display(fmt = "The value of the nonce or mishash is invalid.")]
PowInvalid,
/// Unknown engine given
#[display(fmt = "Unknown engine name ({})", _0)]
UnknownEngineName(String),
/// A convenient variant for String.
#[display(fmt = "{}", _0)]
Msg(String),
}
2018-07-02 11:04:48 +02:00
impl error::Error for Error {
fn source(&self) -> Option<&(dyn error::Error + 'static)> {
match self {
Error::Io(e) => Some(e),
Error::StdIo(e) => Some(e),
Error::Trie(e) => Some(e),
Error::Execution(e) => Some(e),
Error::Block(e) => Some(e),
Error::Transaction(e) => Some(e),
Error::Snappy(e) => Some(e),
Error::Engine(e) => Some(e),
Error::Ethkey(e) => Some(e),
Error::Decoder(e) => Some(e),
Error::Snapshot(e) => Some(e),
_ => None,
}
}
}
2016-01-10 14:05:39 +01:00
impl From<String> for Error {
fn from(s: String) -> Self {
Error::Msg(s)
2016-01-11 17:37:22 +01:00
}
}
impl From<&str> for Error {
fn from(s: &str) -> Self {
Error::Msg(s.into())
Snapshot creation and restoration (#1679) * to_rlp takes self by-reference * clean up some derefs * out-of-order insertion for blockchain * implement block rebuilder without verification * group block chunk header into struct * block rebuilder does verification * integrate snapshot service with client service; flesh out implementation more * initial implementation of snapshot service * remove snapshottaker trait * snapshot writer trait with packed and loose implementations * write chunks using "snapshotwriter" in service * have snapshot taking use snapshotwriter * implement snapshot readers * back up client dbs when replacing * use snapshot reader in snapshot service * describe offset format * use new get_db_path in parity, allow some errors in service * blockchain formatting * implement parity snapshot * implement snapshot restore * force blocks to be submitted in order * fix bug loading block hashes in packed reader * fix seal field loading * fix uncle hash computation * fix a few bugs * store genesis state in db. reverse block chunk order in packed writer * allow out-of-order import for blocks * bring restoration types together * only snapshot the last 30000 blocks * restore into overlaydb instead of journaldb * commit version to database * use memorydbs and commit directly * fix trie test compilation * fix failing tests * sha3_null_rlp, not H256::zero * move overlaydb to ref_overlaydb, add new overlaydb without on-disk rc * port archivedb to new overlaydb * add deletion mode tests for overlaydb * use new overlaydb, check state root at end * share chain info between state and block snapshotting * create blocks snapshot using blockchain directly * allow snapshot from arbitrary block, remove panickers from snapshot creation * begin test framework * blockchain chunking test * implement stateproducer::tick * state snapshot test * create block and state chunks concurrently, better restoration informant * fix tests * add deletion mode tests for overlaydb * address comments * more tests * Fix up tests. * remove a few printlns * add a little more documentation to `commit` * fix tests * fix ref_overlaydb test names * snapshot command skeleton * revert ref_overlaydb renaming * reimplement snapshot commands * fix many errors * everything but inject * get ethcore compiling * get snapshot tests passing again * instrument snapshot commands again * fix fallout from other changes, mark snapshots as experimental * optimize injection patterns * do two injections * fix up tests * take snapshots from 1000 blocks efore * address minor comments * fix a few io crate related errors * clarify names about total difficulty [ci skip]
2016-08-05 17:00:46 +02:00
}
}
impl<E> From<Box<E>> for Error where Error: From<E> {
fn from(err: Box<E>) -> Error {
Error::from(*err)
}
}