ERC-173: 合约所有权标准
合约所有权的标准接口
Authors | Nick Mudge (@mudgen), Dan Finlay <dan@danfinlay.com> |
---|---|
Created | 2018-06-07 |
摘要
本规范定义了用于拥有或控制合约的标准函数。
一个实现允许读取当前所有者 (owner() returns (address)
) 和转移所有权 (transferOwnership(address newOwner)
),以及在所有权变更时使用的标准化事件 (OwnershipTransferred(address indexed previousOwner, address indexed newOwner)
)。
动机
许多智能合约要求以某种方式被拥有或控制。例如,提取资金或执行管理操作。它是如此常见,以至于用于处理合约所有权的合约接口应该被标准化,以允许与管理合约的用户界面和合约的兼容。
以下是可以从此标准中受益的合约和应用程序的一些示例:
- 买卖/拍卖以太坊合约的交易所。只有在存在获取合约所有者和转让所有权的标准时,这才有可能广泛实现。
- 持有合约所有权并可以转移合约所有权的合约钱包。
- 合约注册表。对于某些注册表来说,只允许合约所有者添加/删除他们的合约是有意义的。必须存在一个标准,这些合约注册表才能验证合约是否由其所有者提交,然后才能接受它。
- 显示和转移合约所有权的用户界面。
规范
每个符合 ERC-173 的合约都必须实现 ERC173
接口。合约还应该为 ERC-173 接口实现 ERC165
。
/// @title ERC-173 合约所有权标准
/// 注意:此接口的 ERC-165 标识符是 0x7f5828d0
interface ERC173 /* is ERC165 */ {
/// @dev 当合约的所有权发生变化时会发出此事件。
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/// @notice 获取所有者的地址
/// @return 所有者的地址。
function owner() view external returns(address);
/// @notice 设置合约新所有者的地址
/// @dev 将 _newOwner 设置为 address(0) 以放弃任何所有权。
/// @param _newOwner 合约新所有者的地址
function transferOwnership(address _newOwner) external;
}
interface ERC165 {
/// @notice 查询合约是否实现了接口
/// @param interfaceID 接口标识符,如 ERC-165 中指定
/// @dev 接口标识在 ERC-165 中指定。
/// @return 如果合约实现了 `interfaceID` 且 `interfaceID` 不是 0xffffffff,则返回 `true`,否则返回 `false`
function supportsInterface(bytes4 interfaceID) external view returns (bool);
}
owner()
函数可以实现为 pure
或 view
。
transferOwnership(address _newOwner)
函数可以实现为 public
或 external
。
要放弃合约的任何所有权,请将 _newOwner
设置为零地址:transferOwnership(address(0))
。如果这样做,则合约不再由任何人拥有。
创建合约时应发出 OwnershipTransferred 事件。
理由
影响该标准的关键因素:
- 保持接口中的函数数量最少,以防止合约膨胀。
- 与现有合约的向后兼容性。
- 简单
- 气体效率
考虑了几种所有权方案。选择此标准中的方案是因为其简单性、低 gas 成本以及与现有合约的向后兼容性。
以下是考虑过的其他方案:
- 将以太坊域名服务 (ENS) 域名与合约关联。 合约的
owner()
函数可以查找特定 ENS 名称的所有者地址,并将其用作合约的所有者地址。使用此方案,可以通过将 ENS 域名的所有权转移到不同的地址来转移合约。这种方法的缺点是它与现有合约不向后兼容,并且需要 gas 来对 ENS 相关合约进行外部调用以获取所有者地址。 - 将基于 ERC721 的非同质化代币 (NFT) 与合约关联。 合约的所有权可以与 NFT 的所有权相关联。这种方法的好处是可以利用现有的基于 ERC721 的基础设施来销售/购买/拍卖合约。这种方法的缺点是需要额外的复杂性和基础设施。合约可以与特定的 NFT 关联,但除非 NFT 被编程为跟踪合约,否则 NFT 将不会跟踪它是否拥有合约的所有权。此外,以这种方式处理合约的所有权并不向后兼容。
此标准不排除在同一合约中也实现上述所有权方案或其他方案。例如,合约可以实现此标准,也可以实现其他方案,以便可以通过多种方式管理和转移所有权。此标准确实提供了一个简单的所有权方案,该方案向后兼容、轻量级且易于实现,并且可以被广泛采用和依赖。
该标准可以(并且已经被)其他标准扩展,以添加额外的所有权功能。
安全注意事项
如果 owner()
返回的地址是外部拥有的帐户,则不得丢失或泄露其私钥。
向后兼容性
许多现有合约已经实现了此标准。
版权
通过 CC0 放弃版权和相关权利。
Citation
Please cite this document as:
Nick Mudge (@mudgen), Dan Finlay <dan@danfinlay.com>, "ERC-173: 合约所有权标准," Ethereum Improvement Proposals, no. 173, June 2018. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-173.