forked from ghostchain/ghost-node
		
	ability to do self applause if claps received
Signed-off-by: Uncle Stinky <uncle.stinky@ghostchain.io>
This commit is contained in:
		
							parent
							
								
									186fb58367
								
							
						
					
					
						commit
						2c2df5a607
					
				
							
								
								
									
										6
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										6
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							@ -3648,7 +3648,7 @@ dependencies = [
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "ghost-networks"
 | 
					name = "ghost-networks"
 | 
				
			||||||
version = "0.1.4"
 | 
					version = "0.1.5"
 | 
				
			||||||
dependencies = [
 | 
					dependencies = [
 | 
				
			||||||
 "frame-benchmarking",
 | 
					 "frame-benchmarking",
 | 
				
			||||||
 "frame-support",
 | 
					 "frame-support",
 | 
				
			||||||
@ -3834,7 +3834,7 @@ dependencies = [
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "ghost-slow-clap"
 | 
					name = "ghost-slow-clap"
 | 
				
			||||||
version = "0.3.19"
 | 
					version = "0.3.20"
 | 
				
			||||||
dependencies = [
 | 
					dependencies = [
 | 
				
			||||||
 "frame-benchmarking",
 | 
					 "frame-benchmarking",
 | 
				
			||||||
 "frame-support",
 | 
					 "frame-support",
 | 
				
			||||||
@ -3870,7 +3870,7 @@ dependencies = [
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "ghost-traits"
 | 
					name = "ghost-traits"
 | 
				
			||||||
version = "0.3.20"
 | 
					version = "0.3.21"
 | 
				
			||||||
dependencies = [
 | 
					dependencies = [
 | 
				
			||||||
 "frame-support",
 | 
					 "frame-support",
 | 
				
			||||||
 "sp-runtime 31.0.1",
 | 
					 "sp-runtime 31.0.1",
 | 
				
			||||||
 | 
				
			|||||||
@ -1,6 +1,6 @@
 | 
				
			|||||||
[package]
 | 
					[package]
 | 
				
			||||||
name = "ghost-slow-clap"
 | 
					name = "ghost-slow-clap"
 | 
				
			||||||
version = "0.3.19"
 | 
					version = "0.3.20"
 | 
				
			||||||
description = "Applause protocol for the EVM bridge"
 | 
					description = "Applause protocol for the EVM bridge"
 | 
				
			||||||
license.workspace = true
 | 
					license.workspace = true
 | 
				
			||||||
authors.workspace = true
 | 
					authors.workspace = true
 | 
				
			||||||
 | 
				
			|||||||
@ -20,8 +20,7 @@ benchmarks! {
 | 
				
			|||||||
        let network_id = NetworkIdOf::<T>::default();
 | 
					        let network_id = NetworkIdOf::<T>::default();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let authorities = vec![T::AuthorityId::generate_pair(None)];
 | 
					        let authorities = vec![T::AuthorityId::generate_pair(None)];
 | 
				
			||||||
        let bounded_authorities = 
 | 
					        let bounded_authorities = WeakBoundedVec::<_, T::MaxAuthorities>::try_from(authorities.clone())
 | 
				
			||||||
            WeakBoundedVec::<_, T::MaxAuthorities>::try_from(authorities.clone())
 | 
					 | 
				
			||||||
            .map_err(|()| "more than the maximum number of keys provided")?;
 | 
					            .map_err(|()| "more than the maximum number of keys provided")?;
 | 
				
			||||||
        Authorities::<T>::put(bounded_authorities);
 | 
					        Authorities::<T>::put(bounded_authorities);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -48,6 +47,52 @@ benchmarks! {
 | 
				
			|||||||
        assert_eq!(<<T as pallet::Config>::Currency>::total_balance(&receiver), amount);
 | 
					        assert_eq!(<<T as pallet::Config>::Currency>::total_balance(&receiver), amount);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    self_applause {
 | 
				
			||||||
 | 
					        let authority = T::AuthorityId::generate_pair(Some(vec![69u8]));
 | 
				
			||||||
 | 
					        let bounded_authorities = WeakBoundedVec::<_, T::MaxAuthorities>::try_from(vec![authority.clone()])
 | 
				
			||||||
 | 
					            .map_err(|()| "more than the maximum number of keys provided")?;
 | 
				
			||||||
 | 
					        Authorities::<T>::put(bounded_authorities);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let minimum_balance = <<T as pallet::Config>::Currency>::minimum_balance();
 | 
				
			||||||
 | 
					        let receiver = create_account::<T>();
 | 
				
			||||||
 | 
					        let receiver_clone = receiver.clone();
 | 
				
			||||||
 | 
					        let amount = minimum_balance + minimum_balance;
 | 
				
			||||||
 | 
					        let network_id = NetworkIdOf::<T>::default();
 | 
				
			||||||
 | 
					        let session_index = Default::default();
 | 
				
			||||||
 | 
					        let transaction_hash = H256::repeat_byte(1u8);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let unique_transaction_hash = <Pallet<T>>::generate_unique_hash(
 | 
				
			||||||
 | 
					            &receiver,
 | 
				
			||||||
 | 
					            &amount,
 | 
				
			||||||
 | 
					            &network_id,
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					        let storage_key = (session_index, &transaction_hash, &unique_transaction_hash);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <Pallet::<T>>::trigger_nullification_for_benchmark();
 | 
				
			||||||
 | 
					        let clap = Clap {
 | 
				
			||||||
 | 
					            session_index,
 | 
				
			||||||
 | 
					            authority_index: 0,
 | 
				
			||||||
 | 
					            transaction_hash,
 | 
				
			||||||
 | 
					            block_number: 69,
 | 
				
			||||||
 | 
					            removed: false,
 | 
				
			||||||
 | 
					            network_id,
 | 
				
			||||||
 | 
					            receiver: receiver.clone(),
 | 
				
			||||||
 | 
					            amount,
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let encoded_clap = clap.encode();
 | 
				
			||||||
 | 
					        let signature = authority.sign(&encoded_clap).unwrap();
 | 
				
			||||||
 | 
					        <Pallet<T>>::slow_clap(RawOrigin::None.into(), clap, signature)?;
 | 
				
			||||||
 | 
					        <Pallet::<T>>::trigger_nullification_for_benchmark();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        assert_eq!(<<T as pallet::Config>::Currency>::total_balance(&receiver), Default::default());
 | 
				
			||||||
 | 
					        assert_eq!(ApplausesForTransaction::<T>::get(&storage_key), false);
 | 
				
			||||||
 | 
					    }: _(RawOrigin::Signed(receiver_clone), network_id, session_index, transaction_hash, receiver_clone.clone(), amount)
 | 
				
			||||||
 | 
					    verify {
 | 
				
			||||||
 | 
					        assert_eq!(<<T as pallet::Config>::Currency>::total_balance(&receiver), amount);
 | 
				
			||||||
 | 
					        assert_eq!(ApplausesForTransaction::<T>::get(&storage_key), true);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    impl_benchmark_test_suite!(
 | 
					    impl_benchmark_test_suite!(
 | 
				
			||||||
        Pallet,
 | 
					        Pallet,
 | 
				
			||||||
        crate::mock::new_test_ext(),
 | 
					        crate::mock::new_test_ext(),
 | 
				
			||||||
 | 
				
			|||||||
@ -323,6 +323,7 @@ pub mod pallet {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    #[pallet::error]
 | 
					    #[pallet::error]
 | 
				
			||||||
    pub enum Error<T> {
 | 
					    pub enum Error<T> {
 | 
				
			||||||
 | 
					        NotEnoughClaps,
 | 
				
			||||||
        NotAnAuthority,
 | 
					        NotAnAuthority,
 | 
				
			||||||
        ClapForWrongSession,
 | 
					        ClapForWrongSession,
 | 
				
			||||||
        CurrentValidatorIsDisabled,
 | 
					        CurrentValidatorIsDisabled,
 | 
				
			||||||
@ -404,13 +405,23 @@ pub mod pallet {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        #[pallet::call_index(1)]
 | 
					        #[pallet::call_index(1)]
 | 
				
			||||||
        #[pallet::weight(T::WeightInfo::applause())]
 | 
					        #[pallet::weight(T::WeightInfo::self_applause())]
 | 
				
			||||||
        pub fn applause(
 | 
					        pub fn self_applause(
 | 
				
			||||||
            origin: OriginFor<T>,
 | 
					            origin: OriginFor<T>,
 | 
				
			||||||
            _clap: Clap<T::AccountId, NetworkIdOf<T>, BalanceOf<T>>,
 | 
					            network_id: NetworkIdOf<T>,
 | 
				
			||||||
 | 
					            session_index: SessionIndex,
 | 
				
			||||||
 | 
					            transaction_hash: H256,
 | 
				
			||||||
 | 
					            receiver: T::AccountId,
 | 
				
			||||||
 | 
					            amount: BalanceOf<T>,
 | 
				
			||||||
        ) -> DispatchResult {
 | 
					        ) -> DispatchResult {
 | 
				
			||||||
            let _ = ensure_signed(origin)?;
 | 
					            let _ = ensure_signed(origin)?;
 | 
				
			||||||
            Ok(())
 | 
					            Self::applause_if_posible(
 | 
				
			||||||
 | 
					                network_id,
 | 
				
			||||||
 | 
					                session_index,
 | 
				
			||||||
 | 
					                transaction_hash,
 | 
				
			||||||
 | 
					                receiver,
 | 
				
			||||||
 | 
					                amount,
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -598,6 +609,38 @@ impl<T: Config> Pallet<T> {
 | 
				
			|||||||
        })
 | 
					        })
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    fn applause_if_posible(
 | 
				
			||||||
 | 
					        network_id: NetworkIdOf<T>,
 | 
				
			||||||
 | 
					        session_index: SessionIndex,
 | 
				
			||||||
 | 
					        transaction_hash: H256,
 | 
				
			||||||
 | 
					        receiver: T::AccountId,
 | 
				
			||||||
 | 
					        amount: BalanceOf<T>,
 | 
				
			||||||
 | 
					    ) -> DispatchResult{
 | 
				
			||||||
 | 
					        let clap_unique_hash = Self::generate_unique_hash(&receiver, &amount, &network_id);
 | 
				
			||||||
 | 
					        let received_claps_key = (session_index, &transaction_hash, &clap_unique_hash);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let clap = Clap {
 | 
				
			||||||
 | 
					            authority_index: Default::default(),
 | 
				
			||||||
 | 
					            block_number: Default::default(),
 | 
				
			||||||
 | 
					            removed: false,
 | 
				
			||||||
 | 
					            session_index,
 | 
				
			||||||
 | 
					            network_id,
 | 
				
			||||||
 | 
					            receiver,
 | 
				
			||||||
 | 
					            amount,
 | 
				
			||||||
 | 
					            transaction_hash,
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let enough_authorities = Perbill::from_rational(
 | 
				
			||||||
 | 
					            ReceivedClaps::<T>::get(&received_claps_key).len() as u32,
 | 
				
			||||||
 | 
					            Authorities::<T>::get().len() as u32,
 | 
				
			||||||
 | 
					        ) > Perbill::from_percent(T::ApplauseThreshold::get());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        ensure!(enough_authorities, Error::<T>::NotEnoughClaps);
 | 
				
			||||||
 | 
					        Self::try_applause(&clap, &received_claps_key)?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Ok(())
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    fn start_slow_clapping(
 | 
					    fn start_slow_clapping(
 | 
				
			||||||
        block_number: BlockNumberFor<T>,
 | 
					        block_number: BlockNumberFor<T>,
 | 
				
			||||||
        networks_len: usize,
 | 
					        networks_len: usize,
 | 
				
			||||||
@ -914,6 +957,11 @@ impl<T: Config> Pallet<T> {
 | 
				
			|||||||
            .expect("more than the maximum number of authorities");
 | 
					            .expect("more than the maximum number of authorities");
 | 
				
			||||||
        Authorities::<T>::put(bounded_authorities);
 | 
					        Authorities::<T>::put(bounded_authorities);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    #[cfg(feature = "runtime-benchmarks")]
 | 
				
			||||||
 | 
					    fn trigger_nullification_for_benchmark() {
 | 
				
			||||||
 | 
					        T::NetworkDataHandler::trigger_nullification();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
impl<T: Config> sp_runtime::BoundToRuntimeAppPublic for Pallet<T> {
 | 
					impl<T: Config> sp_runtime::BoundToRuntimeAppPublic for Pallet<T> {
 | 
				
			||||||
 | 
				
			|||||||
@ -602,6 +602,64 @@ fn should_avoid_applause_during_nullification_period() {
 | 
				
			|||||||
    });
 | 
					    });
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[test]
 | 
				
			||||||
 | 
					fn should_self_applause_if_enough_received_claps() {
 | 
				
			||||||
 | 
					    let (network_id, transaction_hash, unique_transaction_hash) =
 | 
				
			||||||
 | 
					        generate_unique_hash(None, None, None, None);
 | 
				
			||||||
 | 
					    let (_, receiver, amount) = get_mocked_metadata();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    new_test_ext().execute_with(|| {
 | 
				
			||||||
 | 
					        let _ = prepare_evm_network(Some(network_id), Some(0));
 | 
				
			||||||
 | 
					        let session_index = advance_session_and_get_index();
 | 
				
			||||||
 | 
					        let storage_key = (session_index, transaction_hash, unique_transaction_hash);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        assert_err!(SlowClap::self_applause(
 | 
				
			||||||
 | 
					                RuntimeOrigin::signed(receiver),
 | 
				
			||||||
 | 
					                network_id,
 | 
				
			||||||
 | 
					                session_index,
 | 
				
			||||||
 | 
					                transaction_hash,
 | 
				
			||||||
 | 
					                receiver,
 | 
				
			||||||
 | 
					                amount,
 | 
				
			||||||
 | 
					        ), Error::<Runtime>::NotEnoughClaps);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        assert_eq!(pallet::ApplausesForTransaction::<Runtime>::get(&storage_key), false);
 | 
				
			||||||
 | 
					        assert_eq!(Balances::balance(&receiver), 0);
 | 
				
			||||||
 | 
					        assert_eq!(BridgedInflationCurve::<RewardCurve, Runtime>::era_payout(
 | 
				
			||||||
 | 
					                0, 0, 0), (0, 0));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        assert_ok!(do_clap_from(session_index, network_id, 0, false));
 | 
				
			||||||
 | 
					        assert_ok!(do_clap_from(session_index, network_id, 1, false));
 | 
				
			||||||
 | 
					        assert_ok!(do_clap_from(session_index, network_id, 2, false));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        assert_eq!(pallet::ApplausesForTransaction::<Runtime>::get(&storage_key), false);
 | 
				
			||||||
 | 
					        assert_eq!(Balances::balance(&receiver), 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        assert_ok!(SlowClap::self_applause(
 | 
				
			||||||
 | 
					                RuntimeOrigin::signed(receiver),
 | 
				
			||||||
 | 
					                network_id,
 | 
				
			||||||
 | 
					                session_index,
 | 
				
			||||||
 | 
					                transaction_hash,
 | 
				
			||||||
 | 
					                receiver,
 | 
				
			||||||
 | 
					                amount,
 | 
				
			||||||
 | 
					        ));
 | 
				
			||||||
 | 
					        assert_eq!(pallet::ApplausesForTransaction::<Runtime>::get(&storage_key), false);
 | 
				
			||||||
 | 
					        assert_eq!(Balances::balance(&receiver), 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Networks::on_finalize(System::block_number());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        assert_ok!(SlowClap::self_applause(
 | 
				
			||||||
 | 
					                RuntimeOrigin::signed(receiver),
 | 
				
			||||||
 | 
					                network_id,
 | 
				
			||||||
 | 
					                session_index,
 | 
				
			||||||
 | 
					                transaction_hash,
 | 
				
			||||||
 | 
					                receiver,
 | 
				
			||||||
 | 
					                amount,
 | 
				
			||||||
 | 
					        ));
 | 
				
			||||||
 | 
					        assert_eq!(pallet::ApplausesForTransaction::<Runtime>::get(&storage_key), true);
 | 
				
			||||||
 | 
					        assert_eq!(Balances::balance(&receiver), amount);
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// TODO: check event
 | 
					// TODO: check event
 | 
				
			||||||
// TODO: multiple logs will create multiple records
 | 
					// TODO: multiple logs will create multiple records
 | 
				
			||||||
// TODO: errors should be checked as much as possible
 | 
					// TODO: errors should be checked as much as possible
 | 
				
			||||||
 | 
				
			|||||||
@ -2,10 +2,10 @@ use frame_support::weights::Weight;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
pub trait WeightInfo {
 | 
					pub trait WeightInfo {
 | 
				
			||||||
    fn slow_clap() -> Weight;
 | 
					    fn slow_clap() -> Weight;
 | 
				
			||||||
    fn applause()-> Weight;
 | 
					    fn self_applause()-> Weight;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
impl WeightInfo for () {
 | 
					impl WeightInfo for () {
 | 
				
			||||||
    fn slow_clap()-> Weight { Weight::zero() }
 | 
					    fn slow_clap()-> Weight { Weight::zero() }
 | 
				
			||||||
    fn applause()-> Weight { Weight::zero() }
 | 
					    fn self_applause()-> Weight { Weight::zero() }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user