在Matic網絡上使用Chainlink預言機

原文標題:《Using Chainlink Oracles on Matic Network》

原文地址:https://blog.chain.link/matic-defi-price-feeds/

原文作者:Harry Papacharissiou

 

image.png

 

自從今年初Matic網絡上線後,得力於它的安全和可擴展的基礎設施以及即時交易特性,它快速成爲以太坊開發者中受歡迎的Layer 2解決方案。Matic的高性能,低手續費的基礎設施爲DeFi應用程序促進大規模應用提供了一個可行的平臺。與此相似,在區塊鏈預言機領域,Chainlink已經成爲DeFi協議優先選擇的預言機解決方案,Chainlink的喂價(Price Feeds現在正在守護着價值數億美元的價值資產。在本篇技術文章中,我們將向你展示如何在Matic的DeFi應用中使用Chainlink的預言機,以及如何使用Chainlink的喂價來給予應用訪問高質量的、防篡改的數據,這些數據不易遭受諸如預言機漏洞和閃電攻擊等風險。

 

對可擴展和安全DeFi協議的需求

 

本年度已經見證了DeFi協議的大爆發,DeFi的總價值鎖定(TVL)從一月份的6.8億美元快速增長到現在的超過140億美元。隨着TVL的增長,鏈上交易數量也達到了新的水平,但同時也引起了一些不必要的關注,作惡者們爲了自身的利益開始利用這些協議漏洞。

 

由於DeFi的增長帶來的鏈上交易數量水平的提升使得以太坊的性能變得擁堵,這也歸因於以太坊區塊鏈自身的可擴展性的限制和吞吐量低的問題。這引起了一系列困擾用戶使用DeFi協議體驗和冗長交易時間的關聯反應。(P.S. 擁堵會導致高昂的gas費,否則礦工不會打包;同時交易確認時間延長,除非給更高的gas費)

 

交易速度緩慢以及交易費用高昂是阻礙DeFi跨入主流的最重要的兩個限制因素。諸如Matic這種Layer 2網絡能夠解鎖下一階段的DeFi的增長,這得益於它的增強的可擴展性,高吞吐量以及低成本的交易等性質。Matic側鏈也是可組合的,並且完全與EVM兼容。DeFi的一大核心價值在於它的無需許可的可組合性,Matic爲這些尋求構建各種有價值的DeFi應用的開發者們提供了一個極具吸引力的選擇,這些DeFi應用可擴展,能提供低成本交易,能確保無需許可的組合性,並提供無縫的用戶體驗。

 

但是,這些DeFi應用仍然需要訪問高質量的可信的外部數據。正如我們在本年度多次看到的那樣,DeFi協議可能會遭受多種形式的攻擊,如價格預言機攻擊等,作惡者結合閃電貸和低質量的預言機來操縱市場來達到對他們有利的局面,損害的是其他用戶的利益。

 

Chainlink的喂價機制降低了DeFi應用容易遭受這些攻擊的風險,採用的方式是提供多種高質量的數據提供方的彙總數據,這些數據由Chainlink網絡上的去中心化的預言機來發布上鍊。Chainlink的去中心化架構以及廣泛的高質量數據源確保了最終價格反映的是廣泛的市場的覆蓋範圍,這事實上意味着此價格是聚合了整個市場上一系列不同的價格後確定的,而不只是其中的一個小小的子集。

現在我們理解了在Matic網絡上構建DeFi協議的優勢,以及Chainlink預言機和喂價機制在其中扮演的重要角色,我們將展示在Matic網絡上構建DeFi應用時使用Chainlink喂價的案例。

 

在Matic網絡上使用Chainlink喂價機制

 

Chainlink的喂價機制使用多種高質量的數據輸入,並將它們與Chainlink預言機網絡相結合,該預言機會將價格數據喂到參考合約(reference contracts),在此合約中數據結果將會聚合。DeFi協議非常重視數據質量和完整性,這一點尤爲重要。Chainlink喂價機制爲這些想要保護自身免受各種由於數據質量問題或者傳輸問題導致的攻擊的協議提供了最佳的、經過嚴格考驗的生產環境解決方案。

 

下面的兩個教程內容也可以通過Remix中的這個完整的智能合約來查看。

 

在Matic網絡上使用Chainlink喂價機制的和預言機的第一步是設置你的MetaMask錢包,使用它來連接Matic的Mumbai測試網絡,然後你就可以獲取一定的Mumbai測試網上的MATIC代幣,並在DeFi智能合約中使用。

 

image.png

在MetaMask中設置Matic Mumbai測試網

 

獲取測試網 Matic代幣

MATIC是Matic網絡上的本地代幣,可以類比於以太坊上的ETH代幣。爲了和Matic網絡交互,MATIC代幣會用來支付gas費用。爲了獲取Mumbai測試網的MATIC代幣,前往MATIC水龍頭,選擇MATIC代幣和Mumbai測試網絡,輸入MetaMask錢包地址,並點擊提交。

 

image.png

Obtaining testnet MATIC 獲取測試網MATIC代幣

截屏2021-01-08 下午12.13.42.png

 

注意:提交後還需要確認,並可前往瀏覽器查看此交易:https://explorer-mumbai.maticvigil.com/tx/0x742aa8e4c1fb12105b424840e435193b1b24324e2d77d926d4903fcc54142772/internal-transactions

 

檢查錢包可以發現獲取了測試代幣(獲取兩次,每次0.1 MATIC):

截屏2021-01-08 下午12.15.55.png

創建智能合約

在Matic網絡上使用Chainlink喂價機制開始構建智能合約最容易的方式是使用標準的價格消費者(Price Consumer)合約。這是基本的標準合約,能夠向Chainlink的喂價機制發起請求。我們將在Remix編輯器中打開合約,並且修改它以滿足我們自己的需求。本文的演示會採用ETH/USD價格獲取。第一步是構造函數中初始化Matic的喂價參考合約,其中,在Mumbai測試網上部署的ETH/USD喂價參考合約地址是:0x0715A7794a1dc8e42615F059dD6e406A6594651A。

 

priceFeed = AggregatorV3Interface(0x0715A7794a1dc8e42615F059dD6e406A6594651A);

接下來,我們需要一個函數來從價格獲取聚合合約(Price Feed Aggregator contract)中獲取最新價格,該聚合合約在上面的構造器中實例化。爲了完成這個目標,我們在聚合合約中已經有了一個函數叫作latestRoundData,這是一個會返回當前聚合合約狀態的函數,並且在本案例中,我們將取出當前的價格並且返回。

function getLatestPrice() public view returns (int) {
        (
            uint80 roundID, 
            int price,
            uint startedAt,
            uint timeStamp,
            uint80 answeredInRound
        ) = priceFeed.latestRoundData();
        return price;
    }

 

部署和測試智能合約

現在我們可以部署並測試我們的智能合約。在Remix中編譯智能合約,然後在部署的頁面,將環境改爲“Injected Web3”,並確保錢包地址是含有MATIC代幣的地址,點擊部署(deploy)按鈕,並跟隨操作後續步驟。最終結果就是成功部署智能合約到Matic Mumbai測試網。

 

部署完成後,我們只需要簡單的執行"getLatestPrice"函數。結果將爲ETH/USD聚合合約中的函數返回的最新的價格數據,這可以用在Matic網絡上的DeFi應用中。

 

image.png

ETH/USD喂價結果

 

在Matic網絡上使用Chainlink預言機

在Matic上可能有一些場景中智能合約需要鏈下數據,而這些數據是Chainlink的喂價沒有提供的。這也是我們需要使用Chainlink預言機的地方。我們現在修改我們的智能合約來獲取使用Chainlink的喂價器不能提供的市場價格,在這個案例中,我們使用ETH/EUR價格。

 

獲取測試網的LINK代幣

你需要獲取一些測試網的LINK代幣來發送請求給Chainlink的預言機。爲了獲取Mumbai測試網的LINK代幣,需要加入Matic的Discord社羣,並貼上你的MetaMask錢包地址,請求Matic團隊成員發送一些Mumbai測試網的LINK代幣。一旦你獲取了一些MATIC和LINK到錢包中,就可以進入到智能合約的步驟了。

 

創建智能合約

在Matic中使用Chainlink預言機建立智能合約的最簡單方法是使用標準的Chainlink APIConsumer合約。這是基礎的標準合約,用於通過Chainlink預言機發起請求獲取外部數據。我們在Remix中修改此合約以滿足自己的需求。

 

首先我們需要重命名“volume”參數爲“ethPrice”,然後“requestVolumeData”函數名修改爲“requestEthereumPrice”。完成後,我們需要修改構造函數爲:

  • Mumbai測試網上LINK代幣地址爲0x70d1F773A9f81C852087B77F6Ae6d3032B02D2AB,我們將其傳到“setChainlinkToken”函數中
  • 正如在Matic文檔中表明的,有一個在Mumbai測試網上運行的預言機合約,地址在0x1cf7D49BE7e0c6AC30dEd720623490B64F572E1,我們設置預言機變量爲這個值
  • 我們將使用的API將通過HTTP GET請求,返回的值是一個無符號整數。運行在Mumbai測試網上的預言機有很多不同的作業規範(job specifications)可以使用。根據Matic文檔中列出的作業,滿足我們需求的是這個:d8fcf41ee8984d3b8b0eae7b74eca7dd,因爲我們想要執行HTTP GET請求,並且返回數據是無符號整數,所以我們設置“jobId”變量爲這個值
  • 修改“fee”變量爲1LINK,移除“0.1”前綴即可。這是隨着外部數據請求一塊發送到預言機的支付數據(爲此請求支付LINK代幣)。
constructor() public {
        setChainlinkToken(0x70d1F773A9f81C852087B77F6Ae6d3032B02D2AB);
        oracle = 0x1cf7D49BE7e0c6AC30dEd720623490B64F572E17;
        jobId = "d8fcf41ee8984d3b8b0eae7b74eca7dd";
        fee = 10 ** 18; // 1 LINK
    }

現在我們完成了構造函數,我們可以移步到“requestEthereumPrice”函數和“fulfill”函數。

 

Chainlink預言機滿足請求的工作原理是採用Chainlink的請求和響應設計模式,其中鏈上函數會創建併發送請求,預言機檢測到請求,然後響應會發送到相同合約的另一個函數。在我們的例子中,“requestEthereumPrice”函數會創建和發送請求,“fulfill”函數會處理響應,響應規範定義在this.fulfill.selector中。

 

我們將要消費的ETH/EUR價格數據API是來自crypto.com的公開API。瀏覽器中點開此鏈接,你可以看到返回數據的JSON格式。

 

在我們的“requestEthereumPrice”函數中,我們將其修改如下:

  • 設置URL爲ETH/EUR接口端點
  • 設置請求中“path”變量爲“EUR”,該路徑是我們想要發現並返回的JSON響應的路徑,該端點輸出結果中包含現在的ETH價格
  • 將結果乘以100,因爲Solidity不會處理含有小數點的數據
  • 將請求發送到Chainlink預言機
function requestEthereumPrice() public returns (bytes32 requestId) 
    {
        Chainlink.Request memory request = buildChainlinkRequest(jobId, address(this), this.fulfill.selector);
        
        // Set the URL to perform the GET request on
        request.add("get", "https://min-api.cryptocompare.com/data/price?fsym=ETH&tsyms=EUR");
        
        // Set the path to find the desired data in the API response, where the response format is:
        // {"USD":243.33}
        request.add("path", "EUR");
        
        // Multiply the result by 100 to remove decimals
        request.addInt("times", 100);
        
        // Sends the request
        return sendChainlinkRequestTo(oracle, request, fee);
    }

在“fulfill”函數中,我們可以看到預言機發回一個響應到_price參數中,然後該參數值在合約中保存到了ethereumPrice變量。

function fulfill(bytes32 _requestId, uint256 _price) public recordChainlinkFulfillment(_requestId)
    {
        ethereumPrice = _price;
    }

現在我們的合約準備好了,可以編譯並部署到Matic Mumbai測試網。

 

部署並測試合約

 

在Remix中編譯合約,然後部署合約到Mumbai測試網,這幾個步驟我們在前面喂價合約中已經做過一遍。

 

下一步是爲合約中添加一定的LINK代幣,所以它能發送請求到Chainlink預言機。爲了完成這個步驟,拿到部署的合約的地址,然後通過MetaMask錢包發送1LINK代幣到此地址中。

 

image.png

給合約充LINK代幣

 

一旦合約部署完成並且充值完LINK,我們可以點擊“requestEthereumPrice”按鈕調用函數,發送請求到Chainlink預言機來獲取當前的以太坊價格。我們也將發送LINK作爲支付到Chainlink的預言機來完成此請求。

image.png

測試部署的合約

 

請求完成後,Chainlink預言機會完成它,然後合約中的“fulfill”函數會被Chainlink結點預言機合約調用。這會花費幾秒鐘的時間來完成 ,然後我們可以通過執行“ethereumPrice”的getter函數來查看API請求結果。這個結果應該是當前的以EUR計價的ETH價格,現在就保存到了合約,等待運行在Matic網絡上的DeFi應用來消費這個數據。

image.png

查看返回結果

 

總結

 

Matic網絡本身具有快速、便宜且可靠的交易特性,爲構建DeFi協議提供了切實可行的Layer 2解決方案。而Chainlink預言機和Chainlink的喂價器進一步增強了在Matic上構建DeFi協議的價值主張,Chainlink預言機和Chainlink的喂價器使得這些協議可以訪問外部數據和事件,包括可以用在各種各樣的有價值的DeFi應用中的高質量的聚合價格數據,如去中心化交易所(DEX),流動性池,借貸協議,去中心化保險以及自動化做市商(AMMs)等等。

 

 

如果你是開發者,想要快速爲你的應用連接到Chainlink的價格參考數據,訪問開發者文檔,並接入Discord技術討論。如果你想要安排一個電話來更深入討論Matic/Chainlink的集成,請在此處聯繫。

Website |  Twitter | Reddit | YouTube | Telegram | Events | GitHub | Price Feeds | DeFi

 

 

END.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章