什么是 Solidity call 函数?
作者 Alchemy
Solidity 编程语言主要用于在 Ethereum 区块链上创建智能合约。本文将介绍关于 Solidity call 函数你需要了解的所有细节。
什么是 Solidity call 函数?
call** 函数是 Solidity 中的一个低级函数,开发者用它来与其他合约交互。**
在构建 Solidity 智能合约时,只要你想从自己的合约中与另一个合约交互,就应该使用 call 方法。
Call 也可以用来执行接收方智能合约中的其他函数,使用调用方提供的 Ether 来支付交易费用。call 函数还有一个优点,即以布尔值的形式返回交易状态,返回值以变量形式发送。
什么是 calldata?
Calldata 是一种临时存储类型,包含函数参数中指定的数据。它与另一种临时存储类型 memory 的区别在于 calldata 的不可变性——存储在 calldata 中的内容无法被更改。
Solidity call 函数是如何工作的?
Solidity call 函数的工作方式是:接收 calldata(在原生 ETH 转账的情况下可以为零),并基于底层 EVM 操作码 CALL 在预期的接收方上执行该 calldata。
当提供了 data(即接收方智能合约中要调用的函数)和 gas 后,call 方法就能利用这两者来执行智能合约内部的函数。
如何使用 call 方法发送 ether?
作为你的 Solidity 函数之一,你可以在你选择的 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 限制,有助于防止重入攻击。transfer 方法固定不变的 gas 限制也使其更适合那些希望将 gas 上限设为 2300 的计算场景。
如何进一步学习 Solidity call 方法
要继续学习 Solidity call,欢迎报名参加 Alchemy University 提供的免费在线 Solidity 开发者速成课程。这门为期 7 周的异步 Ethereum 训练营是在 Alchemy 收购领先的 Ethereum 教育公司 ChainShot 后重新设计推出的。
如果开发者是编程新手,Alchemy University 的3 周 JavaScript 速成课程是开始 Ethereum 训练营之前的绝佳预备课程。
相关概览

构建区块链应用
Alchemy 将最强大的 Web3 开发者产品和工具与资源、社区及专业支持结合在一起。


