本文介绍了Solidity中智能合约如何调用其他合约的函数,解释了调用其他合约的原因,例如代码复用和规避合约大小限制,并通过示例代码展示了如何在调用合约时更新值以及发送以太币。
由 Alchemy 编写
由 Brady Werkheiser 审核
发布于 2022 年 10 月 4 日,阅读时长 2 分钟
在 Solidity 中,可以创建借用其他合约的函数的智能合约。我们将执行借用操作的智能合约称为 caller smart contract,将被借用函数的智能合约称为 called smart contract。
本文将解释开发者何时应该调用另一个合约,并通过示例代码进行讲解。
以太坊带给区块链的最大进步之一是能够链上上传和计算代码。一旦这些程序(被称为智能合约)上传到区块链,它们就无法被编辑。任何人都可以查看它们,而且如果编码正确,智能合约可以与之交互,即使它们的拥有者互不认识,从而有效地将智能合约转变为可重用的库。所有者希望其代码用于某种目的的智能合约,可以通过调用被成千上万的其他人重复使用,以实现他们自己的用例。
人们调用其他智能合约的另一个原因是,在编程时,他们最初的智能合约在完成之前达到了 24,577 字节的大小限制。为了解决这个问题,开发者将足够多的函数移动到一个新的智能合约中,使其低于字节限制。
我们在下面创建了两个示例智能合约,以教你一个合约如何调用另一个智能合约。
在第一个合约中,CallerContract
会更新 CalledContract
中包含的值。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.3;
contract CallerContract{
function setX(address _address, uint_ x) external{
CalledContract(_address).setX(_x);
}
}
contract CalledContract{
uint public x
unit public value = 123;
function setX(uint _x) external {
x = _x;
}
}
在第二个合约中,CallerContractAndSendEther
不仅更新了 CalledContractReceivesEther
中的 x 值,而且还将在调用时发送 ETH。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.3;
contract CallerContractAndSendEther{
function setXAndReceiveEther(address _address, uint_ x) external payable {
CalledContractReceivesEther(_address).receiveXandreceiveEther{value: _value}(_x);
}
contract CalledContractReceivesEther{
Uint public x
Unit public value = 123;
function receiveXandreceiveEther(uint _x) external payable {
x = _x;
value = msg.value;
}
}
想要了解更多 Solidity 吗?随着最近对 Solidity 教育平台 ChainShot 的收购,Alchemy University 正在免费向公众提供为期 7 周的 以太坊开发者速成课程,该课程最初是一个价值 3,000 美元的认证训练营。立即锁定你的名额!
如果你是开发新手,Alchemy 的 为期 3 周的 JavaScript 速成课程 是开始以太坊训练营之前的一个很好的先决条件。
Supercharged | Alchemy | Substack
注册 Alchemy University 并开始免费学习 Solidity 开发 立即注册
📚 目录
分享:
\
\
学习 Solidity\
\
Solidity 中的 selfdestruct 是什么?\
\
它是什么,如何工作,以及如何开始
\
\
学习 Solidity\
\
学习 Solidity 开发的 7 门最佳课程 (2025)\
\
探索学习 Solidity 开发的最佳免费和付费课程
\
\
学习 Solidity\
\
什么是 Solidity 数组?\
\
你的 Solidity 数组入门指南——函数、声明和故障排除
Alchemy 将最强大的 web3 开发者产品和工具与资源、社区和传奇支持相结合。
- 原文链接: alchemy.com/overviews/so...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!