---
title: "什麼是 Solidity 的 call 函式？"
description: "了解 Solidity call 函式的運作方式"
---

# 什麼是 Solidity 的 call 函式？

[Solidity](https://www.alchemy.com/overviews/solidity) 程式語言主要用於在 Ethereum 區塊鏈上建立智能合約。本文將涵蓋你需要了解的 Solidity call function 相關細節。

## **什麼是 Solidity call function？**

Solidity 中的 `call`** function 是開發者用來與其他合約互動的低階 function。**

在建立 [Solidity smart contract](https://www.alchemy.com/overviews/solidity-smart-contract) 時，只要想從自己的合約[與另一個合約互動](https://www.alchemy.com/overviews/solidity-call-another-contract)，就應該使用 `call` 方法。

Call 也可以用來執行接收方智能合約中的其他 function，使用呼叫方提供的 Ether 支付交易費用。`call` function 還有一項優點，就是會以布林值回傳交易狀態，並將回傳值以變數形式送出。

### **什麼是 calldata？**

`Calldata` 是一種暫存儲存空間，內含 function 引數所指定的資料。它與另一種暫存儲存空間 memory 的差別在於 _calldata_ 的不可變性——存放在 `calldata` 中的內容無法被更改。

## **Solidity call function 如何運作？**

Solidity call function 的運作方式是取用 `calldata`（在原生 ETH 轉帳的情況下可為零），並根據低階 [EVM opcode CALL](https://ethereum.org/en/developers/docs/evm/opcodes/) 在目標接收方上執行該 `calldata`。

當提供了 data（也就是要在接收方智能合約中呼叫的 function）與 gas 之後，`call` 方法便能利用這兩者來執行智能合約內的 function。

### **如何使用 call 方法傳送 ether？**

作為你的 [Solidity function](https://www.alchemy.com/overviews/solidity-functions) 之一，你可以將以下程式碼用於你所選的 [Solidity IDE](https://www.alchemy.com/overviews/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）](https://www.alchemy.com/overviews/reentrancy-attack-solidity)。transfer 方法不可變的 gas 上限，也讓它在你希望將上限設為 2300 gas 的運算場景中，是較好的選擇。

## **如何進一步了解 Solidity call 方法**

想要[繼續學習 Solidity call](https://www.alchemy.com/overviews/learn-solidity)，歡迎報名 Alchemy University 免費的線上 Solidity 開發者速成課程，把握名額。這個為期 7 週的[非同步 Ethereum 訓練營](https://university.alchemy.com/?a=5f566a8c97)，是在 Alchemy 收購頂尖 Ethereum 教育公司 ChainShot 之後重新設計的課程。

如果開發者對開發領域完全陌生，在開始 Ethereum 訓練營之前，Alchemy University 的[**3 週 JavaScript 速成課程**](https://www.alchemy.com/university/courses/js) 會是很好的先修課程。
