Solidity极简入门|第二十一讲:调用其他合约

22-08-20 11:00
阅读本文需 6 分钟
总结 AI 总结
看总结 收起
原文标题:《 Solidity 极简入门: 21. 调用其他合约 》
原文作者:0xAA   


我最近在重新学 solidity,巩固一下细节,也写一个「Solidity 极简入门」,供小白们使用(编程大佬可以另找教程),每周更新 1-3 讲。


所有代码和教程开源在 github:github.com/AmazingAng/WTFSolidity


调用已部署合约


开发者写智能合约来调用其他合约,这让以太坊网络上的程序可以复用,从而建立繁荣的生态。很多 web3 项目依赖于调用其他合约,比如收益农场(yield farming)。这一讲,我们介绍如何在已知合约代码(或接口)和地址情况下调用目标合约的函数。


目标合约


我们先写一个简单的合约 OtherContract 来调用。



这个合约包含一个状态变量 x,一个事件 Log 在收到 ETH 时触发,三个函数:


getBalance(): 返回合约 ETH 余额。

setX(): external payable 函数,可以设置 x 的值,并向合约发送 ETH。

getX(): 读取 x 的值。


调用 OtherContract 合约


我们可以利用合约的地址和合约代码(或接口)来创建合约的引用:_Name(_Address),其中_Name 是合约名,_Address 是合约地址。然后用合约的引用来调用它的函数:_Name(_Address).f(),其中 f() 是要调用的函数。


下面我们介绍 4 个调用合约的例子:


1. 传入合约地址


我们可以在函数里传入目标合约地址,生成目标合约的引用,然后调用目标函数。以调用 OtherContract 合约的 setX 函数为例,我们在新合约中写一个 callSetX 函数,传入已部署好的 OtherContract 合约地址_Address 和 setX 的参数 x:



2. 传入合约变量


我们可以直接在函数里传入合约的引用,只需要把上面参数的 address 类型改为目标合约名,比 OtherContract。下面例子实现了调用目标合约的 getX() 函数。



3. 创建合约变量


我们可以创建合约变量,然后通过它来调用目标函数。下面例子,我们给变量 oc 存储了 OtherContract 合约的引用:



4. 调用合约并发送 ETH


如果目标合约的函数是 payable 的,那么我们可以通过调用它来给合约转账:_Name(_Address).f{value: _Value}(),其中_Name 是合约名,_Address 是合约地址,f 是目标函数名,_Value 是要转的 ETH 数额(以 wei 为单位)。


OtherContract 合约的 setX 函数是 payable 的,在下面这个例子中我们通过调用 setX 来往目标合约转账。



转账后,我们可以通过 Log 事件和 getBalance() 函数观察目标合约 ETH 余额的变化。


总结


这一讲,我们介绍如何在通过目标合约代码(或接口)和地址来创建合约的引用,从而调用目标合约的函数。


原文链接
举报 纠错/举报
选择文库
新增文库
取消
完成
新增文库
仅自己可见
公开
保存
纠错/举报
提交