基于eth测试网搭建Chainlink节点

Posted cuiran

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于eth测试网搭建Chainlink节点相关的知识,希望对你有一定的参考价值。

基于ETH测试网搭建Chainlink节点

本文主要参考 Chainlink 官方文档(https://docs.chain.link/docs/running-a-chainlink-node) ,但是搭建过程中有些问题,文档也没有给出,因此写下此文进行一些记录。

所需环境及组件

操作是基于Mac,如果用其他系统操作也类似。主要依赖组件有Docker环境、PostgresSQL、以太测试网等,后面会将如何搭建Chainlink节点过程进行记录。

Docker 安装

Mac下是直接安装的Docker文件,其他环境可参考官网

安装完成输入docker version 输出信息表示安装成功

    Client: Docker Engine - Community
    Cloud integration: 1.0.1
    Version:           19.03.13
    API version:       1.40
    Go version:        go1.13.15
    Git commit:        4484c46d9d
    Built:             Wed Sep 16 16:58:31 2020
    OS/Arch:           darwin/amd64
    Experimental:      false
    Server: Docker Engine - Community
    Engine:
    Version:          19.03.13
    API version:      1.40 (minimum version 1.12)
    Go version:       go1.13.15
    Git commit:       4484c46d9d
    Built:            Wed Sep 16 17:07:04 2020
    OS/Arch:          linux/amd64
    Experimental:     false
    containerd:
    Version:          v1.3.7
    GitCommit:        8fba4e9a7d01810a393d5d25a3621dc101981175
    runc:
    Version:          1.0.0-rc10
    GitCommit:        dc9208a3303feef5b3839f4323d9beb36df0a9dd
    docker-init:
    Version:          0.18.0
    GitCommit:        fec3683

PostgresSQL 安装

Chainlink Node 在 0.8 版本之后将 PostgresSQL 作为唯一的存储选项。PostgresSQL 数据库可以是自己搭建的,也可以是云服务商提供的,只要可以提供数据库的访问接口即可。
这里采用的是基于docker 安装.具体可以参考:

docker安装的postgresql的基本使用

docker run --name postgres2 -e POSTGRES_PASSWORD=password -p 5432:5432 -v pgdata:/var/lib/postgresql/data -d postgres

以太坊测试环境

本文直接使用的 https://infura.io/ 进行测试,测试网可以选择Ropsten和kovan

部署Chainlink 节点

创建Chainlink 目录

  • Ropsten

创建目录

    mkdir ~/.chainlink-ropsten

配置环境变量

    ROOT=/chainlink
    LOG_LEVEL=debug
    ETH_CHAIN_ID=3
    ETH_URL=wss://ropsten.infura.io/ws/v3/自己的id
    MIN_OUTGOING_CONFIRMATIONS=2
    MIN_INCOMING_CONFIRMATIONS=0
    LINK_CONTRACT_ADDRESS=0x20fE562d797A42Dcb3399062AE9546cd06f63280
    CHAINLINK_TLS_PORT=0
    SECURE_COOKIES=false
    GAS_UPDATER_ENABLED=true
    DATABASE_URL=postgresql://postgres:password@172.17.0.2:5432/db_chainlink?sslmode=disable
    ALLOW_ORIGINS=*
  • Kovan

创建目录

    mkdir ~/.chainlink-kovan

配置环境变量

    ROOT=/chainlink
    LOG_LEVEL=debug
    ETH_CHAIN_ID=42
    ETH_URL=wss://kovan.infura.io/ws/v3/自己的id
    MIN_OUTGOING_CONFIRMATIONS=2
    MIN_INCOMING_CONFIRMATIONS=0
    LINK_CONTRACT_ADDRESS=0xa36085F69e2889c224210F603D836748e7dC0088
    CHAINLINK_TLS_PORT=0
    SECURE_COOKIES=false
    GAS_UPDATER_ENABLED=true
    DATABASE_URL=postgresql://postgres:password@172.17.0.2:5432/db_chainlink?sslmode=disable 
    ALLOW_ORIGINS=*

启动节点

这里选择的是基于Kovan环境启动Chainlink节点,若想选择Ropsten环境只需改下命令中的对应参数即可。

    sudo docker run --name chainlink -p 6688:6688 -v ~/.chainlink-kovan:/chainlink -it --env-file=.env smartcontract/chainlink local n

首次启动会首先要求管理员输入一个密码,这个密码是节点账户的 keystore 密码,这个密码必须牢记,丢失的话没有办法找回,并且私钥所管理的资金也会丢失。每次启动都会要求管理员输入这个密码,以解锁 keystore。节点需要通过 keystore 的私钥来签署交易,提交到区块链上。

接下来还会要求节点管理员输入一对邮箱账户和密码,用于登录节点管理页面。

节点测试

登陆管理界面

浏览器中打开 ip:6688 地址,就能看到 Chainlink 节点管理页面的登录入口。用我们在启动节点时填入的邮箱账户和密码,就可以登录到管理界面中了。

我们先去到 Configuration 标签页,会发现有一个 ACCOUNT_ADDRESS 字段,这个 address 就是我们在首次启动节点时候设置 keystore 密码的私钥所对应的地址,在节点提供服务之前,需要向这个地址转入 ETH,用于提交交易。

由于我们使用的是 Kovan 测试网络,我们可以使用MetaMask 给这个账户地址转入测试ETH。

创建 Oracle 合约

Oracle 合约是 Chainlink 节点在区块链上的桥头堡,它与用户合约直接进行沟通,接收用户的预言机请求,将请求结果通过用户注册的回调函数,写入到用户的合约中。

Oracle 合约无需自己编写,我们直接部署 Chainlink 开源的 Oracle 合约代码即可。如果用 remix 部署,只需新建一个包含下面两行代码的文件即可:

pragma solidity 0.4.24;
import "https://github.com/smartcontractkit/chainlink/evm-contracts/src/v0.4/Oracle.sol";

需要注意的是,Oracle 合约会暂时接受用户发起 Chainlink 请求是所支付的 LINK 费用,所以请务必妥善保存合约 owner 的私钥。

部署好 Oracle 合约之后,需要将开放权限给节点的地址,允许节点可以提交事务。如图所示:

创建 Jobs

按照官网提供例子,在节点中添加 Job(作业)。打开节点管理界面的 Jobs 标签页,点击 New Job 添加新的 Job,将每个类型的 Job 的 JSON 拷贝到文本框中,用刚刚部署好的 Oracle 合约地址,替换 JSON 中的 YOUR_ORACLE_CONTRACT_ADDRESS 字段。每创建成功一个 Job,都会生成一个 Job ID,在 Jobs 标签页可以找到所有的 Jobs。

测试Chainlink节点是否可用

通过remix 对节点进行测试

pragma solidity ^0.6.0;

import "https://raw.githubusercontent.com/smartcontractkit/chainlink/develop/evm-contracts/src/v0.6/ChainlinkClient.sol";

contract APIConsumer is ChainlinkClient 
  
    uint256 public ethereumPrice;
    
    address private oracle;
    bytes32 private jobId;
    uint256 private fee;
    
    constructor() public 
        setPublicChainlinkToken();
	// 填入我们刚刚部署好的oracle地址
        oracle = 0x0f6b361eAe488e7fdbeFF164AcD5Bae04c144574;
	// 填入我们刚刚创建的地址
        jobId = "01f4b9afcad747408dd0d58913b79d56";
	// 支付给Oracle的最小费用,可用在Configuration页面MINIMUM_CONTRACT_PAYMENT字段查看到
        fee = 1 * 10 ** 18; // 1 LINK
    
    
    function requestEthereumPrice() public returns (bytes32 requestId) 
    
        Chainlink.Request memory request = buildChainlinkRequest(jobId, address(this), this.fulfill.selector);
        
        // 设置所要请求的API地址
        request.add("get", "https://min-api.cryptocompare.com/data/price?fsym=ETH&tsyms=USD");
        
        // API返回结果的解析路径
        request.add("path", "USD");
        
        // 为去除小数点将结果乘以的倍数
        request.addInt("times", 100);
        
        // 发送请求
        return sendChainlinkRequestTo(oracle, request, fee);
    
    
    function fulfill(bytes32 _requestId, uint256 _price) public recordChainlinkFulfillment(_requestId)
    
        ethereumPrice = _price;
    

部署好用户合约之后,向用户合约转入 LINK,调用 requestEthereumPrice 方法,就可以测试我们的 Chainlink 预言机节点是否可以正常工作啦。
同时,通过节点平台可以查看到交易列表

以上是关于基于eth测试网搭建Chainlink节点的主要内容,如果未能解决你的问题,请参考以下文章

Chainlink 商品 [黄金、白银、石油] 价格为测试网智能合约提供信息

获取 Chainlink ETH/USD 价格反馈答案为 uint256 而不是 int solidity

以太坊私有节点搭建

节点阵列基于斯坦福大学Nick Parlante的教程

第112篇 区块链上的价格预言机(Chainlink)

goerli 测试网资源整理