以太幣交易所 以太幣交易所
Ctrl+D 以太幣交易所
ads

Buidler DAO:以ENS為例深度分析Web3域名系統的技術設計_ENS

Author:

Time:1900/1/1 0:00:00

原文標題:《Buidler DAO:以 ENS 為例深度分析 Web3 域名系統的技術設計》

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

Web3 域名系統,簡而言之就是基于區塊鏈的分布式、去中心化的命名系統,與 DNS(互聯網名稱服務)類似,將地址(錢包地址或智能合約地址)解析成可讀性的名稱,本文以 ENS 為例從整體架構到合約細節,深度剖析 web3 域名系統的設計。

類似 DNS,ENS 域名層級同樣分為

根域名,即""域名

一級域名,類似.com,.cn,在 ens 中有.eth 和.reverse( 用來記錄反向解析,后面會提到 ) 

二級域名,即用戶注冊的域名,比如 axtrur.eth 

三級域名,用戶注冊了二級域名之后,可以創建或修改該二級域名下的三級域名,比如 app.axtrur.eth

由于智能合約直接與可讀的域名進行交互效率低,因此 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"))

在 ens 中,用戶注冊的域名比如 axtrur.eth,會采用 namehash 算法生成的哈希 node 去記錄鏈上數據,后文中我們將提到的 node 理解為一個域名名稱比如 axtrur 即可,關于 ENS 名稱的處理請參考 https://ensuser.com/docs/contract-api-reference/name-processing.html

注冊器合約(綠色部分):負責分配名稱的合約,有正向注冊器,反向注冊器,DNS 注冊器。

解析器合約(藍色部分):負責記錄域名映射關系的合約,分正向、反向解析器,其中正向解析器合約也可自定義實現:

正向解析(主網上有默認的公共解析器合約):負責記錄域名所綁定的內容,即域名的 nameNode(比如 axtrur.eth,app.axtrur.eth)到(包括不限于 name, addr, txt, contenthash 等內容)的解析,可設置各類幣種的錢包地址,還可以設置 IPFS 的內容哈希,甚至記錄郵箱等第三方賬號作為文本記錄。

反向解析(主網上有默認的反向解析器合約):負責記錄錢包地址所綁定的域名,即反向域名的 nameNode(比如 {{錢包地址}}.addr.reverse) 到 域名名稱的解析

Blockchain Capital重塑品牌,并推出投后支持項目“BCAP Build”:7月26日消息,加密風投機構Blockchain Capital今天推出了一個專注于為創始人提供投資后支持的新項目BCAP Build,同時還宣布重塑其網站,以展示其投資組合公司網絡。Blockchain Capital普通合伙人Kinjal Shah在接受采訪時表示,這個新項目將專注于人才、市場進入戰略及其合作伙伴網絡。

據悉,Blockchain Capital成立于2013年,目前管理著19億美元的資產,并正在積極進行投資。[2023/7/27 16:01:00]

根合約:是根域名的 owner,擁有一級域名的管理權限

控制器合約:官網的注冊入口合約(如果需要實現不同的玩法合約,則統一歸為控制器合約模塊,需要將對應注冊器合約地址設置給注冊器,才有權限操作注冊器進行域名 NFT 注冊與記錄反向解析)

價格預言機:ENS 定價采用的是 U 本位(usdt),所以需要 USDT 預言機來計算某一時刻的注冊費的 eth 換算值,ENS 主網上的注冊費為:

長度為 5+ 個字符的域名:每年支付 5 美元

長度為 4 個字符的域名:每年支付 160 美元

長度為 3 個字符的域名:每年支付 640 美元

DNSSEC 預言機:DNS 安全擴展預言機合約,負責校驗證明 web3 域名的所有權和有效性

注冊表是 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 指向基礎注冊器合約。

LayerZero生態全鏈NFT協議Holograph開放Building NFT限時免費多鏈鑄造活動:6月14日消息,據官方消息,LayerZero生態全鏈NFT協議Holograph開放BuildingNFT限時免費多鏈鑄造活動。據悉,Building出自藝術家Amber Vittoria之手,可在以太坊、Polygon、Avalanche、BNB Chain和Optimism上免費鑄造,限時48小時(將于1天9小時后結束)。[2023/6/14 21:36:17]

