本文介绍了Solidity中的call函数,它是一种底层函数,用于智能合约与合约之间的交互。文章详细解释了call函数的工作原理,包括如何发送以太币、call和delegatecall的区别、call和transfer的区别。此外,文章还推荐了Alchemy University的Solidity课程。
Solidity 编程语言主要用于在以太坊区块链上创建智能合约。本文将涵盖你需要了解的关于 Solidity call 函数的所有详细信息。
Solidity 中的 call
函数是开发者用于与其他合约交互的底层函数。
在构建 Solidity 智能合约时,每当你想从自己的合约中与另一个合约进行交互时,都应该使用 call
方法。
调用也可以用于执行接收合约中的其他函数,使用调用者提供的以太币支付交易费用。call
函数还具有返回交易状态的优点,返回值为布尔值,并以变量形式发送。
Calldata
是一种临时存储类型,包含函数参数中指定的数据。它与另一种临时存储类型 memory 的区别在于,calldata 是不可变的——存储在 calldata
中的任何内容都无法更改。
Solidity call 函数的工作方式是获取 calldata
,在原生 ETH 转账的情况下,calldata
可以为零,并基于底层EVM opcode CALL 在目标接收者上执行该 calldata
。
当提供数据(即接收智能合约中要调用的函数)和 gas 时,call
方法能够使用这两者来执行智能合约中的函数。
作为你的 Solidity 函数之一,你可以将以下代码放入你选择的 Solidity IDE 中,并将 address payable _to
替换为接收者地址。
contract SendEther {
function sendViaCall(address payable _to) public payable {
// Call 返回一个布尔值,指示成功或失败。
(bool sent, bytes memory data) = _to.call{value: msg.value}("");
require(sent, "Failed to send Ether");
}
}
`
以下是创建能够从调用接收以太币的合约的代码。
contract ReceiveEther {
// Function to receive Ether. msg.data must be empty
// 接收以太币的函数。msg.data 必须为空
receive() external payable {}
// Fallback function is called when msg.data is not empty
// 当 msg.data 不为空时,调用 Fallback 函数
fallback() external payable {}
function getBalance() public view returns (uint) {
return address(this).balance;
}
}
`
call 和 delegatecall
的区别在于, delegatecall
将执行被调用的函数,就好像它的代码完全是正在进行调用的智能合约的一部分。 相比之下, call
方法将按原样调用该函数,作为另一个智能合约的一部分。 实际上,这意味着被调用的函数将使用调用者的存储、msg.sender
和 msg.value
。
Transfers 具有不可更改的 gas 限制,并且会在失败时取消。 Calls 通过使用 someAddress.call.value(ethAmount).gas(gasAmount)()
代替通常的调用来定制 gas 限制,如果交易失败,将返回 false。
不再建议使用 transfer
方法。 但是,历史上,transfer
是首选,因为它对 gas 使用内置限制,这有助于防止重入漏洞。 transfer 方法上不可变的 gas 限制也使其成为你希望设置 2300 gas 上限的计算的更好选择。
要继续了解 Solidity 调用,请在 Alchemy University 的免费在线 Solidity 开发者速成课程中抢占一席之地。 在 Alchemy 收购了领先的以太坊教育公司 ChainShot 后,这个为期 7 周的异步以太坊训练营 已经过重新设计。
如果开发者通常是开发新手,那么 Alchemy University 的 3 周 JavaScript 速成课程 是开始以太坊训练营之前的一个很好的先决条件。
- 原文链接: alchemy.com/overviews/so...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!