mirror of
https://github.com/hl-archive-node/nanoreth.git
synced 2025-12-06 10:59:55 +00:00
feat: merge BlockBodyTxExt trait into BlockBody (#13613)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
This commit is contained in:
1
Cargo.lock
generated
1
Cargo.lock
generated
@ -8782,6 +8782,7 @@ dependencies = [
|
|||||||
"proptest",
|
"proptest",
|
||||||
"proptest-arbitrary-interop",
|
"proptest-arbitrary-interop",
|
||||||
"rand 0.8.5",
|
"rand 0.8.5",
|
||||||
|
"rayon",
|
||||||
"reth-codecs",
|
"reth-codecs",
|
||||||
"revm-primitives",
|
"revm-primitives",
|
||||||
"secp256k1",
|
"secp256k1",
|
||||||
|
|||||||
@ -15,7 +15,7 @@ workspace = true
|
|||||||
reth-chainspec.workspace = true
|
reth-chainspec.workspace = true
|
||||||
reth-consensus.workspace = true
|
reth-consensus.workspace = true
|
||||||
reth-primitives.workspace = true
|
reth-primitives.workspace = true
|
||||||
reth-primitives-traits.workspace = true
|
reth-primitives-traits = { workspace = true, features = ["rayon"] }
|
||||||
reth-cli-util.workspace = true
|
reth-cli-util.workspace = true
|
||||||
reth-db = { workspace = true, features = ["mdbx"] }
|
reth-db = { workspace = true, features = ["mdbx"] }
|
||||||
reth-storage-errors.workspace = true
|
reth-storage-errors.workspace = true
|
||||||
|
|||||||
@ -49,6 +49,7 @@ serde = { workspace = true, optional = true}
|
|||||||
arbitrary = { workspace = true, features = ["derive"], optional = true }
|
arbitrary = { workspace = true, features = ["derive"], optional = true }
|
||||||
proptest = { workspace = true, optional = true }
|
proptest = { workspace = true, optional = true }
|
||||||
proptest-arbitrary-interop = { workspace = true, optional = true }
|
proptest-arbitrary-interop = { workspace = true, optional = true }
|
||||||
|
rayon = { workspace = true, optional = true }
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
reth-codecs.workspace = true
|
reth-codecs.workspace = true
|
||||||
@ -142,3 +143,6 @@ reth-codec = [
|
|||||||
op = [
|
op = [
|
||||||
"dep:op-alloy-consensus",
|
"dep:op-alloy-consensus",
|
||||||
]
|
]
|
||||||
|
rayon = [
|
||||||
|
"dep:rayon",
|
||||||
|
]
|
||||||
|
|||||||
@ -6,13 +6,16 @@ use crate::{
|
|||||||
use alloc::{fmt, vec::Vec};
|
use alloc::{fmt, vec::Vec};
|
||||||
use alloy_consensus::{Header, Transaction};
|
use alloy_consensus::{Header, Transaction};
|
||||||
use alloy_eips::{eip2718::Encodable2718, eip4895::Withdrawals};
|
use alloy_eips::{eip2718::Encodable2718, eip4895::Withdrawals};
|
||||||
use alloy_primitives::{Bytes, B256};
|
use alloy_primitives::{Address, Bytes, B256};
|
||||||
|
|
||||||
/// Helper trait that unifies all behaviour required by transaction to support full node operations.
|
/// Helper trait that unifies all behaviour required by transaction to support full node operations.
|
||||||
pub trait FullBlockBody: BlockBody<Transaction: FullSignedTx> + MaybeSerdeBincodeCompat {}
|
pub trait FullBlockBody: BlockBody<Transaction: FullSignedTx> + MaybeSerdeBincodeCompat {}
|
||||||
|
|
||||||
impl<T> FullBlockBody for T where T: BlockBody<Transaction: FullSignedTx> + MaybeSerdeBincodeCompat {}
|
impl<T> FullBlockBody for T where T: BlockBody<Transaction: FullSignedTx> + MaybeSerdeBincodeCompat {}
|
||||||
|
|
||||||
|
#[cfg(feature = "rayon")]
|
||||||
|
use rayon::prelude::*;
|
||||||
|
|
||||||
/// Abstraction for block's body.
|
/// Abstraction for block's body.
|
||||||
pub trait BlockBody:
|
pub trait BlockBody:
|
||||||
Send
|
Send
|
||||||
@ -97,6 +100,39 @@ pub trait BlockBody:
|
|||||||
fn encoded_2718_transactions(&self) -> Vec<Bytes> {
|
fn encoded_2718_transactions(&self) -> Vec<Bytes> {
|
||||||
self.encoded_2718_transactions_iter().map(Into::into).collect()
|
self.encoded_2718_transactions_iter().map(Into::into).collect()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Recover signer addresses for all transactions in the block body.
|
||||||
|
fn recover_signers(&self) -> Option<Vec<Address>>
|
||||||
|
where
|
||||||
|
Self::Transaction: SignedTransaction,
|
||||||
|
{
|
||||||
|
#[cfg(feature = "rayon")]
|
||||||
|
{
|
||||||
|
self.transactions().into_par_iter().map(|tx| tx.recover_signer()).collect()
|
||||||
|
}
|
||||||
|
#[cfg(not(feature = "rayon"))]
|
||||||
|
{
|
||||||
|
self.transactions().iter().map(|tx| tx.recover_signer()).collect()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Recover signer addresses for all transactions in the block body _without ensuring that the
|
||||||
|
/// signature has a low `s` value_.
|
||||||
|
///
|
||||||
|
/// Returns `None`, if some transaction's signature is invalid.
|
||||||
|
fn recover_signers_unchecked(&self) -> Option<Vec<Address>>
|
||||||
|
where
|
||||||
|
Self::Transaction: SignedTransaction,
|
||||||
|
{
|
||||||
|
#[cfg(feature = "rayon")]
|
||||||
|
{
|
||||||
|
self.transactions().into_par_iter().map(|tx| tx.recover_signer_unchecked()).collect()
|
||||||
|
}
|
||||||
|
#[cfg(not(feature = "rayon"))]
|
||||||
|
{
|
||||||
|
self.transactions().iter().map(|tx| tx.recover_signer_unchecked()).collect()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T> BlockBody for alloy_consensus::BlockBody<T>
|
impl<T> BlockBody for alloy_consensus::BlockBody<T>
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
use crate::{
|
use crate::{
|
||||||
traits::BlockExt, transaction::SignedTransactionIntoRecoveredExt, BlockBodyTxExt, GotExpected,
|
traits::BlockExt, transaction::SignedTransactionIntoRecoveredExt, GotExpected, RecoveredTx,
|
||||||
RecoveredTx, SealedHeader, TransactionSigned,
|
SealedHeader, TransactionSigned,
|
||||||
};
|
};
|
||||||
use alloc::vec::Vec;
|
use alloc::vec::Vec;
|
||||||
use alloy_consensus::Header;
|
use alloy_consensus::Header;
|
||||||
|
|||||||
@ -1,7 +1,4 @@
|
|||||||
use crate::{
|
use crate::{BlockWithSenders, SealedBlock};
|
||||||
transaction::{recover_signers, recover_signers_unchecked},
|
|
||||||
BlockWithSenders, SealedBlock,
|
|
||||||
};
|
|
||||||
use alloc::vec::Vec;
|
use alloc::vec::Vec;
|
||||||
use reth_primitives_traits::{Block, BlockBody, SealedHeader, SignedTransaction};
|
use reth_primitives_traits::{Block, BlockBody, SealedHeader, SignedTransaction};
|
||||||
use revm_primitives::{Address, B256};
|
use revm_primitives::{Address, B256};
|
||||||
@ -52,7 +49,6 @@ pub trait BlockExt: Block {
|
|||||||
///
|
///
|
||||||
/// If the number of senders does not match the number of transactions in the block, this falls
|
/// If the number of senders does not match the number of transactions in the block, this falls
|
||||||
/// back to manually recovery, but _without ensuring that the signature has a low `s` value_.
|
/// back to manually recovery, but _without ensuring that the signature has a low `s` value_.
|
||||||
/// See also [`recover_signers_unchecked`]
|
|
||||||
///
|
///
|
||||||
/// Returns an error if a signature is invalid.
|
/// Returns an error if a signature is invalid.
|
||||||
#[track_caller]
|
#[track_caller]
|
||||||
@ -87,28 +83,3 @@ pub trait BlockExt: Block {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl<T: Block> BlockExt for T {}
|
impl<T: Block> BlockExt for T {}
|
||||||
|
|
||||||
/// Extension trait for [`BlockBody`] adding helper methods operating with transactions.
|
|
||||||
pub trait BlockBodyTxExt: BlockBody {
|
|
||||||
/// Recover signer addresses for all transactions in the block body.
|
|
||||||
fn recover_signers(&self) -> Option<Vec<Address>>
|
|
||||||
where
|
|
||||||
Self::Transaction: SignedTransaction,
|
|
||||||
{
|
|
||||||
recover_signers(self.transactions(), self.transactions().len())
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Recover signer addresses for all transactions in the block body _without ensuring that the
|
|
||||||
/// signature has a low `s` value_.
|
|
||||||
///
|
|
||||||
/// Returns `None`, if some transaction's signature is invalid, see also
|
|
||||||
/// [`recover_signers_unchecked`].
|
|
||||||
fn recover_signers_unchecked(&self) -> Option<Vec<Address>>
|
|
||||||
where
|
|
||||||
Self::Transaction: SignedTransaction,
|
|
||||||
{
|
|
||||||
recover_signers_unchecked(self.transactions(), self.transactions().len())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<T: BlockBody> BlockBodyTxExt for T {}
|
|
||||||
|
|||||||
Reference in New Issue
Block a user