Gate 廣場創作者新春激勵正式開啟,發帖解鎖 $60,000 豪華獎池
如何參與:
報名活動表單:https://www.gate.com/questionnaire/7315
使用廣場任意發帖小工具,搭配文字發布內容即可
豐厚獎勵一覽:
發帖即可可瓜分 $25,000 獎池
10 位幸運用戶:獲得 1 GT + Gate 鸭舌帽
Top 發帖獎勵:發帖與互動越多,排名越高,贏取 Gate 新年周邊、Gate 雙肩包等好禮
新手專屬福利:首帖即得 $50 獎勵,繼續發帖还能瓜分 $10,000 新手獎池
活動時間:2026 年 1 月 8 日 16:00 – 1 月 26 日 24:00(UTC+8)
詳情:https://www.gate.com/announcements/article/49112
Solidity極簡入門|第二十一講:調用其他合約
我最近在重新學 solidity,鞏固一下細節,也寫一個「Solidity 極簡入門」,供小白們使用(程式設計大佬可以另找教程),每周更新 1-3 講。
所有代碼和教程開源在 github:github.com/AmazingAng/WTFSolidity
調用已部署合約
開發者寫智慧合約來調用其他合約,這讓乙太坊網路上的程式可以複用,從而建立繁榮的生態。 很多 web3 項目依賴於調用其他合約,比如收益農場(yield farming)。 這一講,我們介紹如何在已知合約代碼(或介面)和地址情況下調用目標合約的函數。
目標合約
我們先寫一個簡單的合約 OtherContract 來調用。
這個合約包含一個狀態變數 x,一個事件 Log 在收到 ETH 時觸發,三個函數:
getBalance(): 返回合約 ETH 餘額。
setX(): external payable 函數,可以設置 x 的值,並向合約發送 ETH。
getX(): 讀取 x 的值。
調用 OtherContract 合約
我們可以利用合約的位址和合約代碼(或介面)來創建合約的引用:_Name(_Address),其中_Name 是合約名,_Address 是合約位址。 然後用合約的引用來調用它的函數:_Name(_Address).f(),其中 f() 是要調用的函數。
下面我們介紹 4 個調用合約的例子:
1. 傳入合約位址
我們可以在函數里傳入目標合約位址,生成目標合約的引用,然後調用目標函數。 以調用 OtherContract 合約的 setX 函數為例,我們在新合約中寫一個 callSetX 函數,傳入已部署好的 OtherContract 合約位址_Address 和 setX 的參數 x:
2. 傳入合約變數
我們可以直接在函數里傳入合約的引用,只需要把上面參數的 address 類型改為目標合約名,比 OtherContract。 下面例子實現了調用目標合約的 getX() 函數。
3. 創建合約變數
我們可以創建合約變數,然後通過它來調用目標函數。 下面例子,我們給變數 oc 存儲了 OtherContract 合約的引用:
4. 調用合約併發送ETH
如果目標合約的函數是 payable 的,那麼我們可以通過調用它來給合約轉帳:_Name(_Address).f{value: _Value}(),其中_Name 是合約名,_Address 是合約位址,f 是目標函數名,_Value 是要轉的 ETH 數額(以 wei 為單位)。
OtherContract 合約的 setX 函數是 payable 的,在下面這個例子中我們通過調用 setX 來往目標合約轉帳。
轉帳后,我們可以通過Log事件和 getBalance() 函數觀察目標合約 ETH 餘額的變化。
總結
這一講,我們介紹如何在通過目標合約代碼(或介面)和地址來創建合約的引用,從而調用目標合約的函數。