原文标题:《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 模块概念
注册器合约(绿色部分):担任分配称号的合约,有正向注册器,反向注册器,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)
注册表是 ENS 最中心的合约,上图为注册表合约内部的 records 结构,保护着域名层级 node 对应的 owner、解析器、ttl 信息注册表是 ENS 最中心的合约,上图为注册表合约内部的 records 结构,保护着域名层级 node 对应的 owner、解析器、ttl 信息。
除了注册表信息 records 保护,合约还保护 owner 的托付办理者信息 operators,owner 能够经过添加设置托付办理者地址(能够是用户地址,也能够是合约地址)来共同办理域名信息 合约中相关办理设置接口(比方设置解析器,ttl,以及创立和修正子域名),都会经过润饰器`authorised(node)`来约束调用权限;该润饰器将判别该接口的买卖恳求者是否为当时域名的 owner,或许托付办理者地址,确保了仅有域名的 owner 或托付者才有创立下一级子域名的权限。一起这里布置初始化的时分将`」」`根域名的 node 的 owner 设置为布置者,只需这样,布置者才干将根域名的 owner 设置给 Root 合约根合约。
(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 注册器合约,只需可信合约才可进行调用。
控制器合约(ETHRegsiterController.sol)
用户在官网中,将要注册的域名等注册信息传给控制器合约,控制器合约经过预言机核算该域名的价格,一起将域名经过 namehash 转成 node 后传给根底注册器进行域名 NFT 的注册,一起将域名相关注册表信息写入注册表合约完成注册,一起域名的 owner 能够在官网经过注册表合约进行办理操作,官网中的注册页面如下:
中心注册流程:
ENS 注册选用「恳求 - 提交」两阶段注册形式 ENS 注册选用「恳求 - 提交」两阶段注册形式,为什么需求两阶段提交?咱们知道以太坊节点从买卖池 pool 中捞取买卖是会依照买卖给的 gas 费进行优先级排序;在注册者携带待注册域名构造的买卖提交上链前,在整个网络是揭露透明的,恶意的攻击者能够监听并解析此类待上链买卖,并构造相同域名的注册买卖,经过进步 gas 费的办法抢先上链注册控制器合约注册。
为了避免此类域名抢注问题,ENS 选用了先恳求,后提交的注册形式。在第一阶段并不直接提交域名,而是先调用
makeCommitment 接口根据待请求域名 name、待请求地址 owner、随机值 secret 进行哈希后生成一条特别的 commitment 后,经过 commit 提交上链。
提交阶段的 commitment 记载着当时时刻戳,一起 ENS 设置 commitment 的有效期为 60s 到 86400s 之间;第二阶段注册的时分合约会从头核算 commitment,判别是否与第一阶段提交的一致,一起检查 Commitment 的有效期,确保跟第一阶段的链上处理时刻间隔 1 分钟以上,确保记载了第一阶段买卖的区块经过了至少 5 个后续区块的承认。(此刻攻击者尽管能够获取域名值,但由于只需第一阶段的 owner 需求根第二阶段的 owner 一致才干生成一致的 commitment,然后避免了被抢注的危险)
用户在官网的第二阶段注册流程实际上是代码中的 resolver != address(0) 逻辑分支,由于 ENS 默许会将注册的 resolver 解析器设置为默许的公共正向解析器(publicResolver 后面会说到),这里为什么需求将域名注册给合约自身然后在搬运给用户呢?由于上文中咱们说到注册表合约中只需 owner 或许托付办理者才有权限设置解析器或更新 owner,所以为了帮用户设置好解析器,需求经过根底注册器注册(register)给合约自身,再经过注册表合约设置解析器(setResolver),然后声明所有权(reclaim),最终才搬运给注册者(transferFrom)。
解析器(Resolver)
ENS 中的解析器合约分为正向解析和反向解析,解析记载是 ENS 比较重要的内容,只需定义好规范,生态才干便利的即成 ENS 这类 web3 域名体系。
正向解析(ENS 默许的正向解析器合约 PublicResolver.sol 或许自定义解析器合约。)
担任将域名映射为对应用户设置的内容(包含币种地址,ipfs 内容 hash,通用 text 记载等等。
首先 metamask 会经过注册表合约获取域名 node 设置的解析器地址(默许的公共解析器,也能够是用户自定义的解析器合约地址),然后与该解析器地址交互,获取用户设置的 eth 的币种地址(官网注册默许会设置成注册者,注册者后续可自由更改)进行转账操作。
反向解析(ENS 默许反向解析器合约 DefaultReverseResolver.sol)
担任将用户钱包地址映射为对应的域名。
反向解析实际上是对用户不透明的,用户也无法像正向解析器合约那样能够自定义。用户也能够经过反向注册器(ReverseRegistrar.sol)的 setName 办法设置当时钱包地址要绑定的域名,反向记载相同在 ENS 注册表合约保护,用户注册的反向记载在三级域名记载中,格局为:详细用户地址.addr.reverse
设置反向解析之后,opensea 用户界面会将用户钱包地址展现为可读的 ENS 域名,则是反向解析的过程解析器结构以及 node 对应的注册表信息。
根域名的 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 表情等特别字符过滤,以致于现在买卖市场存在太多冗繁非规范的域名。
现在 ENS 官网现已对特别字符进行过滤,并给予必要的警告提示(可是合约自身并没有约束,所以科学家一样能够经过合约进行注册)
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)。
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。
3、tokenURI 问题:这个比较简单咱们只需继承 ECR721 的 tokenURI 规范呢就能够了,那怎么完成在图片中动态的域名的展现呢?咱们能够选用 svg 上链(能够看文章后面改造后的合约代码的 TokenURIBuilder.sol)。
4、保存字问题:能够将保存字以及对应要保存的钱包地址上链,先保存给合约自身,后面能够经过 apply 接口请求给某个特定地址。
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
总结
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。