随着DeFi的大规模应用,区块链预言机解决方案成为了热议话题,许多人都很关心如何有效地使用预言机安全访问优质数据。而智能合约如果要产生实际价值,就必须通过一个可靠的机制与底层区块链以外的数据进行交互。Chainlink为智能合约开发者提供了一套预言机解决方案,帮助链上应用与链下数据以多种方式进行交互。
智能合约开发者可以获得哪些核心功能?
· 价格数据—精准的去中心化价格数据,覆盖多个市场。
· 访问任何API接口—通过POST和GET等方法访问任何API接口
· Chainlink VRF—创建可验证的随机数
Chainlink价格数据
Chainlink网络多个优质的独立数据源以及具有抗女巫攻击能力的独立节点聚合链下数据并发送到链上,形成链上价格数据。链上价格数据速度快、可靠性高而且去中心化,在一笔交易中执行,这是从预言机获得资产价格数据最简单的方式。Chainlink价格数据(Chainlink Price Feeds)是DeFi领域广泛采用的预言机方案,服务于Synthetix和AAVE等领先区块链项目,传输精准的数据为合成资产定价或确定贷款和抵押的价值。
如果你的智能合约需要输入精准的去中心化加密货币价格,Chainlink价格数据是完美解决方案。Chainlink价格数据用起来非常简单,只需要写几行solidity代码就可以实现,其中包含一个函数调用,用来获取所需的价格数据。
pragma solidity ^0.6.7;
import”@chainlink/contracts/src/v0.6/interfaces/AggregatorV3Interface.sol”;
contract PriceConsumerV3 {
AggregatorV3Interface internal priceFeed;
constructor() public {
priceFeed = AggregatorV3Interface(feedAddress);
}
function getLatestPrice() public view returns (int) {
(
uint80 roundID,
int price,
uint startedAt,
uint timeStamp,
uint80 answeredInRound
) = priceFeed.latestRoundData();
return price;
}
}
访问任何API接口
如果你的智能合约需要接入任何链下价格数据,而不是某个默认的聚合数据,那么Chainlink可以为你接入任何API。无论是体育比赛结果、天气预报、航班时间或任何其他的数据,Chainlink可以将你的智能合约接入任何所需的API接口,并将合约结果输出到任何链下系统。现在有几个已上线的智能合约应用通过Chainlink接入任何所需的API,并实现了巨大价值,其中包括Arbol的农作物保险dApp。Arbol通过Chainlink获取去中心化的天气数据,推出了指数型天气保险产品,保单基于条件参数(如某一地区在某一时间段的降雨量是否达到了设定值)自动理赔,过程中无任何人为干预。这不仅消除了中间成本,而且还避免了理赔纠纷。
这个数据请求和获取功能是智能合约与Chainlink去中心化节点网络交互的主要框架。你只需要扩展智能合约库,创建请求,并实现回调函数获得响应。Chainlink外部适配器也可以为你的智能合约接入任何所需的链下数据接口。
这个功能非常强大,可以为你的智能合约解锁无限可能,覆盖任何资产并以任何方式与现实世界交互。我们之前发过一篇关于将智能合约连接至任何API接口的文章,这篇文章教大家如何通过Chainlink轻松将智能合约连接至链下数据.
Chainlink VRF
随机数虽然看起来简单,但实际上在去中心化网络中生成公正的随机数并不容易。基于区块哈希值等链上数据生成随机数并非理想的解决方案,因为数据可能会被矿工操控。举个例子,一名矿工购买了彩票,而中奖彩票号码是基于区块哈希值定的,那么这名矿工就可以有选择性地创建区块,以操控最终中奖结果。我们推出了Chainlink VRF来解决上述问题,并为智能合约提供安全可验证的随机数。
Chainlink VRF可以在链下生成随机数,因此不存在链上随机数的这些问题,并同时使用加密手段证明随机数没有被篡改。这项技术是去中心化随机数领域的重大突破,开发者和用户可以通过加密方式验证随机数在生成过程中没有被篡改。这个功能将催生出许多创新的智能合约应用。游戏物品创建市场的价值高达几十亿美元,并正在扩展至区块链游戏领域。有了VRF,游戏中就可以基于真实可验证的随机数创建NFT奖励。具体操作方法是:请求合约先将种子值(seed value)输入Chainlink预言机。接着,预言机使用种子及其秘钥生成随机值,并与加密证明一起发送至VRF验证合约。由于VRF合约知道预言机公钥,而且公钥对应的是私钥以及种子值,因此可以验证加密证明。如果有节点的数据被操控,证明就无法与VRF合约的计算结果匹配,因此会被拒收。VRF合约对上报的随机数进行验证,这与用MD5值快速验证下载文件内容类似,但不同的是,VRF合约用的不是简单的哈希值,而是非对称密钥对和加密证明。那么区块链开发者应如何使用这个强大的新功能呢?其实这个功能和我们的聚合价格数据一样,非常容易集成。下面的示例代码是合约接入VRF数据的标准模板。
pragma solidity 0.6.6;
import “@chainlink/contracts/src/v0.6/VRFConsumerBase.sol”;
contract RandomNumberConsumer is VRFConsumerBase {
bytes32 internal keyHash;
uint256 internal fee;
uint256 public randomResult;
constructor()
VRFConsumerBase(
0x2e184F4120eFc6BF4943E3822FA0e5c3829e2fbD, // VRF Coordinator
0x20fE562d797A42Dcb3399062AE9546cd06f63280 // LINK Token
) public
{
keyHash = 0x757844cd6652a5805e9adb8203134e10a26ef59f62b864ed6a8c054733a1dcb0;
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);
}
/**
你只需要导入VRF,用VRF合约地址和秘钥哈希值构建智能合约,然后再调用两个函数:getRandomNumber(发送客户端生成的uint256种子)和fulfillRandomness(这是VRF合约使用的回调函数,用来返回验证过的随机值),然后就搞定了!只需要一次导入、一个构造函数和两个函数,就可以在智能合约中添加可验证的随机数了。
希望本文能帮助大家更深入地了解Chainlink的功能和作用。无论是安全的DeFi价格数据、触发合约的API接口还是输入到游戏中的可验证随机数,Chainlink通通可以帮你实现!
立刻开始用Chainlink开发智能合约
如果这篇文章对你有任何启发,欢迎参加Chainlink黑客松尝试应用你学到的新技能!这次黑客松的奖金超过4万美元,欢迎大家踊跃报名参加!
如果当你读到这篇文章时黑客松已经结束了,那么也欢迎加入我们在推特、YouTube、Discord或Reddit上的社区,转发加上#chainlink和#ChainlinkEA标签。
如果Chainlink预言机可以为你目前开发的产品提供任何附加价值;抑或你希望参与Chainlink网络的开源开发工作,请查看Chainlink开发者文档或加入我们在Discord上的技术讨论群。