原文:《Solidity 极简入门: 21. 调用其他合约》

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

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

调用已部署合约

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

目标合约

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

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

这个合约包含一个状态变量 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:

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

2. 传入合约变量

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

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

3. 创建合约变量

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

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

4. 调用合约并发送 ETH

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

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

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

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

总结

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

推特:@0xAA_Science

社区:Discord微信群官网 wtf.academy

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