EIP173
ERC-173 合约所有权标准
简要说明:
合约所有权的标准接口
原文章:https://eips.ethereum.org/EIPS/eip-173
摘要:
该规范定义了拥有或控制合约的标准功能。
实现允许读取当前所有者(owner() returns (address)
)并转移所有权(transferOwnership(address newOwner)
)以及所有权变更时的标准化事件(OwnershipTransferred(address indexed previousOwner, address indexed newOwner)
)。
动机:
许多智能合约要求以某种方式拥有或控制它们。例如提取资金或执行管理操作,用于处理合约所有权的合约接口应该标准化,以允许与管理合约的用户界面和合约兼容,这是很常见的。
下面是可以从此标准中受益的合约和应用程序类型的一些示例:
- 购买/出售/拍卖以太坊合约的交易所。只有存在获取合约所有者和转让所有权的标准,这才有可能实现。
- 合约钱包,持有合约的所有权,并且可以转让合约的所有权
- 合约登记处。对于某些注册管理机构来说,只允许合约所有者添加/删除其合约是有意义的。这些合约注册中心必须存在一个标准,以再接受合约之前验证合约是否由其所有者提交
- 显示和转让合约所有权的用户界面。
规范
每个符合 ERC-173 的合约都必须实现该ERC173
接口。合约还应该实现REC165
ERC173 接口
/// @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()
函数可以实现为pure
或view
该transferOwnership(address _newOwner)
函数可以实现为public
或external
要放弃合约的任何所有权,请将 _newOwner 设置为零地址:transferOwnership(address(0))
。如果这样做了,那么合约将不再属于任何人
创建合约时应发出 OwnershipTransferred 事件。
基本原理:
映像标准的关键因素:
- 将接口中的函数数量保持在最低限度,以防止合约膨胀
- 与现有合约的向后兼容性
- 简单
- 气体效率高
考虑了几种所有权方案。选择该标准中的方案是因为其简单、天然气成本低以及与现有合约的向后兼容性。
以下是考虑过的其他方案:
- 将以太坊名称服务 (ENS) 域名与合同关联。合约的
owner()
函数可以查找特定 ENS 名称的所有者地址,并将其用作合约的所有者地址。使用此方案,可以通过将 ENS 域名的所有权转移到不同的地址来转移合同。这种方法的缺点是它不能向后兼容现有合约,并且需要gas对ENS相关合约进行外部调用以获取所有者地址。 - 将基于 ERC721 的不可替代代币 (NFT) 与合约关联。合约的所有权可能与 NFT 的所有权挂钩。这种方法的好处是现有的基于 ERC721 的基础设施可用于出售/购买/拍卖合同。这种方法的缺点是额外的复杂性和所需的基础设施。合约可以与特定的 NFT 相关联,但 NFT 不会跟踪它拥有合约的所有权,除非它被编程为跟踪合约。此外,以这种方式处理合约所有权并不向后兼容。
本标准不排除上述所有权方案或其他方案也在同一合同中实施。例如,合同可以实施该标准,也可以实施其他方案,以便可以通过多种方式管理和转让所有权。该标准确实提供了一种简单的所有权方案,该方案向后兼容、轻量级且易于实施,并且可以被广泛采用和依赖。
该标准可以(并且已经)由其他标准扩展以添加额外的所有权功能。
安全考虑
如果返回的地址owner()
是外部拥有的帐户,则其私钥不得丢失或泄露。
向后兼容性
许多现有合同已经实施该标准。