任何区块链上的智能合约都可以通过集成Chainlink预言机连接至任何API。Chainlink是以太坊预言机,它将solidity智能合约连接至链下API和数据,并推动应用量呈现爆发式增长。Chainlink是领先的价格参考数据提供商,目前保障价值超过10亿美元的DeFi应用。虽然Chainlink预言机为众多受人熟知和喜爱的DeFi平台提供了重要价值,但光凭它的一己之力还是无法实现智能合约的颠覆创新。

Chainlink拥有一个非常宏大的目标,那就是成为智能合约标准化的数据中间件,充分释放智能合约的潜力,并在现实世界中产生真正的价值。为了实现这个目标,Chainlink为Solidity和其他区块链开发者提供了开发框架,让他们能与所有链下API交互,本文将详细阐述操作细节,并教大家如何在以太坊主网上进行部署。

首先第一个概念就是适配器:所有Chainlink节点都可以接入适配器以保证数据兼容。所有开发者都可以通过这些适配器建立数据请求的标准接口,而节点运营商也可以建立数据传输标准。这些适配器的功能包括HTTP GET、HTTP POST、Compare和Copy等。适配器能够将dApp连接至链下数据。

以下是HttpGet适配器的参数:

  • get:包含URL的字符串,用来发起一个GET请求
  • headers:是一个键值对,键是字符串类型,值是包含一系列字符串的数组。
  • queryParams:是字符串或字符串数组,代表了URL的请求参数。
  • extPath:是斜线分割的字符串或字符串数组,附加在job的URL上。

如果要将适配器接入智能合约,就需要引入另一个概念,那就是数据请求。继承ChainlinkClient的所有智能合约都可以创建Chainlink.Request结构,允许开发者向Chainlink节点发起一个数据请求。要提交数据请求需要填写一些基本的字段,比如你想要使用的预言机节点地址、job ID以及协商的费用。除了这些默认字段以外,还必须用以下方式在数据请求结构中添加理想的适配器参数:

// Set the URL to perform the GET request on
request.add("get", "https://min-api.cryptocompare.com/data/price?fsym=ETH&tsyms=USD");

这样一来,数据请求的灵活性就会非常高,而且可以适应各种不同的场景,包括获得、发布以及处理任何API,因为数据请求中可以包含任何功能的适配器。若想了解如何创建数据请求以及在ChainlinkClient合约中发送请求和收到回复所需的功能,请查看我们完整的HTTP GET数据请求示例

对于某些常见的请求来说,节点运营商可能已经配置了预言机任务,在这种情况下请求数据就变得简单了许多。你无需创建一个附带适配器的数据请求结构,只需创建默认数据请求格式即可。你也无需再创建其他适配器参数,你选择的预言机基于创建数据请求结构时生成的JobID就能判断如何进行响应。

下方是CoinGecko API consumer接口的完整示例:

Chainlink.Request memory req = buildChainlinkRequest(jobId, address(this),
this.fulfillEthereumPrice.selector);
sendChainlinkRequestTo(oracle, req, fee);

可以用Chainlink Market搜寻现有节点以及节点支持的任务,并最终找到你需要的job ID。

然而,一旦出现一些特别复杂的智能合约应用场景,超出了适配器的默认功能范围,那该怎么处理呢?比如说你可能需要对API数据进行一些高级的处理,这种情况下该怎么办?也许你不想将原始API数据传输至智能合约中,而是先对多个数据点进行统计分析然后再产生元数据。你可以使用默认适配器在链上处理数据,但同时你也希望能够降低gas成本。也许你只是不希望在链上发起需要身份认证的数据请求,因为你不想将身份认证信息放到区块链上或预言机的任务描述中。这种情况下就需要使用外部适配器

42576f7-cldiagram1

外部适配器的宗旨是“无论你想要连接什么样的数据,我都能帮你搞定”。外部适配器是与Chainlink节点共存的链下代码,代码可以用任何一种编程语言编写,可以执行任何你可以想到的功能,唯一需要满足的条件就是数据输入和输出能匹配适配器的JSON格式。外部适配器是连接Chainlink节点和外部数据的桥梁,通知节点运营商如何请求数据并收到JSON数据响应,以供在链上使用。

通过外部适配器约定链下交互参数,将创造出各种新的应用潜力:你可以将API身份认证信息以任何方式储存在链下,数据可以用任何方式进行处理,你可以用任何编程语言编写代码,所有这些操作都不用消耗gas。从某种程度上来说,外部适配器就像是一个layer2预言机,将链下数据以快速和低成本的方式打包成简洁的JSON格式,由Chainlink节点传输到链上,并得到验证。

外部适配器极大丰富了Chainlink预言机中间件的功能性。智能合约开发者可以灵活配置适配器,也可以从Chainlink Market中挑选适配器。如果你是一名智能合约开发者,并希望创建外部适配器,你只需要确定JSON格式的数据请求和响应数据即可。只要确定了这两种格式,开发者就可以依照具体需求任意创建和处理数据。节点运营商如果要支持外部适配器并处理额外的数据请求,就必须在节点UI中为其建立“桥梁”进行连接,并在任务中加入适配器的桥接名称。

43ac349-Screenshot_from_2018-12-07_06-37-27
{
"initiators":[
{ "type":"runLog" }
],
"tasks":[
{ "type":"randomNumber" },
{ "type":"copy",
"params":{"copyPath":["details", "current"]}},
{ "type":"multiply",
"params":{"times":100 }},
{ "type":"ethuint256" },
{ "type":"ethtx" }
]
}

Chainlink致力于为区块链和智能合约开发者提供工具,完美地将智能合约连接至链下数据。Chainlink既可以通过默认适配器也可以通过外部适配器直接调用任何API,开发者可以使用任何所需的数据灵活进行创建。如果你是一名智能合约开发者,并希望将智能合约连接至外部数据;抑或你只是想了解更多关于Chainlink 的信息,请查看下方列出的资源。

如果你对上述内容感兴趣的话,请查看我们的分步示例,轻松部署可以连接链下数据的智能合约。

如果Chainlink预言机可以为你目前开发的产品提供任何附加价值;抑或你希望参与Chainlink网络的开源开发工作,请查看开发者文档或加入我们在Discord上的技术讨论群。

搜索微信号ChainlinkOfficial加入Chainlink中文微信社区,搜索微信号neils_加入Chainlink中文开发者社区。