近期与读书会的前辈讨论开发产品的可能性,当我在思考如何完成一个最佳化的一键行为时,想到一个问题,如何在类似闪电贷的交易内进行价格的比对,比如在某个价格区间内买卖以完成套利。价格数据一般都是存在于交易所,不同交易所会有不同买卖价格,因此存在套利的空间。要进行套利时,取得各交易所即时的价格,就变成是关键的要素之一。

本篇文章主要提到的锁定价格的参考,就是由外部取得,因此我把这篇文章当是成入门的文章之一。

服务商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 ,那你就可以拿到400SAI。存入1ETH就拿到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 是很容易使用的价格服务,而且快速、可靠的价格。