ERC-173 合约所有权标准

简要说明:

合约所有权的标准接口

原文章:https://eips.ethereum.org/EIPS/eip-173

摘要:

该规范定义了拥有或控制合约的标准功能。

实现允许读取当前所有者(owner() returns (address))并转移所有权(transferOwnership(address newOwner))以及所有权变更时的标准化事件(OwnershipTransferred(address indexed previousOwner, address indexed newOwner))。

动机:

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

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

  1. 购买/出售/拍卖以太坊合约的交易所。只有存在获取合约所有者和转让所有权的标准,这才有可能实现。
  2. 合约钱包,持有合约的所有权,并且可以转让合约的所有权
  3. 合约登记处。对于某些注册管理机构来说,只允许合约所有者添加/删除其合约是有意义的。这些合约注册中心必须存在一个标准,以再接受合约之前验证合约是否由其所有者提交
  4. 显示和转让合约所有权的用户界面。

规范

每个符合 ERC-173 的合约都必须实现该ERC173接口。合约还应该实现REC165ERC173 接口

/// @title ERC-173 Contract Ownership Standard
///  Note: the ERC-165 identifier for this interface is 0x7f5828d0
interface ERC173 { // is ERC165
    /// @dev This emits when ownership of a contract changes.    
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /// @notice Get the address of the owner    
    /// @return The address of the owner.
    function owner() view external returns(address);
	
    /// @notice Set the address of the new owner of the contract
    /// @dev Set _newOwner to address(0) to renounce any ownership.
    /// @param _newOwner The address of the new owner of the contract    
    function transferOwnership(address _newOwner) external;	
}

interface ERC165 {
    /// @notice Query if a contract implements an interface
    /// @param interfaceID The interface identifier, as specified in ERC-165
    /// @dev Interface identification is specified in ERC-165. 
    /// @return `true` if the contract implements `interfaceID` and
    ///  `interfaceID` is not 0xffffffff, `false` otherwise
    function supportsInterface(bytes4 interfaceID) external view returns (bool);
}

owner()函数可以实现为pureview

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

要放弃合约的任何所有权,请将 _newOwner 设置为零地址:transferOwnership(address(0))如果这样做了,那么合约将不再属于任何人

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

基本原理:

映像标准的关键因素:

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

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

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

  1. 将以太坊名称服务 (ENS) 域名与合同关联。合约的owner()函数可以查找特定 ENS 名称的所有者地址,并将其用作合约的所有者地址。使用此方案,可以通过将 ENS 域名的所有权转移到不同的地址来转移合同。这种方法的缺点是它不能向后兼容现有合约,并且需要gas对ENS相关合约进行外部调用以获取所有者地址。
  2. 将基于 ERC721 的不可替代代币 (NFT) 与合约关联。合约的所有权可能与 NFT 的所有权挂钩。这种方法的好处是现有的基于 ERC721 的基础设施可用于出售/购买/拍卖合同。这种方法的缺点是额外的复杂性和所需的基础设施。合约可以与特定的 NFT 相关联,但 NFT 不会跟踪它拥有合约的所有权,除非它被编程为跟踪合约。此外,以这种方式处理合约所有权并不向后兼容。

本标准不排除上述所有权方案或其他方案也在同一合同中实施。例如,合同可以实施该标准,也可以实施其他方案,以便可以通过多种方式管理和转让所有权。该标准确实提供了一种简单的所有权方案,该方案向后兼容、轻量级且易于实施,并且可以被广泛采用和依赖。

该标准可以(并且已经)由其他标准扩展以添加额外的所有权功能。

安全考虑

如果返回的地址owner()是外部拥有的帐户,则其私钥不得丢失或泄露。

向后兼容性

许多现有合同已经实施该标准。