From cd0ec5703a07d0d696e82c133c4a56fac98980fc Mon Sep 17 00:00:00 2001 From: Alexey Shekhirin Date: Thu, 1 Aug 2024 15:58:50 +0100 Subject: [PATCH] feat(primitives): improve `no_std` with manual errors and `alloc::String` (#9990) --- crates/primitives/Cargo.toml | 6 +-- crates/primitives/src/constants/eip4844.rs | 2 +- .../primitives/src/transaction/access_list.rs | 4 ++ crates/primitives/src/transaction/error.rs | 53 +++++++++++-------- 4 files changed, 39 insertions(+), 26 deletions(-) diff --git a/crates/primitives/Cargo.toml b/crates/primitives/Cargo.toml index 55ccf3b33..98d37c282 100644 --- a/crates/primitives/Cargo.toml +++ b/crates/primitives/Cargo.toml @@ -45,7 +45,7 @@ once_cell.workspace = true rayon.workspace = true serde.workspace = true tempfile = { workspace = true, optional = true } -thiserror-no-std = { workspace = true, default-features = false } +thiserror-no-std = { workspace = true, default-features = false, optional = true } zstd = { workspace = true, features = ["experimental"], optional = true } # arbitrary utils @@ -85,7 +85,7 @@ secp256k1.workspace = true [features] default = ["c-kzg", "alloy-compat", "std", "reth-codec"] -std = ["thiserror-no-std/std", "reth-primitives-traits/std"] +std = ["thiserror-no-std?/std", "reth-primitives-traits/std"] reth-codec = ["dep:reth-codecs", "dep:zstd", "dep:modular-bitfield"] asm-keccak = ["alloy-primitives/asm-keccak"] arbitrary = [ @@ -100,7 +100,7 @@ arbitrary = [ "dep:proptest", "reth-codec", ] -c-kzg = ["dep:c-kzg", "revm-primitives/c-kzg", "dep:tempfile", "alloy-eips/kzg"] +c-kzg = ["dep:c-kzg", "revm-primitives/c-kzg", "dep:tempfile", "alloy-eips/kzg", "dep:thiserror-no-std"] optimism = [ "reth-chainspec/optimism", "reth-ethereum-forks/optimism", diff --git a/crates/primitives/src/constants/eip4844.rs b/crates/primitives/src/constants/eip4844.rs index 48a3aebb3..483db1d70 100644 --- a/crates/primitives/src/constants/eip4844.rs +++ b/crates/primitives/src/constants/eip4844.rs @@ -8,7 +8,7 @@ pub use alloy_eips::eip4844::{ TARGET_BLOBS_PER_BLOCK, TARGET_DATA_GAS_PER_BLOCK, VERSIONED_HASH_VERSION_KZG, }; -#[cfg(feature = "c-kzg")] +#[cfg(all(feature = "c-kzg", feature = "std"))] mod trusted_setup { use crate::kzg::KzgSettings; use std::io::Write; diff --git a/crates/primitives/src/transaction/access_list.rs b/crates/primitives/src/transaction/access_list.rs index 3053f09ba..c50ba0424 100644 --- a/crates/primitives/src/transaction/access_list.rs +++ b/crates/primitives/src/transaction/access_list.rs @@ -3,9 +3,13 @@ /// Re-export from `alloy_eips`. #[doc(inline)] pub use alloy_eips::eip2930::{AccessList, AccessListItem}; + use revm_primitives::U256; use serde::{Deserialize, Serialize}; +#[cfg(not(feature = "std"))] +use alloc::string::String; + /// `AccessListResult` for handling errors from `eth_createAccessList` #[derive(Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize)] pub struct AccessListResult { diff --git a/crates/primitives/src/transaction/error.rs b/crates/primitives/src/transaction/error.rs index a75704cd2..336c39691 100644 --- a/crates/primitives/src/transaction/error.rs +++ b/crates/primitives/src/transaction/error.rs @@ -2,79 +2,88 @@ use crate::{GotExpectedBoxed, U256}; /// Represents error variants that can happen when trying to validate a /// [Transaction](crate::Transaction) -#[derive(Debug, Clone, Eq, PartialEq, thiserror_no_std::Error)] +#[derive(Debug, Clone, Eq, PartialEq, derive_more::Display)] pub enum InvalidTransactionError { /// The sender does not have enough funds to cover the transaction fees - #[error( - "sender does not have enough funds ({}) to cover transaction fees: {}", _0.got, _0.expected + #[display( + fmt = "sender does not have enough funds ({}) to cover transaction fees: {}", _0.got, _0.expected )] InsufficientFunds(GotExpectedBoxed), /// The nonce is lower than the account's nonce, or there is a nonce gap present. /// /// This is a consensus error. - #[error("transaction nonce is not consistent")] + #[display(fmt = "transaction nonce is not consistent")] NonceNotConsistent, /// The transaction is before Spurious Dragon and has a chain ID. - #[error("transactions before Spurious Dragon should not have a chain ID")] + #[display(fmt = "transactions before Spurious Dragon should not have a chain ID")] OldLegacyChainId, /// The chain ID in the transaction does not match the current network configuration. - #[error("transaction's chain ID does not match")] + #[display(fmt = "transaction's chain ID does not match")] ChainIdMismatch, /// The transaction requires EIP-2930 which is not enabled currently. - #[error("EIP-2930 transactions are disabled")] + #[display(fmt = "EIP-2930 transactions are disabled")] Eip2930Disabled, /// The transaction requires EIP-1559 which is not enabled currently. - #[error("EIP-1559 transactions are disabled")] + #[display(fmt = "EIP-1559 transactions are disabled")] Eip1559Disabled, /// The transaction requires EIP-4844 which is not enabled currently. - #[error("EIP-4844 transactions are disabled")] + #[display(fmt = "EIP-4844 transactions are disabled")] Eip4844Disabled, /// The transaction requires EIP-7702 which is not enabled currently. - #[error("EIP-7702 transactions are disabled")] + #[display(fmt = "EIP-7702 transactions are disabled")] Eip7702Disabled, /// Thrown if a transaction is not supported in the current network configuration. - #[error("transaction type not supported")] + #[display(fmt = "transaction type not supported")] TxTypeNotSupported, /// The calculated gas of the transaction exceeds `u64::MAX`. - #[error("gas overflow (maximum of u64)")] + #[display(fmt = "gas overflow (maximum of u64)")] GasUintOverflow, /// The transaction is specified to use less gas than required to start the invocation. - #[error("intrinsic gas too low")] + #[display(fmt = "intrinsic gas too low")] GasTooLow, /// The transaction gas exceeds the limit - #[error("intrinsic gas too high")] + #[display(fmt = "intrinsic gas too high")] GasTooHigh, /// Thrown to ensure no one is able to specify a transaction with a tip higher than the total /// fee cap. - #[error("max priority fee per gas higher than max fee per gas")] + #[display(fmt = "max priority fee per gas higher than max fee per gas")] TipAboveFeeCap, /// Thrown post London if the transaction's fee is less than the base fee of the block. - #[error("max fee per gas less than block base fee")] + #[display(fmt = "max fee per gas less than block base fee")] FeeCapTooLow, /// Thrown if the sender of a transaction is a contract. - #[error("transaction signer has bytecode set")] + #[display(fmt = "transaction signer has bytecode set")] SignerAccountHasBytecode, } +#[cfg(feature = "std")] +impl std::error::Error for InvalidTransactionError {} + /// Represents error variants that can happen when trying to convert a transaction to /// [`PooledTransactionsElement`](crate::PooledTransactionsElement) -#[derive(Debug, Clone, Eq, PartialEq, thiserror_no_std::Error)] +#[derive(Debug, Clone, Eq, PartialEq, derive_more::Display)] pub enum TransactionConversionError { /// This error variant is used when a transaction cannot be converted into a /// [`PooledTransactionsElement`](crate::PooledTransactionsElement) because it is not supported /// for P2P network. - #[error("Transaction is not supported for p2p")] + #[display(fmt = "Transaction is not supported for p2p")] UnsupportedForP2P, } +#[cfg(feature = "std")] +impl std::error::Error for TransactionConversionError {} + /// Represents error variants than can happen when trying to convert a /// [`TransactionSignedEcRecovered`](crate::TransactionSignedEcRecovered) transaction. -#[derive(Debug, Clone, Eq, PartialEq, thiserror_no_std::Error)] +#[derive(Debug, Clone, Eq, PartialEq, derive_more::Display)] pub enum TryFromRecoveredTransactionError { /// Thrown if the transaction type is unsupported. - #[error("Unsupported transaction type: {0}")] + #[display(fmt = "Unsupported transaction type: {_0}")] UnsupportedTransactionType(u8), /// This error variant is used when a blob sidecar is missing. - #[error("Blob sidecar missing for an EIP-4844 transaction")] + #[display(fmt = "Blob sidecar missing for an EIP-4844 transaction")] BlobSidecarMissing, } + +#[cfg(feature = "std")] +impl std::error::Error for TryFromRecoveredTransactionError {}