接入Chainlink价格数据开发DeFi流动性挖矿dApp实例

本文将教大家如何使用Chainlink去中心化预言机开发一款DeFi应用,并奖励用户专属的ERC20通证。

# 接入Chainlink价格数据开发DeFi流动性挖矿dApp实例 ![](https://img.learnblockchain.cn/2020/11/16_/80079287.png) **本文将教大家如何使用Chainlink去中心化预言机开发一款DeFi应用,并奖励用户专属的ERC20通证。** ## 介绍 近期DeFi行业的火热让[DeFi](https://defi.chain.link/)、[流动性挖矿](https://www.coindesk.com/defi-yield-farming-comp-token-explained)、[权益质押](https://academy.binance.com/blockchain/what-is-staking)和[治理型通证 ](https://www.investopedia.com/tech/governance-why-crypto-investors-should-care/)都成为了热议话题。这些功能开发起来相对比较简单,因此本文将教大家如何基于[DeFi-Chainlink](https://github.com/PatrickAlphaC/chainlink_defi)代码库在十分钟内开发出一款DeFi流动性挖矿dApp。 这个项目受到[Dapp University](https://www.dappuniversity.com/)的Gregory启发,如果想要查看他的[项目代码库](https://github.com/dappuniversity/defi_tutorial)和[教学视频](https://www.youtube.com/watch?v=CgXQC4dbGUE&t=1397s),请点击链接。 ## 什么是流动性挖矿? 流动性挖矿指某一用户向DeFi协议提供流动性,以赚取费用、利息和激励等被动收益。比如,向一个去中心化贷款协议(如Aave)或自动做市商模式的去中心化交易所(如Uniswap)提供流动性,以赚取收益。流动性挖矿的目的是激活新平台的流动性,新平台往往因为没有用户而缺乏流动性,而没有流动性也无法吸引新用户加入,因此容易陷入恶性循环。流动性挖矿可以为平台早期的流动性提供方提供经济激励,解决上述问题。 用户在平台上质押资金,并获得相应利息,这种模式与银行的储蓄账户类似,平台会分给用户一部分平台费,以此激励他们提供流动性。最近,越来越多的平台发布了自己的治理型通证,并将通证奖励给初期的流动性提供方。这个模式很像银行的储蓄账户,开户并存入资金的新用户会得到银行发放的现金奖励。目前流动性挖矿仍是一个相对新颖的模式,因此其效用仍待考证。本文并不急于对这个问题下定论,而是向开发者社区展示如何在dApp中为流动性提供方提供激励并发放治理型通证作为奖励。 ## dApp的作用是什么? 本文将演示如何开发一个dApp,用户可以质押任何一种dApp内支持的[ERC20通证](https://www.investopedia.com/news/what-erc20-and-what-does-it-mean-ethereum/),并自动向流动性提供方发放治理型通证作为奖励。本文中的流动性挖矿通证是一个简单的ERC20智能合约,不存在投票功能,因此除了本示例以外没有任何实用价值。 用户收到的通证数量是dApp中的一个重要部分。用户收到的通证数量不能是随机的,我们要确保发送给他们的通证数量与他们在平台质押的资金量成正比。因此,我们需要接入质押资产的当前市场价格数据,实例中我们将接入[Chainlink去中心化价格数据](http://feeds.chain.link/)。 Chainlink等[去中心化预言机](https://defi.chain.link/)可以为我们提供可靠的价格数据,让我们计算平台上所有质押通证的价值。我们可以轻松将ERC20通证用以太币计价,以计算所有质押通证的总价值。 一旦用户在平台质押资产,就可以集成其他货币乐高获得更多利息收益,本文不包含这部分内容。比如说,你可以将用户通证质押到[Aave](https://aave.com/)或[Synthetix](https://www.synthetix.io/)等平台。 ## **快速启动** 要求: ``` Yarn Nodejs Truffle An ETH wallet with a mnemonic (like metamask), and set the MNEMONIC as an environment variable An RPC_URL from a node provider like [Infura](https://infura.io/) or use your own node. And set an RPC_URL environment variable. ``` 克隆代码库: ``` git clone https://github.com/PatrickAlphaC/chainlink_defi cd chainlink_defi ``` 安装依赖: ``` yarn ``` 在Kovan测试网部署智能合约,然后启动前端: ``` truffle migrate --network live --reset yarn start ``` 然后会出现这样一个窗口: ![](https://img.learnblockchain.cn/2020/11/16_/635083731.png) 现在在平台上可以质押一些通证。首先,需要点击确认,然后就可以向智能合约发送ERC20通证。一开始需要在钱包中充一些测试网LINK通证,你可以[点击此处获得Kovan LINK](https://kovan.chain.link/)。 ![](https://img.learnblockchain.cn/2020/11/16_/247251725.png) 点击两次确认后,就可以开始交易了。完成后,刷新页面可以看到最新的质押通证余额。 ![](https://img.learnblockchain.cn/2020/11/16_/807221697.png) 然后可以回到终端,发放奖励通证。可以在这里查看LINK/ETH汇率。平台会发放与我们的ERC20通证总值相等的DAPP通证(注:以以太币计价)。在我写这篇文章时,1个LINK价值等于0.03348个以太币,因此平台将收到0.3348个DAPP。那么运行以下命令发放通证: ``` truffle exec scripts/issue-token.js --network live ``` 操作完成后,你可以看到收到的DAPP通证数量。 ![](https://img.learnblockchain.cn/2020/11/16_/113361414.png) 你还可以一键转换通证类型。代码库包含Kovan测试网的三种默认ERC20通证,即:LINK、FAU和DappToken(由你来部署!) ## **项目运行机制** 项目主要功能包括两个智能合约,它们的前端都由react实现。 ``` DappToken.sol TokenFarm.sol ``` 如果你刚开始学习truffle,不知道`Migrations`文件是什么,请先查看[truffle文档](https://www.trufflesuite.com/docs/truffle/overview)。 我们先来做`DappToken.sol`,因为它最容易做,只是一个简单的ERC20通证。 几乎不用写什么代码就可以部署一个ERC20通证: ```javascript pragma solidity ^0.6.0; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; contract DappToken is ERC20 { constructor() public ERC20("DApp Token", "DAPP") { _mint(msg.sender, 1000000000000000000000000); } } ``` 安装openzepplin作为智能合约框架。导入的`ERC20.sol`包含Dapp通证作为ERC20通证所需的所有功能。在构造函数中给它命名,然后首次发行通证,进行部署。在演示中,我们使用了1,000,000个DAPP。(记住,末尾要加18个0,因为solidity/以太坊不带小数点。) 部署合约时,将1,000,000个DAPP通证全部发到TokenFarm智能合约中,平台用户获得的奖励全部来自这个智能合约。这些行为定义在migrations文件`3_deploy_tokenfarm.js`中。 ``` const tokenFarm = await TokenFarm.deployed(); await dappToken.transfer(tokenFarm.address, "1000000000000000000000000"); ``` `tokenfarm.sol`文件重要性更高,其中包含质押、取消质押以及查看用户余额等所有代码逻辑。为了追踪所有用户的质押资产余额和ERC20通证总额,我们将用户地址映射生成包含通证地址和通证数量的数据结构,并命名为`stakingBalance`。我们还可以映射生成以下数据: 1. 用户质押了多少独特的通证 2. 某一通证对以太币的价格数据 3. 平台支持的通证名单 4. 用户/流动性提供方名单 ``` mapping(address => mapping(address => uint256)) public stakingBalance; mapping(address => uint256) public uniqueTokensStaked; mapping(address => address) public tokenPriceFeedMapping; address[] allowedTokens; address[] public stakers; ``` 用户可以调用`stakeTokens`和`unstakeTokens`函数在平台上质押或取消质押通证。不过更有意思的是`getUserTotalValue`函数,这个函数会接入Chainlink去中心化预言机,获取可靠的价格数据,计算质押资产总值。 ```javascript function getUserTotalValue(address user) public view returns (uint256) { uint256 totalValue = 0; if (uniqueTokensStaked[user] > 0) { for ( uint256 allowedTokensIndex = 0; allowedTokensIndex < allowedTokens.length; allowedTokensIndex++ ) { totalValue = totalValue + getUserStakingBalanceEthValue( user, allowedTokens[allowedTokensIndex] ); } } return totalValue; } ``` `getUserStakingBalanceEthValue`函数可以获取某一用户的某一质押通证价值。 ```javascript function getUserStakingBalanceEthValue(address user, address token) public view returns (uint256) { if (uniqueTokensStaked[user] <= 0) { return 0; } return (stakingBalance[token][user] * getTokenEthPrice(token)) / (10**18); } ``` `getTokenEthPrice`函数可以获取Chainlink价格数据。 ```javascript function getTokenEthPrice(address token) public view returns (uint256) { address priceFeedAddress = tokenPriceFeedMapping[token]; AggregatorV3Interface priceFeed = AggregatorV3Interface( priceFeedAddress ); ( uint80 roundID, int256 price, uint256 startedAt, uint256 timeStamp, uint80 answeredInRound ) = priceFeed.latestRoundData(); return uint256(price); } ``` 需要添加通证对以太币的价格数据,以计算正确的价值。 欢迎大家使用这个代码库进行开发或发PR。智能合约开发者如果想要在项目中添加流动性挖矿功能,这是一个很好的起点。 现在,你的[DeFi](https://defipulse.com/)项目就可以接入Chainlink[去中心化预言机](https://defi.chain.link/)了! ## 参加Chainlink黑客松赢奖金 如果这篇文章对你有任何启发,欢迎参加[Chainlink黑客松](https://hack.chain.link/)尝试应用你新学到的技能!Chainlink黑客松的奖金超过5万美元,希望大家能踊跃参与!此次黑客松将重点关注DeFi项目,这将为各位进入DeFi领域打开大门。 如果当你读到这篇文章时黑客松已经结束了,那么也欢迎加入我们在[推特](https://twitter.com/chainlink)、[Discord](https://discord.gg/Szt3FYj)、[Youtube](https://www.youtube.com/channel/UCnjkrlqaWEBSnKZQ71gdyFA)或[Reddit](https://www.reddit.com/r/Chainlink/)上的社区,转发加上#chainlink和#ChainlinkEA标签。 如果Chainlink预言机可以为你目前开发的产品提供任何附加价值;抑或你希望参与Chainlink网络的开源开发工作,请查看Chainlink[开发者文档](https://docs.chain.link/)或加入我们在[Discord](https://discordapp.com/invite/aSK4zew)上的技术讨论群。