由于 Root 合約將域名.eth 的 owner 指向基礎注冊器合約(又稱正向注冊器合約),從而基礎注冊器擁有.eth 底下的二級域名的設置權限,使得用戶可以通過基礎注冊器合約進行域名注冊;同時該注冊器合約繼承了 ERC721 協議標準,這也就是為什么 ENS 域名可以作為 NFT 在交易市場比如 opensea 上買賣的原因。除此之外,基礎注冊器合約還維護著每個域名的過期時間 expiries,注冊器為每個域名設置了 90 天的保護期,當域名過期后且在保護期內,域名擁有者可以通過調用續期 renew 接口進行續期,如果超過了保護期,則需要重新注冊(這里重新注冊會先銷毀 NFT 在重新 mint)。同時在 ENS 設計中,注冊器合約(不管是正向注冊器還是反向注冊器)基本上都有 controllers 結構,維護著可信的 controller 注冊器合約,只有可信合約才可進行調用。

用戶在官網中,將要注冊的域名等注冊信息傳給控制器合約,控制器合約通過預言機計算該域名的價格,同時將域名通過 namehash 轉成 node 后傳給基礎注冊器進行域名 NFT 的注冊,同時將域名相關注冊表信息寫入注冊表合約完成注冊,同時域名的 owner 可以在官網通過注冊表合約進行管理操作,官網中的注冊頁面如下:

核心注冊流程:

ENS 注冊采用「請求 - 提交」兩階段注冊模式 ENS 注冊采用「請求 - 提交」兩階段注冊模式,為什么需要兩階段提交?我們知道以太坊節點從交易池 pool 中撈取交易是會按照交易給的 gas 費進行優先級排序;在注冊者攜帶待注冊域名構造的交易提交上鏈前,在整個網絡是公開透明的,惡意的攻擊者可以監聽并解析此類待上鏈交易,并構造相同域名的注冊交易,通過提高 gas 費的方式搶先上鏈注冊控制器合約注冊。

為了防止此類域名搶注問題,ENS 采用了先請求,后提交的注冊模式。在第一階段并不直接提交域名,而是先調用

makeCommitment 接口根據待申請域名 name、待申請地址 owner、隨機值 secret 進行哈希后生成一條特殊的 commitment 后,通過 commit 提交上鏈。

Helium發布miner節點新版本,用于激活輕網關的Golden Build:4月29日消息,Helium核心開發人員已經標記了一個新2022.04.27.0 miner版本。此版本對所有 Hotspot Maker都是強制性的。并要求熱點制造商在2022年5月11日 00:00 UTC 之前升級他們的機隊。此更新包含 Light Hotspot(輕網關)軟件,當通過鏈變量激活時,將改變 Hotspot 接收挑戰的方式,從 Hotspot 中移除塊同步,并穩定 Hotspot 性能。這將允許激活已批準的HIP 55鏈變量并為激活輕網關做準備。

此前消息,Helium將于5月3日激活輕網關(Light Hotspots)升級。[2022/4/29 2:40:25]

提交階段的 commitment 記錄著當前時間戳,同時 ENS 設置 commitment 的有效期為 60s 到 86400s 之間;第二階段注冊的時候合約會重新計算 commitment,判斷是否與第一階段提交的一致,同時檢查 Commitment 的有效期,保證跟第一階段的鏈上處理時間間隔 1 分鐘以上,保證記錄了第一階段交易的區塊經過了至少 5 個后續區塊的確認。(此時攻擊者雖然可以獲取域名值,但由于只有第一階段的 owner 需要根第二階段的 owner 一致才能生成一致的 commitment,從而避免了被搶注的風險)

用戶在官網的第二階段注冊流程實際上是代碼中的 resolver != address(0) 邏輯分支,因為 ENS 默認會將注冊的 resolver 解析器設置為默認的公共正向解析器(publicResolver 后面會提到),這里為什么需要將域名注冊給合約本身然后在轉移給用戶呢?因為上文中我們提到注冊表合約中只有 owner 或者委托管理者才有權限設置解析器或更新 owner,所以為了幫用戶設置好解析器,需要通過基礎注冊器注冊(register)給合約自身,再通過注冊表合約設置解析器(setResolver),然后聲明所有權(reclaim),最后才轉移給注冊者(transferFrom)。

ENS 中的解析器合約分為正向解析和反向解析,解析記錄是 ENS 比較重要的內容,只有定義好規范,生態才能方便的即成 ENS 這類 web3 域名系統。

正向解析(ENS 默認的正向解析器合約 PublicResolver.sol 或者自定義解析器合約。)

