什麼是 Solidity 的 call 函式?
作者 Alchemy
Solidity 程式語言主要用於在 Ethereum 區塊鏈上建立智能合約。本文將涵蓋你需要了解的 Solidity call function 相關細節。
什麼是 Solidity call function?
Solidity 中的 call** function 是開發者用來與其他合約互動的低階 function。**
在建立 Solidity smart contract 時,只要想從自己的合約與另一個合約互動,就應該使用 call 方法。
Call 也可以用來執行接收方智能合約中的其他 function,使用呼叫方提供的 Ether 支付交易費用。call function 還有一項優點,就是會以布林值回傳交易狀態,並將回傳值以變數形式送出。
什麼是 calldata?
Calldata 是一種暫存儲存空間,內含 function 引數所指定的資料。它與另一種暫存儲存空間 memory 的差別在於 calldata 的不可變性——存放在 calldata 中的內容無法被更改。
Solidity call function 如何運作?
Solidity call function 的運作方式是取用 calldata(在原生 ETH 轉帳的情況下可為零),並根據低階 EVM opcode CALL 在目標接收方上執行該 calldata。
當提供了 data(也就是要在接收方智能合約中呼叫的 function)與 gas 之後,call 方法便能利用這兩者來執行智能合約內的 function。
如何使用 call 方法傳送 ether?
作為你的 Solidity function 之一,你可以將以下程式碼用於你所選的 Solidity IDE,並將 address payable _to 替換為接收方地址。
以下程式碼建立了一個能夠透過 call 接收 Ether 的合約。
call 與 delegatecall 有什麼差異?
call 與 delegatecall 的差異在於,delegatecall 會把被呼叫的 function 當作完全是發起呼叫的智能合約自身程式碼的一部分來執行。相對地,call 方法則是按原樣呼叫該 function,將其視為另一個智能合約的一部分。實務上,這代表被呼叫的 function 會使用呼叫方的 storage、msg.sender 與 msg.value。
call 與 transfer 有什麼差異?
Transfer 的 gas 上限不可更改,且失敗時會取消交易。Call 則可以透過使用 someAddress.call.value(ethAmount).gas(gasAmount)() 自訂 gas 上限,取代一般的 call,並會在交易失敗時回傳 false。
transfer 方法已不再是建議使用的做法。不過在過去,transfer 之所以較受青睞,是因為它內建了 gas 上限,有助於防止重入攻擊(reentrancy exploits)。transfer 方法不可變的 gas 上限,也讓它在你希望將上限設為 2300 gas 的運算場景中,是較好的選擇。
如何進一步了解 Solidity call 方法
想要繼續學習 Solidity call,歡迎報名 Alchemy University 免費的線上 Solidity 開發者速成課程,把握名額。這個為期 7 週的非同步 Ethereum 訓練營,是在 Alchemy 收購頂尖 Ethereum 教育公司 ChainShot 之後重新設計的課程。
如果開發者對開發領域完全陌生,在開始 Ethereum 訓練營之前,Alchemy University 的3 週 JavaScript 速成課程 會是很好的先修課程。
相關總覽

打造區塊鏈魔法
Alchemy 結合最強大的 Web3 開發者產品與工具,並提供資源、社群與卓越的支援。


