原文标题:《Buidler DAO:以 ENS 为例深度分析 Web3 域名系统的技巧设想》
原文作家:@axtrur,Buidler DAO 盘问员
图片起头:由 无界领土AI 器用生成
Web3 域名系统,简而言之便是基于区块链的溜达式、去中心化的定名系统,与 DNS(互联网称号就业)近似,将地址(钱包地址或智能合约地址)认知成可读性的称号,本文以 ENS 为例从举座架构到合约细节,深度理解 web3 域名系统的设想。
ENS 前置见解域名层级近似 DNS,ENS 域名层级相通分为
根域名,即""域名
一级域名,近似.com,.cn,在 ens 中有.eth 和.reverse( 用来记载反向认知,背面会提到 )
二级域名,即用户注册的域名,比如 axtrur.eth
三级域名,用户注册了二级域名之后,不错创建或修改该二级域名下的三级域名,比如 app.axtrur.eth
近日,大S又提告汪小菲,据说还是因为孩子探视权,以及抚养费问题,并且前段时间大S还公开将张兰母子诉至法院,称张兰汪小菲在网上侮辱诽谤她,引得网友也是厌恶不已。
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 模块见解6月31日欧洲杯注册器合约(绿色部分):认真分派称号的合约,有正向注册器,反向注册器,DNS 注册器。
认知器合约(蓝色部分):认真记载域名映射议论的合约,分正向、反向认知器,其中正向认知器合约也可自界说兑现:
正向认知(主网上有默许的全球认知器合约):认真记载域名所绑定的内容,即域名的 nameNode(比如 axtrur.eth,app.axtrur.eth)到(包括不限于 name, addr, txt, contenthash 等内容)的认知,可诞生种种币种的钱包地址,还不错诞生 IPFS 的内容哈希,以致记载邮箱品级三方账号行为文本记载。
反向认知(主网上有默许的反向认知器合约):认真记载钱包地址所绑定的域名,即反向域名的 nameNode(比如 {{钱包地址}}.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 接管了先请求,后提交的注册模式。在第一阶段并不获胜提交域名,而是先调用
www.sigsu.commakeCommitment 接口凭据待苦求域名 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 默许指向反向认知器合约
皇冠客服飞机:@seo3687
上头咱们一经把 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 模块2024欧洲杯开赛时间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={{account private key}} INFURA_ID=c03713652e3c4ef6a3c09ea7dbf58711 npx hardhat deploy --network goerli (INFURA_ID 不错替换成我方的 infuraid,奉行前删除 deployment/goerli 文献夹以及 deployment/goerli_result.json)
部署测试网 goerli 后,奉行注册剧本 ens.js 注册域名
OWNKEY={{account 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
2023年欧洲杯将于5月5日至6月3日英国举行。各大已经开始紧张备战工作,们偶像心爱打气。这场盛宴到来,必将掀起足球运动一股新浪潮。默许正向认知器合约: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有人在美高梅平台提过现吗