以太坊域名服务或者ENS能为区块链地址提供人类可读的名称,能为以太坊用户和开发者提供简化的体验。用户可以通过清晰易读的地址与智能合约进行交互,而无需使用可能会造成混淆并导致错误的长字符串哈希。
Chainlink正向着使用ENS作为Data Feeds地址的真实来源的方向前进。 考虑到这一点,了解 ENS 是什么以及它的工作原理就尤为重要。
什么是 ENS?
ENS是一项在以太坊区块链上实现分布式、开放和可扩展命名的服务。或者简单地说,它是一个
查找服务
。ENS 有一个简单的任务:它将人类可读的名称映射到机器可读的地址。从这个意义上说,它类似于域名服务或DNS,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文档提供了节点哈希的参考。节点哈希是使用递归算法构造的,该算法会获取域名用 . 分隔的每个部分,并将它们哈希在一起。 基于EIP-137的规范,该算法的伪代码如下:
def namehash(name):
?if name == '':
???return '\0' * 32
?else:
???label, _, remainder = name.partition('.')
???return sha3(namehash(remainder) + sha3(label))
该名称被拆分为几个组件,然后从最后一个组件开始,连接在一起。 eth-usd.data.eth 的节点哈希结果将通过以下步骤创建。
node = '\0' * 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 Data Feeds。
在链上 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 作为Data Feeds地址的真实来源。ENS消除了对长地址的使用需求,并有助于确保使用正确的区块链地址进行交互。
要了解有关 ENS 和 Chainlink 的更多信息,可访问Chainlink 文档。
访问 chain.link 或阅读 docs.chain.link 上的文档可以了解有关 Chainlink 的更多信息。要讨论集成,请联系专家。
|