介绍
ENS 注册表合约是 ENS 系统中的核心合约,当前在用的注册表合约(ENSRegistryWithFallback)是升级版本(带回退功能,兼容原始版本),在 2020 年 1 月 30 日部署完成,如果不出意外,这也会是最终版。
ENS 注册表合约的功能是维护所有名称和子名称列表,并存储关于每个名称的三个关键信息:名称的所有者、名称的解析器、名称下所有记录的缓存存活时间(即 TTL)。您可以在 ENS 架构中查看注册表的工作原理。
ENS 注册表合约的部分关键交易(前 7 笔交易)
No. | 合约名称 | 相关交易 | 发送方 | 调用函数 | 备注 |
---|---|---|---|---|---|
1 | ENSRegistryWithFallback | 0x00df8 | Deployer-0x4fe4e | 无 | 新 ENS 合约创建 |
2 | ENSRegistryWithFallback | 0x36a85 | Deployer-0x4fe4e | setSubnodeRecord | 设置 eth 的解析器为 OwnedResolver-0x30200、所有者为 BaseRegImp-0x57f18 |
3 | ENSRegistryWithFallback | 0x09a36 | Wallet1-0x0904d | setResolver | 设置 migrated.eth 的解析器为 OwnedResolver-0x30200 |
4 | ENSRegistryWithFallback | 0x6f410 | Deployer-0x4fe4e | setSubnodeOwner | 设置 reverse 的所有者为 Deployer-0x4fe4e |
5 | ENSRegistryWithFallback | 0x7311c | Deployer-0x4fe4e | setSubnodeOwner | 设置 addr.reverse 的所有者为 ReverseRegistrar-0x084b1 |
6 | ENSRegistryWithFallback | 0xebc1b | Deployer-0x4fe4e | setOwner | 设置 reverse 的所有者为 Dead-0x00000 |
7 | ENSRegistryWithFallback | 0xf296f | Deployer-0x4fe4e | setSubnodeOwner | 设置 xyz 的所有者为 DNSRegistrar-0xa2f42 |
8 | ENSRegistryWithFallback | 0xe120b | Deployer-0x4fe4e | setOwner | 设置根名称的所有者为 Root-0xab528 |
部分关键名称的相关信息
- “name”: “eth”,
- “node”: “0x93cdeb708b7545dc668eb9280176169d1c33cfd8ed6f04690a0bcc88a93fc4ae”,
- “labelName”: “eth”,
- “labelhash”: “0x4f5b812789fc606be1b3b16908db13fc7a9adf7ca72641f84d75b47069d3d7f0”,
- “parent-node”: “0x0000000000000000000000000000000000000000000000000000000000000000”
- “name”: “reverse”,
- “node”: “0xa097f6721ce401e757d1223a763fef49b8b5f90bb18567ddb86fd205dff71d34”,
- “labelName”: “reverse”,
- “labelhash”: “0xdec08c9dbbdd0890e300eb5062089b2d4b1c40e3673bbccb5423f7b37dcf9a9c”,
- “parent-node”: “0x0000000000000000000000000000000000000000000000000000000000000000”
- “name”: “addr.reverse”
- “node”: “0x91d1777781884d03a6757a803996e38de2a42967fb37eeaca72729271025a9e2”,
- “labelName”: “addr”,
- “labelhash”: “0xe5e14487b78f85faa6e1808e89246cf57dd34831548ff2e6097380d98db2504a”,
- “parent-node”: “0xa097f6721ce401e757d1223a763fef49b8b5f90bb18567ddb86fd205dff71d34”
- “name”: “xyz”,
- “node”: “0xa87a11c7f15e38a7398517fda2ae1b40d870aa24b34b4b09aa09afc71f2c9d26”,
- “labelName”: “xyz”,
- “labelhash”: “0x9dd2c369a187b4e6b9c402f030e50743e619301ea62aa4c0737d4ef7e10a3d49”,
- “parent-node”: “0x0000000000000000000000000000000000000000000000000000000000000000”
关于原版注册表(ENSRegistry)的故事
现在部署的注册表是在 2020 年 2 月份部署的升级版本,它的上一个版本,也是最早的 ENS 注册表,是用 LLL 语言编写的,在被更新前的两年多时间里一直稳定地为 ENS 提供可靠支持。关于为什么采用 LLL 语言来编写合约,ENS 首席工程师 Nick 这样回复:
We wrote ENS back when Solidity was still very new, and fairly inefficient. The LLL implementation was a lot more efficient, as well as producing bytecode that was simple enough it could be decompiled to verify it exactly matched the implementation. These days, Solidity is a lot more mature, so there’s a lot less reason to do this kind of thing.
我们开始编写 ENS 的时候,Solidity 还是一门新兴语言,而且相当低效。LLL语言则要高效许多,且可以对其进行反编译,以验证它与实现完全匹配。现在,Solidity 已经是一门成熟的语言,所以已经没有太多必要去采用 LLL。
下面我们来看看第一版注册表刚创建时的一些关键交易,回顾一下 ENS 最初的样子:
原版注册表的部分关键交易(前 7 笔交易)
No. | 合约名称 | 相关交易 | 发送方 | 调用函数 | 备注 |
---|---|---|---|---|---|
1 | ENS-0x31415 | 0x40ea7 | 0x8a582 | 无 | ENS 合约创建 |
2 | ENS-0x31415 | 0xe120d | 0x8a582 | setOwner | 设置根域所有者为 0x8472d |
3 | ENS-0x31415 | 0x057a1 | 0x8472d | setSubnodeOwner | 设置 .eth 所有者为 TempRegistrar-0x01223 |
4 | ENS-0x31415 | 0x27fbd | 0x8472d | setSubnodeOwner | 设置 .reverse 所有者为 0x8472d |
5 | ENS-0x31415 | 0x24ae9 | 0x8472d | setSubnodeOwner | 设置 .addr.reverse 所有者为 ReverseRegistrarOld-0xda7fa |
6 | ENS-0x31415 | 0x8b0bc | 0x8472d | setOwner | 设置 .reverse 所有者为 0x00000 |
7 | ENS-0x31415 | 0xf10f3 | 0x8472d | setOwner | 设置根域所有者为 MultiSig-0x91114 |