From 94d28f254f4fb1412449b957e634993c51eba1ff Mon Sep 17 00:00:00 2001 From: Uncle Stinky Date: Tue, 18 Nov 2025 16:00:17 +0300 Subject: [PATCH] update offchain worker logic Signed-off-by: Uncle Stinky --- pallets/slow-clap/Cargo.toml | 2 +- pallets/slow-clap/src/lib.rs | 437 ++++++++++++++++----------------- pallets/slow-clap/src/tests.rs | 22 +- 3 files changed, 228 insertions(+), 233 deletions(-) diff --git a/pallets/slow-clap/Cargo.toml b/pallets/slow-clap/Cargo.toml index 5895e0e..c0bdefc 100644 --- a/pallets/slow-clap/Cargo.toml +++ b/pallets/slow-clap/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "ghost-slow-clap" -version = "0.3.53" +version = "0.3.54" description = "Applause protocol for the EVM bridge" license.workspace = true authors.workspace = true diff --git a/pallets/slow-clap/src/lib.rs b/pallets/slow-clap/src/lib.rs index 4dd4b90..48b61b2 100644 --- a/pallets/slow-clap/src/lib.rs +++ b/pallets/slow-clap/src/lib.rs @@ -23,7 +23,7 @@ use sp_core::H256; use sp_runtime::{ offchain::{ self as rt_offchain, - storage::{MutateStorageError, StorageRetrievalError, StorageValueRef}, + storage::StorageValueRef, storage_lock::{StorageLock, Time}, HttpError, }, @@ -97,8 +97,6 @@ pub struct SessionAuthorityInfo { #[cfg_attr(test, derive(PartialEq))] enum OffchainErr { - FailedSigning, - SubmitTransaction, HttpJsonParsingError, HttpBytesParsingError, HttpRequestError(HttpError), @@ -106,38 +104,65 @@ enum OffchainErr { HttpResponseNotOk(u16), ErrorInEvmResponse, NoStoredNetworks, - NotValidator, + NoEndpointAvailable(NetworkId), StorageRetrievalError(NetworkId), - ConcurrentModificationError(NetworkId), UtxoNotImplemented(NetworkId), UnknownNetworkType(NetworkId), OffchainTimeoutPeriod(NetworkId), - TooManyRequests(NetworkId), } impl core::fmt::Debug for OffchainErr { fn fmt(&self, fmt: &mut core::fmt::Formatter) -> core::fmt::Result { match *self { - OffchainErr::FailedSigning => write!(fmt, "Failed to sign clap."), - OffchainErr::SubmitTransaction => write!(fmt, "Failed to submit transaction."), - OffchainErr::HttpJsonParsingError => write!(fmt, "Failed to parse evm response as JSON."), - OffchainErr::HttpBytesParsingError => write!(fmt, "Failed to parse evm response as bytes."), + OffchainErr::HttpJsonParsingError => { + write!(fmt, "Failed to parse evm response as JSON.") + } + OffchainErr::HttpBytesParsingError => { + write!(fmt, "Failed to parse evm response as bytes.") + } OffchainErr::HttpRequestError(http_error) => match http_error { - HttpError::DeadlineReached => write!(fmt, "Requested action couldn't been completed within a deadline."), - HttpError::IoError => write!(fmt, "There was an IO error while processing the request."), - HttpError::Invalid => write!(fmt, "The ID of the request is invalid in this context."), + HttpError::DeadlineReached => write!( + fmt, + "Requested action couldn't been completed within a deadline." + ), + HttpError::IoError => { + write!(fmt, "There was an IO error while processing the request.") + } + HttpError::Invalid => { + write!(fmt, "The ID of the request is invalid in this context.") + } }, - OffchainErr::ConcurrentModificationError(ref network_id) => write!(fmt, "The underlying DB failed to update due to a concurrent modification for network #{:?}.", network_id), - OffchainErr::StorageRetrievalError(ref network_id) => write!(fmt, "Storage value found for network #{:?} but it's undecodable.", network_id), + OffchainErr::StorageRetrievalError(ref network_id) => write!( + fmt, + "Storage value found for network #{:?} but it's undecodable.", + network_id + ), OffchainErr::RequestUncompleted => write!(fmt, "Failed to complete request."), - OffchainErr::HttpResponseNotOk(code) => write!(fmt, "Http response returned code {:?}.", code), + OffchainErr::HttpResponseNotOk(code) => { + write!(fmt, "Http response returned code {:?}.", code) + } OffchainErr::ErrorInEvmResponse => write!(fmt, "Error in evm reponse."), - OffchainErr::NoStoredNetworks => write!(fmt, "No networks stored for the offchain slow claps."), - OffchainErr::NotValidator => write!(fmt, "Not a validator for slow clap, `--validator` flag needed."), - OffchainErr::UtxoNotImplemented(ref network_id) => write!(fmt, "Network #{:?} is marked as UTXO, which is not implemented yet.", network_id), - OffchainErr::UnknownNetworkType(ref network_id) => write!(fmt, "Unknown type for network #{:?}.", network_id), - OffchainErr::OffchainTimeoutPeriod(ref network_id) => write!(fmt, "Offchain request should be in-flight for network #{:?}.", network_id), - OffchainErr::TooManyRequests(ref network_id) => write!(fmt, "Too many requests over RPC endpoint for network #{:?}.", network_id), + OffchainErr::NoStoredNetworks => { + write!(fmt, "No networks stored for the offchain slow claps.") + } + OffchainErr::NoEndpointAvailable(ref network_id) => write!( + fmt, + "No RPC endpoint available for network #{:?}.", + network_id + ), + OffchainErr::UtxoNotImplemented(ref network_id) => write!( + fmt, + "Network #{:?} is marked as UTXO, which is not implemented yet.", + network_id + ), + OffchainErr::UnknownNetworkType(ref network_id) => { + write!(fmt, "Unknown type for network #{:?}.", network_id) + } + OffchainErr::OffchainTimeoutPeriod(ref network_id) => write!( + fmt, + "Offchain request should be in-flight for network #{:?}.", + network_id + ), } } } @@ -359,25 +384,13 @@ pub mod pallet { #[pallet::hooks] impl Hooks> for Pallet { fn offchain_worker(now: BlockNumberFor) { - match Self::start_slow_clapping(now) { - Ok(iter) => { - for result in iter.into_iter() { - if let Err(e) = result { - log::info!( - target: LOG_TARGET, - "👏 Skipping slow clap at {:?}: {:?}", - now, - e, - ) - } - } - } - Err(e) => log::info!( + if let Err(e) = Self::start_slow_clapping(now) { + log::info!( target: LOG_TARGET, - "👏 Could not start slow clap at {:?}: {:?}", + "👏 Skipping slow clap at {:?}: {:?}", now, e, - ), + ) } } } @@ -680,13 +693,7 @@ impl Pallet { Ok(()) } - fn start_slow_clapping( - block_number: BlockNumberFor, - ) -> OffchainResult>> { - sp_io::offchain::is_validator() - .then(|| ()) - .ok_or(OffchainErr::NotValidator)?; - + fn start_slow_clapping(block_number: BlockNumberFor) -> OffchainResult { let session_index = T::ValidatorSet::session_index(); let networks_len = T::NetworkDataHandler::iter().count(); let network_in_use = T::NetworkDataHandler::iter() @@ -701,7 +708,6 @@ impl Pallet { let network_id_encoded = network_in_use.0.encode(); - let last_timestamp_key = Self::create_storage_key(b"last-timestamp-", &network_id_encoded); let rate_limit_delay_key = Self::create_storage_key(b"rate-limit-", &network_id_encoded); let rate_limit_delay = Self::read_persistent_offchain_storage( &rate_limit_delay_key, @@ -710,51 +716,24 @@ impl Pallet { let network_lock_key = Self::create_storage_key(b"network-lock-", &network_id_encoded); let block_until = - rt_offchain::Duration::from_millis(networks_len as u64 * FETCH_TIMEOUT_PERIOD); + rt_offchain::Duration::from_millis(rate_limit_delay.max(FETCH_TIMEOUT_PERIOD)); let mut network_lock = StorageLock::