Chainlink 入门 -- 基础工具篇

1. 什么是 Chainlink?

长久以来,区块链上运行的智能合约无法直接的与外部系统进行交流,这一瓶颈限制了智能合约应用场景。

如今,我们可以通过引入预言机(Oracle)的功能来解决这一问题,预言机可以为智能合约提供与外部世界的连接性。但是目前的预言机都是中心化的服务,这会给使用中心化预言机服务的智能合约带来单点故障的风险,使得智能合约的去中心化特性变得毫无意义。

为了解决这个问题,Chainlink开发了首个去中心化预言机项目,来向智能合约提供外部数据。有了这个武器,智能合约的安全性和确定性,与真实世界中发生的各类事件联系了起来。Chainlink将为您的智能合约提供获取任意外部API数据的能力。本文档列出了所有与之相关的信息。

  • 关键字:
    • 预言机
    • 去中心化

Chainlink 文档:https://docs.chain.link/docs/getting-started

1.1. 开发工具

1.1.1. Remix Solidity IDE

Remix 是一个网页端的集成开发环境,可以用它在浏览器里创建、运行、调试智能合约。它由以太坊基金会开发维护。通过 Solidity 开发智能合约所需的一切都在 Remix 的 WEB 界面上提供了,所以开发者无需自行搭建开发环境了。Remix 可以大大简化合约的部署方法,无需使用命令行界面即可方便的部署合约。

Remix 主要是编写 solidity 合约,编译,部署和调用。

IDE 地址:https://remix.ethereum.org/

1.1.2. MetaMask

MetaMask是一款浏览器插件钱包,不需下载安装客户端,只需添加至浏览器扩展程序即可使用。

使用 Remix Solidity IDE 的 Injected Web3 环境,配合 MetaMask 插件可方便部署智能合约到以太坊测试网或者主网

MetaMask 主要部署合约到测试网,进行合约的调试。

1.1.2.1. 安装 MetaMask

MetaMask 下载地址:https://metamask.io/download.html

  1. 安装好 MetaMaskChrome 插件后,点击 MetaMask 的小狐狸图标打开扩展程序。
  2. 创建一个新的账户。
  3. 您将会看到由12个单词组成的助记词,拷贝这12个助记词到一个只有你自己知道的安全的地方。
  4. 点击头像,进入设置,将网络从以太坊主网络(Main Ethereum Network)切换到 Kovan 测试网络(Ropsten Test Network)。

meta-mask-kovan-test-network

1.1.3. 测试网络

当前可用的以太坊测试网有如下:

  • 打开 LINK 代币的获取地址:https://kovan.chain.link/
  • MetaMask 中获取帐号地址,复制输入框中,点击 Send me 100 Test LINK 按钮
  • 点击 MetaMask 插件,点击添加代币,选择自定义代币,填写 LINK 代币的地址后自动填充代币信息,点击下一步,完成添加。
    • Rinkeby: 0x01BE23585060835E02B77ef475b0Cc51aA1e0709
    • Kovan : 0xa36085F69e2889c224210F603D836748e7dC0088

meta-mask-add-link-coins

1.2.2. PriceConsumerV3 获取 ETH/USD 汇率价格

  • 打开 Remix Solidity IDE 编辑器,在 Featured Plugins 选择 SOLIDITY
  • 复制合约代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
pragma solidity ^0.6.7;

import "https://github.com/smartcontractkit/chainlink/evm-contracts/src/v0.6/interfaces/AggregatorV3Interface.sol";

contract PriceConsumerV3 {

AggregatorV3Interface internal priceFeed;

/**
* Network: Kovan
* Aggregator: ETH/USD
* Address: 0x9326BFA02ADD2366b30bacB125260Af641031331
*/
constructor() public {
priceFeed = AggregatorV3Interface(0x9326BFA02ADD2366b30bacB125260Af641031331);
}

/**
* Returns the latest price
*/
function getLatestPrice() public view returns (int,uint80) {
(
uint80 roundID,
int price,
uint startedAt,
uint timeStamp,
uint80 answeredInRound
) = priceFeed.latestRoundData();
// If the round is not complete yet, timestamp is 0
require(timeStamp > 0, "Round not complete");
return (price,answeredInRound);
}
}

1.2.3. 调用 VFR 合约获取随机数

  • 打开 Remix Solidity IDE 编辑器,在 Featured Plugins 选择 SOLIDITY
  • 复制合约代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
pragma solidity 0.6.6;

import "https://github.com/smartcontractkit/chainlink/evm-contracts/src/v0.6/VRFConsumerBase.sol";

contract RandomNumberConsumer is VRFConsumerBase {

bytes32 internal keyHash;
uint256 internal fee;

uint256 public randomResult;

/**
* Constructor inherits VRFConsumerBase
*
* Network: Kovan
* Chainlink VRF Coordinator address: 0xdD3782915140c8f3b190B5D67eAc6dc5760C46E9
* LINK token address: 0xa36085F69e2889c224210F603D836748e7dC0088
* Key Hash: 0x6c3699283bda56ad74f6b855546325b68d482e983852a7a82979cc4807b641f4
*/
constructor()
VRFConsumerBase(
0xdD3782915140c8f3b190B5D67eAc6dc5760C46E9, // VRF Coordinator
0xa36085F69e2889c224210F603D836748e7dC0088 // LINK Token
) public
{
keyHash = 0x6c3699283bda56ad74f6b855546325b68d482e983852a7a82979cc4807b641f4;
fee = 0.1 * 10 ** 18; // 0.1 LINK
}

/**
* Requests randomness from a user-provided seed
*/
function getRandomNumber(uint256 userProvidedSeed) public returns (bytes32 requestId) {
require(LINK.balanceOf(address(this)) > fee, "Not enough LINK - fill contract with faucet");
return requestRandomness(keyHash, fee, userProvidedSeed);
}

/**
* Callback function used by VRF Coordinator
*/
function fulfillRandomness(bytes32 requestId, uint256 randomness) internal override {
randomResult = randomness;
}
}
  • 部署合约,获取部署的合约地址

    • 点击 Deploy 按钮时,会弹出 MetaMask 页面,点击确认继续
  • 重要:转入 LINK 代币到合约

    • 获取部署后合约的地址
    • MetaMask 向合约地址转入 LINK 代币

copy-deployed-contract-address

send-link-to-contract-address

  • 调用合约,获取随机数
    • 先发送获取随机数请求
    • 发送请求获取生成的随机数
      send-get-random-number

提示:

  • 如果没有向部署的合约转入 LINK 代币,会提示错误:Gas estimation errored with the following message (see below). The transaction execution will likely fail. Do you want to force sending?
  • The execution failed due to an exception. Reverted

chain-link-contract-with-on-link-coin-error-tip

Just for my love !!