From a1b604afefe785ae33772f3829c989146d44e328 Mon Sep 17 00:00:00 2001 From: Ayush Mishra Date: Tue, 13 Aug 2024 07:08:08 +0530 Subject: [PATCH] Added logs for activity (#417) ## Description ## Types of Changes Please select the branch type you are merging and fill in the relevant template. - [ ] Hotfix - [ ] Release - [ ] Fix or Feature ## Fix or Feature ### Types of Changes - [ ] Tech Debt (Code improvements) - [ ] Bug fix (non-breaking change which fixes an issue) - [ ] New feature (non-breaking change which adds functionality) - [ ] Breaking change (fix or feature that would cause existing functionality to change) - [ ] Dependency upgrade (A change in substrate or any 3rd party crate version) ### Migrations and Hooks - [ ] This change requires a runtime migration. - [ ] Modifies `on_initialize` - [ ] Modifies `on_finalize` ### Checklist for Fix or Feature - [ ] Change has been tested locally. - [ ] Change adds / updates tests if applicable. - [ ] Changelog doc updated. - [ ] `spec_version` has been incremented. - [ ] `network-relayer`'s [events](https://github.com/Cerebellum-Network/network-relayer/blob/dev-cere/shared/substrate/events.go) have been updated according to the blockchain events if applicable. - [ ] All CI checks have been passed successfully ## Checklist for Hotfix - [ ] Change has been deployed to Testnet. - [ ] Change has been tested in Testnet. - [ ] Changelog has been updated. - [ ] Crate version has been updated. - [ ] `spec_version` has been incremented. - [ ] Transaction version has been updated if required. - [ ] Pull Request to `dev` has been created. - [ ] Pull Request to `staging` has been created. - [ ] `network-relayer`'s [events](https://github.com/Cerebellum-Network/network-relayer/blob/dev-cere/shared/substrate/events.go) have been updated according to the blockchain events if applicable. - [ ] All CI checks have been passed successfully ## Checklist for Release - [ ] Change has been deployed to Devnet. - [ ] Change has been tested in Devnet. - [ ] Change has been deployed to Qanet. - [ ] Change has been tested in Qanet. - [ ] Change has been deployed to Testnet. - [ ] Change has been tested in Testnet. - [ ] Changelog has been updated. - [ ] Crate version has been updated. - [ ] Spec version has been updated. - [ ] Transaction version has been updated if required. - [ ] All CI checks have been passed successfully --- pallets/ddc-verification/src/lib.rs | 67 +++++++++++++++++++++++---- pallets/ddc-verification/src/tests.rs | 30 ++++++------ runtime/cere-dev/src/lib.rs | 2 +- runtime/cere/src/lib.rs | 2 +- 4 files changed, 76 insertions(+), 25 deletions(-) diff --git a/pallets/ddc-verification/src/lib.rs b/pallets/ddc-verification/src/lib.rs index d5b308af0..976dc38a0 100644 --- a/pallets/ddc-verification/src/lib.rs +++ b/pallets/ddc-verification/src/lib.rs @@ -150,7 +150,15 @@ pub mod pallet { NotEnoughNodesForConsensus { cluster_id: ClusterId, era_id: DdcEra, - id: ActivityHash, + node_id: String, + validator: T::AccountId, + }, + /// Not enough buckets for consensus. + NotEnoughBucketsForConsensus { + cluster_id: ClusterId, + era_id: DdcEra, + customer_id: String, + bucket_id: BucketId, validator: T::AccountId, }, /// No activity in consensus. @@ -292,7 +300,13 @@ pub mod pallet { NotEnoughNodesForConsensus { cluster_id: ClusterId, era_id: DdcEra, - id: ActivityHash, + node_id: String, + }, + NotEnoughBucketsForConsensus { + cluster_id: ClusterId, + era_id: DdcEra, + customer_id: String, + bucket_id: BucketId, }, /// No activity in consensus. ActivityNotInConsensus { @@ -552,6 +566,8 @@ pub mod pallet { { fn get_consensus_id(&self) -> ActivityHash; fn hash(&self) -> ActivityHash; + + fn get_consensus_error(&self, cluster_id: ClusterId, era_id: DdcEra) -> OCWError; } impl Activity for NodeActivity { @@ -562,6 +578,12 @@ pub mod pallet { fn hash(&self) -> ActivityHash { T::ActivityHasher::hash(&self.encode()).into() } + + fn get_consensus_error(&self, cluster_id: ClusterId, era_id: DdcEra) -> OCWError { + let node_id = &self.node_id; + + OCWError::NotEnoughNodesForConsensus { cluster_id, era_id, node_id: node_id.clone() } + } } impl Activity for CustomerActivity { fn get_consensus_id(&self) -> ActivityHash { @@ -573,6 +595,18 @@ pub mod pallet { fn hash(&self) -> ActivityHash { T::ActivityHasher::hash(&self.encode()).into() } + + fn get_consensus_error(&self, cluster_id: ClusterId, era_id: DdcEra) -> OCWError { + let customer_id = &self.customer_id; + let bucket_id = &self.bucket_id; + + OCWError::NotEnoughBucketsForConsensus { + cluster_id, + era_id, + customer_id: customer_id.clone(), + bucket_id: *bucket_id, + } + } } /// Unwrap or send an error log @@ -2356,11 +2390,12 @@ pub mod pallet { // Check if each customer/bucket appears in at least `min_nodes` nodes for (id, activities) in customer_buckets { if activities.len() < min_nodes.into() { - errors.push(OCWError::NotEnoughNodesForConsensus { - cluster_id: (*cluster_id), - era_id, - id, - }); + let errs: Vec = activities + .into_iter() + .map(|a| a.get_consensus_error(*cluster_id, era_id)) + .collect(); + + errors.extend(errs); } else if let Some(activity) = Self::reach_consensus(&activities, min_threshold.into()) { @@ -2745,11 +2780,25 @@ pub mod pallet { for error in errors { match error { - OCWError::NotEnoughNodesForConsensus { cluster_id, era_id, id } => { + OCWError::NotEnoughNodesForConsensus { cluster_id, era_id, node_id } => { Self::deposit_event(Event::NotEnoughNodesForConsensus { cluster_id, era_id, - id, + node_id, + validator: caller.clone(), + }); + }, + OCWError::NotEnoughBucketsForConsensus { + cluster_id, + era_id, + customer_id, + bucket_id, + } => { + Self::deposit_event(Event::NotEnoughBucketsForConsensus { + cluster_id, + era_id, + customer_id, + bucket_id, validator: caller.clone(), }); }, diff --git a/pallets/ddc-verification/src/tests.rs b/pallets/ddc-verification/src/tests.rs index 5a28bb9fa..d234a50b9 100644 --- a/pallets/ddc-verification/src/tests.rs +++ b/pallets/ddc-verification/src/tests.rs @@ -645,10 +645,11 @@ fn test_get_consensus_customers_activity_not_enough_nodes() { ); assert!(result.is_err()); let errors = result.err().unwrap(); - assert_eq!(errors.len(), 1); + assert_eq!(errors.len(), 2); match &errors[0] { - OCWError::NotEnoughNodesForConsensus { cluster_id, era_id, id } => { - assert_eq!(*id, customers_activity[0].1[0].get_consensus_id::()); + OCWError::NotEnoughBucketsForConsensus { cluster_id, era_id, customer_id, bucket_id } => { + assert_eq!(*customer_id, "0".to_string()); + assert_eq!(*bucket_id, 1); assert_eq!(*cluster_id, cluster_id1); assert_eq!(*era_id, era_id1); }, @@ -697,10 +698,10 @@ fn test_get_consensus_nodes_activity_not_enough_nodes() { ); assert!(result.is_err()); let errors = result.err().unwrap(); - assert_eq!(errors.len(), 1); + assert_eq!(errors.len(), 2); match &errors[0] { - OCWError::NotEnoughNodesForConsensus { cluster_id, era_id, id } => { - assert_eq!(*id, nodes_activity[0].1[0].get_consensus_id::()); + OCWError::NotEnoughNodesForConsensus { cluster_id, era_id, node_id } => { + assert_eq!(*node_id, "0".to_string()); assert_eq!(*cluster_id, cluster_id1); assert_eq!(*era_id, era_id1); }, @@ -961,8 +962,8 @@ fn test_get_consensus_customers_activity_diff_errors() { ); assert!(result.is_err()); let errors = result.err().unwrap(); - assert_eq!(errors.len(), 2); - match &errors[1] { + assert_eq!(errors.len(), 3); + match &errors[2] { OCWError::ActivityNotInConsensus { cluster_id, era_id, id } => { assert_eq!(*id, customers_activity[0].1[0].get_consensus_id::()); assert_eq!(*cluster_id, cluster_id1); @@ -970,9 +971,10 @@ fn test_get_consensus_customers_activity_diff_errors() { }, _ => panic!("Expected CustomerActivityNotInConsensus error"), } - match &errors[0] { - OCWError::NotEnoughNodesForConsensus { cluster_id, era_id, id } => { - assert_eq!(*id, customers_activity[3].1[0].get_consensus_id::()); + match &errors[1] { + OCWError::NotEnoughBucketsForConsensus { cluster_id, era_id, customer_id, bucket_id } => { + assert_eq!(*customer_id, "0".to_string()); + assert_eq!(*bucket_id, 2); assert_eq!(*cluster_id, cluster_id1); assert_eq!(*era_id, era_id1); }, @@ -1328,7 +1330,7 @@ fn test_get_consensus_nodes_activity_diff_errors() { ); assert!(result.is_err()); let errors = result.err().unwrap(); - assert_eq!(errors.len(), 2); + assert_eq!(errors.len(), 3); match &errors[0] { OCWError::ActivityNotInConsensus { cluster_id, era_id, id } => { assert_eq!(*id, nodes_activity[0].1[0].get_consensus_id::()); @@ -1338,8 +1340,8 @@ fn test_get_consensus_nodes_activity_diff_errors() { _ => panic!("Expected CustomerActivityNotInConsensus error"), } match &errors[1] { - OCWError::NotEnoughNodesForConsensus { cluster_id, era_id, id } => { - assert_eq!(*id, nodes_activity[3].1[0].get_consensus_id::()); + OCWError::NotEnoughNodesForConsensus { cluster_id, era_id, node_id } => { + assert_eq!(*node_id, "1".to_string()); assert_eq!(*cluster_id, cluster_id1); assert_eq!(*era_id, era_id1); }, diff --git a/runtime/cere-dev/src/lib.rs b/runtime/cere-dev/src/lib.rs index a4087dc22..b8f4b7bc6 100644 --- a/runtime/cere-dev/src/lib.rs +++ b/runtime/cere-dev/src/lib.rs @@ -149,7 +149,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // and set impl_version to 0. If only runtime // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. - spec_version: 54115, + spec_version: 54116, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 19, diff --git a/runtime/cere/src/lib.rs b/runtime/cere/src/lib.rs index c611751e0..3cf3fe496 100644 --- a/runtime/cere/src/lib.rs +++ b/runtime/cere/src/lib.rs @@ -143,7 +143,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // and set impl_version to 0. If only runtime // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. - spec_version: 54115, + spec_version: 54116, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 19,