Substrate中的Treasury模块分析

Substrate中的Treasury模块分析

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

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

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

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

术语
  • Proposal:一个从资金池中分配给受益者的提案。
  • Beneficiary:一个账号能够接收到资金,当然这个是要从提案中被通过才能够的。
  • Deposit:当发起一个提案,提案中要用到的资金将会被锁住,这个deposit将会被返回或者惩罚掉,如果这个提案通过或者被分别拒绝掉。
  • Pot:国库模块计算出来的未花费的资金。

国库模块基本运作:任何人自己抵押币,然后发起花费提案,如果通过,自己的抵押退回来,如果没有通过,需要扣掉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, beneficiary:::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>>;

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

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

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

你可能感兴趣的:(Substrate中的Treasury模块分析)