前言
要领:委员会的权限是可以通过代码给定的,任何的玩法都可以定制化。
问题:技术委员会和议会的权限区别?
委员会内部权限
对各自委员会内部的内容(propose,vote,等等),都是各自的权限领域,并无交集委员会的任命权限
主流玩法:议员的身份只有sudo或者通过专门的选举制度选举出来。
技术委员会的任命则有议会决定,添加删除重置等权限,需要一半以上的议员同意才能进行。(通过议会提proposal即可)各个委员在公投期间的权限差别
下面的例子只是局限性的例子,任何权限的设置都可以自定义。
链上治理流程
本文主要阐述波卡链上经典的治理设计
公投
通过公投的proposal,最后执行的时候,是通过sudo权限执行。
公众提案的流程:
如果有议会外部提案,那就优先进入公投。如果没有议会外部提案,只有多个民主的提案,就会选择Endorse最多的,进入下一轮的公投。
公投投票规则相关
Super-Majority Approve 需要大多数同意才能通过
Super-Majority Against 反对通过 需要绝大多数
Simple-Majority 只要赞成>反对,即可通过proposal
关于公投的时间相关配置
LaunchPeriod:一轮公投更新的时间
EnactmentPeriod:提案通过和执行之间的时间
VotingPeriod:创建相同preimage hash的限制时间。(preimages会在proposal执行的时候消除掉,然后解除一开始质押的钱)
VoteLockingPeriod:投票锁定的最小时间(取消投票和取消提供给他人的投票权时,会在意这个“冻结期”。
CooloffPeriod:外部提案被否决后不得重新提交的时间区间。
FastTrackVotingPeriod:快速公投允许的最短投票时间。
委员会里的时间
MotionDuration:创建proposal,会有个投票时间。
普通用户
民主通过democracy可以提交public proposal,但是是最难的规则,需要endorse,endorse第一的才能进行公投。
基础功能:
propose - 提交提案,表示为preimiage hash。需要押金。
second - 表示同意提案,将其在提案队列中移到更高位置,并要求与原始提案匹配的存款。
vote - 在全民投票中投票,要么投票是“赞成”以支持提案,要么投票“反对”以维持现状。
unvote - 取消之前的投票,这必须由投票者在投票结束前完成。
delegate - 将投票权(代币*定罪)委托给另一个账户。
undelegate - 停止将投票权委托给另一个帐户。
可以对任何帐户执行的管理操作:
reap_vote - 删除部分账户的过期投票。
unlock - 重新确定帐户的余额锁定,可能使代币可用。
原像动作:
note_preimage -为即将到来的提案注册原像,需要在提案实施后退还押金。
note_preimage_operational - 相同功能,但是只能由T::OperationalPreimageOrigin执行
note_imminent_preimage - 为即将到来的提案注册原像 不需要押金,但提案必须在调度队列中
note_imminent_preimage_operational -
相同功能 但是只能由T::OperationalPreimageOrigin执行reap_preimage - 删除过期提案的原像。仅在与记录它的帐户相同且在投票期之后或在制定期之后为不同帐户的情况下才有效。
议会(5人)
此处的人数不是固定的,此处仅为便于展示和讨论,你可以根据自己的实际需求来设置
议会里的议员可以通过sudo权限指定议员,也可以通过选举模块进行选举更替。
议会里的议员可以提两种提案,1. 内部提案 2. 外部提案。
内部提案
议会的内部提案的权限是局限的,进入执行队列里只有议员member的执行权限,可以通过内部提案指定技术委员会的成员。
外部提案
议会可以通过外部提案,进入公投期。(进入公投最后通过的proposal,可以通过sudo权限执行)
议会可以指定外部提案的类型,通过不同的方法创建出不同投票机制的外部提案。
ps: 需要注意的是,除了SuperMajorityApprove规则的外部提案,都可以通过技术委员会做fast track进行proposal加速处理。
权限分配:
议会对技术委员会任命的权限:需要4/5的议员通过。(add,remove,reset,prime,swap权限)
技术委员会(3人)
此处的人数不是固定的,此处仅为便于展示和讨论,你可以根据自己的实际需求来设置
技术委员会的成员主要是通过议会来决定的。
技术委员会只有内部提案的权限。
技术委员会主要的任务:
拒绝恶意的proposal,对公投中的proposal有否决和取消的权限。
帮助议会的外部提案设置fast track(只有SimpleMajority和SuperMajorityAgainst规则的external proposal才能通设置)
关于Fast Track
技术委员会可以帮助议会的外部提案设置fast track,这是个加速车道,可以自定义vote的时间和执行的时间。但是只有SimpleMajority和SuperMajorityAgainst规则的external proposal才能通过这个方法。
与proposal相关的权限
CancellationOrigin 紧急取消正在进行公投的proposal(取消在renferendum列表里的proposal)
CancelProposalOrigin 取消proposal,取消指定的proposal,并且slash掉提交这个proposal的钱
VetoOrigin 否决proposal,技术委员会一般通过这个权限来否决一些恶意的proposal,会把这个proposal拉入到黑名单当中
权限分配
BlacklistOrigin,将提案永久地列入黑名单。防止它再次被提出。
提交proposal的时候不会检查执行权限,只有在proposal 被 close之后,才会根据投票的结果决定proposal的执行。
Rust
/// A straight majority of the council can decide what their next motion is.
type ExternalOrigin = EnsureRootOrHalfGeneralCouncil;
/// A majority can have the next scheduled referendum be a straight majority-carries vote.
type ExternalMajorityOrigin = EnsureRootOrHalfGeneralCouncil;
/// A unanimous council can have the next scheduled referendum be a straight default-carries
/// (NTB) vote.
type ExternalDefaultOrigin = EnsureRootOrAllGeneralCouncil;
/// Two thirds of the technical committee can have an ExternalMajority/ExternalDefault vote
/// be tabled immediately and with a shorter voting/enactment period.
type FastTrackOrigin = EnsureRootOrTwoThirdsTechnicalCommittee;
type InstantOrigin = EnsureRootOrAllTechnicalCommittee;
// To cancel a proposal which has been passed, 3/5 of the council must agree to it.
type CancellationOrigin = EnsureRootOrThreeFourthsGeneralCouncil;
type BlacklistOrigin = EnsureRoot;
// To cancel a proposal before it has been passed, the technical committee must be unanimous or
// Root must agree.
type CancelProposalOrigin = EnsureRootOrAllTechnicalCommittee;
// Any single technical committee member may veto a coming council proposal, however they can
// only do it once and it lasts only for the cooloff period.
type VetoOrigin = pallet_collective::EnsureMember;
type OperationalPreimageOrigin =
pallet_collective::EnsureMember;
Membership和Elections-phragmen 的区别
有许多项目方需要对委员会的人员添加些“任命”和“选举”的功能,这个时候就需要了解下membership和elections-phragmen。
这两个模块都是和委员会成员的设置有关,也是用的最多的两个模块。
Membership模块
memership里对应的委员会只有成员(Member)这个对象。
可以通过membership模块设置c2t的管理权限。
提供的功能:对应委员会成员的管理(set,add,remove,swap,prime)
Rust
impl pallet_membership::Config for Runtime {
type Event = Event;
type AddOrigin = EnsureRootOrThreeFourthsGeneralCouncil;
type RemoveOrigin = EnsureRootOrThreeFourthsGeneralCouncil;
type SwapOrigin = EnsureRootOrThreeFourthsGeneralCouncil;
type ResetOrigin = EnsureRootOrThreeFourthsGeneralCouncil;
type PrimeOrigin = EnsureRootOrThreeFourthsGeneralCouncil;
type MembershipInitialized = TechnicalCommittee;
type MembershipChanged = TechnicalCommittee;
type MaxMembers = CouncilMaxMembers;
type WeightInfo = ();
}
需要配置的内容:对各个功能需要多少的权限才能调用成功。
Elections-phragmen模块
这个模块下,对应的委员会一共有三种角色
member,runners up,candidates
member,成员身份,member身份的人才是委员会的委员
runnersup,亚军身份/备选人身份,当member身份的人退出之后,默认由runnersup的成员依次延续。
candidates,候选人身份。(member和runnersup也是candidates,大家可以质押一定的钱成为新的candidates)
每隔一段固定的时间(TermDuration)就重新选举,任何人可以通过质押一定的钱成为Candidacy
如果通过sudo remove了member,就需要重新进行一次选举。
用户可以给自己中意的议员投票,投票会涉及到票数(和