Alert Source Discuss
Standards Track: ERC

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))。

动机

许多智能合约要求以某种方式被拥有或控制。例如,提取资金或执行管理操作。它是如此常见,以至于用于处理合约所有权的合约接口应该被标准化,以允许与管理合约的用户界面和合约的兼容。

以下是可以从此标准中受益的合约和应用程序的一些示例:

  1. 买卖/拍卖以太坊合约的交易所。只有在存在获取合约所有者和转让所有权的标准时,这才有可能广泛实现。
  2. 持有合约所有权并可以转移合约所有权的合约钱包。
  3. 合约注册表。对于某些注册表来说,只允许合约所有者添加/删除他们的合约是有意义的。必须存在一个标准,这些合约注册表才能验证合约是否由其所有者提交,然后才能接受它。
  4. 显示和转移合约所有权的用户界面。

规范

每个符合 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() 函数可以实现为 pureview

transferOwnership(address _newOwner) 函数可以实现为 publicexternal

要放弃合约的任何所有权,请将 _newOwner 设置为零地址:transferOwnership(address(0))。如果这样做,则合约不再由任何人拥有。

创建合约时应发出 OwnershipTransferred 事件。

理由

影响该标准的关键因素:

  • 保持接口中的函数数量最少,以防止合约膨胀。
  • 与现有合约的向后兼容性。
  • 简单
  • 气体效率

考虑了几种所有权方案。选择此标准中的方案是因为其简单性、低 gas 成本以及与现有合约的向后兼容性。

以下是考虑过的其他方案:

  1. 将以太坊域名服务 (ENS) 域名与合约关联。 合约的 owner() 函数可以查找特定 ENS 名称的所有者地址,并将其用作合约的所有者地址。使用此方案,可以通过将 ENS 域名的所有权转移到不同的地址来转移合约。这种方法的缺点是它与现有合约不向后兼容,并且需要 gas 来对 ENS 相关合约进行外部调用以获取所有者地址。
  2. 将基于 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.