前言
Chainlink是一个去中心化的预言机网络,它可以让区块链中的智能合约安全地访问外部世界的数据。在这个教程中,你将学习到如何最快自建Chainlink的节点,并发送一笔交易请求。
什么是Chainlink节点
Chainlink 基于ETH 链,但并不是ERC20,而是 ERC677 合约。
它是 ERC20 合约的一个扩展,兼容 ERC20 协议标准,可以在转账时携带数据,并触发接收合约的业务逻辑,扩大了智能合约的应用场景。
目前,Chainlink已经能实现的包括但不限于:
- 分布式价格推送
- 随机函数,链上随机数
- 外部适配器连接链外资源
- 其他预言机网络服务
Chainlink丰富的 节点与合约市场 使其成为了全球领先的预言机网络平台。
成为Chainlink认证的节点提供商,将会获得节点运营奖励。
怎么搭建
我们先从Chainlink的测试网kovan上开始,你需要:
- 一台linux云服务器,以ubuntu为例
- 一个postgresql数据库
- 一个eth节点
本教程以google cloud为例,你也可以选用国内的阿里云,两者都支持postgresql数据库。笔者一开始选择的是vultr云服务器,后台并没有自带数据库,需要自己搭建,比较复杂就不赘述。
由于国内用户对GCloud并不熟悉,所以说得详细一些。
第一步 配置GCloud
登陆 https://cloud.google.com/ 注册一下,绑定一张visa信用卡。新用户会获得300美元的奖励金,用完以前是免费的。
进入控制台:
接下来先配置虚拟机网络,然后再配置数据库。因为数据库会用到前面的网络实例。
配置虚机网络,如图所示:
选择库,在跳出的搜索框里输入 networking
,选择列表下方的第一个并应用。
选择PostgreSQL 数据库。
PostgreSQL是目前最强大的开源对象关系型数据库,Chainlink用的是这个数据库。(注:ETH 使用的是开源NOSQL数据库,leveldb)
记得在连接一栏把专用IP也勾上。
创建的过程需要等待5分钟左右,喝杯咖啡休息一下:)
至此,服务器部分已经配置完了。
第二步 运行Chainlink节点
此处参考 官方教程:运行一个节点,是英文版的。
首先,我们需要登陆这台服务器。
google提供了5种办法登陆,你可以图省事直接点击在浏览器中打开
,并使用内置的客户端直连。
但是由于我们之后需要在本机的浏览器里直接输入localhost
访问节点配置页面,所以我们选择用 gcloud去登陆它。详细文档请参考: gcloud文档 。
初次使用先安装 Cloud SDK,windows mac linux都有。
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
就这样,系统自动打开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节点的以太坊客户端选择。
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
首次启动成功以后会让你输入登陆的邮件和密码。如果没有到这一步就没有成功。
好了!到这里已经初步成功。
总结:
- gcloud auth login
- ssh tunnel
- start node command
第三步 配置Chainlink节点
由于我们已经配置了ssh tunnel,此时可以在本机的浏览器中输入http://localhost:6688/signin 直接打开
如果需要在gcloud开放外网端口,通过公网IP访问,请参考这篇文章:
https://www.vediotalk.com/archives/2481
在浏览器中输入刚才命令行里配置的邮件和密码,点击登录。右边可以看到我们还没有 Kovan 测试网的 ETH币和Chainlink代币。
发送交易
总结一下接下来要做的三步:
- 添加JobId
- Oracle合约
- TestnetConsumer合约
虽然我们现在还不会写合约,但是可以用已有的solidity代码感受一下。
接下去主要用到两个合约,第一个是Oracle.sol。我们用它来将我们的节点注册到测试网上。
在编译这个合约的时候传入主网或测试网Link地址,还需要关注 setFulfillmentPermission 这个函数,表示允许该节点接受请求。
第二个是 ATestnetConsumer.sol 。主要关注 requestEthereumPrice 函数。这个函数让我们可以获取eth的价格。
我们的节点目前还空空如也,我们可以在上面添加一个Job,让它能够承载一定的服务。
复制一段接收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上的合约,我们只需要运行并部署就行了。
点开左侧部署过的Oracle合约,在 setFulfillmentPermission
右边填上参数:
"0x474fCD2f21B9916C0c0e852550E1f586fE1DeB4e", true。
点击红圈等待矿工确认交易,控制台就出现了调用该函数成功的交易。绿色的勾表示调用成功✔
接下去切回浏览器的 New Job页面,将刚才复制的Oracle合约地址填入address里。
这表示使用该任务的时候都需要传入该合约地址。
然后Create Job.
好了,大功告成!记得复制一下成功后弹出的 JobId.
现在,让我们来试着获取一下实时的 ETH的价格。
新建一个 TestNode.sol,复制 https://raw.githubusercontent... 里的代码进去:
同样编译部署以后,在下方 ATestnetConsumer 合约中的 requestEthereumPrice
方法中填入两个参数。第一个参数是Oracle合约地址,另一个是JobId,例如:
"0x12E5bB28a72182e96bd0b47f4079a59ABB09f221","5a9c8ed5a27e487dbbebb7f88b170f5d"
然后在点击该方法以前,记得往合约中打入一定数量的Link代币。因为执行合约会消耗 gas token,如果没有会弹出错误框。
可以在控制台看到我们传入的参数,已经成功了!
此时,点击左侧的 currentPrice
方法,就能看到最新的 ETH 价格了: