Arbitrum 是一個以太坊第2 層網絡,使開發人員能夠以低成本構建和部署高度可擴展的智能合約。借助Arbitrum 上的Chainlink 數據饋送,開發人員可以快速輕鬆地將其智能合約連接到鏈下數據,包括可用於構建大量DeFi 應用程序的超可靠資產價格。
在這篇技術文章中,我們將解釋什麼是Arbitrum,介紹如何開始使用Arbitrum Rinkeby 測試網,並逐步了解如何在Arbitrum 智能合約中使用Chainlink 價格饋送。雖然在本文中,我們將在測試網環境中構建和部署,但Arbitrum One 主網的步驟是相同的。
什麼是仲裁?
仲裁是一個 樂觀匯總 以太坊第2 層解決方案。一些擴展解決方案如雨後春筍般湧現,以在以太坊區塊鏈上提供更高的速度和更低的成本,包括第2 層匯總、狀態(和支付)通道、側鏈、Plasma 和Validium。這些解決方案之間最重要的區別是匯總和狀態通道繼承了第1 層以太坊區塊鏈的安全性,使開發人員能夠基本上構建在基礎以太坊層之上。
Layer-2 rollups 由Optimistic rollups 和ZK-rollups 組成。兩者都是“真正的第2 層解決方案”,這意味著它們能夠以高速和低成本執行大量事務,然後在第1 層驗證這組事務。通過Optimistic rollups,我們“樂觀地相信”這些交易確實發生在第2 層。這些匯總是“樂觀的”,因為欺詐證明認為捆綁包“在被證明有罪之前是無辜的” 並且樂觀地假設在發佈到第1 層時是正確的,除非在7 天的挑戰期內提交了挑戰。
開始使用仲裁
在本教程中,我們將在Arbitrum Rinkeby 測試網(Rinkeby 測試網的第2 層)上構建和部署智能合約。相同的步驟適用於Arbitrum One,它是以太坊主網的第2 層。要使用Arbitrum Rinkeby 測試網,我們需要一些Rinkeby 測試ETH。您可以通過以下方式獲得您的Rinkeby 測試鏈接 鏈環水龍頭——只需粘貼你的錢包地址,選擇Rinkeby Ethereum,然後領取你的測試ETH。
然後,我們需要從Rinkeby 存入測試ETH,以便在Arbitrum Rinkeby 測試網上支付費用。導航到 仲裁橋,連接你的錢包,輸入你需要的Rinkeby ETH數量,然後點擊“存款”。大約需要10 分鐘才能看到您的餘額記入第2 層——喝咖啡休息時間。
收到第2 層ETH 後,將您的Metamask 錢包配置到Arbitrum Rinkeby 測試網。要么導航到 鍊錶 並找到Arbitrum Rinkeby Network 的詳細信息或導航至 Etherscan 瀏覽器 並在網站頁腳中找到Add Arbitrum Network 或選擇Settings -> Networks -> Add Network in Metamask,然後手動輸入詳細信息。
網絡名稱:Arbitrum Rinkeby 測試網
網絡網址:https://rinkeby.arbitrum.io/rpc
鏈號:421611
貨幣符號:ETH
區塊瀏覽器URL:https://testnet.arbiscan.io/
最後,返回 鏈環水龍頭,選擇Arbitrum Rinkeby,並要求10 測試LINK 代幣.
準確可靠的價格數據在智能合約中的重要性
為了擴展第2 層智能合約的可能性,開發人員需要與鏈下資源建立安全連接。借助來自Chainlink 預言機的高度準確和可靠的價格數據,開發人員可以開始在Arbitrum 上構建和測試各種可擴展的DeFi 應用程序,這些應用程序依賴於ETH 和其他代幣的價格,例如借貸協議、去中心化交易所、預測市場等.
雖然這些DeFi 用例需要外部數據,但區塊鍊和第2 層解決方案無法本地訪問自身外部的數據。當向區塊鏈提供數據以促進高級DeFi 用例時,必須保證數據的安全性和高質量,以防止價格預言機攻擊。
Chainlink Price Feeds 通過提供來自各種高質量數據提供商的聚合數據,並由去中心化的預言機通過Chainlink 網絡在鏈上提供數據,從而降低了這些攻擊的風險。 Chainlink 的去中心化預言機機制確保最終價格值反映廣泛的市場覆蓋範圍,這意味著最終價格是在匯總整個市場的一組不同價格後確定的,而不僅僅是一小部分,還考慮了交易量和流動性等其他方面. 借助Chainlink 價格饋送,開發人員能夠構建不會影響安全性的高級DeFi 應用程序。
現在我們了解了Solidity 智能合約中準確可靠的價格數據的需求以及Chainlink 價格預言機所扮演的重要角色,我們將通過一個使用Chainlink Price Feed 獲取Solidity 智能中ETH 最新價格的示例Arbitrum 上的合同。
在Arbitrum 上使用Chainlink 價格信息
首先在您喜歡的代碼編輯器中創建一個新的Solidity 項目。使用帶有Typescript 的Hardhat 的完整示例可在 Github. 我們將使用最新版本的Solidity 和Chainlink。
import "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol";
現在我們將編寫一個函數來從Chainlink 網絡中檢索價格數據。導航到 數據饋送部分 官方Chainlink 文檔。我們將以“getPrice”函數為例並稍作修改。
function getThePrice(address _priceFeedAddress) public view returns (int) { AggregatorV3Interface priceFeed = AggregatorV3Interface(_priceFeedAddress); ( uint80 roundID, int price, uint startedAt, uint updatedAt, uint80 answeredInRound ) = priceFeed.latestRoundData(); return price; }
您可以看到我們將“priceFeedAddress”作為參數傳遞,以使該智能合約更具可擴展性。您可以在Arbitrum Rinkeby 測試網上查看所有可用的Price Feed 地址的完整列表 這裡.
例如,如果我們想知道BTC 的美元價格,我們可以將“0x0c9973e7a27d00e656B9f153348dA46CaD70d03d”作為“_priceFeedAddress”參數傳遞給我們的函數。
快完成了!滿足L2 排序器運行狀況標誌
Arbitrum 中的交易得到高速確認。這是因為所謂的Sequencer。 Sequencer 是一個鏈下組件,能夠對用戶交易進行排序並高速向用戶提供收據。但是,如果Sequencer 不可用,用戶必須通過Ethereum 提交他們的交易,以便在Arbitrum 中處理它們。這不利於用戶體驗,許多dApp 仍然沒有能力與以太坊和Arbitrum 並行交互。
如果您不想在應用程序中擔心這一點,您可以使用Chainlink oracle 來確保Sequencer 可供用戶使用。以下是執行此操作的步驟:
首先,我們需要在我們的Solidity 代碼中添加下一條導入語句
import "@chainlink/contracts/src/v0.8/interfaces/FlagsInterface.sol";
根據Chainlink 文檔,L2 Sequencer Health Flag 由三個參與者組成:
- Chainlink 集群(一組驗證節點)——它在每個心跳“T”(Chainlink 提要配置為更新的最小頻率)執行OCR 作業。
- 報告Sequencer 狀態的實際OCR 提要——這可用於第1 層的外部用戶檢查OR 協議(例如Arbitrum)狀態。
- 驗證器——這由OCR 提要觸發,如果當前答案與前一個答案不同,則執行升旗或降旗動作。
現在,我們需要用下一行來擴展我們的合約
// Identifier of the Sequencer offline flag on the Flags contract address constant private FLAG_ARBITRUM_SEQ_OFFLINE = address(bytes20(bytes32(uint256(keccak256("chainlink.flags.arbitrum-seq-offline")) - 1))); FlagsInterface internal chainlinkFlags; constructor() { chainlinkFlags = FlagsInterface(0x491B1dDA0A8fa069bbC1125133A975BF4e85a91b); }
“0x491B1dDA0A8fa069bbC1125133A975BF4e85a91b”是Arbitrum Rinkeby Flags 合約的地址。要查看其他地址,請前往 Chainlink 文檔.
升起的標誌表示提要未在“T”時間更新,其數據可被視為陳舊。換句話說,Sequencer 下線了,你的合約不應該執行任何關鍵操作。當Sequencer 再次恢復並更新第2 層Chainlink 數據饋送時,您可以像往常一樣繼續使用您的合約。讓我們添加額外的檢查。
function getThePrice(address _priceFeedAddress) public view returns (int) { bool isRaised = chainlinkFlags.getFlag(FLAG_ARBITRUM_SEQ_OFFLINE); if (isRaised) { // If flag is raised we shouldn't perform any critical operations revert("Chainlink feeds are not being updated"); } AggregatorV3Interface priceFeed = AggregatorV3Interface(_priceFeedAddress); ( uint80 roundID, int price, uint startedAt, uint updatedAt, uint80 answeredInRound ) = priceFeed.latestRoundData(); return price; }
部署和測試智能合約
現在我們準備好部署和測試我們的合約了。編譯合約在 混音,然後,在部署選項卡上,將環境更改為“Injected Web3”。確保錢包連接到Arbitrum Rinkeby 測試網,並且下面的錢包地址是包含之前獲得的ETH 的MetaMask 錢包。然後,按下部署按鈕並按照步驟操作。
最終結果是成功的交易和智能合約部署到Arbitrum Rinkeby 測試網。
為了測試它,我們只需要調用我們的“getThePrice”函數並將Arbitrum Rinkeby 測試網上的Chainlink 價格饋送地址之一作為“_priceFeedAddress”參數傳遞。請記住,您可以在 Chainlink 文檔.
概括
Chainlink 流行的ETH/USD 價格饋送以及LINK/USD、AAVE/USD 和BTC/USD 的價格饋送均在Arbitrum 上提供。這些Chainlink 價格饋送建立在分散的預言機基礎設施之上,該基礎設施由眾多經過安全審查的節點運營商和優質數據源組成,從而產生高度準確、可用和防篡改的數據饋送,這些數據饋送本質上可以抵禦閃貸引發的價格操縱等漏洞攻擊。
本技術教程展示了在Arbitrum 上編寫和部署混合智能合約是多麼容易。有了這些知識,您將能夠開始構建自己的智能合約,利用Arbitrum 的低成本和高速度以及由Chainlink Price Feeds 解鎖的高級實用程序。
通過訪問了解有關Chainlink 的更多信息 鏈環 或閱讀文檔 docs.chain.link. 要討論集成,請聯繫專家。