負責將域名映射為對應用戶設置的內容(包括幣種地址,ipfs 內容 hash,通用 text 記錄等等。

首先 metamask 會通過注冊表合約獲取域名 node 設置的解析器地址(默認的公共解析器,也可以是用戶自定義的解析器合約地址),然后與該解析器地址交互,獲取用戶設置的 eth 的幣種地址(官網注冊默認會設置成注冊者,注冊者后續可自由更改)進行轉賬操作。

反向解析(ENS 默認反向解析器合約 DefaultReverseResolver.sol)

以太坊開發環境工具Buidler更名為Hardhat:分布式系統設計團隊NomicLabs宣布將以太坊開發環境工具Buidler更名為Hardhat,改名后,用于擴展和自定義設置的任務運行組件被稱為HardhatRunner,此前具有Solidityconsole.log和堆棧跟蹤功能的星型開發網絡BuidlerEVM,被稱為HardhatNetwork。[2020/10/23]

負責將用戶錢包地址映射為對應的域名。

反向解析實際上是對用戶不透明的,用戶也無法像正向解析器合約那樣可以自定義。用戶也可以通過反向注冊器(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 也存在一些問題。

1、零寬問題:這是 ENS 目前比較麻煩的問題,因為合約設計之初并沒有限制零寬字符(關于零寬問題解釋  https://mirror.xyz/0xc952fE149b640097054CFa53cAf7aC2bfd0162C5/RW6psQ2mnxyzmQx08PUXgLXOZc0kjvfXm8RGRVu8s0Y),比如可以官網注冊某個域名的時候,如果該域名已被注冊,此時用 https://unicode-table.com/en/200B/ 拷貝對應某種零寬字符串插入到要注冊的域名中間某個位置,則可以注冊對應的域名了。

2、特殊字符:ENS 合約并沒有限制.,emoji 表情等特殊字符過濾,以致于目前交易市場存在太多冗雜非規范的域名。

Ocean Builder購買游輪命名為“中本聰” 并將容納加密公司:海洋建筑公司Ocean Builder購買了一艘舊澳大利亞游輪,并將其重新命名為“Satoshi(中本聰)”,并計劃在巴拿馬海岸附近接納加密公司和企業家。Ocean Builder首席運營官Chad Elwartowski表示,這艘船將構成一個創新中心并提供一個獨特的空間,加密企業家可以在其中建立網絡。(Cointelegraph)[2020/10/14]

目前 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)。

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 域名。

本文最后給大家提供一個改造后的 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

區塊律動BlockBeats

媒體專欄

閱讀更多

金色早8點

金色財經

去中心化金融社區

CertiK中文社區

虎嗅科技

念青

深潮TechFlow

Odaily星球日報

騰訊研究院

Tags:ENSNEROWNTPSetherdimensionPEPEMINERtown幣瀑漲tps幣行情

萊特幣最新價格
一文詳解三大模塊化區塊鏈方案:Celestia、Dymension 與 Fuel_區塊鏈

撰寫:Kadeem Clarke區塊鏈一直在發展,每次迭代都試圖解決區塊鏈去中心化、可擴展性和安全性的三難困境.

1900/1/1 0:00:00
FTX暴雷后 用戶都轉向DEX了嗎?_FTX

原文作者:加密數據分析師 ahkek4原文編譯:0x11,Foresight NewsFTX 破產后 CEX 交易量出現下滑;CEX 主導著每日交易量.

1900/1/1 0:00:00
金色早報 | 美眾議院立法者將于12月13日就FTX破產舉行聽證會_加密貨幣

▌美眾議院立法者將于12月13日首次就FTX破產舉行聽證會金色財經報道,美國眾議院金融服務委員會將于12月13日舉行首次以FTX為重點的聽證會.

1900/1/1 0:00:00
金色觀察丨DeFi收益來源全面概述_BSP

文/Mikey,1kxnetwork;譯/金色財經xiaozou去中心化金融一個主要的優勢就是它對所有人開放,任何人在任何時間、任何地點都可以參與其中.

1900/1/1 0:00:00
如何抓住zkEVM Rollup的巨大機會?附zkSync、Scroll、StarkNet潛在空投指南_ROL

文:@TheDeFinvestor 來源:推特 ZK季即將到來。 隨著人們期待已久的zkEVM擴展解決方案即將推出,一種新的敘事可能會出現.

1900/1/1 0:00:00
為Curve帶來0費率?穩定幣crvUSD的新機制解讀_AMM

作者:北辰 上周Curve為了應對CRV被做空,適時發布了已經預告了很久的穩定幣crvUSD的白皮書,雖然只是初稿.

1900/1/1 0:00:00
ads