原文标题:《Buidler DAO:以 ENS 为例深度分析 Web3 域名体系的技术规划》

原文作者:@axtrur,Buidler DAO 研究员

Web3 域名体系,简而言之便是根据区块链的分布式、去中心化的命名体系,与 DNS(互联网称号服务)相似,将地址(钱包地址或智能合约地址)解析成可读性的称号,本文以 ENS 为例从整体架构到合约细节,深度剖析 web3 域名体系的规划。

ENS 前置概念

域名层级

相似 DNS,ENS 域名层级相同分为

根域名,即""域名

一级域名,相似.com,.cn,在 ens 中有.eth 和.reverse( 用来记载反向解析,后面会说到 )

二级域名,即用户注册的域名,比方 axtrur.eth

三级域名,用户注册了二级域名之后,能够创立或修正该二级域名下的三级域名,比方 app.axtrur.eth

NameHash 算法

由于智能合约直接与可读的域名进行交互功率低,因而 ENS 选用固定长度的 256 位加密哈希作为域名记载。namehash 是一个递归算法,可从恣意域名的 NameHash 值推导出恣意子域名的值,而无需知道原域名的真实文本字符串,一起契合域名的多层级特性。

Namehash("") = "0x0000000000000000000000000000000000000000000000000000000000000000" Namehash("eth") = keccak256(Namehash(""), keccak256("eth")) Namehash("axtrur.eth") = keccak256(Namehash("eth"), keccak256("axtrur")) Namehash("app.axtrur.eth") = keccak256(Namehash("axtrur.eth"), keccak256("app"))

node

在 ens 中,用户注册的域名比方 axtrur.eth,会选用 namehash 算法生成的哈希 node 去记载链上数据,后文中咱们将说到的 node 了解为一个域称号号比方 axtrur 即可,关于 ENS 称号的处理请参考 https://ensuser.com/docs/contract-api-reference/name-processing.html

ENS 模块概念

Buidler DAO:以ENS为例深度分析Web3域名系统的技术设计

注册器合约(绿色部分):担任分配称号的合约,有正向注册器,反向注册器,DNS 注册器。

解析器合约(蓝色部分):担任记载域名映射关系的合约,分正向、反向解析器,其间正向解析器合约也可自定义完成:

正向解析(主网上有默许的公共解析器合约):担任记载域名所绑定的内容,即域名的 nameNode(比方 axtrur.eth,app.axtrur.eth)到(包含不限于 name, addr, txt, contenthash 等内容)的解析,可设置各类币种的钱包地址,还能够设置 IPFS 的内容哈希,甚至记载邮箱等第三方账号作为文本记载。