接入Chainlink价格数据开发DeFi流动性挖矿dApp实例

本文将教大家如何使用Chainlink去中心化预言机开发一款DeFi应用,并奖励用户专属的ERC20通证。

介绍

近期DeFi行业的火热让DeFi、流动性挖矿、权益质押和治理型通证 都成为了热议话题。这些功能开发起来相对比较简单,因此本文将教大家如何基于DeFi-Chainlink代码库在十分钟内开发出一款DeFi流动性挖矿dApp。

这个项目受到Dapp University的Gregory启发,如果想要查看他的项目代码库和教学视频,请点击链接。

什么是流动性挖矿?

流动性挖矿指某一用户向DeFi协议提供流动性,以赚取费用、利息和激励等被动收益。比如,向一个去中心化贷款协议(如Aave)或自动做市商模式的去中心化交易所(如Uniswap)提供流动性,以赚取收益。流动性挖矿的目的是激活新平台的流动性,新平台往往因为没有用户而缺乏流动性,而没有流动性也无法吸引新用户加入,因此容易陷入恶性循环。流动性挖矿可以为平台早期的流动性提供方提供经济激励,解决上述问题。

用户在平台上质押资金,并获得相应利息,这种模式与银行的储蓄账户类似,平台会分给用户一部分平台费,以此激励他们提供流动性。最近,越来越多的平台发布了自己的治理型通证,并将通证奖励给初期的流动性提供方。这个模式很像银行的储蓄账户,开户并存入资金的新用户会得到银行发放的现金奖励。目前流动性挖矿仍是一个相对新颖的模式,因此其效用仍待考证。本文并不急于对这个问题下定论,而是向开发者社区展示如何在dApp中为流动性提供方提供激励并发放治理型通证作为奖励。

