ERC-7787: 灵魂绑定可降级治理
DAO 治理,其中投票权不可转让,并且在没有积极贡献的情况下会随着时间而衰减。
Authors | Guilherme Neves (@0xneves), Rafael Castaneda <rafaelcastaneda@gmail.com> |
---|---|
Created | 2024-10-15 |
Discussion Link | https://ethereum-magicians.org/t/erc-7787-soulbound-degradable-governance/21326 |
Requires | EIP-20 |
摘要
本提案介绍了灵魂绑定可降级治理 (SDG) 标准,其中治理权应授予为不可转让的代币,这些代币会随着时间推移而衰减,除非通过参与进行更新。SDG 使年轻的 DAO 能够通过在早期开发阶段将治理权与经济权力分离来实现基于优点的治理。
动机
传统的 DAO 治理模型严重依赖于经济代币,其中投票权与代币持有量成正比。虽然这种模型对某些用例有效,但它存在权力集中在富裕成员手中、导致金权政治以及阻碍较小利益相关者参与的风险。此外,它还会培养一种以财务为中心的文化,吸引主要关注经济利益而非长期治理或社区福祉的贡献者。
特别是,年轻的 DAO 需要激励积极贡献而不依赖经济力量的治理模型。本提案通过将治理权与经济权力分离,并确保政治权力在未通过持续参与维持的情况下会衰减来解决这些问题。这种方法创建了一个基于优点的结构,反映了持续的参与,并降低了早期阶段权力集中或依赖大量通货膨胀政策的风险。
规范
本文档中使用的关键词“必须”,“不得”,“必需”,“应该”,“不应该”,“推荐”,“不推荐”,“可以”和“可选”应按照 RFC 2119 和 RFC 8174 中的描述进行解释。
该系统必须使用两种不同的代币类型运行,一种代表政治权力,另一种代表经济权力:
-
政治权力代币应为不可转让的,并随着时间推移而衰减。
-
经济权力代币支持流动性和交易,为 DAO 的运营提供所需的财务效用,并且建议作为标准 ERC-20 代币。
此标准的实施者必须:
-
覆盖
transfer(...)
函数,以阻止地址之间的治理代币转移。 -
通过覆盖父合约上的
getVotes(...)
函数来创建衰减机制,从而降低代币的投票权。建议使用线性或指数衰减公式。 -
创建相应的 Event 发射,以跟踪地址的投票权。
合约接口:
// SPDX-License-Identifier: CC0-1.0
pragma solidity ^0.8.20;
interface SDG {
/**
* @dev 返回投票单位开始衰减之前的宽限期持续时间。此期限固定为 90 天。但可以在派生合约中覆盖。
* @return 宽限期的持续时间(以秒为单位)。
*/
function gracePeriod() public view virtual returns (uint256);
/**
* @dev 返回投票单位减少的衰减期持续时间。此期限固定为 90 天。但可以在派生合约中覆盖。
* @return 衰减期的持续时间(以秒为单位)。
*/
function decayPeriod() public view virtual returns (uint256);
/**
* @dev 应由派生合约实现,以返回帐户的当前投票单位。
* 此函数根据上次更新的时间计算投票单位,并随着时间的推移而衰减。
* @param account 要检查投票单位的地址。
* @return 帐户的当前投票单位。
*/
function getVotes(address account) public view virtual returns (uint256);
}
原理
SDG 标准通过不与任何特定代币类型绑定来确保灵活性,从而允许 DAO 使用 ERC-20、ERC-721、ERC-1155 或其他未来代币标准来实现它。此决策最大限度地提高了框架在不同治理模型中的兼容性和适应性。
将治理权与经济权力分离旨在为寻求防止早期权力集中同时促进积极参与的年轻 DAO 提供实用的治理模型。不可转让的治理代币可确保只有参与的成员才能保留影响力,因为如果政治权力没有通过贡献进行更新,它会随着时间的推移而衰减。
我们刻意避免在标准中包含“游戏管理员模式”等用于早期阶段的机制或固定的衰减策略,以保持规范的最小化和模块化。这些治理结构应由各个 DAO 根据需要实施,而不会给核心 SDG 标准增加额外的复杂性。目标是为 DAO 提供构建可持续的、基于优点的治理的基本工具,同时为实施级别的实验和定制留下空间。
包含宽限期和衰减期可以平衡公平性和流动性,从而激励积极参与,同时防止治理停滞。这些机制确保治理权力反映最近的贡献,自然地淘汰不活跃的成员,并维持动态的、基于优点的结构。
向后兼容性
未发现向后兼容性问题。
参考实现
// SPDX-License-Identifier: CC0-1.0
pragma solidity ^0.8.20;
import { SDG } from "./SDG.sol"; // SDG 实现
import { SOULERC721 } from "./ERC721/SOULERC721.sol"; // Soulbounded ERC721 实现
import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; // Oz Ownable 合约
/**
* @title Valocracy
* @dev 实现了 SDG 治理模型,其中治理权力会随着时间的推移而衰减,如果未积极维护。
* 只有 DAO 治理合约(作为所有者)才能铸造新代币或授予额外的治理权力。
*/
contract Valocracy is SDG, SOULERC721, Ownable {
// 发出事件,当投票单位被更新时
event VotingUnitsUpdated(address indexed account, uint256 oldVotingUnits, uint256 newVotingUnits);
// 顺序 ID 和代币总供应量
uint256 public totalSupply;
// 地址到其代币 ID 的映射
mapping(address => uint256) private _tokens;
/**
* @param _name ERC721 代币的名称。
* @param _symbol ERC721 代币的符号。
*/
constructor(
string memory _name,
string memory _symbol
) Ownable(_msgSender()) SOULERC721(_name, _symbol) {}
/**
* @dev 参见 {IERC721Metadata-tokenURI}。
* @notice 此函数返回一个静态字符串作为代币 URI。在实际实现中,此
* 函数应返回一个 URI,该 URI 指向包含有关代币元数据的 JSON 文件。甚至
* 更好的是,一个动态 SVG,显示代币持有者的治理权力。
*/
function tokenURI(uint256 tokenId) public pure override returns (string memory) {
return "自定义图像或动态 NFT,显示治理权力";
}
/**
* @dev 参见 {ISDG-getVotes}。
*/
function getVotes(address account) public view override returns (uint256) {
uint256 grantedTime = _lastUpdateOf(account);
// 如果没有授予投票单位或仍在宽限期内,则返回所有投票单位
if (grantedTime == 0 || block.timestamp < grantedTime + gracePeriod()) {
return _votingUnitsOf(account);
}
// 计算自宽限期结束以来经过的时间
uint256 timeSinceGracePeriod = block.timestamp - (grantedTime + gracePeriod());
// 如果衰减期结束,则返回 0
if (timeSinceGracePeriod >= decayPeriod()) {
return 0;
}
// 线性衰减:计算衰减期内剩余的投票单位
uint256 decayPercentage = (timeSinceGracePeriod * 1e18) / decayPeriod(); // 百分比为 18 个小数位
uint256 remainingVotes = (_votingUnitsOf(account) * (1e18 - decayPercentage)) / 1e18;
return remainingVotes;
}
/**
* @dev 通过 `amount` 将投票单位授予指定的帐户。只有合约所有者才能
* 铸造新代币并授予额外的投票单位。如果用户没有代币,则
* 将为他们铸造一个。
* @param to 要铸造新代币或授予额外投票单位的地址。
* @param amount 要伴随代币授予的投票单位数量。
*/
function grantVotingUnits(address to, uint256 amount) public virtual onlyOwner {
if (_tokens[to] == 0) {
_mint(to, ++totalSupply);
_tokens[to] = totalSupply;
}
uint256 votingUnits = getVotes(to);
_setVotingUnits(to, votingUnits + amount);
emit VotingUnitsUpdated(to, votingUnits, amount);
}
/**
* @notice 烧毁 ERC721 代币并擦除与代币持有者关联的投票单位。
* @dev 代币必须存在并且可以由代币持有者或授权实体烧毁。
* @param tokenId 要烧毁的代币的 ID。
*/
function burn(uint256 tokenId) public virtual {
address from = ownerOf(tokenId);
uint256 votingUnits = getVotes(from);
_tokens[from] = 0;
_setVotingUnits(from, 0);
_burn(tokenId);
emit VotingUnitsUpdated(from, votingUnits, 0);
}
}
安全考虑
未发现任何安全问题。
版权
通过 CC0 放弃版权及相关权利。
Citation
Please cite this document as:
Guilherme Neves (@0xneves), Rafael Castaneda <rafaelcastaneda@gmail.com>, "ERC-7787: 灵魂绑定可降级治理 [DRAFT]," Ethereum Improvement Proposals, no. 7787, October 2024. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-7787.