VictorLink价格服务
简介
智能合约经常需要对真实世界的代币资产价格做响应,在 DeFi 领域更是如此,资产价格必须和真实世界价格高度对应, 否则用户和开发者可能承受合约被套利或攻击带来的损失。
VictorLink 价格服务专注于数字货币价格对, 为 DApp 提供准确稳定的外部世界数字货币价格信息。
VictorLink 官方提供了聚合多个 VictorLink 预言机节点价格数据的方案,最终得到稳定的价格服务,称作喂价合约(Price Feed Contract).
本文介绍如何使用和部署 VictorLink 价格服务合约。
获取最新价格
消费者合约中获取最新价格数据需要引入 AggregatorInterface, 该接口定义了喂价服务对外提供的接口。
pragma solidity ^0.5.0;
interface AggregatorInterface {
function latestAnswer() external view returns (int256);
function latestTimestamp() external view returns (uint256);
function latestRound() external view returns (uint256);
function getAnswer(uint256 roundId) external view returns (int256);
function getTimestamp(uint256 roundId) external view returns (uint256);
}
contract PriceConsumer {
AggregatorInterface internal priceFeed;
/**
* Price Aggregator Address: Vxxxxxxxxxxxx
*/
constructor() public {
priceFeed = AggregatorInterface(0xxxxxxxxxxxaaaaa);
}
/**
* Returns the latest price
*/
function getLatestPrice() public view returns (int) {
// If the round is not complete yet, timestamp is 0
require(priceFeed.latestTimestamp() > 0, "Round not complete");
return priceFeed.latestAnswer();
}
}
历史价格
由 AggregatorInterface 接口函数列表,通过 getAnswer(uint256 roundId) 可以获取历史价格信息。对应的时间戳通过 getTimestamp(uint256 roundId) 获得。
喂价合约
测试网
VS-USDT | ||
VCT-USDT |
申请新交易对 请联系官方人员
部署价格服务
开发者也可以部署自己的价格服务,自定义价格来源和最少响应预言机个数。
生产环境情况下,应该需要多个预言机节点来喂价,然后通过聚合得到一个最终的价格。 但在测试的流程下,我们暂且只设置一个节点来喂价。简化测试展示流程。
部署喂价合约
VisionUser 合约是 VictorLink 官方推出的聚合价格服务合约模板,该合约实现了 AggregatorInterface 接口,开发者可以直接使用。
合约代码位于 VisionUser.sol(https://github.com/vision-consensus/victorlink/blob/master/vvm-contracts/v1.0/VisionUser.sol)
部署 VisionUser 合约时需要在构造函数提供 VCT 代币地址和 VictorMid 合约地址。例如 Vpioneer 测试网中,需要提供 (Vxxxxxxx, Vyyyyyyy)
添加预言机节点以及 job ID
VisionUser 合约部署完毕后,合约 owner 需要为其设置所聚合请求的预言机服务列表。使用如下接口:
function updateRequestDetails(uint128 _paymentAmount, uint128 _minimumResponses, address[] _oracles, bytes32[] _jobIds)
其中 _paymentAmount 表示每次更新调用所支付代币数量。
_oracles 和 _jobIds 是一对等长列表,每组对应一个VictorLink 预言机 job 唯一标识。
_minimumResponses 表示需要的最少响应预言机个数,必须大于等于 _oracles 长度。 例如可以设置要求至少 5/10 个预言机响应后,本次更新值才有效。
示例调用 updateRequestDetails(10, 1, ["Vxxxxxxxssssaa"], ["db22ccf4b4a14d0cae2a0757632e425d"]).
为合约转入 VCT 代币
VisionUser 合约需要使用 transferAndCall 调用 Oracle 合约,所以合约账户需要有足够的 VCT 代币。 可以通过转账或测试网水龙头为合约转入若干 VCT 代币。
调用喂价合约
1.更新价格 requestRateUpdate
使用如下接口请求 VictorLink 预言机节点从外部数据源获取最新价格:
function requestRateUpdate() returns (bytes32)
接口返回 requestID. 通过 requestID 可以取消更新价格请求。
2.获取最新价格 latestAnswer
使用 AggregatorInterface 中的 latestAnswer() 调用可以获取最新价格。
TronScan 的合约信息页面可以直接调用该方法获得最新值。
Updated over 2 years ago