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]]
 | 
			
		||||
name = "ghost-networks"
 | 
			
		||||
version = "0.1.4"
 | 
			
		||||
version = "0.1.5"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "frame-benchmarking",
 | 
			
		||||
 "frame-support",
 | 
			
		||||
@ -3834,7 +3834,7 @@ dependencies = [
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "ghost-slow-clap"
 | 
			
		||||
version = "0.3.19"
 | 
			
		||||
version = "0.3.20"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "frame-benchmarking",
 | 
			
		||||
 "frame-support",
 | 
			
		||||
@ -3870,7 +3870,7 @@ dependencies = [
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "ghost-traits"
 | 
			
		||||
version = "0.3.20"
 | 
			
		||||
version = "0.3.21"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "frame-support",
 | 
			
		||||
 "sp-runtime 31.0.1",
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,6 @@
 | 
			
		||||
[package]
 | 
			
		||||
name = "ghost-slow-clap"
 | 
			
		||||
version = "0.3.19"
 | 
			
		||||
version = "0.3.20"
 | 
			
		||||
description = "Applause protocol for the EVM bridge"
 | 
			
		||||
license.workspace = true
 | 
			
		||||
authors.workspace = true
 | 
			
		||||
 | 
			
		||||
@ -20,8 +20,7 @@ benchmarks! {
 | 
			
		||||
        let network_id = NetworkIdOf::<T>::default();
 | 
			
		||||
 | 
			
		||||
        let authorities = vec![T::AuthorityId::generate_pair(None)];
 | 
			
		||||
        let bounded_authorities = 
 | 
			
		||||
            WeakBoundedVec::<_, T::MaxAuthorities>::try_from(authorities.clone())
 | 
			
		||||
        let bounded_authorities = WeakBoundedVec::<_, T::MaxAuthorities>::try_from(authorities.clone())
 | 
			
		||||
            .map_err(|()| "more than the maximum number of keys provided")?;
 | 
			
		||||
        Authorities::<T>::put(bounded_authorities);
 | 
			
		||||
 | 
			
		||||
@ -48,6 +47,52 @@ benchmarks! {
 | 
			
		||||
        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!(
 | 
			
		||||
        Pallet,
 | 
			
		||||
        crate::mock::new_test_ext(),
 | 
			
		||||
 | 
			
		||||
@ -323,6 +323,7 @@ pub mod pallet {
 | 
			
		||||
 | 
			
		||||
    #[pallet::error]
 | 
			
		||||
    pub enum Error<T> {
 | 
			
		||||
        NotEnoughClaps,
 | 
			
		||||
        NotAnAuthority,
 | 
			
		||||
        ClapForWrongSession,
 | 
			
		||||
        CurrentValidatorIsDisabled,
 | 
			
		||||
@ -404,13 +405,23 @@ pub mod pallet {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        #[pallet::call_index(1)]
 | 
			
		||||
        #[pallet::weight(T::WeightInfo::applause())]
 | 
			
		||||
        pub fn applause(
 | 
			
		||||
        #[pallet::weight(T::WeightInfo::self_applause())]
 | 
			
		||||
        pub fn self_applause(
 | 
			
		||||
            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 {
 | 
			
		||||
            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(
 | 
			
		||||
        block_number: BlockNumberFor<T>,
 | 
			
		||||
        networks_len: usize,
 | 
			
		||||
@ -914,6 +957,11 @@ impl<T: Config> Pallet<T> {
 | 
			
		||||
            .expect("more than the maximum number of 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> {
 | 
			
		||||
 | 
			
		||||
@ -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: multiple logs will create multiple records
 | 
			
		||||
// TODO: errors should be checked as much as possible
 | 
			
		||||
 | 
			
		||||
@ -2,10 +2,10 @@ use frame_support::weights::Weight;
 | 
			
		||||
 | 
			
		||||
pub trait WeightInfo {
 | 
			
		||||
    fn slow_clap() -> Weight;
 | 
			
		||||
    fn applause()-> Weight;
 | 
			
		||||
    fn self_applause()-> Weight;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl WeightInfo for () {
 | 
			
		||||
    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