Substrate中的Treasury模块分析
2019-12-02 本文已影响0人
建怀
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<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(),
);
});
}