Solidity中的治理合约

文章详细介绍了DeFi应用中的治理模式,包括提案、投票、法定人数等关键概念,并探讨了治理攻击类型及改进空间。文章还提供了一些设置治理的工具和资源。

许多 DeFi 应用程序遵循的治理模式受到 Compound Finance 实现的强烈启发。尽管没有与创建标准治理接口相关的以太坊改进提案,但大多数 DeFi 治理实现一般遵循同一组原则。

最终,治理合约的行为类似于多签名钱包,投票权由投票者的代币余额加权。

提案是一个以太坊交易:一个地址或地址列表,以及一个 calldata 或 calldata 列表。社区(持有有权投票的代币的持有者)提出以太坊交易,并根据投票结果,交易在链上执行,或者如果未通过投票,则被否决。

对于没有在链上执行的操作(例如更改软件的法律许可),只需签署一条授予权利的消息。

有用术语

在我们开始解释合约之前,了解治理合约的技术术语是很有帮助的。

提案

每次投票以提案开始,如前所述。它始终是一个可以签名的以太坊交易,即它有目标地址和 calldata。

为了防止提案垃圾邮件,合约通常有某种过滤机制来限制谁可以创建提案,通常是必须持有一定比例治理代币的地址。

在底层,提案通常是一个具有一些当前状态标志的 Solidity 结构,记录对它的投票以及如果提案通过将执行哪些交易。

投票

不出所料,投票是一个以太坊交易,投票者对提案投赞成或反对票。投票的权重通常由相关快照时地址持有的代币数量决定。

法定人数

如果没有 100% 的代币持有者投票就无法采取任何行动,那么很可能什么都不会完成,因为如果只有一个代币持有者决定不参与,系统就会停滞不前。另一方面,如果只有 1% 的投票对某个选举有效,那通过不受欢迎的提案就太容易了。

为了决定提案的命运,它必须在投票期间达到法定人数阈值(可能投票总数的一定百分比)。

投票期间

提案不会无限期等待法定人数的达到。否则,治理提案可能会在提出提案的情况发生变化时执行。这个倒计时从提案创建之时开始,如果在时限内未达到法定人数,提案将被否决。

排队和执行

如果在投票期内通过的投票数量超过法定人数阈值,则该提案被视为通过。出于安全原因,提案成功与实际执行之间通常有一个时间延迟。

定时锁

与投票期不同,这是提案获得批准与实际执行之间的延迟。

考虑一种情况,其中治理合约中有一个有争议的提案,一个不满的用户子集将会撤回流动性,如果该提案被实施。定时锁给他们提供了在看到投票结果后撤出的一段时间。

给用户一个机会对不利提案采取行动,激励提案者只提交不会引发反抗的提案。

治理的阶段

目前尚无普遍的规范来说明如何创建、投票和执行治理提案。然而,你可以大致期待它遵循这些交易的某种近似

待处理 ⭢ 活跃 ⭢ 被否决 ⭢ 取消
                ⮑ 成功 ⭢ 排队 ⭢ 执行
                  ⮑----------⮑-------⮑ 过期

这是 Compound Finance 的治理状态转换流

compound governance defi

<https://docs.compound.finance/v2/governance>

而这是 Uniswap

Uniswap governance defi

<https://docs.uniswap.org/contracts/v2/reference/Governance/governance-reference>

谁有权创建提案(并将其转移到待处理状态)取决于协议。一个常见的模式是持有足够治理代币的钱包可以创建提案。同样,谁可以将状态转换为“已取消”也取决于协议。没有关于谁有权执行这些操作的普遍标准。

当不确定何时可以进行状态转换时,最好直接阅读治理 Solidity 智能合约。

Governor Alpha 和 Bravo

Compound 对 DeFi 中的治理方式产生了深远影响。2021年,Compound 在其原始治理 智能合约设计 中引入了新特性。这种新设计被称为 Governor Bravo,其他 DeFi 协议 也在设计变更中跟随。