dApp的作用是什么?

本文将演示如何开发一个dApp,用户可以质押任何一种dApp内支持的ERC20通证,并自动向流动性提供方发放治理型通证作为奖励。本文中的流动性挖矿通证是一个简单的ERC20智能合约,不存在投票功能,因此除了本示例以外没有任何实用价值。

用户收到的通证数量是dApp中的一个重要部分。用户收到的通证数量不能是随机的,我们要确保发送给他们的通证数量与他们在平台质押的资金量成正比。因此,我们需要接入质押资产的当前市场价格数据,实例中我们将接入Chainlink去中心化价格数据。

Chainlink等去中心化预言机可以为我们提供可靠的价格数据,让我们计算平台上所有质押通证的价值。我们可以轻松将ERC20通证用以太币计价,以计算所有质押通证的总价值。

一旦用户在平台质押资产,就可以集成其他货币乐高获得更多利息收益,本文不包含这部分内容。比如说,你可以将用户通证质押到Aave或Synthetix等平台。

快速启动

要求:

Yarn

Nodejs

Truffle

An ETH wallet with a mnemonic (like metamask), and set the MNEMONIC as an environment variable

An RPC_URL from a node provider like [Infura](https://infura.io/) or use your own node. And set an RPC_URL environment variable.

克隆代码库:

git clone https://github.com/PatrickAlphaC/chainlink_defi

cd chainlink_defi

安装依赖:

yarn

在Kovan测试网部署智能合约,然后启动前端:

truffle migrate --network live --reset

yarn start

然后会出现这样一个窗口:

现在在平台上可以质押一些通证。首先,需要点击确认,然后就可以向智能合约发送ERC20通证。一开始需要在钱包中充一些测试网LINK通证,你可以点击此处获得Kovan LINK。

点击两次确认后,就可以开始交易了。完成后,刷新页面可以看到最新的质押通证余额。

然后可以回到终端,发放奖励通证。可以在这里查看LINK/ETH汇率。平台会发放与我们的ERC20通证总值相等的DAPP通证(注:以以太币计价)。在我写这篇文章时,1个LINK价值等于0.03348个以太币,因此平台将收到0.3348个DAPP。那么运行以下命令发放通证:

truffle exec scripts/issue-token.js --network live

操作完成后,你可以看到收到的DAPP通证数量。

你还可以一键转换通证类型。代码库包含Kovan测试网的三种默认ERC20通证,即:LINK、FAU和DappToken(由你来部署!)

项目运行机制

项目主要功能包括两个智能合约,它们的前端都由react实现。

DappToken.sol
TokenFarm.sol

如果你刚开始学习truffle,不知道Migrations文件是什么,请先查看truffle文档。

我们先来做DappToken.sol,因为它最容易做,只是一个简单的ERC20通证。

几乎不用写什么代码就可以部署一个ERC20通证:

pragma solidity ^0.6.0;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";

contract DappToken is ERC20 {
   constructor() public ERC20("DApp Token", "DAPP") {
       _mint(msg.sender, 1000000000000000000000000);
   }
}

安装openzepplin作为智能合约框架。导入的ERC20.sol包含Dapp通证作为ERC20通证所需的所有功能。在构造函数中给它命名,然后首次发行通证,进行部署。在演示中,我们使用了1,000,000个DAPP。(记住,末尾要加18个0,因为solidity/以太坊不带小数点。)

部署合约时,将1,000,000个DAPP通证全部发到TokenFarm智能合约中,平台用户获得的奖励全部来自这个智能合约。这些行为定义在migrations文件3_deploy_tokenfarm.js中。

const tokenFarm = await TokenFarm.deployed();
await dappToken.transfer(tokenFarm.address, "1000000000000000000000000");

tokenfarm.sol文件重要性更高,其中包含质押、取消质押以及查看用户余额等所有代码逻辑。为了追踪所有用户的质押资产余额和ERC20通证总额,我们将用户地址映射生成包含通证地址和通证数量的数据结构,并命名为stakingBalance。我们还可以映射生成以下数据:

  1. 用户质押了多少独特的通证

  2. 某一通证对以太币的价格数据

  3. 平台支持的通证名单

  4. 用户/流动性提供方名单

   mapping(address => mapping(address => uint256)) public stakingBalance;
   mapping(address => uint256) public uniqueTokensStaked;
   mapping(address => address) public tokenPriceFeedMapping;
   address[] allowedTokens;
   address[] public stakers;

用户可以调用stakeTokensunstakeTokens函数在平台上质押或取消质押通证。不过更有意思的是getUserTotalValue函数,这个函数会接入Chainlink去中心化预言机,获取可靠的价格数据,计算质押资产总值。

function getUserTotalValue(address user) public view returns (uint256) {
       uint256 totalValue = 0;
       if (uniqueTokensStaked[user] > 0) {
           for (
               uint256 allowedTokensIndex = 0;
               allowedTokensIndex &lt; allowedTokens.length;
               allowedTokensIndex++
           ) {
               totalValue =
                   totalValue +
                   getUserStakingBalanceEthValue(
                       user,
                       allowedTokens[allowedTokensIndex]
                   );
           }
       }
       return totalValue;
   }

getUserStakingBalanceEthValue函数可以获取某一用户的某一质押通证价值。

function getUserStakingBalanceEthValue(address user, address token)
       public
       view
       returns (uint256)
   {
       if (uniqueTokensStaked[user] &lt;= 0) {
           return 0;
       }
       return
           (stakingBalance[token][user] * getTokenEthPrice(token)) / (10**18);
   }

getTokenEthPrice函数可以获取Chainlink价格数据。

   function getTokenEthPrice(address token) public view returns (uint256) {
       address priceFeedAddress = tokenPriceFeedMapping[token];
       AggregatorV3Interface priceFeed = AggregatorV3Interface(
           priceFeedAddress
       );
       (
           uint80 roundID,
           int256 price,
           uint256 startedAt,
           uint256 timeStamp,
           uint80 answeredInRound
       ) = priceFeed.latestRoundData();
       return uint256(price);
   }

需要添加通证对以太币的价格数据,以计算正确的价值。

欢迎大家使用这个代码库进行开发或发PR。智能合约开发者如果想要在项目中添加流动性挖矿功能,这是一个很好的起点。

现在,你的DeFi项目就可以接入Chainlink去中心化预言机了!

参加Chainlink黑客松赢奖金

如果这篇文章对你有任何启发,欢迎参加Chainlink黑客松尝试应用你新学到的技能!Chainlink黑客松的奖金超过5万美元,希望大家能踊跃参与!此次黑客松将重点关注DeFi项目,这将为各位进入DeFi领域打开大门。

如果当你读到这篇文章时黑客松已经结束了,那么也欢迎加入我们在推特、Discord、Youtube或Reddit上的社区,转发加上#chainlink和#ChainlinkEA标签。

如果Chainlink预言机可以为你目前开发的产品提供任何附加价值;抑或你希望参与Chainlink网络的开源开发工作,请查看Chainlink开发者文档或加入我们在Discord上的技术讨论群。

区块链技术网。

  • 发表于 2020-11-13 14:52
  • 阅读 ( 1054 )
  • 学分 ( 34 )
  • 分类:预言机

评论