From b6c6e777a8200363463937cf8ff9f88ac77df5d0 Mon Sep 17 00:00:00 2001 From: Rohit Yadav Date: Tue, 10 Feb 2026 01:06:41 +0530 Subject: [PATCH] Optimize Extranonce cloning in hot path (Fixes #2076) - Implemented AsRef for Extranonce struct. - Refactored validate_share to use extend_from_slice instead of clone and extend. - This reduces unnecessary allocations during share validation. --- sv2/channels-sv2/src/server/extended.rs | 4 ++-- sv2/subprotocols/mining/src/lib.rs | 6 ++++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/sv2/channels-sv2/src/server/extended.rs b/sv2/channels-sv2/src/server/extended.rs index 2fcf6f6a27..c93ed32dc9 100644 --- a/sv2/channels-sv2/src/server/extended.rs +++ b/sv2/channels-sv2/src/server/extended.rs @@ -677,8 +677,8 @@ where let extranonce_prefix = job.get_extranonce_prefix(); let mut full_extranonce = vec![]; - full_extranonce.extend(extranonce_prefix.clone()); - full_extranonce.extend(share.extranonce.inner_as_ref()); + full_extranonce.extend_from_slice(extranonce_prefix); + full_extranonce.extend_from_slice(share.extranonce.as_ref()); // calculate the merkle root from: // - job coinbase_tx_prefix diff --git a/sv2/subprotocols/mining/src/lib.rs b/sv2/subprotocols/mining/src/lib.rs index 986756289f..d3bd35b332 100644 --- a/sv2/subprotocols/mining/src/lib.rs +++ b/sv2/subprotocols/mining/src/lib.rs @@ -127,6 +127,12 @@ pub struct Extranonce { extranonce: alloc::vec::Vec, } +impl AsRef<[u8]> for Extranonce { + fn as_ref(&self) -> &[u8] { + &self.extranonce + } +} + // this function converts a U256 type in little endian to Extranonce type impl<'a> From> for Extranonce { fn from(v: U256<'a>) -> Self {