diff --git a/Cargo.lock b/Cargo.lock index 06f830f89e9..d5e21f92da0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3351,10 +3351,10 @@ dependencies = [ "ethrex-trie", "ethrex-vm", "hex", + "keccak-asm", "rustc-hash 2.1.1", "secp256k1", "serde_json", - "sha3", "thiserror 2.0.17", "tokio", "tokio-util", @@ -3373,6 +3373,7 @@ dependencies = [ "ethrex-trie", "hex", "hex-literal", + "keccak-asm", "kzg-rs", "lazy_static", "libc", @@ -3384,7 +3385,6 @@ dependencies = [ "serde", "serde_json", "sha2", - "sha3", "thiserror 2.0.17", "tinyvec", "tracing", @@ -3500,12 +3500,12 @@ dependencies = [ "ethrex-trie", "ethrex-vm", "hex", + "keccak-asm", "lambdaworks-crypto 0.11.0", "rkyv", "secp256k1", "serde", "serde_with", - "sha3", "thiserror 2.0.17", ] @@ -3556,6 +3556,7 @@ dependencies = [ "ethrex-rlp", "hex", "k256 0.13.4 (registry+https://github.com/rust-lang/crates.io-index)", + "keccak-asm", "lambdaworks-math 0.11.0", "lazy_static", "malachite 0.6.1", @@ -3566,7 +3567,6 @@ dependencies = [ "serde", "serde_json", "sha2", - "sha3", "spinoff", "strum 0.27.2", "substrate-bn", @@ -3612,6 +3612,7 @@ dependencies = [ "hex-literal", "hmac", "indexmap 2.12.0", + "keccak-asm", "lazy_static", "prometheus 0.14.0", "rand 0.8.5", @@ -3621,7 +3622,6 @@ dependencies = [ "serde", "serde_json", "sha2", - "sha3", "snap", "spawned-concurrency", "spawned-rt", @@ -3704,13 +3704,13 @@ dependencies = [ "hex-literal", "jemalloc_pprof", "jsonwebtoken 9.3.1", + "keccak-asm", "rand 0.8.5", "reqwest 0.12.24", "secp256k1", "serde", "serde_json", "sha2", - "sha3", "thiserror 2.0.17", "tokio", "tokio-util", @@ -3767,13 +3767,13 @@ dependencies = [ "ethrex-trie", "hex", "hex-literal", + "keccak-asm", "qfilter", "rayon", "rocksdb", "rustc-hash 2.1.1", "serde", "serde_json", - "sha3", "tempfile", "thiserror 2.0.17", "tokio", @@ -3824,13 +3824,13 @@ dependencies = [ "hasher", "hex", "hex-literal", + "keccak-asm", "lazy_static", "proptest", "rand 0.8.5", "rocksdb", "serde", "serde_json", - "sha3", "smallvec", "tempfile", "thiserror 2.0.17", @@ -3851,10 +3851,10 @@ dependencies = [ "ethrex-rlp", "ethrex-trie", "hex", + "keccak-asm", "lazy_static", "rkyv", "serde", - "sha3", "thiserror 2.0.17", "tracing", ] @@ -5496,6 +5496,16 @@ dependencies = [ "cpufeatures", ] +[[package]] +name = "keccak-asm" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "505d1856a39b200489082f90d897c3f07c455563880bc5952e38eabf731c83b6" +dependencies = [ + "digest 0.10.7", + "sha3-asm", +] + [[package]] name = "kzg-rs" version = "0.2.7" @@ -9544,6 +9554,16 @@ dependencies = [ "keccak", ] +[[package]] +name = "sha3-asm" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c28efc5e327c837aa837c59eae585fc250715ef939ac32881bcc11677cd02d46" +dependencies = [ + "cc", + "cfg-if 1.0.4", +] + [[package]] name = "sharded-slab" version = "0.1.7" diff --git a/Cargo.toml b/Cargo.toml index 0a00799c305..537afbb47d5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -74,6 +74,7 @@ tracing-subscriber = { version = "0.3.0", features = ["env-filter"] } async-trait = "0.1.88" ethereum-types = { version = "0.15.1", features = ["serialize"] } +keccak-asm.version = "0.1.4" serde = { version = "1.0.203", features = ["derive"] } serde_with = "3.11.0" serde_json = "1.0.117" @@ -85,7 +86,6 @@ hex-literal = "0.4.1" crc32fast = "1.4.2" lazy_static = "1.5.0" sha2 = "0.10.8" -sha3 = "0.10.8" tokio-util = { version = "0.7.15", features = ["rt"] } jsonwebtoken = "9.3.0" rand = "0.8.5" diff --git a/crates/blockchain/Cargo.toml b/crates/blockchain/Cargo.toml index 2e859496882..a7c9b8ccf09 100644 --- a/crates/blockchain/Cargo.toml +++ b/crates/blockchain/Cargo.toml @@ -16,7 +16,7 @@ ethrex-vm.workspace = true secp256k1.workspace = true thiserror.workspace = true -sha3.workspace = true +keccak-asm.workspace = true tracing.workspace = true bytes.workspace = true hex.workspace = true diff --git a/crates/blockchain/payload.rs b/crates/blockchain/payload.rs index 40d0b3f7213..11b8aaf8df6 100644 --- a/crates/blockchain/payload.rs +++ b/crates/blockchain/payload.rs @@ -23,7 +23,7 @@ use ethrex_vm::{Evm, EvmError}; use ethrex_rlp::encode::RLPEncode; use ethrex_storage::{Store, error::StoreError}; -use sha3::{Digest, Keccak256}; +use keccak_asm::{Digest, Keccak256}; use ethrex_metrics::metrics; diff --git a/crates/common/Cargo.toml b/crates/common/Cargo.toml index b333a592d46..bbe372f6757 100644 --- a/crates/common/Cargo.toml +++ b/crates/common/Cargo.toml @@ -20,7 +20,7 @@ serde_json.workspace = true thiserror.workspace = true sha2.workspace = true kzg-rs.workspace = true -sha3.workspace = true +keccak-asm.workspace = true secp256k1.workspace = true once_cell = "1.20.2" libc = "0.2" diff --git a/crates/common/constants.rs b/crates/common/constants.rs index 726ab7dd0ce..5ced914e187 100644 --- a/crates/common/constants.rs +++ b/crates/common/constants.rs @@ -1,6 +1,6 @@ use crate::H256; use ethrex_rlp::constants::RLP_NULL; -use sha3::{Digest as _, Keccak256}; +use keccak_asm::{Digest as _, Keccak256}; use std::{str::FromStr, sync::LazyLock}; // = Keccak256(RLP([])) as of EIP-3675 diff --git a/crates/common/evm.rs b/crates/common/evm.rs index 3bb5dc6b4c2..8bad4f4d41a 100644 --- a/crates/common/evm.rs +++ b/crates/common/evm.rs @@ -1,6 +1,6 @@ use ethereum_types::Address; use ethrex_rlp::encode::RLPEncode; -use sha3::{Digest, Keccak256}; +use keccak_asm::{Digest, Keccak256}; /// Calculates the address of a new conctract using the CREATE /// opcode as follows: diff --git a/crates/common/trie/Cargo.toml b/crates/common/trie/Cargo.toml index 8c9c95b4912..465324399ed 100644 --- a/crates/common/trie/Cargo.toml +++ b/crates/common/trie/Cargo.toml @@ -14,7 +14,7 @@ anyhow = "1.0.86" bytes.workspace = true tracing.workspace = true thiserror.workspace = true -sha3.workspace = true +keccak-asm.workspace = true hex.workspace = true serde.workspace = true serde_json = "1.0.117" diff --git a/crates/common/trie/node_hash.rs b/crates/common/trie/node_hash.rs index f7743bdf205..b6eb95ad565 100644 --- a/crates/common/trie/node_hash.rs +++ b/crates/common/trie/node_hash.rs @@ -1,6 +1,6 @@ use ethereum_types::H256; use ethrex_rlp::{decode::RLPDecode, encode::RLPEncode, error::RLPDecodeError, structs::Encoder}; -use sha3::{Digest, Keccak256}; +use keccak_asm::{Digest, Keccak256}; /// Struct representing a trie node hash /// If the encoded node is less than 32 bits, contains the encoded node itself diff --git a/crates/common/trie/trie.rs b/crates/common/trie/trie.rs index 4102fdbe43b..fab6c4100bb 100644 --- a/crates/common/trie/trie.rs +++ b/crates/common/trie/trie.rs @@ -13,7 +13,7 @@ mod verify_range; use ethereum_types::H256; use ethrex_rlp::constants::RLP_NULL; use ethrex_rlp::encode::RLPEncode; -use sha3::{Digest, Keccak256}; +use keccak_asm::{Digest, Keccak256}; use std::collections::{BTreeMap, HashSet}; use std::sync::{Arc, Mutex}; diff --git a/crates/common/trie/verify_range.rs b/crates/common/trie/verify_range.rs index ac81a5ad124..36133ca7944 100644 --- a/crates/common/trie/verify_range.rs +++ b/crates/common/trie/verify_range.rs @@ -2,7 +2,7 @@ use std::collections::{BTreeMap, VecDeque}; use ethereum_types::H256; use ethrex_rlp::decode::RLPDecode; -use sha3::{Digest, Keccak256}; +use keccak_asm::{Digest, Keccak256}; use crate::{ ProofTrie, Trie, TrieError, ValueRLP, diff --git a/crates/common/types/account.rs b/crates/common/types/account.rs index 228ada9ebaf..1c8b65a252c 100644 --- a/crates/common/types/account.rs +++ b/crates/common/types/account.rs @@ -3,9 +3,9 @@ use std::collections::HashMap; use bytes::Bytes; use ethereum_types::{H256, U256}; use ethrex_trie::Trie; +use keccak_asm::{Digest as _, Keccak256}; use rustc_hash::FxHashMap; use serde::{Deserialize, Serialize}; -use sha3::{Digest as _, Keccak256}; use ethrex_rlp::{ decode::RLPDecode, diff --git a/crates/common/types/block_execution_witness.rs b/crates/common/types/block_execution_witness.rs index 3f950a097f0..9f2356ebb9d 100644 --- a/crates/common/types/block_execution_witness.rs +++ b/crates/common/types/block_execution_witness.rs @@ -13,11 +13,11 @@ use bytes::Bytes; use ethereum_types::{Address, H256, U256}; use ethrex_rlp::{decode::RLPDecode, encode::RLPEncode}; use ethrex_trie::{EMPTY_TRIE_HASH, NodeRLP, Trie}; +use keccak_asm::{Digest, Keccak256}; use rkyv::{Archive, Deserialize as RDeserialize, Serialize as RSerialize}; use serde::de::{SeqAccess, Visitor}; use serde::ser::SerializeSeq; use serde::{Deserialize, Deserializer, Serialize, Serializer, de}; -use sha3::{Digest, Keccak256}; /// State produced by the guest program execution inside the zkVM. It is /// essentially built from the `ExecutionWitness`. diff --git a/crates/common/types/genesis.rs b/crates/common/types/genesis.rs index 1ceeb867144..b4b5309c3f0 100644 --- a/crates/common/types/genesis.rs +++ b/crates/common/types/genesis.rs @@ -2,9 +2,9 @@ use bytes::Bytes; use ethereum_types::{Address, Bloom, H256, U256}; use ethrex_rlp::encode::RLPEncode; use ethrex_trie::Trie; +use keccak_asm::{Digest, Keccak256}; use rkyv::{Archive, Deserialize as RDeserialize, Serialize as RSerialize}; use serde::{Deserialize, Serialize}; -use sha3::{Digest, Keccak256}; use std::{ collections::{BTreeMap, HashMap}, io::{BufReader, Error}, diff --git a/crates/common/types/transaction.rs b/crates/common/types/transaction.rs index c3bc9243944..2308254ad63 100644 --- a/crates/common/types/transaction.rs +++ b/crates/common/types/transaction.rs @@ -3,12 +3,12 @@ use std::{cmp::min, fmt::Display}; use crate::utils::keccak; use bytes::Bytes; use ethereum_types::{Address, H256, Signature, U256}; +use keccak_asm::{Digest, Keccak256}; pub use mempool::MempoolTransaction; use rkyv::{Archive, Deserialize as RDeserialize, Serialize as RSerialize}; use secp256k1::{Message, ecdsa::RecoveryId}; use serde::{Serialize, ser::SerializeStruct}; pub use serde_impl::{AccessListEntry, GenericTransaction, GenericTransactionError}; -use sha3::{Digest, Keccak256}; use ethrex_rlp::{ constants::RLP_NULL, diff --git a/crates/common/utils.rs b/crates/common/utils.rs index d5f4f242637..2680d820074 100644 --- a/crates/common/utils.rs +++ b/crates/common/utils.rs @@ -1,8 +1,7 @@ use crate::H256; use ethereum_types::U256; use hex::FromHexError; -use sha3::Digest; -use sha3::Keccak256; +use keccak_asm::{Digest, Keccak256}; pub const ZERO_U256: U256 = U256([0, 0, 0, 0]); diff --git a/crates/l2/common/Cargo.toml b/crates/l2/common/Cargo.toml index c0d2b8a9c4b..74137d1544d 100644 --- a/crates/l2/common/Cargo.toml +++ b/crates/l2/common/Cargo.toml @@ -17,7 +17,7 @@ bytes.workspace = true thiserror.workspace = true serde.workspace = true lambdaworks-crypto.workspace = true -sha3.workspace = true +keccak-asm.workspace = true secp256k1.workspace = true hex.workspace = true serde_with.workspace = true diff --git a/crates/networking/p2p/Cargo.toml b/crates/networking/p2p/Cargo.toml index ce819dc570d..b8b2fa83d7b 100644 --- a/crates/networking/p2p/Cargo.toml +++ b/crates/networking/p2p/Cargo.toml @@ -18,6 +18,7 @@ ethrex-threadpool.workspace = true ethereum-types.workspace = true async-trait.workspace = true +keccak-asm.workspace = true tracing.workspace = true tokio = { workspace = true, features = ["full"] } tokio-util = { workspace = true, features = ["codec", "net"] } @@ -37,7 +38,6 @@ rocksdb = { workspace = true, optional = true } prometheus = "0.14.0" tokio-stream = "0.1.17" -sha3 = "0.10.8" serde_json = "1.0.117" diff --git a/crates/networking/p2p/discv4/messages.rs b/crates/networking/p2p/discv4/messages.rs index 3b0ca7c41da..4e28d727b97 100644 --- a/crates/networking/p2p/discv4/messages.rs +++ b/crates/networking/p2p/discv4/messages.rs @@ -10,11 +10,11 @@ use ethrex_rlp::{ error::RLPDecodeError, structs::{self, Decoder, Encoder}, }; +use keccak_asm::{Digest, Keccak256}; use secp256k1::{ SecretKey, ecdsa::{RecoverableSignature, RecoveryId}, }; -use sha3::{Digest, Keccak256}; use std::{convert::Into, io::ErrorKind}; #[derive(Debug, thiserror::Error)] diff --git a/crates/networking/p2p/rlpx/connection/codec.rs b/crates/networking/p2p/rlpx/connection/codec.rs index e17d5b0b38c..3ab3f9c0ce6 100644 --- a/crates/networking/p2p/rlpx/connection/codec.rs +++ b/crates/networking/p2p/rlpx/connection/codec.rs @@ -14,7 +14,7 @@ use aes::{ use bytes::{Buf, BytesMut}; use ethrex_common::{H128, H256}; use ethrex_rlp::{decode::RLPDecode, encode::RLPEncode as _}; -use sha3::{Digest as _, Keccak256}; +use keccak_asm::{Digest as _, Keccak256}; use tokio::io::{AsyncRead, AsyncWrite}; use tokio_util::codec::{Decoder, Encoder, Framed}; diff --git a/crates/networking/p2p/rlpx/connection/handshake.rs b/crates/networking/p2p/rlpx/connection/handshake.rs index c53e09b881c..a0dd373d5c1 100644 --- a/crates/networking/p2p/rlpx/connection/handshake.rs +++ b/crates/networking/p2p/rlpx/connection/handshake.rs @@ -22,12 +22,12 @@ use ethrex_rlp::{ structs::{Decoder, Encoder}, }; use futures::{StreamExt, stream::SplitStream}; +use keccak_asm::{Digest, Keccak256}; use rand::Rng; use secp256k1::{ PublicKey, SecretKey, ecdsa::{RecoverableSignature, RecoveryId}, }; -use sha3::{Digest, Keccak256}; use std::{ collections::HashMap, net::SocketAddr, diff --git a/crates/networking/p2p/rlpx/error.rs b/crates/networking/p2p/rlpx/error.rs index fe5e1db9426..a0f9261948c 100644 --- a/crates/networking/p2p/rlpx/error.rs +++ b/crates/networking/p2p/rlpx/error.rs @@ -107,8 +107,8 @@ impl From for PeerConnectionError { } } -impl From for PeerConnectionError { - fn from(e: sha3::digest::InvalidLength) -> Self { +impl From for PeerConnectionError { + fn from(e: keccak_asm::digest::InvalidLength) -> Self { PeerConnectionError::CryptographyError(e.to_string()) } } diff --git a/crates/networking/p2p/rlpx/utils.rs b/crates/networking/p2p/rlpx/utils.rs index 23c5f64ab2e..4730a4966cc 100644 --- a/crates/networking/p2p/rlpx/utils.rs +++ b/crates/networking/p2p/rlpx/utils.rs @@ -1,8 +1,8 @@ use ethrex_common::{H256, H512}; use ethrex_rlp::error::{RLPDecodeError, RLPEncodeError}; +use keccak_asm::{Digest, Keccak256}; use secp256k1::ecdh::shared_secret_point; use secp256k1::{PublicKey, SecretKey}; -use sha3::{Digest, Keccak256}; use snap::raw::{Decoder as SnappyDecoder, Encoder as SnappyEncoder, max_compress_len}; use std::array::TryFromSliceError; diff --git a/crates/networking/p2p/types.rs b/crates/networking/p2p/types.rs index e4b191f60d8..5db1e9f92e8 100644 --- a/crates/networking/p2p/types.rs +++ b/crates/networking/p2p/types.rs @@ -7,9 +7,9 @@ use ethrex_rlp::{ error::RLPDecodeError, structs::{self, Decoder, Encoder}, }; +use keccak_asm::{Digest, Keccak256}; use secp256k1::{PublicKey, SecretKey}; use serde::{Deserialize, Serialize, ser::Serializer}; -use sha3::{Digest, Keccak256}; use std::net::Ipv6Addr; use std::{ fmt::Display, diff --git a/crates/networking/rpc/Cargo.toml b/crates/networking/rpc/Cargo.toml index 513016d088e..a73bd872682 100644 --- a/crates/networking/rpc/Cargo.toml +++ b/crates/networking/rpc/Cargo.toml @@ -9,6 +9,7 @@ documentation.workspace = true [dependencies] axum = { features = ["ws"], workspace = true } +keccak-asm.workspace = true tower-http.workspace = true serde.workspace = true serde_json = "1.0.117" @@ -32,7 +33,6 @@ jsonwebtoken.workspace = true rand.workspace = true tokio-util = { workspace = true, features = ["codec"] } reqwest.workspace = true -sha3 = "0.10.8" sha2.workspace = true jemalloc_pprof = { version = "0.8.0", optional = true, features = ["flamegraph", "symbolize"] } diff --git a/crates/storage/Cargo.toml b/crates/storage/Cargo.toml index c95898bae78..1cc6226d835 100644 --- a/crates/storage/Cargo.toml +++ b/crates/storage/Cargo.toml @@ -18,7 +18,7 @@ anyhow = "1.0.86" bytes.workspace = true tracing.workspace = true thiserror.workspace = true -sha3.workspace = true +keccak-asm.workspace = true hex.workspace = true serde.workspace = true serde_json = "1.0.117" diff --git a/crates/storage/store.rs b/crates/storage/store.rs index 75c97ce1073..2526563aae6 100644 --- a/crates/storage/store.rs +++ b/crates/storage/store.rs @@ -16,7 +16,7 @@ use ethrex_common::{ use ethrex_rlp::decode::RLPDecode; use ethrex_rlp::encode::RLPEncode; use ethrex_trie::{Nibbles, NodeRLP, Trie, TrieLogger, TrieNode, TrieWitness}; -use sha3::{Digest as _, Keccak256}; +use keccak_asm::{Digest as _, Keccak256}; use std::{collections::hash_map::Entry, sync::Arc}; use std::{ collections::{BTreeMap, HashMap}, diff --git a/crates/vm/Cargo.toml b/crates/vm/Cargo.toml index 9ae87fdb635..902e3224b22 100644 --- a/crates/vm/Cargo.toml +++ b/crates/vm/Cargo.toml @@ -18,7 +18,7 @@ hex.workspace = true lazy_static.workspace = true tracing.workspace = true serde.workspace = true -sha3.workspace = true +keccak-asm.workspace = true rkyv.workspace = true bincode = "1" diff --git a/crates/vm/levm/Cargo.toml b/crates/vm/levm/Cargo.toml index b2fdf9a43b1..5324135d6af 100644 --- a/crates/vm/levm/Cargo.toml +++ b/crates/vm/levm/Cargo.toml @@ -13,11 +13,11 @@ ethrex-rlp.workspace = true derive_more = { version = "1.0.0", features = ["full"] } bytes.workspace = true +keccak-asm.workspace = true thiserror.workspace = true serde = { workspace = true, features = ["derive", "rc"] } serde_json.workspace = true -sha3 = "0.10.8" datatest-stable = "0.2.9" walkdir = "2.5.0" secp256k1.workspace = true diff --git a/crates/vm/levm/src/opcode_handlers/keccak.rs b/crates/vm/levm/src/opcode_handlers/keccak.rs index 552c5909378..646e543706b 100644 --- a/crates/vm/levm/src/opcode_handlers/keccak.rs +++ b/crates/vm/levm/src/opcode_handlers/keccak.rs @@ -6,7 +6,7 @@ use crate::{ vm::VM, }; use ethrex_common::utils::u256_from_big_endian; -use sha3::{Digest, Keccak256}; +use keccak_asm::{Digest, Keccak256}; // KECCAK256 (1) // Opcodes: KECCAK256 diff --git a/crates/vm/levm/src/precompiles.rs b/crates/vm/levm/src/precompiles.rs index 3bb885d6edf..5e8db0a6a15 100644 --- a/crates/vm/levm/src/precompiles.rs +++ b/crates/vm/levm/src/precompiles.rs @@ -14,6 +14,7 @@ use ethrex_common::{ }; use ethrex_crypto::{blake2f::blake2b_f, kzg::verify_kzg_proof}; use k256::elliptic_curve::Field; +use keccak_asm::{Digest, Keccak256}; use lambdaworks_math::cyclic_group::IsGroup; use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bn_254::curve::{ BN254FieldElement, BN254TwistCurveFieldElement, @@ -39,7 +40,6 @@ use p256::{ ecdsa::{Signature as P256Signature, signature::hazmat::PrehashVerifier}, elliptic_curve::bigint::U256 as P256Uint, }; -use sha3::Digest; use std::borrow::Cow; use std::ops::Mul; @@ -376,8 +376,6 @@ pub(crate) fn fill_with_zeros(calldata: &Bytes, target_len: usize) -> Bytes { #[cfg(all(not(feature = "sp1"), not(feature = "risc0")))] pub fn ecrecover(calldata: &Bytes, gas_remaining: &mut u64, _fork: Fork) -> Result { - use sha3::Keccak256; - use crate::gas_cost::ECRECOVER_COST; increase_precompile_consumed_gas(ECRECOVER_COST, gas_remaining)?; diff --git a/crates/vm/levm/src/utils.rs b/crates/vm/levm/src/utils.rs index 2b5d305da58..2637c2f97c6 100644 --- a/crates/vm/levm/src/utils.rs +++ b/crates/vm/levm/src/utils.rs @@ -28,11 +28,11 @@ use ethrex_common::{ use ethrex_common::{types::TxKind, utils::u256_from_big_endian_const}; use ethrex_rlp; use ethrex_rlp::encode::RLPEncode; +use keccak_asm::{Digest, Keccak256}; use secp256k1::{ Message, ecdsa::{RecoverableSignature, RecoveryId}, }; -use sha3::{Digest, Keccak256}; use std::collections::{BTreeMap, HashMap}; pub type Storage = HashMap;