最近,我们注意到 ENS 注册表合约存在一个漏洞。这个漏洞导致名称的所有者可以设置 “后门”,通过这个后门,他们可以在将一个名称转让或出售给别人以后,还能单方面收回该名称的所有权。
这个漏洞有个特点:攻击者必须先拥有该名称的合法所有权,并且必须在转让名称所有权之前设置这个 “后门”。因此,该漏洞不能被用来追回名称。
这个漏洞是由 Sam Sun 通过以太坊基金会的漏洞悬赏程序报告的。我们已经详细检查了 ENS 的注册表,并且确信之前没有人利用过这个漏洞。因此,所有 ENS 名称的所有权都是安全的。
因此,ENS 将迁移到一个新部署的合约上。本文档描述了具体的技术操作步骤,并简要描述这些操作对 DApp 开发者和用户的影响。
本文所描述的内容主要是针对那些对迁移的底层细节感兴趣的人,而对于大多数用户或开发者来说,则没有必要了解这些内容。对于漏洞及其对用户影响的描述,可以参阅 这篇文章 ;对于迁移步骤的描述,开发者们可以参阅 DApp 开发者迁移指南。
新部署的 ENS 合约
大多数 ENS 合约已经重新部署完成。其中有几个进行了更改,还有一些正在重新部署,确保它们引用的是新注册表。
ENS 注册表
新版的 ENS 注册表已经成功部署在这个地址:0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e
。除了修复漏洞,我们还利用这个机会实现了一些其他的功能,这些功能会提高 ENS 的可用性:
- 添加了
setRecord
和setSubnodeRecord
方法,允许在单个操作中设置所有者、解析器和 TTL 。 - 增加了基于 ERC721 的审批机制,允许用户将名称的控制权委托给另一个地址,而无须转让名称。
新注册表合约已经由 Sam Sun 进行了审查,并经过了 ConsenSys Diligence 的复查,双方都没有发现问题。
为了使迁移尽可能地顺利,我们给新注册表配置了回调机制。如果它在自己的存储中查询不到某条记录,它会在以前的 ENS 注册表合约中查询。此回调仅对读操作有效;如果旧注册表中存在记录,而新注册表中还没有,则用户不能调用函数来修改新注册表中的记录。
这意味着要将所有名称从以前的注册表中迁移过来,必须像从零开始一样重新创建名称。例如,如果 foo.eth
在新注册表中还不存在,那么 eth
的所有者必须通过调用 setSubnodeOwner
(或新的 setSubnodeRecord
)将其作为新名称进行创建。其他顶级名称的所有者(例如,.luxe
.kred
.club
和 .art
)需要代表其用户执行此操作,以便这些用户能够恢复对其名称的写权限。
因此,如果某条记录没有迁移到新注册表,用户和应用程序可以继续更新旧注册表中的记录,然后这些变化最终将映射至新注册表中。在将记录迁移到新注册表以后,在旧注册表中进行的更改就不会再映射到新注册表中。这可以确保由智能合约操作的名称继续发挥作用,直到它们的所有者采取手动操作将它们迁移过来。
下面列出了针对各种类别名称的迁移策略:
- 顶级名称(
.eth
.luxe
.kred
.club
.art
.xyz
和.reverse
)的迁移作为部署工作的一部分来完成。 .eth
二级名称(如 foo.eth)将会自动为用户进行迁移,详细信息请参阅下面的 “迁移合约” 部分。- 由子名称注册器管理的子名称也会自动为用户迁移。
- 通过其他方式创建的子名称需要父名称的所有者通过调用
setSubnodeOwner
或setSubnodeRecord
来重新创建。ENS APP 为用户直接拥有的子名称提供一键迁移的功能。 - 反向解析记录(
.addr.reverse
名称)需要在 ENS APP 界面中通过 “claim” 过程来重新创建。 .xyz
记录的迁移需要先在 ENS APP 界面通过 “claim” 过程证明相应 DNS 域名的所有权。.kred
.art
和.club
名称由这些顶级名称的操作人员迁移。
对于尚未迁移到新注册表的名称,名称解析可以正常进行。用户只有在更改名称的所有权、解析器或 TTL 时,才需要关心迁移的问题。
.eth 注册器
新版的 .eth 注册器(BaseRegistrarImplementation)也已经重新部署,地址是:0x57f1887a8BF19b14fC0dF6Fd9B2acc9Af147eA85
。这个注册器基本没有变化,只进行了一些细微的修改,以便于支持迁移。
迁移合约
一个专门为迁移过程而设计的新合约已经部署在这个地址:0x6109DD117AA5486605FC85e040ab00163a75c662
。该合约作为新版 .eth 注册控制器,在迁移过程开始时,会在旧注册器中被设置为 .eth 的所有者。该合约内实现的功能可以将 .eth 二级名称(如 foo.eth)从旧注册表和旧注册器迁移到新版本中。
一旦激活,ENS 团队将会把所有当前注册的 .eth 二级名称迁移到新部署的合约系统中。所有名称的注册记录将自动转到新注册器,名称有效期保持不变。注册表记录将被自动迁移,除非它们受到合约的控制。那些由合约控制的名称不会自动迁移,这样做是为了避免破坏注册器合约。
如果你的某个名称是由智能合约控制的(例如,使用了自定义注册器来分配子名称),那么你需要部署一个新版本的合约,并引用新注册表,然后自己手动在 ENS APP 中通过设置管理员来迁移这个名称。
此外,ENS 团队会自动地从原先的临时注册器(基于拍卖的注册器)迁移记录。临时注册器上还没有迁移的名称会在新部署的注册器自动创建,这些名称的有效期会被设置为 2020 年 5 月 4 日,也就是说这些名称不再需要用户手动迁移了。尽管如此,他们还是需要发送一笔交易来收回之前的押金,该操作不受时间限制。这样,ENS 的新注册器就可以完全与这个过时的注册器撇清关系了。
公共解析器
新版的公共解析器合约已经成功部署在这个地址:0x4976fb03C32e5B8cfe2b6cCB31c09Ba78EBaBa41
。该合约引用了新的 ENS 注册表,并附带实现了 “多重调用” 功能,允许用户通过一笔交易同时设置多条记录。
虽然使用旧版公共解析器的名称依旧可以正常解析,但由于公共解析器需要在 ENS 注册表中查询谁具有设置某个名称解析记录的权限,所以要想修改解析记录,就需要先迁移到新版公共解析器才行。ENS APP 利用 “多重调用” 功能来助力迁移进程,使得用户能够通过两笔交易完成一个名称所有解析记录的迁移:第一笔交易将所有解析记录从旧解析器复制到新解析器中,第二笔交易将名称在注册表中的记录指向新的解析器合约。
.eth 注册控制器
ENS 中所有 .eth 二级名称的注册请求都是通过 控制器合约 来处理的。迁移完成后,所有来自旧注册表和旧注册器的名称都在新注册表和新注册器中重新注册,ENS 团队将启用标准注册控制器,该控制器通过前后两笔交易完成一次注册。控制器合约与以前的部署没有任何变化。
反向注册器
新版反向注册器已经成功部署,并指向了新版注册器。与旧版本相比,没有任何变化。在整个迁移过渡期间,反向解析将继续正常工作。
DNSSEC 注册器
新版 DNSSEC 注册器已经成功部署。新版本保留了旧版本的所有功能,同时加入了一些改进,这些改进让 DNSSEC 支持更多顶级名称变得更为容易。.xyz 名称的解析会继续正常工作,但是这些名称的所有者如果需要更改名称的某些信息,就必须先通过 “claim” 过程收回名称的所有权。
子名称注册器
新版子名称注册器已经成功部署,该版本与之前的版本相比,除了支持这次迁移,基本没有变化。