Chainlink 节点部署教程
本文次要参考 Chainlink 官网文档(https://docs.chain.link/docs/running-a-chainlink-node)编写,如果您能够浏览英文,举荐您间接浏览官网文档。
装置必须组件
服务器环境 Ubuntu1804,咱们以 Ropsten 测试网为例,以太坊主网的搭建只需批改相干配置选项即可。
Docker 装置参考文档
https://docs.docker.com/engine/install/ubuntu/
将以后用户增加至 docker 用户组
sudo usermod -aG docker $USER
exit
# 从新登录
PostgresSQL
Chainlink Node 在 0.8 版本之后将 PostgresSQL 作为惟一的存储选项。PostgresSQL 数据库能够是本人搭建的,也能够是云服务商提供的,只有能够提供数据库的拜访接口即可。
本地装置参考:
https://www.postgresql.org/download/linux/ubuntu/
以太坊客户端
Chainlink 节点通过与以太坊客户端节点连贯,通过连贯的以太坊客户端来获取链上的用户预言机申请,通过提交交易将获取到的数据写入到链上。所以 Chainlink 节点必须要依附一个以太坊客户端节点能力发挥作用。您能够本人搭建以太坊客户端节点,也能够抉择以太坊 RPC 服务提供方的服务,只须要一个 WebSocket 链接提供给 Chainlink 节点即可。
Chainlink 的文档中(https://docs.chain.link/docs/run-an-ethereum-client)提供了搭建本地以太坊客户端节点的办法,也提供了几个内部以太坊 API 服务供您抉择。因为以太坊客户端节点对硬件要求比拟高,本文中咱们抉择 infura 提供的收费 API 来作为 Chainlink 节点的以太坊客户端抉择。
部署 Chainlink 节点
创立 Chainlink 目录
Ropsten: mkdir ~/.chainlink-ropsten
配置环境变量
Ropsten:
echo "ROOT=/chainlink
LOG_LEVEL=debug
ETH_CHAIN_ID=3
MIN_OUTGOING_CONFIRMATIONS=2
LINK_CONTRACT_ADDRESS=0x20fE562d797A42Dcb3399062AE9546cd06f63280
CHAINLINK_TLS_PORT=0
SECURE_COOKIES=false
GAS_UPDATER_ENABLED=true
ALLOW_ORIGINS=*
ETH_URL=wss://ropsten.infura.io/ws/v3/<your-api-key>
DATABASE_URL=postgresql://postgres:password@localhost:5432/postgres
DATABASE_TIMEOUT=0" > ~/.chainlink-ropsten/.env
MIN_OUTGOING_CONFIRMATIONS
: 节点收回交易所须要的最小确认块数,在达到最小确认块数之前,同一个 run 不会开始下一个工作。如果不设置,默认值为 12。
LINK_CONTRACT_ADDRESS
: LINK token 的发行地址,这里有测试网和主网的 LINK 发行地址,您能够依据本人的网络进行配置。如果不进行配置,默认是主网的 LINK 发行地址。
GAS_UPDATER_ENABLED
: 如果设置为 true,节点会在提交事务失败时进步 gas 费用从新提交。默认为 false。
ETH_URL
: 以太坊客户端 WebSocket RPC 接口地址。您能够抉择自建以太坊客户端,也能够抉择第三方服务,只有提供 WebSocket 协定的 RPC 接口地址即可。
DATABASE_URL
: Chainlink 节点须要应用 PostgresSQL 数据库来进行一些数据的长久化存储。同样您能够抉择自建数据库或应用第三方数据库服务,只须要提供数据库地址能够让节点读写数据即可。
DATABASE_TIMEOUT
:数据库连贯超时等待时间。默认 500ms。
启动节点
cd ~/.chainlink-ropsten && docker run -p 6688:6688 -v ~/.chainlink-ropsten:/chainlink -it --env-file=.env smartcontract/chainlink local n
首次启动会首先要求管理员输出一个明码,这个明码是节点账户的 keystore 明码,这个明码必须牢记,失落的话没有方法找回,并且私钥所治理的资金也会失落。每次启动都会要求管理员输出这个明码,以解锁 keystore。节点须要通过 keystore 的私钥来签订交易,提交到区块链上。
接下来还会要求节点管理员输出一对邮箱账户和明码,用于登录节点治理页面。
测试节点
登录浏览器治理页面
浏览器中关上 ip:6688 地址,就能看到 Chainlink 节点治理页面的登录入口。用咱们在启动节点时填入的邮箱账户和明码,就能够登录到治理界面中了。
咱们先去到 **Configuration
** 标签页,会发现有一个ACCOUNT_ADDRESS
字段,这个 address 就是咱们在首次启动节点时候设置 keystore 明码的私钥所对应的地址,在节点提供服务之前,须要向这个地址转入 ETH,用于提交交易。
因为咱们应用的是 Ropsten 测试网络,所以咱们能够把这个地址复制到 Ropsten faucet 中,获取测试 ETH。如果您是服务于以太主网上的利用,须要您想这个账户地址手动转入 ETH。
创立 oracle 合约
Oracle 合约是 Chainlink 节点在区块链上的桥头堡,它与用户合约间接进行沟通,接管用户的预言机申请,将申请后果通过用户注册的回调函数,写入到用户的合约中。
Oracle 合约无需本人编写,咱们间接部署 Chainlink 开源的 Oracle 合约代码即可。如果用 remix 部署,只需新建一个蕴含上面两行代码的文件即可:
pragma solidity 0.6.6;
import "https://github.com/smartcontractkit/chainlink/evm-contracts/src/v0.6/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 服务的可用性。
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 = 0x5F66a231a29CE1513dc6c16407fDCe9D0aEE2cB0;
// 填入咱们刚刚创立的地址
jobId = "4b9b6e7d89154a8d855affed3985aafd";
// 领取给 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 预言机节点是否能够失常工作啦。
退出 Chainlink 开发者社区