微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何通过将货币转移到另一个帐户而不是使用储备货币来修改昵称托盘在基板中以设置昵称?

如何解决如何通过将货币转移到另一个帐户而不是使用储备货币来修改昵称托盘在基板中以设置昵称?

在尼克斯货盘中,帐户可以通过储备货币为其自己设置昵称。我想修改功能以改为要求向另一个特定帐户支付费用(目前,我只想将费用发送给Alice帐户)以设置昵称。

这似乎应该是一个相当简单的修改,但是由于我是Substrate和Rust的新手,所以这并不像我想象的那么简单。我已经分叉了尼克斯托盘,但根本无法弄清楚如何从这里开始。

我正在使用https://github.com/paritytech/substrate的本地克隆版本

解决方法

以下是您需要进行的高级更改:

  1. 在托盘的配置Trait中引入新的associated type
pub trait Trait: frame_system::Trait {
    // -- snip --
    // This is a new type that allows the runtime to configure where the payment should go.
    type PaymentReceiver: Get<Self::AccountId>;
}
  1. 更新set_name函数以使用其他Currency函数。在这种情况下,我们要使用transfer而不是reserve
// New import needed
use frame_support::traits::ExistenceRequirement::KeepAlive;
fn set_name(origin,name: Vec<u8>) {
    let sender = ensure_signed(origin)?;

    ensure!(name.len() >= T::MinLength::get(),Error::<T>::TooShort);
    ensure!(name.len() <= T::MaxLength::get(),Error::<T>::TooLong);

    let deposit = if let Some((_,deposit)) = <NameOf<T>>::get(&sender) {
        Self::deposit_event(RawEvent::NameChanged(sender.clone()));
        deposit
    } else {
        let deposit = T::ReservationFee::get();
        // The only change is made here...
        T::Currency::transfer(&sender,&T::PaymentReceiver::get(),deposit.clone(),KeepAlive)?;
        Self::deposit_event(RawEvent::NameSet(sender.clone()));
        deposit
    };

    <NameOf<T>>::insert(&sender,(name,deposit));
}
  1. 注释掉我们将在unreserveslash_reserved中使用的代码部分,因为这些行为不适用于这种新逻辑。

fn clear_name

// let _ = T::Currency::unreserve(&sender,deposit.clone());

fn kill_name

// T::Slashed::on_unbalanced(T::Currency::slash_reserved(&target,deposit.clone()).0);
  1. 进行了这些更改之后,您的托盘应该可以正常编译:
substrate git:(master) ✗ cargo build -p pallet-nicks
   Compiling pallet-nicks v2.0.0-rc6 (/Users/shawntabrizi/Documents/GitHub/substrate/frame/nicks)
   Finished dev [unoptimized + debuginfo] target(s) in 2.48s
  1. 要在运行时中实际使用这些更改,您将需要使用以下新的PaymentReceiver特性对其进行配置:
// Here we define the value of the receiver
// `//Alice` -> `5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY`
// -> `0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d`
// Using: https://www.shawntabrizi.com/substrate-js-utilities/

ord_parameter_types! {
    pub const PaymentReceiverValue: AccountId = AccountId::from(
        hex_literal::hex!("d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d")
    );
}

您可能需要在运行时中引入hex_literal条板箱。

我们在特质实现中使用此值:

impl pallet_nicks::Trait for Runtime {
    // -- snip --
    type PaymentReceiver: PaymentReceiverValue;
}

就是这样!让我知道是否有帮助。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。