ENS(Ethereum Name Service)是以太坊域名服務,是一個基于以太坊區塊鏈的分布式、開放和可擴展的命名系統。ENS的工作是將可讀的域名(比如"a
ENS(Ethereum Name Service)是以太坊域名服務,是一個基于以太坊區塊鏈的分布式、開放和可擴展的命名系統。
ENS的工作是將可讀的域名(比如"alice.eth")解析為計算機可以識別的標識符,如以太坊地址、內容的散列、元數據等。ENS還支持"反向解析",這使得將元數據(如規范化域名或接口描述)與以太坊地址相關聯成為可能。
ENS的目標與DNS(互聯網域名服務)類似,但由于以太坊區塊鏈的功能特點和限制條件,兩者架構有很大的不同。與DNS一樣,ENS是一個層次結構的域名系統,不同層次域名之間以點作為分隔符,我們把層次的名稱叫做域,一個域的所有者能夠完全控制其子域。
頂級域名(比如".eth"和".test")的所有者是一種名為"注冊中心(registrar)"的智能合約,該合約內指定了控制子域名分配的規則。任何人都可以按照這些合約規定的規則,獲得一個域名的所有權并為自己所用。
由于ENS的層次性,不論一個人擁有哪個級別的域名,都可以根據需要為自己或他人配置子域名。例如,如果Alice擁有"alice.eth",她就可以創建"pay.alice.eth"并按需對其進行設置。
ENS部署在以太坊主網絡和幾個測試網絡上。如果你使用ehereum-ens[1]javascript庫或終端用戶應用程序,它將自動檢測與你交互的網絡并在該網絡上部署ENS。
你現在就可以通過ENS管理器[2]或ENS官方主頁[3]上的ENS應用程序,來試用ENS。
ENS架構
ENS有兩個主要組件:注冊表[4]和解析器[5]
ENS注冊表是一個智能合約,該合約維護所有域名和子域名列表,并存儲關于每個域名的三個關鍵信息:
•域名的所有者
•域名的解析器
•域名下所有記錄的緩存存活時間(即TTL)
域名的所有者可以是外部帳戶(用戶)或智能合約。注冊中心就是一個擁有頂級域名的智能合約,并按照合約中的規則將該域名的子域名分發給用戶。
ENS注冊表中的域名所有者可以:
•為域名設置解析器和TTL
•將域名的所有權轉讓給另一個地址
•更改子域名的所有權
ENS注冊表非常簡單,它的存在只是為了將域名映射到負責解析這個域名的解析器。
解析器負責將域名轉換為地址。只要是符合解析器相關標準的智能合約,都可以在ENS中作為解析器程序。通用解析器服務于需求簡單的用戶,比如不經常更改地址的用戶。
每個記錄類型(以太坊地址、內容的散列等)都定義了一個或多個方法,解析器必須實現這些方法才能提供這類記錄。新的記錄類型可以隨時通過EIP標準化程序進行定義,因此不需要為了支持它們而對ENS注冊表或現有的解析器進行更改。
在ENS中解析一個域名需要兩個步驟:首先,詢問注冊表是哪個解析器負責解析該域名,然后,向該解析器查詢解析結果。
在上面的例子中,我們想找到"foo.eth"指向的以太坊地址。首先,我們詢問注冊表是哪個解析器負責解析"foo.eth";然后,我們向該解析器查詢"foo.eth"的地址。
Namehash
智能合約中的資源限制使得直接與可讀的域名交互效率低下,因此ENS只使用固定長度的256位加密散列。為了從域名生成散列的同時仍然保留其層次性,ENS使用了名為Namehash的算法。例如,"alice.eth"的Namehash為 0x787192fc5378cc32aa956ddfdedbf26b24e8d78e40109add0eea2c1a012c3dec,Namehash只是用來在ENS內部表示域名。
Namehash是一個遞歸過程,可以為任何有效的域名生成唯一的散列。從任意一個域名的Namehash開始(比如"alice.eth"的Namehash)可以推導出任意子域名的Namehash(比如"iam.alice.eth"的Namehash),而且推導過程中不需要知道或處理"alice.eth"這個可讀的原始域名。正是這個特性使得ENS能夠成為一個層次性的系統,且不必在內部處理可讀的文本字符串。
在使用Namehash進行散列之前,首先需要借助UTS-46標準對域名進行規范化,確保域名中的字母與大小寫無關,并禁止使用無效字符。任何對域名進行散列和解析的操作都必須首先對其進行規范化,以確保所有用戶獲得ENS的一致性。(劉笨笨)