DAOrayaki |详解波卡链上治理
2022-07-2218:00
DoraFactory
2022-07-22 18:00
DoraFactory
2022-07-22 18:00
收藏文章
订阅专栏

前言

要领:委员会的权限是可以通过代码给定的,任何的玩法都可以定制化。


问题:技术委员会和议会的权限区别?

  1. 委员会内部权限

    对各自委员会内部的内容(propose,vote,等等),都是各自的权限领域,并无交集

  2. 委员会的任命权限

    主流玩法:议员的身份只有 sudo 或者通过专门的选举制度选举出来。

    技术委员会的任命则有议会决定,添加删除重置等权限,需要一半以上的议员同意才能进行。(通过议会提 proposal 即可)

  3. 各个委员在公投期间的权限差别

    下面的例子只是局限性的例子,任何权限的设置都可以自定义。


链上治理流程

本文主要阐述波卡链上经典的治理设计

公投

通过公投的 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 人)

此处的人数不是固定的,此处仅为便于展示和讨论,你可以根据自己的实际需求来设置


技术委员会的成员主要是通过议会来决定的。

技术委员会只有内部提案的权限。

技术委员会主要的任务:

  1. 拒绝恶意的 proposal,对公投中的 proposal 有否决和取消的权限。

  2. 帮助议会的外部提案设置 fast track(只有SimpleMajoritySuperMajorityAgainst规则的 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<AccountId>;
// 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<AccountId, TechnicalCommitteeInstance>;

type OperationalPreimageOrigin =
        pallet_collective::EnsureMember<AccountId, GeneralCouncilInstance>;


Membership 和

Elections-phragmen 的区别

有许多项目方需要对委员会的人员添加些“任命”和“选举”的功能,这个时候就需要了解下 membership 和 elections-phragmen。

这两个模块都是和委员会成员的设置有关,也是用的最多的两个模块。

Membership 模块

memership 里对应的委员会只有成员(Member)这个对象。


可以通过 membership 模块设置 c2t 的管理权限。

提供的功能:对应委员会成员的管理(set,add,remove,swap,prime)

Rust
impl pallet_membership::Config<TechnicalCommitteeMembershipInstance> 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

  1. member,成员身份,member 身份的人才是委员会的委员

  2. runnersup,亚军身份 / 备选人身份,当 member 身份的人退出之后,默认由 runnersup 的成员依次延续。

  3. 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 的情况有三处:

  1. 通过blacklist被拉入黑名单的 proposal

  2. 被 cancel 的 proposal

  3. 最后执行时,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 Pallet

  1. Referenda and Conviction Pallet and Pre-image pallet

  2. 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




通过 DAO,研究组织和媒体可以打破地域的限制,以社区的方式资助和生产内容。DAOrayaki 将会通过 DAO 的形式,构建一个满足人们需求,一个民主治理和所有人都可以利用的公共媒体系统,从而实现真正意义上的去中心化。欢迎通过以下方式提交星际移民、量子计算、DAO 的相关研究,瓜分 10000USDC 赏金池!了解去中心化自治组织(DAO),探讨最新治理话题,关注 DAO 的发展趋势,欢迎加入 DAOrayaki 社区!


官方网站:daorayaki.org
Discord server: https://discord.gg/wNUPmsGsa4
Medium: https://medium.com/@daorayaki
Email: daorayaki@dorafactory.org
微信助手:DAOrayaki-Media
Twitter: @daorayaki_
小宇宙:DAOrayaki


详情请参考:
Dora Factory 支持去中心化 DAO 研究组织 DAOrayaki
对 DAOrayaki 第一阶段的回顾 -- 去中心化媒体的先驱
DAOrayaki |DAOrayaki 开启去中心化治理 2.0 时代
DAOrayaki |风险投资的范式转移:无限主义基金和无限游戏
DAOrayaki |DAOrayaki dGov 模型:基于 Futarchy 的正和游戏

更多关于 DAO 的文章,关注 Dorafactory,查看往期文章。

【免责声明】市场有风险,投资需谨慎。本文不构成投资建议,用户应考虑本文中的任何意见、观点或结论是否符合其特定状况。据此投资,责任自负。

专栏文章
查看更多
数据请求中

推荐专栏

数据请求中

一起「遇见」未来

DOWNLOAD FORESIGHT NEWS APP

Download QR Code