---
title: "什么是 Solidity call 函数？"
description: "了解 Solidity call 函数的工作原理"
---

# 什么是 Solidity call 函数？

[Solidity](https://www.alchemy.com/overviews/solidity) 编程语言主要用于在 Ethereum 区块链上创建智能合约。本文将介绍关于 Solidity call 函数你需要了解的所有细节。

## **什么是 Solidity call 函数？**

`call`** 函数是 Solidity 中的一个低级函数，开发者用它来与其他合约交互。**

在构建 [Solidity 智能合约](https://www.alchemy.com/overviews/solidity-smart-contract)时，只要你想从自己的合约中[与另一个合约交互](https://www.alchemy.com/overviews/solidity-call-another-contract)，就应该使用 `call` 方法。

Call 也可以用来执行接收方智能合约中的其他函数，使用调用方提供的 Ether 来支付交易费用。`call` 函数还有一个优点，即以布尔值的形式返回交易状态，返回值以变量形式发送。

### **什么是 calldata？**

`Calldata` 是一种临时存储类型，包含函数参数中指定的数据。它与另一种临时存储类型 memory 的区别在于 _calldata_ 的不可变性——存储在 `calldata` 中的内容无法被更改。

## **Solidity call 函数是如何工作的？**

Solidity call 函数的工作方式是：接收 `calldata`（在原生 ETH 转账的情况下可以为零），并基于底层 [EVM 操作码 CALL](https://ethereum.org/en/developers/docs/evm/opcodes/) 在预期的接收方上执行该 `calldata`。

当提供了 data（即接收方智能合约中要调用的函数）和 gas 后，`call` 方法就能利用这两者来执行智能合约内部的函数。

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

作为你的 [Solidity 函数](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` 会将被调用函数的代码完全当作调用方智能合约的一部分来执行。相比之下，`call` 方法则按原样调用该函数，将其作为另一个智能合约的一部分。实际上，这意味着被调用的函数会使用调用方的 storage、`msg.sender` 和 `msg.value`。

### call 和 transfer 有什么区别？

Transfer 的 gas 限制是固定不可变的，且失败时会取消交易。Call 则可以通过使用 `someAddress.call.value(ethAmount).gas(gasAmount)()` 来自定义 gas 限制，替代通常的 call，若交易失败会返回 false。

`transfer` 方法目前已不再推荐使用。不过在历史上，`transfer` 曾是首选，因为它使用了内置的 gas 限制，有助于[防止重入攻击](https://www.alchemy.com/overviews/reentrancy-attack-solidity)。transfer 方法固定不变的 gas 限制也使其更适合那些希望将 gas 上限设为 2300 的计算场景。

## **如何进一步学习 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 后重新设计推出的。

如果开发者是编程新手，Alchemy University 的[**3 周 JavaScript 速成课程**](https://www.alchemy.com/university/courses/js)是开始 Ethereum 训练营之前的绝佳预备课程。
