Substrate中Collective模块
Substrate中议会的功能模块,议员们需要通过发起提案来推动共识达成。议会成员两种方式,一种是直接Root权限的调用set_members
,或者间接的,通过民主选举的方法ChangeMembers
。
发起的提案需要被投票,投票其实很简单,其记录结构如下:
/// Info for keeping track of a motion being voted on.
pub struct Votes<AccountId> {
/// The proposal's unique index.
index: ProposalIndex,
/// The number of approval votes that are needed to pass the motion.
threshold: MemberCount,
/// The current set of voters that approved it.
ayes: Vec<AccountId>,
/// The current set of voters that rejected it.
nays: Vec<AccountId>,
}
存储那些数据呢,其实也很简单:
- Proposals,获取所有提案的Hash。
- ProposalOf,根据提案Hash来获取提案信息。
- Voting,某个正在进行投票的提案,获取所有投票人账号地址。
- ProposalCount,至今为止的提案总数。
- Members,现在议会中所有的成员账号地址,根据value进行排序。
可以在链初始化的时候,放几个议会成员。
add_extra_genesis {
config(phantom): rstd::marker::PhantomData<I>;
config(members): Vec<T::AccountId>;
build(|config| Module::<T, I>::initialize_members(&config.members))
}
监听链上事件:
- Proposed:新的提案被提出来
- Voted:提案被投票
- Approved:提案被通过
- Disapproved:提案被否决
- Executed:提案被执行
- MemberExecuted:提案被一个成员执行
然后是定义的几个方法了:
- set_members:给ROOT用户执行的。用来直接指定议会成员。
- execute:议会成员执行提案。
- propose:发起提案,如果threshold小于2,提案可以直接执行,否则需要投票。
- vote:给提案投票。投票人必须为议会成员。
网友评论