原文标题: 《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 (' ' ) )0x 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000 keccak256 (eth ) ) namehash ) axtrur.eth )=keccak256 ) namehash ),kec cak 256 ) axtrur ) ) namehash
node是ens,用户注册的域名,例如axtrur.eth,选择namehash算法天生的散列node来记录链上的数据。 后述的node也可以作为axtrur等域名的称号来认识。 关于ens称号的处理请参考3359ensuser.com/docs/conns
ENS模块概念挂号合同(绿色整体) )分配称号的合同,有正向挂号、反向挂号、DNS挂号。
解析器合同(蓝整体) )负责记录域名映射联系的合同,分为前向、反向解析器,也可以定制完成中向解析器合同。
前向分析(其中主网有默认的群聚分析器协议) )与域名相关联的实质上,即来自记录域名的nameNode (例如,今天早上的axtrur.eth、app.axtrur.eth )
反向分析(如果主网络有默认的反向分析器协议) )从绑定到钱包记录位置的域名,也就是负责反向域名的nameNode (例如钱包位置).addr.reverse )到域名号码
根协议:根域名的owner,具有一级域名的处理权限
把握器合同:官网挂号出口合同(假设需要完成分支的玩法合同时,必须一致归类为把握器合同模块,在挂号上确立挂号合同的位置,才有权操作挂号进行域名NFT挂号和记录的逆向分析) ) )。
代价预言机:由于ENS的定价选择u本位(usdt ),需要usdt预言机来计算某个临时刻的挂号费的eth换算值,ENS的主网上挂号费如下。
5个字符的域名:每年支付5美元
4个字符的域名:每年支付160美元
三个字母的域名:每年支付640美元
DNSSEC预言机: DNS安全扩展机协议负责验证和验证web3域名的所有权和无效性
ENS模块分析挂号合同(EnsRegistry.sol )挂号是ENS最里面的合同,上图为挂号合同内部的records组织,域名级别node对应的owner、解析器、ttl信息挂号是ENS最里面的合同
除了挂号信息records的维护外,合同还维护着owner的相关人员信息operators。 owner可能经由传播建立依赖方的位置来独特地处理结合域名信息协议建立的接口(例如,建立解析器、ttl、建立和子域名的更改) 确定此接口的买卖请求者是否为当前域名的所有者,并投保,可能取决于操作者,只有域名的所有者或依赖者才能设立
下一级子域名的权力。同时这边摆设初始化的时分将`」」`根域名的 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 默认会将挂号的 resol明天2下午ver 剖析器树立为默认的众人正向剖析器(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 networ后天3晚上k 的 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
默认正向剖析器合约: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
版权声明:项目均采集于互联网, 空投币 无法审核全面,且希望大家能赚钱,请谨慎切勿上当受骗!
温馨提示:★★★天上真会掉馅饼!天道酬勤,都是机会!不错过每个空投糖果!真假难以辨认,尽量0撸!