ERC-162: 初始 ENS 哈希注册器
Authors | Maurelian, Nick Johnson <nick@ethereum.org>, Alex Van de Sande <avsa@ethereum.org> |
---|---|
Created | 2016-10-25 |
Table of Contents
Contents
- Abstract
- Motivations
- Specification
- Initial restrictions
- Name format for hash registration
- Auctioning names
- Deeds
- Deployment and Upgrade process
- Registrar Interface
- Rationale
- Not committing to a permanent registrar at the outset
- Valid names >= 7 characters
- Restricting TLD to
.eth
- Holding ether as collateral
- Prior work
Abstract
本 ERC 描述了注册器合约的实现,该合约于 2017-05-04 部署到以太坊主网络,用于管理 Ethereum Name Service (ENS) 中名称的分配。 相应的源代码位于此处。
有关更多背景信息,请参阅 EIP-137。
注册器负责将域名分配给系统的用户,并且是唯一能够更新 ENS 的实体; ENS 注册表中节点的拥有者是其注册器。 注册器可以是合约或外部拥有的账户,但至少根注册器和顶级注册器预计将以合约的形式实现。
- EIP 137
一个设计良好且受管制的注册器对于 EIP 137 中描述的 ENS 的成功至关重要,但由于它在核心 ENS 协议之外,因此在本文件中单独描述。
为了最大化新命名空间的效用和采用率,注册器应缓解投机和“域名抢注”,但是,缓解的最佳方法尚不清楚。 因此,提出了一个“初始”注册器,该注册器实现了一种简单的名称分配方法。 在初始阶段,可用的命名空间将受到显着限制,仅限于 .eth
顶级域名,并且不允许使用长度小于 7 个字符的子域名。 本规范主要描述了 @alexvandesande 和 @arachnid 的 哈希注册器实现,以便于讨论。
目的是用永久注册器合约替换初始注册器合约。 永久注册器将增加可用的命名空间,并结合从初始注册器的性能中获得的经验教训。 预计此升级将在首次部署后大约 2 年内进行。
Motivations
为了优化 ENS 的采用和初始注册器命名空间的良好管理,应考虑以下因素。
可升级性: 初始注册器应该是安全可升级的,以便可以在部署期间获得的知识可用于用改进的永久注册器替换它。
有效分配: 新发布的命名空间通常会造成一片混乱,导致许多潜在有价值的名称被购买但未使用,希望能够以利润重新出售。 这降低了最有用名称的可用性,进而降低了名称服务对最终用户的效用。
实现有效分配可能需要也可能不需要人为干预来进行争议解决和其他形式的管理。 初始注册器不应旨在创建最有效的可能分配,而是应限制长期来看的错误分配成本。
安全性: 注册器将持有以太币余额,没有明确的限制。 它必须安全地设计。
简单性: ENS 规范本身强调关注点分离,允许最重要的元素(注册表)尽可能简单。 反过来,临时注册器应该尽可能简单,同时仍然满足其其他设计目标。
采用: 由于网络效应,成功的标准会变得更加成功。 注册器应考虑哪些策略可以鼓励 ENS 的普遍采用,以及它控制的命名空间的采用。
Specification
Initial restrictions
预计初始注册器将在升级之前提供大约两年的服务。 这应该有足够的时间来学习、观察和设计更新的系统。
在最初的两年期间,可用的命名空间将限制为 .eth
TLD。
此限制由 ENS 根节点的拥有者强制执行,该拥有者不应将除 .eth
之外的任何节点分配给初始注册器。 ENS 的根节点应由多个参与者使用多重签名合约进行控制。
初始注册器还将禁止注册长度为 6 个字符或更少的名称。
Name format for hash registration
提交给初始注册表的名称必须使用 Ethereum 的 sha3 函数进行哈希处理。 请注意,提交给注册表的哈希是正在注册的子域标签的哈希,而不是 EIP 137 中定义的 namehash。
例如,为了注册 abcdefg.eth
,应该提交 sha3('abcdefg')
,而不是 sha3(sha3(0, 'eth'), 'abcdefg')
。
Auctioning names
注册器将通过 Vickrey 拍卖分配可用的名称:
Vickrey 拍卖是一种密封投标拍卖。 投标人提交书面投标,而不知道拍卖中其他人的投标。 最高出价者获胜,但支付的价格是第二高的出价。 这种类型的拍卖…激励投标人出价其真实价值。
一个名称的拍卖生命周期有 5 种可能的状态,或模式。
- Not-yet-available: 大多数名称最初将无法用于拍卖,并且将在启动后的 8 周内的某个时间变得可用。
- Open: 名称的最早可用时间由其 sha3 哈希的最高有效字节决定。
0x00
将立即变为可用,0xFF
将在 8 周后变为可用,其他名称的可用性将相应地分配。 一旦名称可用,就可以开始对其进行拍卖。 - Auction: 一旦某个名称的拍卖开始,就会有 72 小时的竞标期。 投标人必须提交以太币付款,以及密封的出价,作为
sha3(bytes32 hash, address owner, uint value, bytes32 salt)
的哈希。 投标人可以通过发送更多的以太币来混淆真实的投标价值。 - Reveal: 在竞标期结束后,开始 48 小时的揭示期。 在此期间,投标人必须揭示其密封投标的真实参数。 随着投标的揭示,以太币付款将根据下表中概述的“退款比率”的时间表返还。 如果没有揭示任何投标,该名称将返回到 Open 状态。
- Owned: 在揭示期结束后,中标者必须提交交易以完成拍卖,然后调用 ENS 的
setSubnodeOwner
函数,将中标者的地址记录为该名称哈希的拥有者。
下表概述了定义注册器拍卖机制的重要参数。
Registrar Parameters
Name | Description | Value |
---|---|---|
totalAuctionLength | 从拍卖开始到揭示期结束的完整时间段。 | 5 days |
revealPeriod | 不再允许竞标,并且必须揭示投标的时间段的长度。 | 48 hours |
launchLength | 所有名称都将可用于拍卖的时间段。 | 8 weeks |
minPrice | 为了换取名称的所有权而必须锁定的最小以太币数量。 | 0.01 ether |
Deeds
初始注册器合约本身不持有余额。 发送到注册器的所有以太币将保存在单独的 Deed
合约中。 首次提交密封投标时,会首先创建并资助 deed 合约。 在拍卖完成且哈希已注册后,中标投标的 deed 将被持有,以换取哈希的所有权。 未中标的 bid 将被退还。
已拥有名称的 deed 可以由其拥有者转移到另一个帐户,从而转移名称的所有权和控制权。
在注册 1 年后,哈希的拥有者可以选择放弃所有权,并将 deed 的价值返还给他们。
非中标 bid 的 deed 可以通过各种方法关闭,届时持有的任何以太币将返还给投标人、销毁或作为奖励发送给帮助注册器的人。
下表概述了在关闭时将返还 deed 合约中持有的余额的哪一部分,以及返还给谁。 剩余的余额将被销毁。
Refund schedule
Reason for Deed closure | Refund Recipient | Refund Percentage |
---|---|---|
A valid non-winning bid is revealed. | Bidder | 99.5% |
A bid submitted after the auction period is revealed. | Bidder | 99.5% |
An otherwise valid bid is revealed on an owned name. 1 | Bidder | 0.5% |
An expired sealed bid is cancelled. 2 | Canceler | 0.5% |
A registered hash is reported as invalid. 3 | Reporter | 50% |
A registered hash is reported as invalid. 3 | Owner | 50% |
Notes:
- 这激励所有投标及时揭示。 如果投标可以稍后揭示,则可以通过威胁揭示新的第二高投标来对当前最高投标人进行敲诈勒索。
- 在超过 2 周零 5 天后仍未密封的投标可以由任何人取消以收集少量奖励。
- 由于名称在拍卖和注册之前会被哈希处理,因此初始注册器无法独立强制执行字符长度限制。 因此,提供奖励以报告无效名称。
Deployment and Upgrade process
初始注册器需要 ENS 的地址作为构造函数,并且应在 ENS 之后部署。 拥有 ENS 中根节点的多重签名帐户然后应将初始注册器的地址设置为 eth
节点的所有者。
预计初始注册器将在部署后大约 2 年内被永久注册器替换。 以下过程应用于升级:
- 将部署永久注册器合约。
- 拥有 ENS 中根节点的多重签名帐户会将
.eth
节点的所有权分配给永久注册器。 - 初始注册器中哈希的拥有者将负责将其 deed 注册到永久注册器。 这里考虑了几个选项:
- 要求拥有者在截止日期之前转移其所有权,以保持所有权和/或继续名称解析服务。 . 2. 如果永久注册器缺少条目,则让其查询初始注册器以获取所有权。
Planned deactivation
为了限制对初始注册器的依赖,新的拍卖将在 4 年后停止,并且 8 年后 deed 中持有的所有以太币将无法访问。
Registrar Interface
function state(bytes32 _hash) constant returns (Mode)
- 实现一个状态机,返回名称的当前状态
function entries(bytes32 _hash) constant returns (Mode, address, uint, uint, uint)
- 返回有关已注册名称的以下信息:
- state
- deed address
- registration date
- balance of the deed
- highest value bid at auction
function getAllowedTime(bytes32 _hash) constant returns (uint timestamp)
- 返回哈希不再处于初始
not-yet-available
状态的时间。
function isAllowed(bytes32 _hash, uint _timestamp) constant returns (bool allowed)
- 接受哈希和时间,当且仅当它已通过初始
not-yet-available
状态时,才返回 true。
function startAuction(bytes32 _hash);
- 将哈希的状态从 Open 移动到 Auction。 如果状态不是 Open,则抛出异常。
function startAuctions(bytes32[] _hashes);
- 在哈希数组上启动多个拍卖。 这使某人可以在他们实际上只对竞标一个感兴趣时,为许多虚拟哈希打开拍卖。 这将增加攻击者只是盲目地对所有新拍卖进行竞标的成本。 未竞标的已开放虚拟拍卖会在一周后关闭。
function shaBid(bytes32 hash, address owner, uint value, bytes32 salt) constant returns (bytes32 sealedBid);
- 接受投标的参数,并返回参与拍卖竞标所需的 sealedBid 哈希值。 这会混淆参数,以模仿在信封中放置投标的机制。
function newBid(bytes32 sealedBid);
- 竞标通过将带有 sealedBid 哈希和以太币数量的消息发送到主合约来发送。 该哈希包含有关投标的信息,包括投标名称哈希、投标价值和随机 salt。 在揭示之前,投标不会与任何一个拍卖相关联。 投标本身的价值可以通过发送超过实际投标价值的金额来掩盖。 之后是 48 小时的揭示期。 在此期间之后揭示的投标将被烧毁,并且以太币无法恢复。 由于这是一次拍卖,因此预计大多数公共哈希,例如已知域名和常见字典单词,将有多个投标人推高价格。
function startAuctionsAndBid(bytes32[] hashes, bytes32 sealedBid)
- 一个实用函数,允许在单个交易中调用
startAuctions
,然后调用newBid
。
function unsealBid(bytes32 _hash, address _owner, uint _value, bytes32 _salt);
- 竞标期完成后,有一个揭示期,在此期间提交投标的属性以揭示它们。 注册器使用上面的
shaBid()
函数哈希这些属性,以验证它们是否与预先存在的密封投标匹配。 如果 unsealedBid 是新的最佳投标,则旧的最佳投标将返还给其投标人。
function cancelBid(bytes32 seal);
- 根据上面退款时间表注释中描述的规则取消未揭示的投标。
function finalizeAuction(bytes32 _hash);
在注册日期过去后,可以调用此函数来完成拍卖,然后调用 ENS 函数 setSubnodeOwner()
,更新 ENS 记录以将中标者设置为节点的所有者。
function transfer(bytes32 _hash, address newOwner);
- 将与提交的哈希相对应的 ENS 节点的所有者更新为新所有者。 此函数必须只能由当前所有者调用。
function releaseDeed(bytes32 _hash);
- 经过一段时间后,所有者可以释放财产并取回其以太币。
function invalidateName(string unhashedName);
- 由于注册是在名称的哈希上完成的,因此注册器本身无法验证名称。 此函数可用于报告长度为 6 个字符或更少的名称。 如果已注册,则提交者将获得 deed 价值的 10%。 我们特意限制简化的注册器,以迫使其在几年内进行重组。
function eraseNode(bytes32[] labels)
- 允许任何人删除当前在注册器中不拥有的名称的子域的所有者和解析器记录。 例如,要在拥有
.eth
的注册器上将foo.bar.eth
归零,请传递一个包含[sha3('foo'), sha3('bar')]
的数组。
function transferRegistrars(bytes32 _hash) onlyOwner(_hash);
- 在升级到永久注册器期间使用。 如果此注册器不再是其在 ENS 中的根节点的所有者,则此函数会将 deed 转移到当前所有者,该所有者应为新的注册器。 如果此注册器仍然拥有其根节点,则此函数抛出异常。
Rationale
Starting with a temporary registrar
预期和设计名称分配的所有潜在问题不太可能成功。 这种方法选择不担心是否完美,而是让我们在训练轮上观察和学习,并在将可用命名空间扩展到更短的名称或另一个 TLD 之前实施改进。
Valid names >= 7 characters
为升级后的注册器保留最短的且通常是最有价值的域名,从而有机会实施争议解决流程(假设发现有必要)。
Delayed release of names
更慢的发布允许有更多的时间来识别和解决启动后可能出现的任何问题。
Restricting TLD to .eth
选择单个 TLD 有助于通过专注于一个命名空间来最大化网络效应。
三个字母的 TLD 是一种模式,因其在互联网域名中的常见用法而为人熟知。 这种熟悉度显着提高了 ENS 集成到现有 DNS 系统中的潜力,并保留为 特殊用途域名。 最近的一个先例是 保留 .onion
域名。
Holding ether as collateral
这种方法比要求所有者进行定期付款以保留域名所有权的熟悉模型更简单。 它还使初始注册器成为收入中性的服务。
Prior work
本文档大量借鉴了以下来源:
- EIP-137 概述了注册表合约 (ENS.sol) 和关联的解析器合约的初始实施。
- ERC-26 是第一个提议在合约层提供名称服务的 ERC
- @alexvandesande 的 HashRegistrar 的当前实施
Edits:
- 2016-10-26 在摘要中添加了链接 Alex 的设计
- 2016-11-01 将“Planned deactivation”更改为 h3’
- 2017-03-13 更新了竞标和揭示期的时间表
Copyright
Copyright and related rights waived via CC0.
Citation
Please cite this document as:
Maurelian, Nick Johnson <nick@ethereum.org>, Alex Van de Sande <avsa@ethereum.org>, "ERC-162: 初始 ENS 哈希注册器," Ethereum Improvement Proposals, no. 162, October 2016. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-162.