Substrate中的Treasury模块分析

2019-12-02  本文已影响0人  建怀

Substrate中的Treasury模块分析

Treasury模块提供一个资金池,能够由抵押者们来管理,在这个国库系统中,能够发起发费提案从这个资金池中。

抵押者们可以去提案,批准或者拒绝开支。当然区块链需要提供一个方法(手续费或者通货膨胀)去收集这个资金到国库中。

问题一: 发起花费国库资金的最低标准?一个人投票通过是否可以?

问题二: 国库资金是否只能发起提案来支配?

术语

国库模块基本运作:任何人自己抵押币,然后发起花费提案,如果通过,自己的抵押退回来,如果没有通过,需要扣掉5%的抵押币。花费提案需要议员来表决,通过就进入了通过提案的队列,在一个周期(一天)进行一次性打款,如果国库余额不够,就打不完,如果余额足够,剩下的就积累下来。打款后,余下的国库余额销毁50%。这是国库模块的默认逻辑。

问题一:发起花费国库资金的最低标准,发起花费提案,需要花费的5%资金进行抵押,不得低于1个Token。一个人投票通过是不可以的,投票表决的是议会成员。

问题二:国库资金当然不是只能发起提案来支配,完全可以自己将spend_funds()的逻辑自己另外实现,创建另外一个国库,改写propose_spend() ,reject_proposal(),approve_proposal()的逻辑。比如可以直接在Approvals里添加proposal,这样就可以直接跳过上面三个方法,也就是跳过走议会表决的流程。

Module

decl_module! {
    /// 提出支出建议。如果提议被拒绝,与价值成比例的押金将被保留并大幅惩罚掉。一旦提案被批准,它就会被退回。
    fn propose_spend(origin,#[compact] value: BalanceOf<T>, beneficiary:<T::Lookup as StaticLookup>::Source)
    
    /// 拒绝一个提案支出,发起提案的保留存款会被惩罚掉。
    fn reject_proposal(origin,#[compact] proposal_id: ProposalIndex)
    
    /// 批准一个提案
    fn approve_proposal(origin,#[compact] proposal_id: ProposalIndex)
    
    /// 一个SpendPeriod周期,将这些提议花费进行打款
    fn on_finalize(n: T::BlockNumber){
        fn (n % T::SpendPeriod::get()).is_zero() {
            Self::spend_funds();
        }
    }
}

Store

/// 花费提案数量
ProposalCount get(fn proposal_count): ProposalIndex;

/// 花费提案map
Proposals get(fn proposals): map ProposalIndex => Option<Proposal<T::AccountId, BalanceOf<T>>>;

/// 花费提案目录,提案通过了,但还没有奖励的
Approvals get(fn approvals): Vec<ProposalIndex>;

初始配置的时候设置,创建一个国库账号:

add_extra_genesis {
    build(|_config| {
        // Create Treasury account
        let _ = T::Currency::make_free_balance_be(
            &<Module<T>>::account_id(),
            T::Currency::minimum_balance(),
        );
    });
}
上一篇 下一篇

猜你喜欢

热点阅读