亲自搭建一个Chainlink节点并用它来获取ETH报价

前言

Chainlink是一个去中心化的预言机网络,它可以让区块链中的智能合约安全地访问外部世界的数据。在这个教程中,你将学习到如何最快自建Chainlink的节点,并发送一笔交易请求。

什么是Chainlink节点

Chainlink 基于ETH 链,但并不是ERC20,而是 ERC677 合约。
它是 ERC20 合约的一个扩展,兼容 ERC20 协议标准,可以在转账时携带数据,并触发接收合约的业务逻辑,扩大了智能合约的应用场景。
目前,Chainlink已经能实现的包括但不限于:

  1. 分布式价格推送
  2. 随机函数,链上随机数
  3. 外部适配器连接链外资源
  4. 其他预言机网络服务

Chainlink丰富的 节点与合约市场 使其成为了全球领先的预言机网络平台。
成为Chainlink认证的节点提供商,将会获得节点运营奖励。

怎么搭建

我们先从Chainlink的测试网kovan上开始,你需要:

  1. 一台linux云服务器,以ubuntu为例
  2. 一个postgresql数据库
  3. 一个eth节点

本教程以google cloud为例,你也可以选用国内的阿里云,两者都支持postgresql数据库。笔者一开始选择的是vultr云服务器,后台并没有自带数据库,需要自己搭建,比较复杂就不赘述。
由于国内用户对GCloud并不熟悉,所以说得详细一些。

第一步 配置GCloud

登陆 https://cloud.google.com/ 注册一下,绑定一张visa信用卡。新用户会获得300美元的奖励金,用完以前是免费的。
进入控制台:
亲自搭建一个Chainlink节点并用它来获取ETH报价_第1张图片

接下来先配置虚拟机网络,然后再配置数据库。因为数据库会用到前面的网络实例。
配置虚机网络,如图所示:
亲自搭建一个Chainlink节点并用它来获取ETH报价_第2张图片

选择库,在跳出的搜索框里输入 networking,选择列表下方的第一个并应用。
亲自搭建一个Chainlink节点并用它来获取ETH报价_第3张图片

创建SQL实例:
亲自搭建一个Chainlink节点并用它来获取ETH报价_第4张图片

选择PostgreSQL 数据库。
PostgreSQL是目前最强大的开源对象关系型数据库,Chainlink用的是这个数据库。(注:ETH 使用的是开源NOSQL数据库,leveldb)
亲自搭建一个Chainlink节点并用它来获取ETH报价_第5张图片
记得在连接一栏把专用IP也勾上。

创建的过程需要等待5分钟左右,喝杯咖啡休息一下:)

成功以后添加用户:
亲自搭建一个Chainlink节点并用它来获取ETH报价_第6张图片

至此,服务器部分已经配置完了。


第二步 运行Chainlink节点

此处参考 官方教程:运行一个节点,是英文版的。
首先,我们需要登陆这台服务器。
亲自搭建一个Chainlink节点并用它来获取ETH报价_第7张图片
google提供了5种办法登陆,你可以图省事直接点击在浏览器中打开,并使用内置的客户端直连。
但是由于我们之后需要在本机的浏览器里直接输入localhost访问节点配置页面,所以我们选择用 gcloud去登陆它。详细文档请参考: gcloud文档

初次使用先安装 Cloud SDK,windows mac linux都有。
亲自搭建一个Chainlink节点并用它来获取ETH报价_第8张图片

gcloud compute ssh --zone "us-central1-a" "chainlink-kovan-icy" --project "molten-snowfall-298315"

由于我们需要通过ssh tunnel连上6688这个端口,所以我们在这个命令后加上一点东西

gcloud compute --project "molten-snowfall-298315" ssh --zone "us-central1-a" "chainlink-kovan-icy" -- -L 6688:localhost:6688

ssh tunnel
就这样,系统自动打开putty客户端为我们连接。
连上以后分为几步敲以下命令:

  • 安装docker,将当前用户添加至docker用户组。
curl -sSL https://get.docker.com/ | sh
sudo usermod -aG docker $USER
  • 创建kovan目录并配置环境变量
mkdir ~/.chainlink-kovan
echo "ROOT=/chainlink
LOG_LEVEL=debug
ETH_CHAIN_ID=42
MIN_OUTGOING_CONFIRMATIONS=2
LINK_CONTRACT_ADDRESS=0xa36085F69e2889c224210F603D836748e7dC0088
CHAINLINK_TLS_PORT=0
SECURE_COOKIES=false
GAS_UPDATER_ENABLED=true
ALLOW_ORIGINS=*" > ~/.chainlink-kovan/.env
  • 配置以太坊节点
您可以自己搭建以太坊客户端节点,也可以选择以太坊RPC服务提供方的服务,只需要一个WebSocket链接提供给Chainlink节点即可。

Chainlink的文档中 提供了搭建本地以太坊客户端节点的方法,也提供了几个外部以太坊API服务供您选择。由于以太坊客户端节点对硬件要求比较高,本文中我们选择 infura 提供的免费API来作为Chainlink节点的以太坊客户端选择。