以下是 Governor Bravo 中的新内容:

  • 投票者可以明确“弃权”,而不仅仅是投赞成或反对
  • 治理合约变为可升级的代理模式
  • 投票者可以为他们的投票添加一个理由字符串

在 OpenZeppelin Bravo 实现中, vote 结构 中可以看到为“弃权”添加的字段。

执行治理提案的示例工作流程

网站 tally.xyz 提供了一个非常好的界面,展示治理提案的工作流程。

让我们看看来自 Uniswap 的提案 9,这是一个成功的提案,旨在向他们的流动性池添加一个 1 个基点的费用级别。

对于那些不熟悉 Uniswap 的人来说,当希望交易代币的人在流动性提供者创建的池中执行交换时,流动性提供者会赚取费用。此费用在池创建时决定,但只能来自固定集的费用大小。社区希望添加一个非常小的费用选项,以便与其他代币交换 DeFi 服务竞争,该提案已通过。

以下是 tally 对投票和执行的可视化。

DeFi Governance text

<https://www.tally.xyz/gov/uniswap/proposal/9>

页面应该大致无需解释,但为了方便我们在这里简要说明。

这里列出的每个操作都是链上操作。读者可以点击三个点小部件以访问 Etherscan 上的相关交易。

这是实际执行提案的交易。 <https://etherscan.io/tx/0x5c84f89a67237db7500538b81af61ebd827c081302dd73a1c20c8f6efaaf4f3c#eventlog>

很明显,FeeAmountEnabled 事件是由 0x1f98431c8ad98523631ae4a59f267346ea31f984 合约发出的,该合约是用于创建池的 Uniswap 工厂。

Tally 方便地提供了投票者进行投票的代码,该代码最终被执行。

治理攻击

以下是一些黑客成功执行的治理攻击示例。

闪电贷攻击

BeanStalk 协议具有一个名为 emergencyCommit 的特性,当足够多的投票者支持该交易时,可以立即执行此交易。这旨在在需要立即推进的紧急提案中绕过时间延迟。攻击者通过获取闪电贷来获得足够的投票权,以绕过定时锁并执行一个命令,从而抽走协议的资金。

低价攻击

如果代币的价格足够低,攻击者就可以以经济方式获得足够的投票权,以通过他们想要的任何提案。相对于治理代币的市值,协议中锁定的重大资产使其特别容易受到这种攻击。这种攻击针对的是 True Seniorage Dollar,攻击者投票铸造数十亿个稳定币供自己使用,然后在另一个去中心化交易所出售。由于治理代币的市值相对较低,51% 攻击的风险并非微不足道。

社会或政治攻击

与任何民主一样,投票在一定程度上可以被社会操控。装备精良的攻击者的协调行动可以推动不受欢迎的提案得到执行。

改进空间

目前尚未确定本文所描述的 DeFi 治理的当前模式是否是最佳方式。Vitalik Buterin 抨击 当前做法 一般不利于少数投票者。他在其 博客文章 中提出了解决方案。一个获得一定关注的解决方案是通过持有量的平方根来加权投票,也称为“平方投票”。仍然存在一个未解决的问题,即攻击者可以将其持有量拆分为多个地址,以避免通过平方根函数降低其投票权重。

设置治理的工具

对于希望通过链上治理设置 DAO 的人,这里有一些资源可以避免从头开始编写合约。

结论

治理合约是目前治理代币持有者对应执行哪些以太坊交易进行投票的接受模式。尽管许多项目遵循一个共同的模式,但以安全和公正的方式进行治理仍然是一个未解决的研究问题。

了解更多

请查看我们的 区块链训练营 以学习以太坊和 DeFi 开发。

最初发布于 2023 年 2 月 27 日

  • 原文链接: rareskills.io/post/gover...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
RareSkills
RareSkills
https://www.rareskills.io/