如何使用ENS和Chainlink Data Feeds简化智能合约开发者体验

以太坊域名服务或者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 的更多信息。要讨论集成,请联系专家。

Subscribe to Chainlink预言机
Receive the latest updates directly to your inbox.
Verification
This entry has been permanently stored onchain and signed by its creator.