如何使用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 的更多信息。要讨论集成,请联系专家。

Need Integration Support?
Talk to an expert
Faucets
Get testnet tokens
Read the Docs
Technical documentation