前言要领:委员会的权限是可以通过代码给定的,任何的玩法都可以定制化。 问题:技术委员会和议会的权限区别? 委员会内部权限对各自委员会内部的内容(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) Rustimpl 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,就需要重新进行一次选举。 用户可以给自己中意的议员投票,投票会涉及到票数(和?挂钩,票数涉及到的?,会被lock住。 ps:每进入新的一轮,用户投的票不会取消,用户投的票会一直默认下去,除非用户更新投票的信息。 关于elections-phragmen模块涉及到的选举规则:Borda count 议会界面中的backing的值,可以理解成Borda排序投票法中的积分概念。 
每个投票人按喜好排列候选者。如果候选者 x 在某张选票上排第 n 位,它就得某个分数 sn. 将所有投票人给候选者 x 打的分数 sn 加总,分数累计下来最高分的候选者 x 便赢得选举。分数规则满足单调递减 s1 ≥ s2 ≥ ... ≥ 0,且为非负值。 如果 s1 = 1,s2 = s3 = ... = 0,则波达计数法退化为简单多数规则。即每个投票人将自己的一票投给最满意的候选者,得票多者取胜。这种方法不易充分表达民意,可能选出争议人士; 如果 sn = N – n, 其中 N 为候选人总数,则 sn 随名次 n 线性递减,是通常意义下的 “波达数” 方法。这种方法的民意表达最充分,但比较容易放大反对者的声音,为 “策略选举” 提供了可能; 有一种规则 sn = 1 / n,为瑙鲁议会采用。第一名得一票,第二名得半票,第三名得 1/3 票,依此类推。这种方法是上述两种方法的折衷。
ps: elections-phragmen中属于第二种方式,是通常意义下的Borda count排序方法,不过系数是从n开始而不是n-1。(规则可以自定义) 假设有三个候选人甲、乙、丙的选举。结果如下: 4张选票为:1.甲 2.乙 3.丙 5张选票为:1.甲 2.丙 3.乙 7张选票为:1.丙 2.乙 3.甲 各人的分数如下: 甲:43+53+7*1 = 34 乙:42+51+7*2 = 22 丙:41+52+7*3 = 35 即丙胜出。 相关 Pallet 简介pallet-democracy与proposal相关、公投相关。 democracy中有些操作会涉及到slash操作,Slash去向一般是设置给Treasury Account,也有项目方是Burn掉了。 被Slash的情况有三处: 通过blacklist被拉入黑名单的proposal 被cancel的proposal 最后执行时,Preimage有问题的proposal
pallet-collective设置委员会的全部成员,提供proposal的提交和投票功能。 set_members 设置members,sudo权限 execute 执行proposal,member权限,并且以member权限执行proposal propose 添加一个新提案,要么投票表决,要么直接执行。 vote member权限 pallet-membership,“比较死板的设置member” add member remove member pallet_membership - Rust【1】 pallet-elections-phragmen,有选举策略,能自建成为候选人 pallet_elections_phragmen - Rust【2】 一些项目方的玩法(2022.6): 
操作演示普通用户公众提案的流程:如果有议会外部提案,那就优先进入公投。如果没有议会外部提案,只有多个民主的提案,就会选择Endorse最多的,进入下一轮的公投。 发起民主提案的流程: 1、获取原像hash值 提出要采取的行动需要您绑定一些代币。为了确保您有足够的代币进行最低存款,您可以检查链状态中的参数。仅在提案提交(即进行投票)后才会释放绑定的代币;用户无法在公投之前“撤销”他们的提议并取回保证金。由于基本上不可能确切地预测提案何时可能成为公投(如果有的话),这意味着任何绑定的代币都将被锁定一段不确定的时间。 在submit preimage处,设置好方法后,获取这个image的值。 在这里,可以提交原像,也可以不提交原像(因为提交大原像的存储成本可能非常昂贵, 
2、提交proposal 现在您将单击“提交提案”按钮并在标题为“原像哈希”的输入中输入原像哈希,并在“锁定余额”字段中输入至少最低存款。 
现在,任何访问该链的人都可以看到您的提案,其他人可以支持它或提交原像。然而,很难说这个提议究竟做了什么,因为它显示了动作的哈希值。在有人提交此提案的实际原像之前,其他持有者将无法判断他们是否支持它。在下一步中,你需要提交原像。 
3、提交原像 提出提案的行为与提交提案的原像分开,因为提交大原像的存储成本可能非常昂贵。允许原像提交作为单独的交易进行意味着如果您没有资金这样做,另一个帐户可以为您提交原像。这也意味着您不必立即支付如此多的资金,因为您可以证明原像散列带外。 但是,在提案通过之前的某个时间点,您需要提交原像,否则提案将无法实施。该指南现在将向您展示如何执行此操作。 单击蓝色的“提交原像”按钮并将其配置为与之前获取原像哈希的操作相同。这一次,您无需将哈希复制到另一个选项卡,而是继续并单击“提交原像”并确认交易。 包含交易后,您应该会看到 UI 更新,其中包含已提交提案的信息。 4、进行Endorsed 每个人都可以进行Endorsed,但是需要质押这个提案设置的“至少最低存款”,当这轮公投期过了之后,下轮公投会选一个Endorsed最高的提案进入公投期。 重要的是要注意,一旦提案完成,就无法停止或取消附议提案。因此,被借调的 DOT 将被保留,直到提案被提交公投。这是一个不确定的时间量,因为无法保证某个提案会在特定时期内成为公投,因为其他提案可能会率先进入公投。 用户就可以开始投票了。 5、Vote 选择支持的数量和质押的时间。 
Polkadot 使用了一种叫做Voluntary Locking 允许代币持有者通过声明他们愿意锁定他们的代币多长时间来增加他们的投票权的想法,因此,每个代币持有者的投票数将通过以下公式计算: votes = tokens * conviction_multiplier 每当锁定周期数翻倍时,就会将投票乘数加一。 票数计算的公式: 
议会以升级系统为例。 1、创建原像 制作 parachainSystem.authorizeUpgrade(codeHash)的原像。 这里的preimage hash为 0xb7caf049918934c5b7f1e06718854b0783c7b86380c9ac731f8ca3cd49b76dad 
2、创建外部提案 
3、通过议会投票 
通过投票之后,就能进入到公投的外部提案通道。 
技术委员会1、技术委员会可以通过fast track,改变外部提案的vote和执行时间。 
2、在技术委员会内部通过提案 
3、成功执行,外部提案成功加速。 
接下来进行正常的公投投票即可。 

成功,接下来任何人都可以通过 parachainSystem.enactAuthorizedUpgrade(code)进行升级。 
成功升级 
关于 Referenda and Conviction PalletReferenda and Conviction Pallet and Pre-image pallet Democracy Pallet
(不使用理事会,全民投票托盘会提供一个相对简单的投票过程。) 目前,使用的是 Democracy 托盘,因为它已经过审核并证明了相当长一段时间的稳定性。在 Kusama 上进行测试并经过审核后,仍然可以考虑切换到全民投票。 (Referenda and Conviction Voting pallets)这个用的不多,还没有广泛的应用,Democracy是被多方测试过的。 相关的拓展链接: https://github.com/paritytech/substrate/pull/10195 https://github.com/integritee-network/parachain/issues/108 https://mp.weixin.qq.com/s/tejMz3YrqhZ0W0uT-2rWcg https://mp.weixin.qq.com/s/ZjdrsgSBJoyaS6Lgfof7gg 参考【1】 https://paritytech.github.io/substrate/master/pallet_membership/index.html 【2】 https://paritytech.github.io/substrate/master/pallet_elections_phragmen/index.html 来源:金色财经 |