按关键词阅读:
文章插图
DeFi这个大类下包含许多智能合约应用场景 , 如区块链投票、去中心化彩票、流动性挖矿以及去中心化交易平台 。 本文将教大家如何使用Chainlink喂价预言机在以太坊主网上用Solidity开发简单的看涨期权DeFi交易平台 。 当然 , 你也可以将这个实例稍作修改 , 开发一个看跌期权交易平台 。 这个平台拥有一个强大的功能 , 那就是所有价值转移都通过智能合约进行 , 交易双方可以绕过中间方直接展开交易 。 因此 , 这个过程不包含任何第三方 , 只包含智能合约和去中心化的Chainlink喂价 , 这就是最典型的DeFi应用 。 开发一个去中心化期权交易平台将涵盖以下内容:
- 在Solidity中对比字符串
- 将整数转换成固定位数的小数
- 创建并初始化一个通证接口 , 比如LINK
- 在用户/智能合约之间转移通证
- 批准通证转移
- SafeMath
- 智能合约ABI接口
- 用require执行交易状态
- 以太坊msg.Value及其与通证价值交易的区别
- 在int和uint之间进行转换
- 应付(payable)的地址
- 最后 , 用Chainlink数据聚合商的接口获取DeFi价格数据
- 行权价格:约定的资产买进/卖出价格
- 期权费用:购买合约时支付给卖家的费用
- 到期日:合约终止的时间
- 行权:买家行使其权利以行权价格买卖资产的行为
pragma solidity ^0.6.7;
import "";
import "";
import "";
contract chainlinkOptions {
//溢出安全操作符
using SafeMath for uint;
//喂价接口
AggregatorV3Interface internal ethFeed;
AggregatorV3Interface internal linkFeed;
//LINK通证接口
LinkTokenInterface internal LINK;
uint ethPrice;
uint linkPrice;
//预计算字符串哈希值
bytes32 ethHash = keccak256(abi.encodePacked("ETH"));
bytes32 linkHash = keccak256(abi.encodePacked("LINK"));
address payable contractAddr;
//期权以结构数组形式储存
struct option {
uint strike; //Price in USD (18 decimal places) option allows buyer to purchase tokens at
uint premium; //Fee in contract token that option writer charges
uint expiry; //Unix timestamp of expiration time
uint amount; //Amount of tokens the option contract is for
bool exercised; //Has option been exercised
bool canceled; //Has option been canceled
uint id; //Unique ID of option, also array index
uint latestCost; //Helper to show last updated cost to exercise
address payable writer; //Issuer of option
address payable buyer; //Buyer of option
}
option public ethOpts;
option public linkOpts;
//Kovan喂价:
constructor public {
//以太币/美元的Kovan喂价
ethFeed = AggregatorV3Interface(0x9326BFA02ADD2366b30bacB125260Af641031331);
//LINK/美元的Kovan喂价
linkFeed = AggregatorV3Interface(0x396c5E36DD0a0F5a5D33dae44368D4193f69a1F0);
//Kovan上的LINK通证地址
LINK = LinkTokenInterface(0xa36085F69e2889c224210F603D836748e7dC0088);
contractAddr = payable(address(this));
}
在导入时 , 我们需要接入Chainlink的数据聚合商接口实现喂价功能 , 并接入LINK通证接口(注:这里我们要用LINK转账 , 因此需要使用通证合约的ERC20功能) 。 最后 , 我们导入OpenZeppelin的SafeMath合约 , 这是执行内置溢出检查运算的标准库 , 而Solidity的内置操作符中不包含溢出检查 。
接下来 , 我们重新定义运算类型和uint , 使用导入的SafeMath , 定义我们的喂价、LINK接口、价格变量 , 计算以太币和LINK字符串的keccak256哈希值(之后会用到) , 以及地址变量来储存我们的合约地址 。 要注意一点 , 地址被定义为“应付”(payable) , 因为我们的合约需要用这个地址收款 。 接着 , 在构建完成后将接口初始化成Kovan合约地址 , 这样就可以调用合约函数 , 并用“address(this)”设置合约地址 。 我们再将地址转换成“应付”(payable) , 因为否则address 会返回无法支付的地址类型 。 至于期权本身的数据类型 , 可以用一个结构数组 , 也可以用结构链表 。 使用标准数组的好处是我们可以直接访问期权 , 这是链表无法做到的 , 但同时 , 删除标准数组中的值计算成本非常高 。 因此 , 我们不对期权做删除操作 , 而只将它们标记为“到期”或“取消” , 这样就能牺牲储存空间以换取计算速度和简便性 。 最后 , 期权的买卖和行权可以通过O(1) operations降低gas费用 。
稿源:(未知)
【傻大方】网址:http://www.shadafang.com/c/111J2I3H020.html
标题:接入去中心化预言机Chainlink喂价开发DeFi看涨期权交易平台实例