2019-01-07 11:33:07 +01:00
|
|
|
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
|
|
|
// This file is part of Parity Ethereum.
|
2018-04-13 17:34:27 +02:00
|
|
|
|
2019-01-07 11:33:07 +01:00
|
|
|
// Parity Ethereum is free software: you can redistribute it and/or modify
|
2018-04-13 17:34:27 +02: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.
|
|
|
|
|
2019-01-07 11:33:07 +01:00
|
|
|
// Parity Ethereum is distributed in the hope that it will be useful,
|
2018-04-13 17:34:27 +02: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
|
2019-01-07 11:33:07 +01:00
|
|
|
// along with Parity Ethereum. If not, see <http://www.gnu.org/licenses/>.
|
2018-04-13 17:34:27 +02:00
|
|
|
|
|
|
|
//! Transaction Pool state client.
|
|
|
|
//!
|
|
|
|
//! `Client` encapsulates all external data required for the verifaction and readiness.
|
|
|
|
//! It includes any Ethereum state parts required for checking the transaction and
|
|
|
|
//! any consensus-required structure of the transaction.
|
|
|
|
|
|
|
|
use std::fmt;
|
|
|
|
|
|
|
|
use ethereum_types::{U256, H256, H160 as Address};
|
2019-01-04 14:05:46 +01:00
|
|
|
use types::transaction;
|
2018-04-13 17:34:27 +02:00
|
|
|
|
|
|
|
/// Account Details
|
|
|
|
#[derive(Debug, Clone)]
|
|
|
|
pub struct AccountDetails {
|
|
|
|
/// Current account nonce
|
|
|
|
pub nonce: U256,
|
|
|
|
/// Current account balance
|
|
|
|
pub balance: U256,
|
|
|
|
/// Is this account a local account?
|
|
|
|
pub is_local: bool,
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Transaction type
|
|
|
|
#[derive(Debug, PartialEq)]
|
|
|
|
pub enum TransactionType {
|
|
|
|
/// Regular transaction
|
|
|
|
Regular,
|
|
|
|
/// Service transaction (allowed by a contract to have gas_price=0)
|
|
|
|
Service,
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Verification client.
|
|
|
|
pub trait Client: fmt::Debug + Sync {
|
|
|
|
/// Is transaction with given hash already in the blockchain?
|
|
|
|
fn transaction_already_included(&self, hash: &H256) -> bool;
|
|
|
|
|
|
|
|
/// Structurarily verify given transaction.
|
|
|
|
fn verify_transaction(&self, tx: transaction::UnverifiedTransaction)
|
|
|
|
-> Result<transaction::SignedTransaction, transaction::Error>;
|
|
|
|
|
|
|
|
/// Estimate minimal gas requirurement for given transaction.
|
|
|
|
fn required_gas(&self, tx: &transaction::Transaction) -> U256;
|
|
|
|
|
|
|
|
/// Fetch account details for given sender.
|
|
|
|
fn account_details(&self, address: &Address) -> AccountDetails;
|
|
|
|
|
|
|
|
/// Classify transaction (check if transaction is filtered by some contracts).
|
|
|
|
fn transaction_type(&self, tx: &transaction::SignedTransaction) -> TransactionType;
|
2018-04-27 15:02:45 +02:00
|
|
|
|
|
|
|
/// Performs pre-validation of RLP decoded transaction
|
|
|
|
fn decode_transaction(&self, transaction: &[u8])
|
|
|
|
-> Result<transaction::UnverifiedTransaction, transaction::Error>;
|
2018-04-13 17:34:27 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/// State nonce client
|
|
|
|
pub trait NonceClient: fmt::Debug + Sync {
|
|
|
|
/// Fetch only account nonce for given sender.
|
|
|
|
fn account_nonce(&self, address: &Address) -> U256;
|
|
|
|
}
|