這 以太坊名稱服務 或ENS 為以太坊地址提供人類可讀的名稱,為以太坊用戶和開發人員提供簡化的體驗。有了清晰的地址,用戶就可以與智能合約進行交互,而無需使用長字符哈希,這可能會造成混淆並導致錯誤。
Chainlink 正朝著使用ENS 作為事實來源的方向發展 數據饋送 地址。考慮到這一點,了解ENS 是什麼以及它是如何工作的很重要。
什麼是ENS?
ENS 是一種在以太坊區塊鏈上實現分佈式、開放和可擴展命名的服務。或者,簡單地說,它是一個查找服務。 ENS 有一個簡單的工作:它將人類可讀的名稱映射到機器可讀的地址。從這個意義上說,它類似於域名服務或DNS,後者將IP 地址替換為域名。但ENS 不是IP 地址,而是用人類可讀的名稱替換以太坊地址。
ENS 為地址、散列和其他標識符提供命名服務。如果沒有ENS,用戶需要知道以太坊區塊鏈上合約或錢包的完整64 個字符地址才能與其進行交互。
ENS 提供了使用人類可讀地址的能力。這些地址可以用作域,從而實現域層次結構,這意味著可以將子域分配給一個ENS 地址。
ENS 對Chainlink 意味著什麼?
頂級ENS 域由稱為註冊商的智能合約所有。這些註冊商提供管理子域分配的規則。在`.eth`頂級域,Chainlink與ENS廣泛合作,提供`data.eth`域,其中包含Chainlink Price Feed地址的可識別索引,使發現Chainlink預言機網絡變得更加容易。這意味著開發人員可以使用人類可讀的地址,如`eth-usd.data.eth` 代替合約地址,如`0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419`。
在Javascript 中使用ENS
在支持Web3 的Javascript 庫中,使用ENS 解析域名很簡單。使用 web3.js, 這很簡單
var address = ens.getAddress('eth-usd.data.eth');
其他支持ENS 的庫可以在 ENS 文檔.
製作節點哈希
當ENS 地址在鏈上使用時,事情會變得更有趣。
ENS 文檔 作參考 噸o 節點哈希。節點散列是用遞歸算法構造的,該算法採用域的每個組件,以“.”分隔,並將它們散列在一起。基於規格 EIP-137 日該算法的偽代碼為:
def namehash(name): if name == '': return ' ' * 32 else: label, _, remainder = name.partition('.') return sha3(namehash(remainder) + sha3(label))
該名稱被拆分為其組成部分,然後,從最後一個組成部分開始,連接在一起。 `eth-usd.data.eth` 的結果節點哈希將通過以下步驟創建。
node = ' ' * 32 node = sha3(node + sha3('eth')) node = sha3(node + sha3('data')) node = sha3(node + sha3('eth-usd'))
需要注意的是,為了從散列算法中產生正確的輸出,必須首先對名稱進行規範化。 ENS 要求任何使用它的人都必須跟隨 UTS46 用於規範化和驗證。
鑑於此過程的複雜性,建議將節點哈希傳遞給合約,而不是在鏈上計算它。這 eth-ens-namehash npm 包為您執行規範化和散列。
此外,The Graph 有一個 API 可用 用於查找有關ENS 域的數據; `labelhash` 是包含此信息的特定字段,但還有更多可用信息。
解決鏈上問題
一旦定義了ENS 地址的節點哈希,就可以使用它來解析鏈上的合約地址。同樣,這很有用,因為對於解析器,節點哈希和人類可讀的地址是相同的。解析器充當我們正在解析的實體地址的真實來源。在這種情況下,這將是Chainlink 數據饋送之一。
在鏈上Solidity 合約中,您需要為ENS 合約和解析器實現幾個接口。
abstract contract ENS { function resolver(bytes32 node) public virtual view returns (Resolver); } abstract contract Resolver { function addr(bytes32 node) public virtual view returns (address); }
一旦定義了這些接口,就可以創建一個簡單的解析器來將節點哈希轉換為地址。
contract MyContract { // This is the ENS registry address // It is the same address for Mainet, Ropsten, Rinkerby, Gorli and other networks; ENS ens = ENS(0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e); function resolve(bytes32 node) public view returns(address) { Resolver resolver = ens.resolver(node); return resolver.addr(node); } }
包起來
Chainlink 選擇使用ENS 作為數據饋送地址的真實來源。 ENS 消除了使用長地址的需要,並有助於確保與正確的區塊鏈地址進行交互。要了解有關ENS 和Chainlink 的更多信息,請訪問 Chainlink 文檔.
通過訪問了解有關Chainlink 的更多信息 鏈環 或閱讀文檔 docs.chain.link. 要討論集成,請聯繫專家。