http://www.7klian.com

利用Chainlink预言机,十分钟开拓一个DeFi项目

    return ref.getAnswer(latest – _back);
  deployer.deploy(ReferenceConsumer, “0x882906a758207FeA9F21e0bb7d2f24E561bd0981”);
}
    setChainlinkToken(_link);
}
这样其实一个最简朴的 Chainlink 消费者合约就建设完成了,下面是一段完整的代码,虽然你也可以在此之上添加一些其他函数,好比提取 LINK、打消请求等等。
  }
  function requestEthereumPrice(string memory _currency, uint256 _payment) public {
const ReferenceConsumer = artifacts.require(“ReferenceConsumer”);
    “JPY”: 1018295.17,
AggregatorInterface internal ref;
import “@chainlink/contracts/src/v0.6/ChainlinkClient.sol”;
    public
import “@chainlink/contracts/src/v0.4/interfaces/AggregatorInterface.sol”;
truffle init
  }
7 编写测试剧本挪用合约
    return ref.getLatestRound();
    emit RequestFulfilled(_requestId, _price);
{
    bytes32 internal specId;
npm install @chainlink/contracts –save
}
}
  function fulfill(bytes32 _requestId, bytes32 _price)
module.exports = function(deployer) {
我们别离就对这个几个要领做个包装就可以然后就可以获取到 BTC/USD 的价值啦。下面的一段完整的代码,各人可以在这个基本上,插手一些其他的业务逻辑,就可以建设一个 DeFi 项目啦。
返回的价值功效中,所有 USD 参考数据合约的功效值会乘以 100000000,所有 ETH 参考数据合约的功效值会乘以 1000000000000000000。
个中的主要语句就是通过 buildChainlinkRequest 建设了一个 Chainlink 请求,该请求会提倡一次 LINK 的转账到 Oracle 地点,并附带请求数据。请求数据可以通过 add 的要领添加到请求中。请求数据可以包罗:请求地点、理会路径、倍数等。
module.exports = async callback => {
由于提倡 Chainlink 请求需要向 Oracle 付出 LINK 作为用度,所以我们的用户合约需要拥有 LINK 才气乐成获取数据。所以我们需要向方才陈设好的 MyContract 合约转入一部门 LINK。每次请求的用度可以按照所选择的 Oracle 要求的用度来付出。
truffle migrate –network ropsten
  onlyOwner()
import “@chainlink/contracts/src/v0.4/interfaces/AggregatorInterface.sol”;
pragma solidity ^0.6.0;
  }
    Chainlink.Request memory req = buildChainlinkRequest(specId, _callback, this.fulfill.selector);
1 建设 truffle 项目
    req.addStringArray(“path”, path);
https://min-api.cryptocompare.com/data/price?fsym=BTC&tsyms=USD,JPY,EUR
    requestEthereumPriceByCallback(_currency, _payment, address(this));
 
setter 方法:
在合约中通过结构函数可能编写 setter 要领,设置好我们想要的参考合约的地点
  }
6 编写测试剧本
    function fulfill(bytes32 _requestId, bytes32 _price)
const MyContract = artifacts.require(‘MyContract’)
  function getPreviousAnswer(uint256 _back) public view returns (int256) {
 
  ref = AggregatorInterface(_aggregator);
会见这个接口,会返回一个 JSON 工具,提供当前时间,BTC 别离相对付美元、日元、欧元的价值。
constructor(address _aggregator) public {
  bytes32 internal specId;
npx truffle exec scripts/request.js  –network ropsten
  AggregatorInterface internal ref;
}
    uint256 latest = ref.latestRound();
    req.add(“get”, “https://min-api.cryptocompare.com/data/price?fsym=ETH&tsyms=USD,EUR,JPY”);
// MyContract 通过担任 Chainlinked 合约得到了建设Chainlink请求的成果
我们就选择 Ropsten 网络下的 BTC/USD 生意业务对的合约,地点为 0x882906a758207FeA9F21e0bb7d2f24E561bd0981
接下来我们就可以挪用合约来获取我们想要的数据了。我们可以利用 truffle 给我们提供的节制台,也可以本身编写剧本文件来测试。剧本文件的编写也很是简朴,我们写一个请求的文件和一个读取的文件
    requestEthereumPriceByCallback(_currency, _payment, address(this));
  }
mkdir RefereceData
  }
3 建设用户合约
  const rc = await ReferenceConsumer.deployed()
  }
