;
/// Transaction hash type for a pool.
pub type TxHash =
::Hash;
/// Block hash type for a pool.
pub type BlockHash
= <
::Block as BlockT>::Hash;
/// Transaction type for a pool.
pub type TransactionFor
= <
::Block as BlockT>::Extrinsic;
/// Type of transactions event stream for a pool.
pub type TransactionStatusStreamFor
= TransactionStatusStream, BlockHash>;
/// Typical future type used in transaction pool api.
pub type PoolFuture = std::pin::Pin> + Send>>;
/// In-pool transaction interface.
///
/// The pool is container of transactions that are implementing this trait.
/// See `sp_runtime::ValidTransaction` for details about every field.
pub trait InPoolTransaction {
/// Transaction type.
type Transaction;
/// Transaction hash type.
type Hash;
/// Get the reference to the transaction data.
fn data(&self) -> &Self::Transaction;
/// Get hash of the transaction.
fn hash(&self) -> &Self::Hash;
/// Get priority of the transaction.
fn priority(&self) -> &TransactionPriority;
/// Get longevity of the transaction.
fn longevity(&self) ->&TransactionLongevity;
/// Get transaction dependencies.
fn requires(&self) -> &[TransactionTag];
/// Get tags that transaction provides.
fn provides(&self) -> &[TransactionTag];
/// Return a flag indicating if the transaction should be propagated to other peers.
fn is_propagable(&self) -> bool;
}
/// Transaction pool interface.
pub trait TransactionPool: Send + Sync {
/// Block type.
type Block: BlockT;
/// Transaction hash type.
type Hash: Hash + Eq + Member + Serialize;
/// In-pool transaction type.
type InPoolTransaction: InPoolTransaction<
Transaction = TransactionFor,
Hash = TxHash
>;
/// Error type.
type Error: From + crate::error::IntoPoolError;
// *** RPC
/// Returns a future that imports a bunch of unverified transactions to the pool.
fn submit_at(
&self,
at: &BlockId,
source: TransactionSource,
xts: Vec>,
) -> PoolFuture, Self::Error>>, Self::Error>;
/// Returns a future that imports one unverified transaction to the pool.
fn submit_one(
&self,
at: &BlockId,
source: TransactionSource,
xt: TransactionFor,
) -> PoolFuture, Self::Error>;
/// Returns a future that import a single transaction and starts to watch their progress in the pool.
fn submit_and_watch(
&self,
at: &BlockId,
source: TransactionSource,
xt: TransactionFor,
) -> PoolFuture>, Self::Error>;
// *** Block production / Networking
/// Get an iterator for ready transactions ordered by priority.
///
/// Guarantees to return only when transaction pool got updated at `at` block.
/// Guarantees to return immediately when `None` is passed.
fn ready_at(&self, at: NumberFor)
-> Pin> + Send>> + Send>>;
/// Get an iterator for ready transactions ordered by priority.
fn ready(&self) -> Box> + Send>;
// *** Block production
/// Remove transactions identified by given hashes (and dependent transactions) from the pool.
fn remove_invalid(&self, hashes: &[TxHash]) -> Vec>;
// *** logging
/// Returns pool status.
fn status(&self) -> PoolStatus;
// *** logging / RPC / networking
/// Return an event stream of transactions imported to the pool.
fn import_notification_stream(&self) -> ImportNotificationStream>;
// *** networking
/// Notify the pool about transactions broadcast.
fn on_broadcasted(&self, propagations: HashMap, Vec>);
/// Returns transaction hash
fn hash_of(&self, xt: &TransactionFor) -> TxHash;
/// Return specific ready transaction by hash, if there is one.
fn ready_transaction(&self, hash: &TxHash) -> Option>;
}
/// Events that the transaction pool listens for.
pub enum ChainEvent {
/// New blocks have been added to the chain
NewBlock {
/// Is this the new best block.
is_new_best: bool,
/// Id of the just imported block.
id: BlockId,
/// Header of the just imported block
header: B::Header,
/// List of retracted blocks ordered by block number.
retracted: Vec,
},
/// An existing block has been finalized.
Finalized {
/// Hash of just finalized block
hash: B::Hash,
},
}
/// Trait for transaction pool maintenance.
pub trait MaintainedTransactionPool: TransactionPool {
/// Perform maintenance
fn maintain(&self, event: ChainEvent) -> Pin + Send>>;
}
/// An abstraction for transaction pool.
///
/// This trait is used by offchain calls to be able to submit transactions.
/// The main use case is for offchain workers, to feed back the results of computations,
/// but since the transaction pool access is a separate `ExternalitiesExtension` it can
/// be also used in context of other offchain calls. For one may generate and submit
/// a transaction for some misbehavior reports (say equivocation).
pub trait OffchainSubmitTransaction: Send + Sync {
/// Submit transaction.
///
/// The transaction will end up in the pool and be propagated to others.
fn submit_at(
&self,
at: &BlockId,
extrinsic: Block::Extrinsic,
) -> Result<(), ()>;
}
impl OffchainSubmitTransaction for TPool {
fn submit_at(
&self,
at: &BlockId,
extrinsic: ::Extrinsic,
) -> Result<(), ()> {
log::debug!(
target: "txpool",
"(offchain call) Submitting a transaction to the pool: {:?}",
extrinsic
);
let result = futures::executor::block_on(self.submit_one(
&at, TransactionSource::Local, extrinsic,
));
result.map(|_| ())
.map_err(|e| log::warn!(
target: "txpool",
"(offchain call) Error submitting a transaction to the pool: {:?}",
e
))
}
}