近期,我与读书会的前辈们深入探讨了开发产品的可能性。在思考如何实现一个高度优化的一键操作时,一个疑问油然而生:如何在类似闪电贷的交易中比对价格,例如在特定价格区间内进行买卖,以实现套利。价格数据通常存储在交易所,而不同交易所的价格会有所不同,这就产生了套利的可能。为了进行套利,获取各交易所的即时价格成为了关键因素之一。本文主要介绍了如何通过外部获取锁定价格的方法,因此我将这篇文章视为入门文章之一。
服务商Chainlink提供了一个平台,使开发者能够从智能合约中调用外部API,并使用为Solidity设计的可验证随机数函数(Verifiable Random Function,VRF)。在智能合约中,基本的request和receive循环并不立即返回数据,而是在一个交易中请求数据,在另一个交易中接收数据。本文将介绍另一种方式,在同一个交易中请求并获取链下数据。
关于速度的需求
在撰写本文时,DeFi的锁定金额已经超过30亿美元。这里的锁定金额是指参照其他资产价值,例如稳定币。任何去中心化稳定币的背后都有其他资产支持,因此任何人都可以拿回原来的资产。
如何展示价格
以SAI为例。SAI背后的资产是ETH,如果你想获得SAI,就必须将ETH存入MakerDAO协议中。存入ETH后,协议将铸造等值的SAI。你能获得的SAI数量取决于ETH的价格和你存入的ETH数量。例如:假设ETH的价格是200元,你存入2 ETH,那么你就可以获得400 SAI。存入1 ETH,你就可以获得200 SAI。
如果ETH的价格发生变化,你能获得的SAI数量也会随之变化。例如,如果ETH的价格变为100元,你就能获得100 SAI。
由于协议依赖于ETH的价格,因此必须有一个可靠的价格来源,以便系统随时追踪价格,保持平衡。在这个例子中,request和receive循环可能可行,但由于它们不在同一个交易中获取价格,所以不能用于铸币。价格还需要被其他功能追踪,因为铸币完成后,价格已经过期,会有新的价格出现。如果铸币功能不在同一个交易中,用户就需要等待一段时间才能获得SAI。
解决这个差距
我们可以使用Chainlink Price Feeds的服务来解决这个问题。
Price Feeds是一个链上的资源,包括来自多个独立数据源的价格数据。它们具有快速、可靠的特性,可以在同一个交易中执行,并且易于使用。
如何使用价格数据
这些数据专门设计用于特定用途,特别是DeFi领域。如果需要完整的价格数据列表,可以访问Chainlink官网进行查询。接下来的示例代码将以Ropsten测试网上的ETH/USD为例。
在代码的第3行,我们引入了Chainlink提供的智能合约程序库AggregatorInterface。这个合约中定义了一些功能,让开发者可以请求数据。在第14-16行,在构造函数中,使用AggregatorInterface初始化priceFeed状态变量,参数是数据的地址。在这个例子中,是Ropsten测试网的ETH/USD数据。在第21-23行,调用最新价格数据,priceFeed.lastestAnswer(),返回最新价格数据。在第28-30行,也可以获取最新数据的时间戳。
结论
Chainlink Price Feeds是一个易于使用且快速、可靠的价格服务。
标签: 数字货币