智能合約 是在區塊鏈環境中發布和執行的計算機程序。由於它們在區塊鏈上運行,它們可以在沒有中央方或服務器的情況下運行。它們通常寫在 堅固性 語。
在以太坊區塊鏈上,智能合約可以與現有部署的合約交互。這也適用於任何其他與EVM 兼容的區塊鏈(使用以太坊虛擬機創建的任何區塊鏈)。
以下是一些與其他智能合約交互的智能合約示例:
- 代幣鑄造者或發行者有權調用代幣的智能合約並發行它。
- 去中心化交易所一直以交易代幣的形式與其他智能合約交互。
- 當您使用Chainlink Data Feed 獲得資產報價時,您的智能合約正在與資產的價格聚合器交互,這是另一個智能合約。
- 當您使用可驗證的隨機數生成器Chainlink VRF 時,您的合約會向VRF 協調器發送請求,後者會將數字發送回您的智能合約。
- 要使用Chailink Keepers 自動執行智能合約,您需要創建一個Keepers Upkeep,它將檢查條件並在已部署的智能合約上執行指令。
為什麼要從另一個智能合約調用函數?
有時一個應用程序需要拆分為多個智能合約。例如,我曾經創建了一個應用程序,該應用程序已經分成三個相互交互的智能合約,但我無法在以太坊主網上發布它,因為字節大小超過了允許的限制。為了發布應用程序,我不得不重構應用程序以將其拆分為五個智能合約。
另一個有趣的用例是可升級合約。區塊鍊是不可變的,這意味著智能合約的代碼一旦部署就不可能更改。但是可以創建一個代理,將函數調用委託給另一個包含實際業務邏輯的合約。
如果您想更改邏輯,可以為代理合約提供不同的目標地址,例如具有一些改進的新部署版本。可以將邏輯和數據分離到不同的智能合約中。邏輯合約可以通過代理進行更新或換出,同時保留數據合約中的所有信息。
此功能非常強大,因為它允許重用代碼,並且可以像庫一樣使用一些已部署的合約。它還可以降低部署成本,因為使用該庫的合約不需要包含所有代碼本身。
使用Solidity 調用另一個智能合約
讓我們使用Remix,一個在線網絡工具。去 remix.ethereum.org 開始。
為您的智能合約創建文件
創建一個文件以添加智能合約。是的,同一個文件中可以有多個智能合約!
- 在Remix 中,單擊左側欄上的第二個圖標“文件資源管理器”。
- 單擊“創建新文件”按鈕。
- 將您的文件命名為Contracts.sol
您將在此文件中的Solidity 中編寫和部署兩個智能合約。
首先,定義 SPDX 許可證類型和編譯器版本。複製並粘貼此部分:
// SPDX-License-Identifier: MIT pragma solidity 0.8.16;
櫃檯合約
第一個合約是“計數器”,一個增加數字的腳本。
複製並粘貼此示例:
contract Counter { uint public number; function increment() external { number += 1; } }
該計數器合約具有:
- 公共變量 數字,無符號整數類型,將存儲增量的值。
- 一個函數 增量 將number 變量的值加一。它是一個外部函數,這意味著它可以從其他合約和交易中調用。
編譯Counter 合約
- 在左側欄中找到一個名為“Solidity 編譯器”的按鈕。
- 單擊“編譯Contracts.sol”按鈕。
- 啟用自動編譯選項。
- 檢查按鈕上的綠色標誌,消息編譯成功。
部署Counter 合約
- 在左側面板中,轉到“部署和運行事務”按鈕。
- 目前,我們只有一個智能合約,因此“合約”下拉菜單中會自動選擇“計數器”。
- 單擊“部署”按鈕。
在左側面板底部找到合約並複制其地址。例如,我的是:
0xd9145CCE52D386f254917e481eB44e9943F39138
您應該會看到如下圖所示的內容:
與計數器交互
展開Counter 合約並:
- 單擊“數字”按鈕並檢查它是否為0。
- 點擊“增加”按鈕發送一筆交易以增加數量。
- 再次單擊“數字”按鈕並檢查現在它是否為1。
這是最終結果:
CounterCaller 合約
現在我們已經部署了第一個合約,讓我們創建另一個使用Counter 增量函數的合約。這是一種類似依賴注入的機制。調用者可以實例化它想要調用的合約,並且知道函數和公共變量的類型簽名。
將此代碼複製並粘貼到Contracts.sol 文件的末尾:
contract CounterCaller { Counter public myCounter; constructor(address counterAddress) { myCounter = Counter(counterAddress); } function counterIncrement() external { myCounter.increment(); } }
CounterCaller 合約有:
- 一個名為的公共變量 我的計數器, 類型計數器。這意味著我們正在使用我們想要調用的合約作為類型,獲取Counter Contract 的公共函數和變量的規範。
- 這 構造函數一個僅在部署過程中調用的函數,用於將myCounter 初始化為之前部署的Counter 的地址。
- 功能 反增量 這將調用myCounter 上的函數increment,這就像一個指向智能合約Counter 的“指針”。
查看整個文件Contracts.sol:
// SPDX-License-Identifier: MIT pragma solidity 0.8.16; contract Counter { uint public number; function increment() external { number += 1; } } contract CounterCaller { Counter public myCounter; constructor(address counterAddress) { myCounter = Counter(counterAddress); } function counterIncrement() external { myCounter.increment(); } }
編譯CounterCaller 合約
- 如果您已經啟用了自動編譯選項,則會對其進行編譯。
- 檢查按鈕上的綠色標誌,消息編譯成功。
- 否則,請按照前面解釋的說明編譯Counter Contract。
現在,讓我們部署CounterCaller 合約。在左側面板中,轉到“部署和運行事務”按鈕。
- 在下拉合同中,選擇 反來電者。
- 將計數器地址粘貼到按鈕部署右側的字段中。
- 單擊“部署”按鈕。
與CounterCaller 交互
找到左側面板底部的CounterCaller 合約並展開它。
- 單擊“myCounter”按鈕並檢查它是否是計數器地址。
- 點擊“counterIncrement”按鈕發送一個調用Counter 合約上的函數increment 的交易。
- 轉到Counter 合約並單擊數字按鈕以驗證它再次增加,現在應該是2。
這是最終結果:
這是一個基本示例,可幫助您了解如何使用Solidity 從另一個智能合約調用智能合約。
還有其他方法可以在Solidity 中委託合約之間的調用。重要的是要注意部署的合約總是有一個地址,如果你知道函數和公共變量,另一個智能合約可以調用它。
既然您知道如何從另一個智能合約調用智能合約,那麼您可以使用大量的用例和功能。你可以:
- 將合同拆分為多個合同
- 設計複雜dApp 的架構
- 啟用可重用性
- 創建工廠合約(可以創建其他合約的智能合約)
如果您是開發人員並希望保護您的智能合約、dApp 或協議,請考慮在您的智能合約應用程序中使用Chainlink。如需更多學習和參考資源,請查看 區塊鏈教育中心, 開發者文檔, 或者 聯繫專家. 您還可以通過以下方式直接將您的智能合約與現實世界的數據聯繫起來 去中心化的預言機.