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