mkdir MyChainlinkedContract
  constructor(address _aggregator) public {
latestTimestamp() 最新一次聚合的时间戳
AggregatorInterface internal ref;
    sendChainlinkRequest(req, _payment);
 
    bytes32 indexed requestId,  // User-defined ID
  function requestEthereumPriceByCallback(string memory _currency, uint256 _payment, address _callback) public {
  );
    specId = _specId;
npx truffle exec scripts/read.js  –network ropsten
latestAnswer() 最新的聚合功效
2._oracle 所
利用的 Oracle 合约地点。假如您不知道选择什么哪个 Oracle,可以前往 Chainlink 市场 market.link 上选择。
getTimestamp(uint256 roundId) 通过轮次号获取汗青时间戳
    Chainlink.Request memory req = buildChainlinkRequest(specId, _callback, this.fulfill.selector);
    currentPrice = _price;
    specId = _specId;
const MyContract = artifacts.require(‘MyContract’)
  function getLatestRound() public view returns (uint256) {
contract ReferenceConsumer {
1 新建项目
npx truffle exec scripts/getdata.js  –network ropsten
首先我们先简朴回首一下,,一般环境下我们如何利用 Chainlink 来获取真实世界中的价值数据。我们知道,价值是通过生意业务来发生的,所以最直接的方法是通过生意业务所提供的接口来获取某个生意业务所的某个的价值。可是这只是来自于一个生意业务所的数据,大概会有个别性的误差。有一些加密钱币行情网站,他们会汇总多个生意业务所的数据,可能按照本身的指标来计较数据,获得一个偏离度较量小也就是更真实的数据。所以我们就回收从行情网站的接口得到数据,然后通过提交生意业务,将价值数据送到智能合约中。
简朴来说,Chainlink 价值参考数据提供的价值是在链上可以直接会见的,不需要通过我们指定 API 来手动获取。
getAnswer(uint256 roundId) 通过轮次号获取汗青功效
request.js
我们新建一个目次就叫 RefereceData,然后用上面的的方法成立一个 truffle 项目:
  }
cd RefereceData
5 利用参考合约获取价值数据
  ref = AggregatorInterface(_aggregator);
contract MyContract is ChainlinkClient {
    path[0] = _currency;
├── test
{
const ReferenceConsumer = artifacts.require(‘ReferenceConsumer’)
    emit RequestFulfilled(_requestId, _price);
1._link 所利用网络情况下的 LINK token 地点
│   └── 1_initial_migration.js
    req.add(“get”, “https://min-api.cryptocompare.com/data/price?fsym=BTC&tsyms=USD,EUR,JPY”);
    require(_back <= latest, “Not enough history”);
乐成之后稍等一段时间,因为需要网络对生意业务简直认,然后再通过以下呼吁读取 Oracle 获取到的数据。
下面我们就来讲一下 Chainlink 价值参考数据合约应该怎么来利用。
    “USD”: 9460.99,
  public
  function requestEthereumPrice(string memory _currency, uint256 _payment) public {
  bytes32 public currentPrice;
  callback(console.log(parseInt(data)))
}
  function getLatestTimestamp() public view returns (uint256) {
我们在 contracts 目次中新建一个合约文件 MyContract.sol,在文件中新建一个合约,担任自 ChainlinkClient 合约,并配置结构函数,参数别离是:
  callback(tx.tx)
  }
  const tx = await mc.requestEthereumPrice(‘USD’, ‘1000000000000000000’)
  function requestEthereumPriceByCallback(string memory _currency, uint256 _payment, address _callback) public {
接下来我们就可以编写建设 Chainlink 请求的代码
}
顺利的话,节制台上会打出当前 BTC 的价值 9352
  const mc = await MyContract.deployed()
    sendChainlinkRequest(req, _payment);
npm install @chainlink/contracts –save
    recordChainlinkFulfillment(_requestId)
结构函数方法:
    req.addStringArray(“path”, path);
    bytes32 indexed requestId,  // User-defined ID
AggregatorInterface 接口给我们提供了 5 个要领供我们利用别离是:
  }
│   └── Migrations.sol
您可以用您喜欢的编辑器东西,好比 VS Code, 打开项目目次。目次布局如下:
2 新建用户合约文件
  {
    “EUR”: 8640.8
};
module.exports = async callback => {
    string[] memory path = new string[](1);

Chainlink价值参考数据合约是可以在智能合约网络中值得依赖的真实价值数据的链上参考点。这些合约由多个 Chainlink 节点按时更新,提供高精度,高频率,可定制化的 DeFi 价值参考数据,可以利便的为 DeFi 项目标开拓提供开箱即用的不变基本设施。本文我们会教你如何利用这些合约。除此之外,Chainlink 还提供了通过获取链下数据的方法,从用户指定的 API 获取价值数据。我们下面就先容一下这两种方法。
function setReferenceContract(address _aggregator)
module.exports = async callback => {
  }
pragma solidity ^0.4.24;
    public
}
    setChainlinkOracle(_oracle);
然后陈设到 Ropsten 网络上。
通过以下呼吁执行该测试剧本:
  const data = await rc.getLatestAnswer()
pragma solidity ^0.6.0;
6 完整示例
在 scripts 目次下新建一个测试文件,好比叫 getdata.js
├── contracts
    return ref.latestTimestamp();
Chainlink 的价值参考数据是专门为 DeFi 项目设计的
预言机,网址是 feeds.chain.link。Chainlink 的价值参考数据预言机网络极大晋升了以太坊上 Dapp 数据的安详性和靠得住性,并且大大加快了新 DeFi 产物乐成上线的速度。Chainlink 在去中心化的预言机网络中提供价值参考数据,这是一个共享资源社区,并受到用户支持。用户利用这些预言机网络的本钱要低于本身传输数据的本钱,并且由于预言机网络是去中心化的,安详程度也会大幅晋升。更多的信息可以参考这篇博文。
.
  event RequestFulfilled(
  );
    return ref.getTimestamp(latest – _back);
4 将用户合约陈设到 Ropsten 测试网络上
有了 Chainlink 的价值参考数据合约,DeFi 的
开拓变得很是简朴了,开拓者只需要存眷本身的金融方面的业务逻辑即可。https://feeds.chain.link网站上列出了很是多的利用 Chainlink 价值参考数据的 DeFi 项目,他们都是开源的,我们也可以去他们的 GitHub 页面,去进修如何用 Chainlink 来设计一个 DeFi 项目。

    setChainlinkOracle(_oracle);
cd MyChainlinkedContract
├── migrations
  callback(console.log(parseInt(data)))
  const mc = await MyContract.deployed()
    setChainlinkToken(_link);
3 找到我们需要的参考数据合约地点
    path[0] = _currency;
  function getPreviousTimestamp(uint256 _back) public view returns (uint256) {
    string[] memory path = new string[](1);
    uint256 latest = ref.latestRound();
2 安装 Chainlink 开拓库
    currentPrice = _price;
  }
一切顺利的话就会在节制台获得 920089000000 的功效,这就是当前 BTC 的价值,即 9200.89。
  event RequestFulfilled(
read.js
利用价值参考数据合约和上面的直接从链下获取的方法是有很打差异的,我们先来相识一下 Chainlink 的价值参考数据合约。
别的我们还需要界说一个回调函数来吸收 Oracle 获取到的功效,这个函数需要作为参数在构建 Chainlink 请求时传入到函数 buildChainlinkRequest 中:
Chainlink文档中给我们提供了很是多生意业务对的参考合约地点,不只有主网的地点,尚有 Ropsten、Rinkeby、Kovan 测试网的合约地点。
价值参考数据 Reference Data
直接从 API 获取价值
  function getLatestAnswer() public view returns (int256) {
    bytes32 indexed price
这样,我们就以一个很是直接的方法,通过一个我们指定的 API,完成了一个在合约中获取 BTC 价值数据的用例。
latestRound() 最新一次聚合的轮次号
我们选择的行情网站的 cryptocompare,它提供了一些很是好用的 API 来提供种种生意业务市场上的信息。我们就以它文档上给出的一个 API 来作为例子:
  }
5 向合约地点转入LINK
import “@chainlink/contracts/src/v0.6/ChainlinkClient.sol”;
在 constracts 目次下新建一个 ReferenceConsumer.sol 文件,文件中需要引入聚合接口合约 AggregatorInterface:
  constructor(address _link, address _oracle, bytes32 _specId) public {
  }
    ref = AggregatorInterface(_aggregator);
  constructor(address _link, address _oracle, bytes32 _specId) public {
  const data = await mc.currentPrice.call()
    recordChainlinkFulfillment(_requestId)
└── truffle-config.j
我们设置好 truffle 的 config 文件中的 Ropsten network 字段和相关的 provider,添加一个 migration 文件,通过下面的呼吁,将我们的用户合约陈设到 Ropsten 测试网络上。
3._specId 即 jobId,用于完陈类型呼吁序列的任务 ID,同样可在 Chainlink 市场 market.link 上对应的 Oracle 下选择。
假如您还没有安装 truffle suite, 可以通过 npm install truffle -g 来安装。
}
好的,下面我们就来编写合约来获取 BTC 的美元价值。
truffle init
通过以下呼吁来挪用请求剧本:
    require(_back <= latest, “Not enough history”);
 
在 Migrations 目次下新建一个文件 2_referenceconsumer_migration.js ,将我们上面查到的 BTC/USD 的参考合约地点在陈设时传入结构函数中:
4 设置参考合约地点
  {
    return ref.latestAnswer();
    bytes32 indexed price
contract MyContract is ChainlinkClient {

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

相关文章阅读