反向解析(主网上有默许的反向解析器合约):担任记载钱包地址所绑定的域名,即反向域名的 nameNode(比方 https://bicoin8.com/wp-content/uploads/2023/04/202304211cHpE0.jpghttps://bicoin8.com/wp-content/uploads/2023/04/202304211cHpE0.jpg钱包地址}}.addr.reverse) 到 域称号号的解析

根合约:是根域名的 owner,具有一级域名的办理权限

控制器合约:官网的注册入口合约(假如需求完成不同的玩法合约,则一致归为控制器合约模块,需求将对应注册器合约地址设置给注册器,才有权限操作注册器进行域名 NFT 注册与记载反向解析)

价格预言机:ENS 定价选用的是 U 本位(usdt),所以需求 USDT 预言机来核算某一时刻的注册费的 eth 换算值,ENS 主网上的注册费为:

长度为 5+ 个字符的域名:每年付出 5 美元

长度为 4 个字符的域名:每年付出 160 美元

长度为 3 个字符的域名:每年付出 640 美元

DNSSEC 预言机:DNS 安全扩展预言机合约,担任校验证明 web3 域名的所有权和有效性

ENS 模块解析

注册表合约 (EnsRegistry.sol)

Buidler DAO:以ENS为例深度分析Web3域名系统的技术设计

注册表是 ENS 最中心的合约,上图为注册表合约内部的 records 结构,保护着域名层级 node 对应的 owner、解析器、ttl 信息注册表是 ENS 最中心的合约,上图为注册表合约内部的 records 结构,保护着域名层级 node 对应的 owner、解析器、ttl 信息。

Buidler DAO:以ENS为例深度分析Web3域名系统的技术设计

除了注册表信息 records 保护,合约还保护 owner 的托付办理者信息 operators,owner 能够经过添加设置托付办理者地址(能够是用户地址,也能够是合约地址)来共同办理域名信息 合约中相关办理设置接口(比方设置解析器,ttl,以及创立和修正子域名),都会经过润饰器`authorised(node)`来约束调用权限;该润饰器将判别该接口的买卖恳求者是否为当时域名的 owner,或许托付办理者地址,确保了仅有域名的 owner 或托付者才有创立下一级子域名的权限。一起这里布置初始化的时分将`」」`根域名的 node 的 owner 设置为布置者,只需这样,布置者才干将根域名的 owner 设置给 Root 合约根合约。

Buidler DAO:以ENS为例深度分析Web3域名系统的技术设计

(Root.sol)根合约是根域名的 owner,一起根合约作为根域名的 owner,有权限调用注册表合约的 setSubnodeOwner 接口,将域名.eth 的 owner 指向根底注册器合约。

根底注册器合约(BaseRegistrarImplementation.sol)

由于 Root 合约将域名.eth 的 owner 指向根底注册器合约(又称正向注册器合约),然后根底注册器具有.eth 底下的二级域名的设置权限,使得用户能够经过根底注册器合约进行域名注册;一起该注册器合约继承了 ERC721 协议规范,这也便是为什么 ENS 域名能够作为 NFT 在买卖市场比方 opensea 上买卖的原因。除此之外,根底注册器合约还保护着每个域名的过期时刻 expiries,注册器为每个域名设置了 90 天的保护期,当域名过期后且在保护期内,域名具有者能够经过调用续期 renew 接口进行续期,假如超过了保护期,则需求从头注册(这里从头注册会先销毁 NFT 在从头 mint)。一起在 ENS 规划中,注册器合约(不管是正向注册器还是反向注册器)基本上都有 controllers 结构,保护着可信的 controller 注册器合约,只需可信合约才可进行调用。

Buidler DAO:以ENS为例深度分析Web3域名系统的技术设计

控制器合约(ETHRegsiterController.sol)

用户在官网中,将要注册的域名等注册信息传给控制器合约,控制器合约经过预言机核算该域名的价格,一起将域名经过 namehash 转成 node 后传给根底注册器进行域名 NFT 的注册,一起将域名相关注册表信息写入注册表合约完成注册,一起域名的 owner 能够在官网经过注册表合约进行办理操作,官网中的注册页面如下:

Buidler DAO:以ENS为例深度分析Web3域名系统的技术设计

中心注册流程:

Buidler DAO:以ENS为例深度分析Web3域名系统的技术设计

ENS 注册选用「恳求 - 提交」两阶段注册形式 ENS 注册选用「恳求 - 提交」两阶段注册形式,为什么需求两阶段提交?咱们知道以太坊节点从买卖池 pool 中捞取买卖是会依照买卖给的 gas 费进行优先级排序;在注册者携带待注册域名构造的买卖提交上链前,在整个网络是揭露透明的,恶意的攻击者能够监听并解析此类待上链买卖,并构造相同域名的注册买卖,经过进步 gas 费的办法抢先上链注册控制器合约注册。

为了避免此类域名抢注问题,ENS 选用了先恳求,后提交的注册形式。在第一阶段并不直接提交域名,而是先调用

makeCommitment 接口根据待请求域名 name、待请求地址 owner、随机值 secret 进行哈希后生成一条特别的 commitment 后,经过 commit 提交上链。

Buidler DAO:以ENS为例深度分析Web3域名系统的技术设计

提交阶段的 commitment 记载着当时时刻戳,一起 ENS 设置 commitment 的有效期为 60s 到 86400s 之间;第二阶段注册的时分合约会从头核算 commitment,判别是否与第一阶段提交的一致,一起检查 Commitment 的有效期,确保跟第一阶段的链上处理时刻间隔 1 分钟以上,确保记载了第一阶段买卖的区块经过了至少 5 个后续区块的承认。(此刻攻击者尽管能够获取域名值,但由于只需第一阶段的 owner 需求根第二阶段的 owner 一致才干生成一致的 commitment,然后避免了被抢注的危险)

Buidler DAO:以ENS为例深度分析Web3域名系统的技术设计

用户在官网的第二阶段注册流程实际上是代码中的 resolver != address(0) 逻辑分支,由于 ENS 默许会将注册的 resolver 解析器设置为默许的公共正向解析器(publicResolver 后面会说到),这里为什么需求将域名注册给合约自身然后在搬运给用户呢?由于上文中咱们说到注册表合约中只需 owner 或许托付办理者才有权限设置解析器或更新 owner,所以为了帮用户设置好解析器,需求经过根底注册器注册(register)给合约自身,再经过注册表合约设置解析器(setResolver),然后声明所有权(reclaim),最终才搬运给注册者(transferFrom)。

解析器(Resolver)

ENS 中的解析器合约分为正向解析和反向解析,解析记载是 ENS 比较重要的内容,只需定义好规范,生态才干便利的即成 ENS 这类 web3 域名体系。

正向解析(ENS 默许的正向解析器合约 PublicResolver.sol 或许自定义解析器合约。)

担任将域名映射为对应用户设置的内容(包含币种地址,ipfs 内容 hash,通用 text 记载等等。

Buidler DAO:以ENS为例深度分析Web3域名系统的技术设计

首先 metamask 会经过注册表合约获取域名 node 设置的解析器地址(默许的公共解析器,也能够是用户自定义的解析器合约地址),然后与该解析器地址交互,获取用户设置的 eth 的币种地址(官网注册默许会设置成注册者,注册者后续可自由更改)进行转账操作。

反向解析(ENS 默许反向解析器合约 DefaultReverseResolver.sol)

担任将用户钱包地址映射为对应的域名。

反向解析实际上是对用户不透明的,用户也无法像正向解析器合约那样能够自定义。用户也能够经过反向注册器(ReverseRegistrar.sol)的 setName 办法设置当时钱包地址要绑定的域名,反向记载相同在 ENS 注册表合约保护,用户注册的反向记载在三级域名记载中,格局为:详细用户地址.addr.reverse

Buidler DAO:以ENS为例深度分析Web3域名系统的技术设计

设置反向解析之后,opensea 用户界面会将用户钱包地址展现为可读的 ENS 域名,则是反向解析的过程解析器结构以及 node 对应的注册表信息。

Buidler DAO:以ENS为例深度分析Web3域名系统的技术设计

根域名的 owner 是根域名:

.eth 一级域名的 owner 是正向注册器也便是(BaseRegistrarImplement.sol)

用户注册的二级、三级域名的 owner 是用户自身,一起能够自由设置解析器合约地址

.reserve 一级域名 owner 是 ENS 的多签钱包地址

.addr.reserve 二级域名 owner 是反向注册器,ens 当时主网版别控制器合约注册的时分默许经过反向注册器(ReverseRegistrar.sol)设置反向解析记载(比方详细用户地址.addr.reverse 指向 axtrur.eth),用户无需供给 gas 之外的反向注册费。

用户注册域名的反向三级域名的 owner 都默许指向反向注册器合约,一起 resolver 默许指向反向解析器合约

上面咱们现已把 ENS 域名合约规划以及首要的模块整理完了,ENS 在规划上比方模块拆分,权限拆分方面都是值得咱们学习的,可是现在主网上的 ENS 也存在一些问题。

ENS 存在问题与处理

1、零宽问题:这是 ENS 现在比较费事的问题,由于合约规划之初并没有约束零宽字符(关于零宽问题解说 https://mirror.xyz/0xc952fE149b640097054CFa53cAf7aC2bfd0162C5/RW6psQ2mnxyzmQx08PUXgLXOZc0kjvfXm8RGRVu8s0Y),比方能够官网注册某个域名的时分,假如该域名已被注册,此刻用 https://unicode-table.com/en/200B/拷贝对应某种零宽字符串插入到要注册的域名中间某个方位,则能够注册对应的域名了。

2、特别字符:ENS 合约并没有约束.,emoji 表情等特别字符过滤,以致于现在买卖市场存在太多冗繁非规范的域名。

Buidler DAO:以ENS为例深度分析Web3域名系统的技术设计

现在 ENS 官网现已对特别字符进行过滤,并给予必要的警告提示(可是合约自身并没有约束,所以科学家一样能够经过合约进行注册)

Buidler DAO:以ENS为例深度分析Web3域名系统的技术设计

3、transfer 问题:ENS 现在有个比较费事的问题便是域名 NFT 在搬运的时分,owner 没有同步搬运,所以当你在买卖市场买了一个 ENS 域名 NFT 的时分,你需求经过根底注册器合约的 reclaim 接口,耗费一定的 gas 费声明 NFT 所有权后,才干到 ens 官网上看到自己具有的域。

4、tokenURI 问题:ENS 的根底注册器合约并没有即成 ERC721 规范的 tokenURI,可能是规划之初没有考虑好,所以现在咱们在买卖市场比方 opensea 上的 ENS 的 NFT 的 metadata,是买卖市场特别对 ENS 即成了 ENS 中心化的 metaservice 的 API(比方:https://metadata.ens.domains/mainnet/0x57f1887a8bf19b14fc0df6fd9b2acc9af147ea85/92165218023603606815515740961699344403389102980529428548045197994533319339809)。

Buidler DAO:以ENS为例深度分析Web3域名系统的技术设计

5、保存字:这是我觉得.bit 这方面做得比较好的方面,.bit 官方会把 web2 国际中的组织或公司称号保存下来,便于后续 web2 与 web3 之间的衔接(https://github.com/dotbitHQ/Documents/blob/main/Reserved_DAS/Reserved_DAS_List.md)这对于 web3 域名生态发展是有意义。

6、根底合约可晋级,ENS 现在对于根底模块并没有选用代理形式支持合约可晋级,这样当未来需求对根底模块晋级的时分是比较费事的,一种是 fallback 一种是搬迁数据,但这都只能处理部分问题,这个方面 ENS 是有改善空间的。

咱们能够怎么处理上面那些问题呢?

1、字符问题,咱们能够在控制器合约的 valid 函数修正逻辑,一种完成办法是约束零宽等特别字符比方 spaceid(https://github.com/Space-ID/SpaceIDContract-Audit/blob/main/contracts/bnbregistrar/BNBRegistrarControllerV9.sol#L88),另一种便是只允许契合规范的字符。

2、transfer 问题:咱们能够在根底注册器里复写 transferFrom 和 saveTransferFrom 函数,在搬运 nft 的一起调用 setSubnodeOwner 搬运 owner。

Buidler DAO:以ENS为例深度分析Web3域名系统的技术设计

3、tokenURI 问题:这个比较简单咱们只需继承 ECR721 的 tokenURI 规范呢就能够了,那怎么完成在图片中动态的域名的展现呢?咱们能够选用 svg 上链(能够看文章后面改造后的合约代码的 TokenURIBuilder.sol)。

4、保存字问题:能够将保存字以及对应要保存的钱包地址上链,先保存给合约自身,后面能够经过 apply 接口请求给某个特定地址。

Buidler DAO:以ENS为例深度分析Web3域名系统的技术设计

5、根底合约可晋级:咱们能够选用代理形式 (eip-1967) 对根底模块合约进行改造,感兴趣能够参考 lens-protocol 的合约规划(https://github.com/lens-protocol/core/tree/main/contracts)。

DNS 模块

ENS 的 DNS 才能并不是咱们说的 web2 域名体系比方.com 能够完成在浏览器里访问域名来访问你的 ens 域名,ENS 的 dns 注册实际上仅仅根据 DNS 安全扩展,经过相关的证明,校验算法证明你对于该 web2 的域名的所有权,然后在链上做一个(web2 域名到钱包地址)的记载,使得咱们能够用 web2 域名进行链上转账。详见(https://ensuser.com/docs/dns-registrar-guide.html)

可是本文为什么咱们没有详细讲 ENS 的 DNS 模块呢?是由于 ENS 尽管花了大部分精力在完成 DNS,可是这个功能放在 ENS 比较鸡肋,用的人很少。其实这实际上是一个 did 聚合的领域,相似的才能个人觉得更适合放到聚合 DID 中去完成,比方像 mask network 的 nextid,cloak network 的 zkid。能够把 proof 做好,向即成 twitter 等 web2 的 handler 一样,去集成 web2 域名。

布置自己的 web3 域名

本文最终给咱们供给一个改造后的 ENS 域名合约版别 ( https://github.com/axtrur/xens-contracts改造内容以及布置办法详见 readme),便利咱们自行布置自己的 web3 域名,深化了解 web3 域名体系的规划原理 布置 goerli 测验网指令

OWNER_KEY=https://bicoin8.com/wp-content/uploads/2023/04/202304211cHpE0.jpghttps://bicoin8.com/wp-content/uploads/2023/04/202304211cHpE0.jpgaccount private key}} INFURA_ID=c03713652e3c4ef6a3c09ea7dbf58711 npx hardhat deploy --network goerli (INFURA_ID 能够替换成自己的 infuraid,执行前删除 deployment/goerli 文件夹以及 deployment/goerli_result.json)

布置测验网 goerli 后,执行注册脚本 ens.js 注册域名

OWNKEY=https://bicoin8.com/wp-content/uploads/2023/04/202304211cHpE0.jpghttps://bicoin8.com/wp-content/uploads/2023/04/202304211cHpE0.jpgaccount private key}} INFURA=https://goerli.infura.io/v3/c03713652e3c4ef6a3c09ea7dbf58711 node ens.js

就能够到 opensea 测验网检查现已布置的 nft 了,比方我布置的.buidlerdao 后缀的域名就能够到 opensea 测验网检查现已布置的 nft 了,比方我布置的.buidlerdao 后缀的域名

https://testnets.opensea.io/collection/buildlerdao-name-service

Buidler DAO:以ENS为例深度分析Web3域名系统的技术设计

总结

ENS 域名作为 web3 域名的先行者,在规划上有许多值得学习的地方,咱们看到的.bnb,.nft 也都是根据 ens 合约根底上搭建的。期望经过本文咱们对 ENS 的规划从整体到细节有个深化的深化,web3 域名不仅仅是一个 NFT,他有着更深远的意义。一起 web 域名仅仅一个很小的开始,相信随之遍及、生态集成以及咱们对 did 的探究,原生链上的可读的 web3 域名将会被聚合起来,使得每个用户在加密国际里都有个一致的名片描绘,更好地去衔接多链生态,衔接用户。

ENS 域名体系相关 EIP 规范

EIP 137 - 注册表 https://eips.ethereum.org/EIPS/eip-137

EIP 181 - 反向注册器 https://eips.ethereum.org/EIPS/eip-181

EIP 205 - ABI 解析 (ABI()).

EIP 619 - SECP256k1 公钥解析 (pubkey()).

EIP 634 - 文本记载解析 (text()).

EIP 1577 - 内容 hash 解析 (contenthash()).

EIP 2304 - 多Token地址解析 (addr()). 新的记载类型能够随时经过 EIP 规范化程序进行定义

主网布置的 ENS 合约

注册表合约:0x00000000000c2e074ec69a0dfb2997ba6c7d2e1e

根合约:0xab528d626ec275e3fad363ff1393a41f581c5897

根底正向注册器合约:0x57f1887a8BF19b14fC0dF6Fd9B2acc9Af147eA85

反向注册器合约:0x084b1c3c81545d370f3634392de611caabff8148

默许正向解析器合约:0x4976fb03c32e5b8cfe2b6ccb31c09ba78ebaba41

默许反向解析器合约:0xa2c122be93b0074270ebee7f6b7292c7deb45047

控制器合约:0x283Af0B28c62C092C9727F1Ee09c02CA627EB7F5

ENS 域名资料

官网: https://app.ens.domains/

github: https://github.com/ensdomains

合约代码:https://github.com/ensdomains/ens-contracts/tree/master/contracts

线网布置版别:https://etherscan.io/accounts/label/ens

文档:https://ensuser.com/docs/contract-api-reference/ens-contracts-overview.html

买卖市场:https://opensea.io/collection/ens

其他 web3 域名体系资料

.bnb

官网: https://space.id/

github: https://github.com/Space-ID

买卖市场:https://www.element.market/collections/space-id-bnb

.bit

官网:https://www.did.id/

github:https://github.com/dotbitHQ

买卖市场:https://opensea.io/collection/dotbit

.nft

官网:https://nft.space/

买卖市场:https://www.element.market/collections/nft-name-service

此时快讯

【2022-12-09 02:44】【链游平台WEMIX将实施回购销毁和代币通缩策略】12月9日消息,韩国游戏公司Wemade旗下链游平台WEMIX宣布立即实施回购销毁活动,将在2022年12月9日至2023年3月8日的90天内将回购并销毁价值1000万美元的WEMIX代币。此外,基金会还将采用并实施WEMIX通缩政策,所有WEMIX3.0平台和基金会产生的投资收入的25%将按季度销毁。
此前报道,11月24日,韩国数字资产交易平台联合协会(DAXA)决定对韩国游戏巨头 WeMade旗下链游平台代币WEMIX停止交易支持,以保护投资者。受此影响,Bithumb、Upbit等多家韩国交易所宣布将下架WEMIX。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注