亲自搭建一个Chainlink节点并用它来获取ETH报价_第9张图片

echo "ETH_URL=wss://kovan.infura.io/ws/v3/0ce89c2fce5443f58de18b0c8e1b1f6d" >> ~/.chainlink-kovan/.env
  • 配置外部数据库
echo "DATABASE_URL=postgresql://chainlink-db-user:[email protected]:5432/postgres" >> ~/.chainlink-kovan/.env
  • 启动节点
cd ~/.chainlink-kovan && sudo docker run -p 6688:6688 -v ~/.chainlink-kovan:/chainlink -it --env-file=.env smartcontract/chainlink local n

亲自搭建一个Chainlink节点并用它来获取ETH报价_第10张图片

首次启动成功以后会让你输入登陆的邮件和密码。如果没有到这一步就没有成功。

好了!到这里已经初步成功。

总结:

  1. gcloud auth login
  2. ssh tunnel
  3. start node command

第三步 配置Chainlink节点

由于我们已经配置了ssh tunnel,此时可以在本机的浏览器中输入http://localhost:6688/signin 直接打开
亲自搭建一个Chainlink节点并用它来获取ETH报价_第11张图片

如果需要在gcloud开放外网端口,通过公网IP访问,请参考这篇文章:
https://www.vediotalk.com/archives/2481

在浏览器中输入刚才命令行里配置的邮件和密码,点击登录。右边可以看到我们还没有 Kovan 测试网的 ETH币和Chainlink代币。
亲自搭建一个Chainlink节点并用它来获取ETH报价_第12张图片


发送交易

总结一下接下来要做的三步:

  1. 添加JobId
  2. Oracle合约
  3. TestnetConsumer合约
虽然我们现在还不会写合约,但是可以用已有的solidity代码感受一下。
接下去主要用到两个合约,第一个是Oracle.sol。我们用它来将我们的节点注册到测试网上。
在编译这个合约的时候传入主网或测试网Link地址,还需要关注 setFulfillmentPermission 这个函数,表示允许该节点接受请求。
第二个是 ATestnetConsumer.sol 。主要关注 requestEthereumPrice 函数。这个函数让我们可以获取eth的价格。

我们的节点目前还空空如也,我们可以在上面添加一个Job,让它能够承载一定的服务。
亲自搭建一个Chainlink节点并用它来获取ETH报价_第13张图片
复制一段接收ethuint256类型的Job:

{
  "name": "Get > Uint256",
  "initiators": [
    {
      "type": "runlog",
      "params": {
        "address": "YOUR_ORACLE_CONTRACT_ADDRESS"
      }
    }
  ],
  "tasks": [
    {
      "type": "httpget"
    },
    {
      "type": "jsonparse"
    },
    {
      "type": "multiply"
    },
    {
      "type": "ethuint256"
    },
    {
      "type": "ethtx"
    }
  ]
}

此时,需要将address里的地址替换成oracle合约地址。于是我们切到 Remix 去部署oracle合约。
注意,该链接自动会打开gist上的合约,我们只需要运行并部署就行了。
亲自搭建一个Chainlink节点并用它来获取ETH报价_第14张图片
点开左侧部署过的Oracle合约,在 setFulfillmentPermission 右边填上参数:

"0x474fCD2f21B9916C0c0e852550E1f586fE1DeB4e", true。

点击红圈等待矿工确认交易,控制台就出现了调用该函数成功的交易。绿色的勾表示调用成功✔
亲自搭建一个Chainlink节点并用它来获取ETH报价_第15张图片

接下去切回浏览器的 New Job页面,将刚才复制的Oracle合约地址填入address里。
这表示使用该任务的时候都需要传入该合约地址。
亲自搭建一个Chainlink节点并用它来获取ETH报价_第16张图片
然后Create Job.
好了,大功告成!记得复制一下成功后弹出的 JobId.


现在,让我们来试着获取一下实时的 ETH的价格。
新建一个 TestNode.sol,复制 https://raw.githubusercontent... 里的代码进去:
亲自搭建一个Chainlink节点并用它来获取ETH报价_第17张图片
同样编译部署以后,在下方 ATestnetConsumer 合约中的 requestEthereumPrice 方法中填入两个参数。第一个参数是Oracle合约地址,另一个是JobId,例如:

"0x12E5bB28a72182e96bd0b47f4079a59ABB09f221","5a9c8ed5a27e487dbbebb7f88b170f5d"

然后在点击该方法以前,记得往合约中打入一定数量的Link代币。因为执行合约会消耗 gas token,如果没有会弹出错误框。
亲自搭建一个Chainlink节点并用它来获取ETH报价_第18张图片

可以在控制台看到我们传入的参数,已经成功了!
此时,点击左侧的 currentPrice 方法,就能看到最新的 ETH 价格了:
亲自搭建一个Chainlink节点并用它来获取ETH报价_第19张图片

你可能感兴趣的:(区块链)