From c6040b8447ec234a3bc7dd4d0549be478676bc9c Mon Sep 17 00:00:00 2001 From: Alain Brenzikofer Date: Fri, 22 Dec 2023 14:08:59 +0100 Subject: [PATCH 1/5] accept any new sidechain block from authorized enclave for shard --- Cargo.lock | 80 ++++++++-------- primitives/sidechain/src/lib.rs | 3 +- sidechain/src/lib.rs | 44 ++++----- sidechain/src/tests.rs | 156 ++++++++++++++++---------------- 4 files changed, 139 insertions(+), 144 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4f7718c6..03d55acd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -873,7 +873,7 @@ dependencies = [ [[package]] name = "frame-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "frame-support", "frame-support-procedural", @@ -910,7 +910,7 @@ dependencies = [ [[package]] name = "frame-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "bitflags 1.3.2", "environmental", @@ -943,7 +943,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "Inflector", "cfg-expr", @@ -959,7 +959,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -971,7 +971,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "proc-macro2", "quote", @@ -981,7 +981,7 @@ dependencies = [ [[package]] name = "frame-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "frame-support", "log", @@ -1786,7 +1786,7 @@ checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" [[package]] name = "pallet-balances" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "frame-benchmarking", "frame-support", @@ -1955,7 +1955,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "frame-benchmarking", "frame-support", @@ -1973,7 +1973,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "frame-benchmarking", "frame-support", @@ -2813,7 +2813,7 @@ checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" [[package]] name = "sp-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "hash-db", "log", @@ -2833,7 +2833,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "Inflector", "blake2", @@ -2847,7 +2847,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "parity-scale-codec", "scale-info", @@ -2860,7 +2860,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "integer-sqrt", "num-traits", @@ -2874,7 +2874,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "parity-scale-codec", "scale-info", @@ -2887,7 +2887,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "parity-scale-codec", "scale-info", @@ -2899,7 +2899,7 @@ dependencies = [ [[package]] name = "sp-core" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "array-bytes", "bitflags 1.3.2", @@ -2943,7 +2943,7 @@ dependencies = [ [[package]] name = "sp-core-hashing" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "blake2b_simd", "byteorder", @@ -2957,7 +2957,7 @@ dependencies = [ [[package]] name = "sp-core-hashing-proc-macro" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "proc-macro2", "quote", @@ -2968,7 +2968,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "proc-macro2", "quote", @@ -2978,7 +2978,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "environmental", "parity-scale-codec", @@ -2989,7 +2989,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "async-trait", "impl-trait-for-tuples", @@ -3004,7 +3004,7 @@ dependencies = [ [[package]] name = "sp-io" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "bytes", "ed25519", @@ -3030,7 +3030,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "lazy_static", "sp-core", @@ -3041,7 +3041,7 @@ dependencies = [ [[package]] name = "sp-keystore" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "futures", "parity-scale-codec", @@ -3055,7 +3055,7 @@ dependencies = [ [[package]] name = "sp-metadata-ir" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "frame-metadata", "parity-scale-codec", @@ -3066,7 +3066,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "backtrace", "lazy_static", @@ -3076,7 +3076,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "either", "hash256-std-hasher", @@ -3098,7 +3098,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -3116,7 +3116,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "Inflector", "proc-macro-crate", @@ -3128,7 +3128,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "parity-scale-codec", "scale-info", @@ -3141,7 +3141,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "hash-db", "log", @@ -3161,12 +3161,12 @@ dependencies = [ [[package]] name = "sp-std" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" [[package]] name = "sp-storage" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "impl-serde", "parity-scale-codec", @@ -3179,7 +3179,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "async-trait", "futures-timer", @@ -3194,7 +3194,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "parity-scale-codec", "sp-std", @@ -3206,7 +3206,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "ahash 0.8.6", "hash-db", @@ -3229,7 +3229,7 @@ dependencies = [ [[package]] name = "sp-version" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "impl-serde", "parity-scale-codec", @@ -3246,7 +3246,7 @@ dependencies = [ [[package]] name = "sp-version-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "parity-scale-codec", "proc-macro2", @@ -3257,7 +3257,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "anyhow", "impl-trait-for-tuples", @@ -3271,7 +3271,7 @@ dependencies = [ [[package]] name = "sp-weights" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "parity-scale-codec", "scale-info", diff --git a/primitives/sidechain/src/lib.rs b/primitives/sidechain/src/lib.rs index a5faac04..86a82554 100644 --- a/primitives/sidechain/src/lib.rs +++ b/primitives/sidechain/src/lib.rs @@ -24,9 +24,10 @@ use sp_core::H256; #[cfg(feature = "std")] use serde::{Deserialize, Serialize}; +pub type SidechainBlockNumber = u64; #[derive(PartialEq, Eq, Clone, Encode, Decode, Debug, Copy, Default, TypeInfo)] #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] pub struct SidechainBlockConfirmation { - pub block_number: u64, + pub block_number: SidechainBlockNumber, pub block_header_hash: H256, } diff --git a/sidechain/src/lib.rs b/sidechain/src/lib.rs index 5624d062..e0f5a141 100644 --- a/sidechain/src/lib.rs +++ b/sidechain/src/lib.rs @@ -21,7 +21,7 @@ use enclave_bridge_primitives::ShardIdentifier; use frame_support::dispatch::DispatchResultWithPostInfo; use frame_system::{self}; use pallet_enclave_bridge::Pallet as EnclaveBridge; -use sidechain_primitives::SidechainBlockConfirmation; +use sidechain_primitives::{SidechainBlockConfirmation, SidechainBlockNumber}; use sp_core::H256; use sp_std::{prelude::*, str, vec}; @@ -29,7 +29,7 @@ pub use crate::weights::WeightInfo; // Disambiguate associated types pub type AccountId = ::AccountId; -pub type ShardBlockNumber = (ShardIdentifier, u64); +pub type ShardAndBlockNumber = (ShardIdentifier, SidechainBlockNumber); pub use pallet::*; @@ -60,6 +60,7 @@ pub mod pallet { /// a sidechain block has been finalized FinalizedSidechainBlock { shard: ShardIdentifier, + block_number: SidechainBlockNumber, block_header_hash: H256, validateer: T::AccountId, }, @@ -76,12 +77,7 @@ pub mod pallet { #[pallet::storage] #[pallet::getter(fn latest_sidechain_block_confirmation)] pub type LatestSidechainBlockConfirmation = - StorageMap<_, Blake2_128Concat, ShardIdentifier, SidechainBlockConfirmation, ValueQuery>; - - #[pallet::storage] - #[pallet::getter(fn sidechain_block_finalization_candidate)] - pub type SidechainBlockFinalizationCandidate = - StorageMap<_, Blake2_128Concat, ShardIdentifier, u64, ValueQuery>; + StorageMap<_, Blake2_128Concat, ShardIdentifier, SidechainBlockConfirmation, OptionQuery>; #[pallet::call] impl Pallet { @@ -92,7 +88,7 @@ pub mod pallet { origin: OriginFor, shard: ShardIdentifier, block_number: u64, - next_finalization_candidate_block_number: u64, + _next_finalization_candidate_block_number: u64, //fixme: can be removed next time we introduce breaking changes block_header_hash: H256, ) -> DispatchResultWithPostInfo { let sender = ensure_signed(origin)?; @@ -103,7 +99,8 @@ pub mod pallet { >::block_number(), )?; - // TODO: Simple logic for now: only accept blocks from first registered enclave. + // TODO: Simple but robust logic for now: + // accept all blocks from first registered enclave for shard as long as blocknumber monotonically increases. if sender != shard_status[0].signer { log::debug!( "Ignore block confirmation from registered enclave with index > 1: {:?}", @@ -111,22 +108,12 @@ pub mod pallet { ); return Ok(().into()) } - let finalization_candidate_block_number = - >::try_get(shard).unwrap_or(1); - - ensure!( - block_number == finalization_candidate_block_number, - >::ReceivedUnexpectedSidechainBlock - ); - ensure!( - next_finalization_candidate_block_number > finalization_candidate_block_number, - >::InvalidNextFinalizationCandidateBlockNumber - ); - - >::insert( - shard, - next_finalization_candidate_block_number, - ); + if let Some(ancestor) = Self::latest_sidechain_block_confirmation(shard) { + ensure!( + ancestor.block_number < block_number, + >::ReceivedUnexpectedSidechainBlock + ); + } Self::finalize_block( shard, SidechainBlockConfirmation { block_number, block_header_hash }, @@ -145,13 +132,16 @@ impl Pallet { ) { >::insert(shard, confirmation); let block_header_hash = confirmation.block_header_hash; + let block_number = confirmation.block_number; log::debug!( - "Imported sidechain block confirmed with shard {:?}, block header hash {:?}", + "Imported sidechain block {} confirmed with shard {:?}, block header hash {:?}", + block_number, shard, block_header_hash ); Self::deposit_event(Event::FinalizedSidechainBlock { shard, + block_number, block_header_hash, validateer: sender.clone(), }); diff --git a/sidechain/src/tests.rs b/sidechain/src/tests.rs index b9d0c9bc..8e63db75 100644 --- a/sidechain/src/tests.rs +++ b/sidechain/src/tests.rs @@ -33,31 +33,6 @@ fn get_signer(pubkey: &[u8; 32]) -> AccountId { test_utils::get_signer(pubkey) } -#[test] -fn confirm_imported_sidechain_block_invalid_next_finalization_candidate() { - new_test_ext().execute_with(|| { - Timestamp::set_timestamp(TEST7_TIMESTAMP); - let hash = H256::default(); - let signer7 = get_signer(TEST7_SIGNER_PUB); - let shard7 = H256::from_slice(&TEST7_MRENCLAVE); - - let block_number = 1; - - register_ias_enclave7(); - - assert_err!( - Sidechain::confirm_imported_sidechain_block( - RuntimeOrigin::signed(signer7.clone()), - shard7, - block_number, - block_number, - hash - ), - Error::::InvalidNextFinalizationCandidateBlockNumber, - ); - }) -} - #[test] fn confirm_imported_sidechain_block_works_for_correct_shard() { new_test_ext().execute_with(|| { @@ -81,6 +56,7 @@ fn confirm_imported_sidechain_block_works_for_correct_shard() { let expected_event = RuntimeEvent::Sidechain(SidechainEvent::FinalizedSidechainBlock { shard: shard7, + block_number, block_header_hash: hash, validateer: signer7, }); @@ -122,72 +98,90 @@ fn confirm_imported_sidechain_block_correct_order() { register_ias_enclave7(); assert_ok!(confirm_sidechain_block7(1, 2, H256::random(), true)); - assert_eq!(Sidechain::latest_sidechain_block_confirmation(shard7).block_number, 1); - assert_eq!(Sidechain::sidechain_block_finalization_candidate(shard7), 2); + assert_eq!( + Sidechain::latest_sidechain_block_confirmation(shard7) + .unwrap_or_default() + .block_number, + 1 + ); assert_ok!(confirm_sidechain_block7(2, 3, H256::random(), true)); - assert_eq!(Sidechain::latest_sidechain_block_confirmation(shard7).block_number, 2); - assert_eq!(Sidechain::sidechain_block_finalization_candidate(shard7), 3); + assert_eq!( + Sidechain::latest_sidechain_block_confirmation(shard7) + .unwrap_or_default() + .block_number, + 2 + ); assert_ok!(confirm_sidechain_block7(3, 4, H256::random(), true)); - assert_eq!(Sidechain::latest_sidechain_block_confirmation(shard7).block_number, 3); - assert_eq!(Sidechain::sidechain_block_finalization_candidate(shard7), 4); + assert_eq!( + Sidechain::latest_sidechain_block_confirmation(shard7) + .unwrap_or_default() + .block_number, + 3 + ); assert_ok!(confirm_sidechain_block7(4, 5, H256::random(), true)); - assert_eq!(Sidechain::latest_sidechain_block_confirmation(shard7).block_number, 4); - assert_eq!(Sidechain::sidechain_block_finalization_candidate(shard7), 5); + assert_eq!( + Sidechain::latest_sidechain_block_confirmation(shard7) + .unwrap_or_default() + .block_number, + 4 + ); assert_ok!(confirm_sidechain_block7(5, 6, H256::random(), true)); - assert_eq!(Sidechain::latest_sidechain_block_confirmation(shard7).block_number, 5); - assert_eq!(Sidechain::sidechain_block_finalization_candidate(shard7), 6); + assert_eq!( + Sidechain::latest_sidechain_block_confirmation(shard7) + .unwrap_or_default() + .block_number, + 5 + ); }) } #[test] -fn confirm_imported_sidechain_block_wrong_next() { +fn confirm_imported_sidechain_block_outdated_successor_fails() { new_test_ext().execute_with(|| { Timestamp::set_timestamp(TEST7_TIMESTAMP); let shard7 = H256::from_slice(&TEST7_MRENCLAVE); register_ias_enclave7(); - assert_ok!(confirm_sidechain_block7(1, 2, H256::random(), true)); - assert_eq!(Sidechain::latest_sidechain_block_confirmation(shard7).block_number, 1); - assert_eq!(Sidechain::sidechain_block_finalization_candidate(shard7), 2); - assert_ok!(confirm_sidechain_block7(2, 4, H256::random(), true)); - assert_eq!(Sidechain::latest_sidechain_block_confirmation(shard7).block_number, 2); - assert_eq!(Sidechain::sidechain_block_finalization_candidate(shard7), 4); + assert_ok!(confirm_sidechain_block7(11, 42, H256::random(), true)); + assert_eq!( + Sidechain::latest_sidechain_block_confirmation(shard7) + .unwrap_or_default() + .block_number, + 11 + ); + assert_ok!(confirm_sidechain_block7(22, 42, H256::random(), true)); + assert_eq!( + Sidechain::latest_sidechain_block_confirmation(shard7) + .unwrap_or_default() + .block_number, + 22 + ); + + // resubmission must fail assert_err!( - confirm_sidechain_block7(3, 4, H256::random(), true), + confirm_sidechain_block7(22, 42, H256::random(), true), Error::::ReceivedUnexpectedSidechainBlock ); - assert_eq!(Sidechain::latest_sidechain_block_confirmation(shard7).block_number, 2); - assert_eq!(Sidechain::sidechain_block_finalization_candidate(shard7), 4); - assert_ok!(confirm_sidechain_block7(4, 5, H256::random(), true)); - assert_eq!(Sidechain::latest_sidechain_block_confirmation(shard7).block_number, 4); - assert_eq!(Sidechain::sidechain_block_finalization_candidate(shard7), 5); - }) -} - -#[test] -fn confirm_imported_sidechain_block_outdated() { - new_test_ext().execute_with(|| { - Timestamp::set_timestamp(TEST7_TIMESTAMP); - let shard7 = H256::from_slice(&TEST7_MRENCLAVE); - - register_ias_enclave7(); - - assert_ok!(confirm_sidechain_block7(1, 2, H256::random(), true)); - assert_eq!(Sidechain::latest_sidechain_block_confirmation(shard7).block_number, 1); - assert_eq!(Sidechain::sidechain_block_finalization_candidate(shard7), 2); - assert_ok!(confirm_sidechain_block7(2, 4, H256::random(), true)); - assert_eq!(Sidechain::latest_sidechain_block_confirmation(shard7).block_number, 2); - assert_eq!(Sidechain::sidechain_block_finalization_candidate(shard7), 4); + // outdated blocks must fail assert_err!( - confirm_sidechain_block7(2, 4, H256::random(), true), + confirm_sidechain_block7(21, 42, H256::random(), true), Error::::ReceivedUnexpectedSidechainBlock ); - assert_eq!(Sidechain::latest_sidechain_block_confirmation(shard7).block_number, 2); - assert_eq!(Sidechain::sidechain_block_finalization_candidate(shard7), 4); - assert_ok!(confirm_sidechain_block7(4, 5, H256::random(), true)); - assert_eq!(Sidechain::latest_sidechain_block_confirmation(shard7).block_number, 4); - assert_eq!(Sidechain::sidechain_block_finalization_candidate(shard7), 5); + + assert_eq!( + Sidechain::latest_sidechain_block_confirmation(shard7) + .unwrap_or_default() + .block_number, + 22 + ); + assert_ok!(confirm_sidechain_block7(44, 42, H256::random(), true)); + assert_eq!( + Sidechain::latest_sidechain_block_confirmation(shard7) + .unwrap_or_default() + .block_number, + 44 + ); }) } @@ -199,13 +193,19 @@ fn dont_process_confirmation_of_second_registered_enclave() { register_ias_enclave(TEST7_SIGNER_PUB, TEST7_CERT); assert_ok!(confirm_sidechain_block(shard7, TEST7_SIGNER_PUB, 1, 2, H256::default(), true)); - assert_eq!(Sidechain::latest_sidechain_block_confirmation(shard7).block_number, 1); + assert_eq!( + Sidechain::latest_sidechain_block_confirmation(shard7) + .unwrap_or_default() + .block_number, + 1 + ); register_ias_enclave(TEST6_SIGNER_PUB, TEST6_CERT); System::reset_events(); assert_ok!(confirm_sidechain_block(shard7, TEST6_SIGNER_PUB, 1, 2, H256::default(), false)); let expected_event = RuntimeEvent::Sidechain(SidechainEvent::FinalizedSidechainBlock { shard: shard7, + block_number: 1, block_header_hash: H256::default(), validateer: get_signer(TEST6_SIGNER_PUB), }); @@ -241,6 +241,7 @@ fn confirm_imported_sidechain_block_works_for_correct_shard_with_updated_fingerp let expected_event = RuntimeEvent::Sidechain(SidechainEvent::FinalizedSidechainBlock { shard, + block_number: 1, block_header_hash: hash, validateer: enclave_signer.clone(), }); @@ -266,6 +267,7 @@ fn confirm_imported_sidechain_block_works_for_correct_shard_with_updated_fingerp let expected_event = RuntimeEvent::Sidechain(SidechainEvent::FinalizedSidechainBlock { shard, + block_number: 2, block_header_hash: hash, validateer: enclave_signer.clone(), }); @@ -287,6 +289,7 @@ fn confirm_imported_sidechain_block_works_for_correct_shard_with_updated_fingerp let expected_event = RuntimeEvent::Sidechain(SidechainEvent::FinalizedSidechainBlock { shard, + block_number: 3, block_header_hash: hash, validateer: enclave_signer, }); @@ -314,6 +317,7 @@ fn two_sidechains_with_different_fingerprint_works() { let expected_event = RuntimeEvent::Sidechain(SidechainEvent::FinalizedSidechainBlock { shard: shard1, + block_number: 1, block_header_hash: hash1, validateer: enclave_signer1.clone(), }); @@ -337,6 +341,7 @@ fn two_sidechains_with_different_fingerprint_works() { let expected_event = RuntimeEvent::Sidechain(SidechainEvent::FinalizedSidechainBlock { shard: shard2, + block_number: 1, block_header_hash: hash2, validateer: enclave_signer2.clone(), }); @@ -356,14 +361,12 @@ fn two_sidechains_with_different_fingerprint_works() { assert_eq!(shard_status2[0].last_activity, 2u32); assert_eq!( Sidechain::latest_sidechain_block_confirmation(shard1), - SidechainBlockConfirmation { block_number: 1, block_header_hash: hash1 } + Some(SidechainBlockConfirmation { block_number: 1, block_header_hash: hash1 }) ); assert_eq!( Sidechain::latest_sidechain_block_confirmation(shard2), - SidechainBlockConfirmation { block_number: 1, block_header_hash: hash2 } + Some(SidechainBlockConfirmation { block_number: 1, block_header_hash: hash2 }) ); - assert_eq!(Sidechain::sidechain_block_finalization_candidate(shard1), 2); - assert_eq!(Sidechain::sidechain_block_finalization_candidate(shard2), 10); }) } @@ -424,6 +427,7 @@ fn confirm_sidechain_block( if assert_event { let expected_event = RuntimeEvent::Sidechain(SidechainEvent::FinalizedSidechainBlock { shard, + block_number, block_header_hash, validateer: signer, }); From 554ab33a5fb51be86aa889a7337aa17bf9c2b662 Mon Sep 17 00:00:00 2001 From: Alain Brenzikofer Date: Fri, 22 Dec 2023 16:24:01 +0100 Subject: [PATCH 2/5] introduce purge_enclave_from_shard_status and make ShardStatus a BoundedVec --- Cargo.lock | 80 ++++++++++---------- enclave-bridge/src/lib.rs | 107 +++++++++++++++++++-------- enclave-bridge/src/weights.rs | 12 +++ primitives/enclave-bridge/src/lib.rs | 1 + 4 files changed, 131 insertions(+), 69 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 03d55acd..4f7718c6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -873,7 +873,7 @@ dependencies = [ [[package]] name = "frame-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "frame-support", "frame-support-procedural", @@ -910,7 +910,7 @@ dependencies = [ [[package]] name = "frame-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "bitflags 1.3.2", "environmental", @@ -943,7 +943,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "Inflector", "cfg-expr", @@ -959,7 +959,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -971,7 +971,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "proc-macro2", "quote", @@ -981,7 +981,7 @@ dependencies = [ [[package]] name = "frame-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "frame-support", "log", @@ -1786,7 +1786,7 @@ checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" [[package]] name = "pallet-balances" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "frame-benchmarking", "frame-support", @@ -1955,7 +1955,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "frame-benchmarking", "frame-support", @@ -1973,7 +1973,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "frame-benchmarking", "frame-support", @@ -2813,7 +2813,7 @@ checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" [[package]] name = "sp-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "hash-db", "log", @@ -2833,7 +2833,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "Inflector", "blake2", @@ -2847,7 +2847,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "parity-scale-codec", "scale-info", @@ -2860,7 +2860,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "integer-sqrt", "num-traits", @@ -2874,7 +2874,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "parity-scale-codec", "scale-info", @@ -2887,7 +2887,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "parity-scale-codec", "scale-info", @@ -2899,7 +2899,7 @@ dependencies = [ [[package]] name = "sp-core" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "array-bytes", "bitflags 1.3.2", @@ -2943,7 +2943,7 @@ dependencies = [ [[package]] name = "sp-core-hashing" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "blake2b_simd", "byteorder", @@ -2957,7 +2957,7 @@ dependencies = [ [[package]] name = "sp-core-hashing-proc-macro" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "proc-macro2", "quote", @@ -2968,7 +2968,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "proc-macro2", "quote", @@ -2978,7 +2978,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "environmental", "parity-scale-codec", @@ -2989,7 +2989,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "async-trait", "impl-trait-for-tuples", @@ -3004,7 +3004,7 @@ dependencies = [ [[package]] name = "sp-io" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "bytes", "ed25519", @@ -3030,7 +3030,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "lazy_static", "sp-core", @@ -3041,7 +3041,7 @@ dependencies = [ [[package]] name = "sp-keystore" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "futures", "parity-scale-codec", @@ -3055,7 +3055,7 @@ dependencies = [ [[package]] name = "sp-metadata-ir" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "frame-metadata", "parity-scale-codec", @@ -3066,7 +3066,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "backtrace", "lazy_static", @@ -3076,7 +3076,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "either", "hash256-std-hasher", @@ -3098,7 +3098,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -3116,7 +3116,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "Inflector", "proc-macro-crate", @@ -3128,7 +3128,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "parity-scale-codec", "scale-info", @@ -3141,7 +3141,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "hash-db", "log", @@ -3161,12 +3161,12 @@ dependencies = [ [[package]] name = "sp-std" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" [[package]] name = "sp-storage" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "impl-serde", "parity-scale-codec", @@ -3179,7 +3179,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "async-trait", "futures-timer", @@ -3194,7 +3194,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "parity-scale-codec", "sp-std", @@ -3206,7 +3206,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "ahash 0.8.6", "hash-db", @@ -3229,7 +3229,7 @@ dependencies = [ [[package]] name = "sp-version" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "impl-serde", "parity-scale-codec", @@ -3246,7 +3246,7 @@ dependencies = [ [[package]] name = "sp-version-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "parity-scale-codec", "proc-macro2", @@ -3257,7 +3257,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "anyhow", "impl-trait-for-tuples", @@ -3271,7 +3271,7 @@ dependencies = [ [[package]] name = "sp-weights" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "parity-scale-codec", "scale-info", diff --git a/enclave-bridge/src/lib.rs b/enclave-bridge/src/lib.rs index 750b558b..da5169c7 100644 --- a/enclave-bridge/src/lib.rs +++ b/enclave-bridge/src/lib.rs @@ -17,33 +17,35 @@ #![cfg_attr(not(feature = "std"), no_std)] +pub use crate::weights::WeightInfo; use codec::Encode; -use enclave_bridge_primitives::*; +use enclave_bridge_primitives::{ + Request, ShardConfig, ShardIdentifier, ShardSignerStatus as ShardSignerStatusGeneric, + UpgradableShardConfig, ENCLAVE_BRIDGE, SHARD_STATUS_MAX_DEPTH, +}; use frame_support::{ dispatch::{DispatchErrorWithPostInfo, DispatchResult, DispatchResultWithPostInfo}, ensure, + pallet_prelude::ConstU32, traits::{Currency, ExistenceRequirement}, }; use frame_system::{self, ensure_signed}; -use sp_core::H256; +use pallet_teerex::Pallet as Teerex; +use sp_core::{bounded::BoundedVec, H256}; use sp_runtime::traits::{SaturatedConversion, Saturating}; use sp_std::{prelude::*, str, vec}; - -pub use crate::weights::WeightInfo; - +use teerex_primitives::{EnclaveFingerprint, MultiEnclave}; // Disambiguate associated types pub type AccountId = ::AccountId; pub type BalanceOf = <::Currency as Currency>>::Balance; -pub type ShardSignerStatusVec = Vec< - ShardSignerStatus< - ::AccountId, - ::BlockNumber, - >, +pub type ShardSignerStatus = ShardSignerStatusGeneric< + ::AccountId, + ::BlockNumber, >; +pub type ShardSignerStatusVec = + BoundedVec, ConstU32>; pub use pallet::*; -use pallet_teerex::Pallet as Teerex; -use teerex_primitives::MultiEnclave; /// Maximum number of topics for the `publish_hash` call. const TOPICS_LIMIT: usize = 5; @@ -101,6 +103,11 @@ pub mod pallet { data: Vec, }, ShardConfigUpdated(ShardIdentifier), + /// An enclave has been purged from a shard status. Most likely due to inactivity + PurgedEnclaveFromShardConfig { + shard: ShardIdentifier, + subject: T::AccountId, + }, } #[pallet::error] @@ -111,17 +118,14 @@ pub mod pallet { TooManyTopics, /// The length of the `data` passed to `publish_hash` exceeds the limit. DataTooLong, + /// Too many enclaves in ShardStatus + TooManyEnclaves, } #[pallet::storage] #[pallet::getter(fn shard_status)] - pub type ShardStatus = StorageMap< - _, - Blake2_128Concat, - ShardIdentifier, - Vec>, - OptionQuery, - >; + pub type ShardStatus = + StorageMap<_, Blake2_128Concat, ShardIdentifier, ShardSignerStatusVec, OptionQuery>; /// this registry holds shard configurations as well as pending updates thereof. /// We decided to put config and update data in the same storage for performance reasons. @@ -362,6 +366,51 @@ pub mod pallet { Self::deposit_event(Event::ShardConfigUpdated(shard)); Ok(().into()) } + /// Update shard config + /// To be respected by L2 instances after `enactment_delay` parentchain blocks + /// If no previous config exists, the `enactment_delay` parameter will be ignored + /// and the `shard_config` will be active immediately + #[pallet::call_index(6)] + #[pallet::weight((::WeightInfo::purge_enclave_from_shard_status(), DispatchClass::Normal, Pays::No))] + pub fn purge_enclave_from_shard_status( + origin: OriginFor, + shard: ShardIdentifier, + subject: T::AccountId, + ) -> DispatchResultWithPostInfo { + ensure_root(origin)?; + + let new_status: ShardSignerStatusVec = + if let Some(shard_status) = Self::shard_status(shard) { + shard_status + .iter() + .map(|s| s.clone()) + .filter(|signer_status| signer_status.signer != subject) + .collect::>>() + .try_into() + .expect("can only become smaller by filtering") + } else { + //noop + log::warn!( + target: ENCLAVE_BRIDGE, + "attempt to purge absent enclave from shard status" + ); + return Ok(().into()) + }; + + >::insert(shard, new_status); + + log::info!( + target: ENCLAVE_BRIDGE, + "purged {:?} from shard status for {:?}", + subject, + shard, + ); + Self::deposit_event(crate::pallet::Event::PurgedEnclaveFromShardConfig { + shard, + subject, + }); + Ok(().into()) + } } } @@ -371,10 +420,7 @@ impl Pallet { enclave_signer: &T::AccountId, shard: ShardIdentifier, current_block_number: T::BlockNumber, - ) -> Result< - (MultiEnclave>, Vec>), - DispatchErrorWithPostInfo, - > { + ) -> Result<(MultiEnclave>, ShardSignerStatusVec), DispatchErrorWithPostInfo> { let enclave = Teerex::::get_sovereign_enclave(enclave_signer)?; ensure!( enclave.fingerprint() == @@ -418,14 +464,15 @@ impl Pallet { enclave_fingerprint: EnclaveFingerprint, current_block_number: T::BlockNumber, ) -> Result, DispatchErrorWithPostInfo> { - let new_status = ShardSignerStatus { + let new_status = ShardSignerStatus:: { signer: enclave_signer.clone(), fingerprint: enclave_fingerprint, last_activity: current_block_number, }; - let signer_statuses = >::get(shard) - .map(|mut status_vec| { + let signer_statuses: Vec> = Self::shard_status(shard) + .map(|status_bvec| { + let mut status_vec = status_bvec.to_vec(); if let Some(index) = status_vec.iter().position(|i| &i.signer == enclave_signer) { status_vec[index] = new_status.clone(); } else { @@ -435,6 +482,10 @@ impl Pallet { }) .unwrap_or_else(|| vec![new_status]); + let signer_statuses = match ShardSignerStatusVec::::try_from(signer_statuses) { + Ok(status_bvec) => status_bvec, + Err(_) => return Err(Error::::TooManyEnclaves.into()), + }; log::trace!( target: ENCLAVE_BRIDGE, "touched shard: {:?}, signer statuses: {:?}", @@ -445,9 +496,7 @@ impl Pallet { Ok(signer_statuses) } - pub fn most_recent_shard_update( - shard: &ShardIdentifier, - ) -> Option> { + pub fn most_recent_shard_update(shard: &ShardIdentifier) -> Option> { >::get(shard) .map(|mut statuses| { statuses.sort_by_key(|a| a.last_activity); diff --git a/enclave-bridge/src/weights.rs b/enclave-bridge/src/weights.rs index c113d43c..5b2aca7d 100644 --- a/enclave-bridge/src/weights.rs +++ b/enclave-bridge/src/weights.rs @@ -56,6 +56,7 @@ pub trait WeightInfo { fn unshield_funds() -> Weight; fn publish_hash(l: u32, t: u32) -> Weight; fn update_shard_config() -> Weight; + fn purge_enclave_from_shard_status() -> Weight; } /// Weights for pallet_teerex using the Integritee parachain node and recommended hardware. @@ -129,6 +130,12 @@ impl WeightInfo for IntegriteeWeight { .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) } + + fn purge_enclave_from_shard_status() -> Weight { + Weight::from_parts(10_000_000, 0) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } } /// For tests, weights have been generated with the integritee-node. @@ -196,4 +203,9 @@ impl WeightInfo for () { .saturating_add(RocksDbWeight::get().reads(3)) .saturating_add(RocksDbWeight::get().writes(2)) } + fn purge_enclave_from_shard_status() -> Weight { + Weight::from_parts(10_000_000, 0) + .saturating_add(RocksDbWeight::get().reads(1)) + .saturating_add(RocksDbWeight::get().writes(1)) + } } diff --git a/primitives/enclave-bridge/src/lib.rs b/primitives/enclave-bridge/src/lib.rs index 7fb258da..e82c2bb7 100644 --- a/primitives/enclave-bridge/src/lib.rs +++ b/primitives/enclave-bridge/src/lib.rs @@ -36,6 +36,7 @@ pub struct ShardSignerStatus { pub fingerprint: EnclaveFingerprint, pub last_activity: BlockNumber, } +pub const SHARD_STATUS_MAX_DEPTH: u32 = 10; #[derive(Encode, Decode, Clone, PartialEq, Eq, sp_core::RuntimeDebug, TypeInfo)] pub struct ShardConfig { From 52ce4a98c24506cb9dcee6c388b7266928a750ad Mon Sep 17 00:00:00 2001 From: Alain Brenzikofer Date: Fri, 22 Dec 2023 16:54:26 +0100 Subject: [PATCH 3/5] tests passed --- enclave-bridge/src/lib.rs | 10 +- enclave-bridge/src/tests/mod.rs | 2 + enclave-bridge/src/tests/test_shard_status.rs | 118 ++++++++++++++++++ 3 files changed, 125 insertions(+), 5 deletions(-) create mode 100644 enclave-bridge/src/tests/test_shard_status.rs diff --git a/enclave-bridge/src/lib.rs b/enclave-bridge/src/lib.rs index da5169c7..f75e144b 100644 --- a/enclave-bridge/src/lib.rs +++ b/enclave-bridge/src/lib.rs @@ -120,6 +120,8 @@ pub mod pallet { DataTooLong, /// Too many enclaves in ShardStatus TooManyEnclaves, + /// No such enclave was found in shard status + EnclaveNotFoundInShardStatus, } #[pallet::storage] @@ -366,10 +368,8 @@ pub mod pallet { Self::deposit_event(Event::ShardConfigUpdated(shard)); Ok(().into()) } - /// Update shard config - /// To be respected by L2 instances after `enactment_delay` parentchain blocks - /// If no previous config exists, the `enactment_delay` parameter will be ignored - /// and the `shard_config` will be active immediately + /// Purge enclave from shard status + /// this is a root call to be used for maintenance. Shall eventually be replaced by a lazy timeout #[pallet::call_index(6)] #[pallet::weight((::WeightInfo::purge_enclave_from_shard_status(), DispatchClass::Normal, Pays::No))] pub fn purge_enclave_from_shard_status( @@ -394,7 +394,7 @@ pub mod pallet { target: ENCLAVE_BRIDGE, "attempt to purge absent enclave from shard status" ); - return Ok(().into()) + return Err(Error::::EnclaveNotFoundInShardStatus.into()) }; >::insert(shard, new_status); diff --git a/enclave-bridge/src/tests/mod.rs b/enclave-bridge/src/tests/mod.rs index d50dc0e3..fcdc8c10 100644 --- a/enclave-bridge/src/tests/mod.rs +++ b/enclave-bridge/src/tests/mod.rs @@ -25,6 +25,8 @@ mod test_indirect_invocation; mod test_publish_hash; mod test_shard_config; +mod test_shard_status; + fn get_bonding_account(enclave: &MultiEnclave>) -> AccountId { AccountId::decode(&mut enclave.fingerprint().encode().as_ref()).unwrap() } diff --git a/enclave-bridge/src/tests/test_shard_status.rs b/enclave-bridge/src/tests/test_shard_status.rs new file mode 100644 index 00000000..c68a6fc3 --- /dev/null +++ b/enclave-bridge/src/tests/test_shard_status.rs @@ -0,0 +1,118 @@ +/* + Copyright 2021 Integritee AG and Supercomputing Systems AG + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +*/ + +use super::*; +use crate::{Error, Event as EnclaveBridgeEvent, ShardConfigRegistry}; +use enclave_bridge_primitives::{ShardConfig, ShardIdentifier, UpgradableShardConfig}; +use frame_support::{assert_err, assert_noop, assert_ok}; +use sp_keyring::AccountKeyring; +use teerex_primitives::EnclaveFingerprint; + +#[test] +fn purge_enclave_from_shard_status_works_if_present() { + new_test_ext().execute_with(|| { + Timestamp::set_timestamp(NOW); + let enclave_signer_1 = AccountKeyring::Eve.to_account_id(); + let enclave_signer_2 = AccountKeyring::Ferdie.to_account_id(); + let enclave_fingerprint = EnclaveFingerprint::default(); + let shard = ShardIdentifier::default(); + assert_ok!(EnclaveBridge::touch_shard( + shard, + &enclave_signer_1.clone(), + enclave_fingerprint, + 1 + )); + assert_ok!(EnclaveBridge::purge_enclave_from_shard_status( + RuntimeOrigin::root(), + shard, + enclave_signer_1.clone(), + )); + + assert!(EnclaveBridge::shard_status(shard).is_some()); + assert_eq!(EnclaveBridge::shard_status(shard).unwrap().len(), 0); + assert_ok!(EnclaveBridge::touch_shard( + shard, + &enclave_signer_1.clone(), + enclave_fingerprint, + 2 + )); + assert_ok!(EnclaveBridge::touch_shard( + shard, + &enclave_signer_2.clone(), + enclave_fingerprint, + 2 + )); + assert!(EnclaveBridge::shard_status(shard).is_some()); + assert_eq!(EnclaveBridge::shard_status(shard).unwrap().len(), 2); + + assert_ok!(EnclaveBridge::purge_enclave_from_shard_status( + RuntimeOrigin::root(), + shard, + enclave_signer_1, + )); + + assert!(EnclaveBridge::shard_status(shard).is_some()); + assert_eq!(EnclaveBridge::shard_status(shard).unwrap().len(), 1); + assert_eq!(EnclaveBridge::shard_status(shard).unwrap()[0].signer, enclave_signer_2); + }) +} + +fn purge_enclave_from_shard_status_is_noop_if_absent() { + new_test_ext().execute_with(|| { + Timestamp::set_timestamp(NOW); + let enclave_signer_1 = AccountKeyring::Eve.to_account_id(); + let enclave_signer_2 = AccountKeyring::Ferdie.to_account_id(); + let enclave_fingerprint = EnclaveFingerprint::default(); + let shard = ShardIdentifier::default(); + assert_ok!(EnclaveBridge::touch_shard( + shard, + &enclave_signer_1.clone(), + enclave_fingerprint, + 1 + )); + assert_noop!( + EnclaveBridge::purge_enclave_from_shard_status( + RuntimeOrigin::root(), + shard, + enclave_signer_2.clone(), + ), + Error::::EnclaveNotFoundInShardStatus + ); + }) +} + +#[test] +fn purge_enclave_from_shard_status_fails_if_not_root() { + new_test_ext().execute_with(|| { + Timestamp::set_timestamp(NOW); + let enclave_signer_1 = AccountKeyring::Eve.to_account_id(); + let enclave_fingerprint = EnclaveFingerprint::default(); + let shard = ShardIdentifier::default(); + assert_ok!(EnclaveBridge::touch_shard( + shard, + &enclave_signer_1.clone(), + enclave_fingerprint, + 1 + )); + assert!(EnclaveBridge::purge_enclave_from_shard_status( + RuntimeOrigin::signed(enclave_signer_1.clone()), + shard, + enclave_signer_1.clone(), + ) + .is_err()); + }) +} From 562e44ab346820f3ac94db5cbaffe01c5d6b9dac Mon Sep 17 00:00:00 2001 From: Alain Brenzikofer Date: Fri, 22 Dec 2023 17:13:05 +0100 Subject: [PATCH 4/5] add Event check --- enclave-bridge/src/lib.rs | 2 +- enclave-bridge/src/tests/test_shard_status.rs | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/enclave-bridge/src/lib.rs b/enclave-bridge/src/lib.rs index f75e144b..f3ab6c18 100644 --- a/enclave-bridge/src/lib.rs +++ b/enclave-bridge/src/lib.rs @@ -383,7 +383,7 @@ pub mod pallet { if let Some(shard_status) = Self::shard_status(shard) { shard_status .iter() - .map(|s| s.clone()) + .cloned() .filter(|signer_status| signer_status.signer != subject) .collect::>>() .try_into() diff --git a/enclave-bridge/src/tests/test_shard_status.rs b/enclave-bridge/src/tests/test_shard_status.rs index c68a6fc3..401699d9 100644 --- a/enclave-bridge/src/tests/test_shard_status.rs +++ b/enclave-bridge/src/tests/test_shard_status.rs @@ -41,6 +41,13 @@ fn purge_enclave_from_shard_status_works_if_present() { shard, enclave_signer_1.clone(), )); + let expected_event = + RuntimeEvent::EnclaveBridge(EnclaveBridgeEvent::PurgedEnclaveFromShardConfig { + shard, + subject: enclave_signer_1.clone(), + }); + println!("events:{:?}", System::events()); + assert!(System::events().iter().any(|a| a.event == expected_event)); assert!(EnclaveBridge::shard_status(shard).is_some()); assert_eq!(EnclaveBridge::shard_status(shard).unwrap().len(), 0); From fd99c07c1e25669713353bbe0d42d73c697b41bb Mon Sep 17 00:00:00 2001 From: Alain Brenzikofer Date: Sat, 23 Dec 2023 07:20:34 +0100 Subject: [PATCH 5/5] review comments and fix bogus test --- Cargo.lock | 80 +++++++++---------- enclave-bridge/src/lib.rs | 37 ++++----- enclave-bridge/src/tests/test_shard_status.rs | 16 ++-- primitives/enclave-bridge/src/lib.rs | 2 +- 4 files changed, 60 insertions(+), 75 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 03d55acd..4f7718c6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -873,7 +873,7 @@ dependencies = [ [[package]] name = "frame-benchmarking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "frame-support", "frame-support-procedural", @@ -910,7 +910,7 @@ dependencies = [ [[package]] name = "frame-support" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "bitflags 1.3.2", "environmental", @@ -943,7 +943,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "Inflector", "cfg-expr", @@ -959,7 +959,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -971,7 +971,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "proc-macro2", "quote", @@ -981,7 +981,7 @@ dependencies = [ [[package]] name = "frame-system" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "frame-support", "log", @@ -1786,7 +1786,7 @@ checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" [[package]] name = "pallet-balances" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "frame-benchmarking", "frame-support", @@ -1955,7 +1955,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "frame-benchmarking", "frame-support", @@ -1973,7 +1973,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "frame-benchmarking", "frame-support", @@ -2813,7 +2813,7 @@ checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" [[package]] name = "sp-api" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "hash-db", "log", @@ -2833,7 +2833,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "Inflector", "blake2", @@ -2847,7 +2847,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "parity-scale-codec", "scale-info", @@ -2860,7 +2860,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "integer-sqrt", "num-traits", @@ -2874,7 +2874,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "parity-scale-codec", "scale-info", @@ -2887,7 +2887,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "parity-scale-codec", "scale-info", @@ -2899,7 +2899,7 @@ dependencies = [ [[package]] name = "sp-core" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "array-bytes", "bitflags 1.3.2", @@ -2943,7 +2943,7 @@ dependencies = [ [[package]] name = "sp-core-hashing" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "blake2b_simd", "byteorder", @@ -2957,7 +2957,7 @@ dependencies = [ [[package]] name = "sp-core-hashing-proc-macro" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "proc-macro2", "quote", @@ -2968,7 +2968,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "proc-macro2", "quote", @@ -2978,7 +2978,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "environmental", "parity-scale-codec", @@ -2989,7 +2989,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "async-trait", "impl-trait-for-tuples", @@ -3004,7 +3004,7 @@ dependencies = [ [[package]] name = "sp-io" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "bytes", "ed25519", @@ -3030,7 +3030,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "lazy_static", "sp-core", @@ -3041,7 +3041,7 @@ dependencies = [ [[package]] name = "sp-keystore" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "futures", "parity-scale-codec", @@ -3055,7 +3055,7 @@ dependencies = [ [[package]] name = "sp-metadata-ir" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "frame-metadata", "parity-scale-codec", @@ -3066,7 +3066,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "backtrace", "lazy_static", @@ -3076,7 +3076,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "either", "hash256-std-hasher", @@ -3098,7 +3098,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -3116,7 +3116,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "Inflector", "proc-macro-crate", @@ -3128,7 +3128,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "parity-scale-codec", "scale-info", @@ -3141,7 +3141,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.13.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "hash-db", "log", @@ -3161,12 +3161,12 @@ dependencies = [ [[package]] name = "sp-std" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" [[package]] name = "sp-storage" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "impl-serde", "parity-scale-codec", @@ -3179,7 +3179,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "async-trait", "futures-timer", @@ -3194,7 +3194,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "parity-scale-codec", "sp-std", @@ -3206,7 +3206,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "ahash 0.8.6", "hash-db", @@ -3229,7 +3229,7 @@ dependencies = [ [[package]] name = "sp-version" version = "5.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "impl-serde", "parity-scale-codec", @@ -3246,7 +3246,7 @@ dependencies = [ [[package]] name = "sp-version-proc-macro" version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "parity-scale-codec", "proc-macro2", @@ -3257,7 +3257,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "7.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "anyhow", "impl-trait-for-tuples", @@ -3271,7 +3271,7 @@ dependencies = [ [[package]] name = "sp-weights" version = "4.0.0" -source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" +source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.42#ff24c60ac7d9f87727ecdd0ded9a80c56e4f4b65" dependencies = [ "parity-scale-codec", "scale-info", diff --git a/enclave-bridge/src/lib.rs b/enclave-bridge/src/lib.rs index f3ab6c18..5e533ebc 100644 --- a/enclave-bridge/src/lib.rs +++ b/enclave-bridge/src/lib.rs @@ -21,7 +21,7 @@ pub use crate::weights::WeightInfo; use codec::Encode; use enclave_bridge_primitives::{ Request, ShardConfig, ShardIdentifier, ShardSignerStatus as ShardSignerStatusGeneric, - UpgradableShardConfig, ENCLAVE_BRIDGE, SHARD_STATUS_MAX_DEPTH, + UpgradableShardConfig, ENCLAVE_BRIDGE, MAX_SHARD_STATUS_SIGNER_COUNT, }; use frame_support::{ dispatch::{DispatchErrorWithPostInfo, DispatchResult, DispatchResultWithPostInfo}, @@ -43,7 +43,7 @@ pub type ShardSignerStatus = ShardSignerStatusGeneric< ::BlockNumber, >; pub type ShardSignerStatusVec = - BoundedVec, ConstU32>; + BoundedVec, ConstU32>; pub use pallet::*; @@ -122,6 +122,8 @@ pub mod pallet { TooManyEnclaves, /// No such enclave was found in shard status EnclaveNotFoundInShardStatus, + /// Shard not found + ShardNotFound, } #[pallet::storage] @@ -379,23 +381,14 @@ pub mod pallet { ) -> DispatchResultWithPostInfo { ensure_root(origin)?; - let new_status: ShardSignerStatusVec = - if let Some(shard_status) = Self::shard_status(shard) { - shard_status - .iter() - .cloned() - .filter(|signer_status| signer_status.signer != subject) - .collect::>>() - .try_into() - .expect("can only become smaller by filtering") - } else { - //noop - log::warn!( - target: ENCLAVE_BRIDGE, - "attempt to purge absent enclave from shard status" - ); - return Err(Error::::EnclaveNotFoundInShardStatus.into()) - }; + let new_status: ShardSignerStatusVec = Self::shard_status(shard) + .ok_or(Error::::ShardNotFound)? + .iter() + .cloned() + .filter(|signer_status| signer_status.signer != subject) + .collect::>>() + .try_into() + .expect("can only become smaller by filtering"); >::insert(shard, new_status); @@ -482,10 +475,8 @@ impl Pallet { }) .unwrap_or_else(|| vec![new_status]); - let signer_statuses = match ShardSignerStatusVec::::try_from(signer_statuses) { - Ok(status_bvec) => status_bvec, - Err(_) => return Err(Error::::TooManyEnclaves.into()), - }; + let signer_statuses = ShardSignerStatusVec::::try_from(signer_statuses) + .map_err(|_| Error::::TooManyEnclaves)?; log::trace!( target: ENCLAVE_BRIDGE, "touched shard: {:?}, signer statuses: {:?}", diff --git a/enclave-bridge/src/tests/test_shard_status.rs b/enclave-bridge/src/tests/test_shard_status.rs index 401699d9..2ad5293a 100644 --- a/enclave-bridge/src/tests/test_shard_status.rs +++ b/enclave-bridge/src/tests/test_shard_status.rs @@ -78,26 +78,20 @@ fn purge_enclave_from_shard_status_works_if_present() { }) } -fn purge_enclave_from_shard_status_is_noop_if_absent() { +#[test] +fn purge_enclave_from_shard_status_for_inexistent_shard_is_err() { new_test_ext().execute_with(|| { Timestamp::set_timestamp(NOW); let enclave_signer_1 = AccountKeyring::Eve.to_account_id(); - let enclave_signer_2 = AccountKeyring::Ferdie.to_account_id(); - let enclave_fingerprint = EnclaveFingerprint::default(); let shard = ShardIdentifier::default(); - assert_ok!(EnclaveBridge::touch_shard( - shard, - &enclave_signer_1.clone(), - enclave_fingerprint, - 1 - )); + assert_noop!( EnclaveBridge::purge_enclave_from_shard_status( RuntimeOrigin::root(), shard, - enclave_signer_2.clone(), + enclave_signer_1.clone(), ), - Error::::EnclaveNotFoundInShardStatus + Error::::ShardNotFound ); }) } diff --git a/primitives/enclave-bridge/src/lib.rs b/primitives/enclave-bridge/src/lib.rs index e82c2bb7..741f9dbe 100644 --- a/primitives/enclave-bridge/src/lib.rs +++ b/primitives/enclave-bridge/src/lib.rs @@ -36,7 +36,7 @@ pub struct ShardSignerStatus { pub fingerprint: EnclaveFingerprint, pub last_activity: BlockNumber, } -pub const SHARD_STATUS_MAX_DEPTH: u32 = 10; +pub const MAX_SHARD_STATUS_SIGNER_COUNT: u32 = 10; #[derive(Encode, Decode, Clone, PartialEq, Eq, sp_core::RuntimeDebug, TypeInfo)] pub struct ShardConfig {