Chainlink去中心化预言机桥接区块链与现实世界

本文探讨了Chainlink预言机网络的搭建过程,包括使用预置或自定义适配器实现智能合约与外部数据的连接。通过Kovan测试链演示环境,详细介绍了Chainlink架构、适配器使用、自定义适配器开发及预言机合约部署。

本文由深入浅出区块链技术提供
Chainlink 是一个去中心化的预言机网络,它可以让区块链中的智能合约安全地 访问外部世界的数据。在这个文章中,我们将探索 chainlink 预言机网络的搭建,并学习如何使用预置或自定义的适配器实现智能合约与外部世界数据的桥接。

智能合约被锁定在区块链里,与外部世界隔离开来。然而在许多应用中,智能合约的运行需要依赖于外部真实世界的信息。

以 Ocean 协议为例:只有当提供的数据被证明是可以使用时,数据提供商才可以得到代币奖励。因此一个可以桥接区块链和现实世界的预言机(Oracle)网络 就非常必要了。

Chainlink 是一个去中心化的 Oracle 网络,它可以让区块链中的智能合约安全地访问外部世界的数据:

在这里插入图片描述
在这个教程中,我们将探索 chainlink 网络的搭建以及其适配器的使用方法,我们 在 Kovan 测试链搭建了一个用于概念验证的演示环境,所有的代码可以从 这里[1]下载。我们使用 truffle v5.0.3 和 Node.js v8.11.1。

1、Chainlink 架构概述

Chainlink 网络的主要组成部分如下:

• Chainlink 预言机合约:预言机智能合约部署在区块链网络上,它接收来自合约的 Link 代币支付并向 Chainlink 节点分发事件

• Chainlink 节点:Chainlink 节点是运行在区块链和外部数据源之间的链下中间件, 它提供真实世界的数据,执行来自请求器合约的请求

• Chainlink 适配器:适配器是应用相关的软件,它负责与数据源交互并执行特定的任务。chainlink 适配器可以部署在 serverless 平台,例如 amazon lambda 或 Google cloud functions
在这里插入图片描述
值得指出的是,每个来自请求器合约的请求都必须包含一个任务 ID,用来唯一的标识 一个特定的工作流水线。Chainlink 节点依赖于任务 ID 来识别与数据源交互所需的适配器 以及处理数据所需的工作流。

2、使用 Chainlink 内置的适配器

在这一部分,我们使用 Chainlinkg 预置的适配器来展示如何集成 Chainlink 并向其 提交请求。

2.1 安装 Chainlink 包
在项目根目录,执行如下命令安装 chainlink 包:


$ npm install github:smartcontractkit/chainlink --save

另外,Chainlink 官方最近增加了一个新的 NPM 包用于 Chainlink 合约,可以如下 命令安装:


$ npm install chainlink.js — save

2.2 在 Kovan 测试链部署请求器合约
要访问 Chainlink 的预言机合约,需要构造一个用于发送 Link 代币并提交请求的 请求器合约。

我们创建了一个请求器合约示例,可以在这里下载。


constructor() public {
   
   
    // Set the address for the LINK token in Kovan network.
    setLinkToken(0xa36085F69e2889c224210F603D836748e7dC0088);
    // Set the address of the Oracle contract in Kovan network.
    setOracle(0x2f90A6D021db21e1B2A077c5a37B3C7E75D15b7e); 
}...

   /*
   * Create a request and send it to default Oracle contract
   */

  function createRequest(
    bytes32 _jobId,
    string _url,
    string _path,
    int256 _times
)
    public
    onlyOwner
    returns (bytes32 requestId)
  {
   
   
    // create request instance
    Chainlink.Request memory req = newRequest(_jobId, this, this.fulfill.selector);
    // fill in the pass-in parameters

    req.add("url", _url);
    req.add("path", _path);
    req.addInt("times", _times);
    // send request & payment to Chainlink oracle
    requestId = chainlinkRequestTo(getOracle(), req, ORACLE_PAYMENT);
    // emit event message
    emit requestCreated(msg.sender, _jobId, requestId);
  }

请求器合约中的关键函数是 createRequest 函数,它创建请求并设置必要的参数:

• Job Id:特定作业流水线的唯一标识符。可以在这里查看内置适配器的完整清单:https://docs.chain.link/docs/addresses-and-job-specs

• URL:可以返回 JSON 数据的 Web API 的访问端结点

• path:JSON 数据字段选择路径,用来声明使用数据中的哪一部分

• times:数据倍乘系数。该操作将浮点数转换为整数,因为 solidity 智能合约仅接受整数

2.3 在 Kovan 测试链部署请求器合约
执行如下命令在以太坊 Kovan 测试链部署请求器合约:


$ truffle migrate --network kovan
    ...
   Deploying 'OceanRequester'
   --------------------------
   > transaction hash:    0x6e228163e73828c58c8287fec72c551289516a1d8e9300aab5dcc99d848f6146
   > Blocks: 0            Seconds: 16
   > contract address:    0x04E4b02EA2662F5BF0189912e6092d317d6388F3
   > account:             0x0E364EB0Ad6EB5a4fC30FC3D2C2aE8EBe75F245c
   > balance:             2.703082875853937168
   > gas used:            1439461
   > gas price:           10 gwei
   > value sent:          0 ETH
   > total cost:          0.01439461 ETH
   > Saving artifacts

   -------------------------------------

   > Total cost:          0.01439461 ETH

2.4 向请求器合约存入 LINK 代币
Chainlink 官方提供了一些代币 faucet。在 Kovan 测试链上可以访问 https://kovan.chain.link/ 获取一些测试用的 LINK 代币。

只需要输入合约地址或钱包地址,Chainlink 的 faucet 就会转 100 个 LINK 代币进去:
在这里插入图片描述
2.5 从合约请求数据
我们创建了一个 JavaScript 脚本来与请求器合约交互,以便创建并提交请求给 Chainlink 网络。可以在这里下载 JavaScript 脚本。


contract("OceanRequester", (accounts) => {
   
   
  const LinkToken = artifacts.require("LinkToken.sol");
  const OceanRequester = artifacts.require("OceanRequester.sol");
  const jobId = web3.utils.toHex("2c6578f488c843588954be403aba2deb");
  const url = "https://min-api.cryptocompare.com/data/price?fsym=ETH&tsyms=USD,EUR,JPY";
  const path = "USD";
  const times = 100;
  let link, ocean;

  beforeEach(async () => {
   
   

    link = await LinkToken.at("0xa36085F69e2889c224210F603D836748e7dC0088");
    ocean = await OceanRequester.at("0x04E4b02EA2662F5BF0189912e6092d317d6388F3");

  });


  describe("query the initial token balance", () => {
   
   
    it("create a request and send to Chainlink", async () => {
   
   
      let tx = await ocean.createRequest(jobId, url, path, times);
      request = h.decodeRunRequest(tx.receipt.rawLogs[3]);
      ...
      data = await ocean.getRequestResult(request.id)
      console.log("Request is fulfilled. data := " + data)
       ...
     });
   
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值