如何在智能合約中取得鏈下價格數據

以太坊 ethereum andy 4年前 (2020-09-28) 1277次浏览 已收录 0个评论 扫描二维码
文章目录[隐藏]

如何在智能合約中取得鏈下價格數據

近期與讀書會的前輩討論開發產品的可能性,當我在思考如何完成一個最佳化的一鍵行為時,想到一個問題,如何在類似閃電貸的交易內進行價格的比對,比如在某個價格區間內買賣以完成套利。價格數據一般都是存在於交易所,不同交易所會有不同買賣價格,因此存在套利的空間。要進行套利時,取得各交易所即時的價格,就變成是關鍵的要素之一。
本篇文章主要提到的鎖定價格的參考,就是由外部取得,因此我把這篇文章當是成入門的文章之一。

服務商 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 是很容易使用的價格服務,而且快速、可靠的價格。

參考

https://medium.com/better-programming/how-to-retrieve-price-data-in-smart-contracts-9e0467dfd280
https://gist.github.com/alexroan/c7b9cd9afd58e69e951446273d252be5#file-chainlink-priceconsumer-sol
http://docs.chain.link/docs/reference-contracts


神隊友學長Andy , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:如何在智能合約中取得鏈下價格數據
喜欢 (0)
[[email protected]]
分享 (0)
andy
关于作者:
中年大叔,打拼 like young students.
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址