WTF Solidity极简入门第二十讲:发送ETH transfer,send和call

  • Solidity 提供了三种向其他合约发送 ETH 的方法:transfer()send()call(),其中 call() 是最推荐的方式。

  • 接收 ETH 合约:示例合约 ReceiveETH 包含 receive() 函数用于接收 ETH 并触发事件,以及 getBalance() 函数用于查询合约余额。

  • 发送 ETH 合约:通过 SendETH 合约演示三种发送 ETH 的方法:

    • transfer():gas 限制为 2300,失败会自动回滚交易。
    • send():gas 限制为 2300,失败不会回滚,需手动处理返回值。
    • call():无 gas 限制,支持复杂逻辑,失败不会回滚,需手动处理返回值。
  • 总结call() 最灵活,推荐使用;transfer() 次之,适合简单场景;send() 因缺乏自动回滚功能,几乎无人使用。

总结

原文:《Solidity 极简入门: 20. 发送 ETH transfer,send 和 call》

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

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

Solidity 有三种方法向其他合约发送 ETH,他们是:transfer(),send() 和 call(),其中 call() 是被鼓励的用法。

接收 ETH 合约

我们先部署一个接收 ETH 合约 ReceiveETH。ReceiveETH 合约里有一个事件 Log,记录收到的 ETH 数量和 gas 剩余。还有两个函数,一个是 receive(),收到 ETH 被触发,并发送 Log 事件;另一个是查询合约 ETH 余额的 getBalance().

WTF Solidity极简入门第二十讲:发送ETH transfer,send和call

部署好合约后,运行 getBalance() 函数,可以看到当前合约的 ETH 余额为 0.

发送 ETH 合约

我们将实现三种方法向 ReceiveETH 合约发送 ETH。首先,先在发送 ETH 合约 SendETH 中实现 payable 的构造函数和 receive(),让我们能够在部署时和部署后向合约转账。

WTF Solidity极简入门第二十讲:发送ETH transfer,send和call

transfer

- 用法是 transfer(发送 ETH 数额)。

- transfer() 的 gas 限制是 2300,足够用于转账,但对方合约的 fallback() 或 receive() 函数不能实现太复杂的逻辑。

- transfer() 如果转账失败,会自动 revert(回滚交易)。

代码样例,注意参数中的_to 填 ReceiveETH 合约的地址,amount 是 ETH 转账金额:

WTF Solidity极简入门第二十讲:发送ETH transfer,send和call

send

- 用法是 send(发送 ETH 数额)。

- send() 的 gas 限制是 2300,足够用于转账,但对方合约的 fallback() 或 receive() 函数不能实现太复杂的逻辑。

- send() 如果转账失败,不会 revert。

- send() 的返回值是 bool,代表着转账成功或失败,需要额外代码处理一下。

代码样例:

WTF Solidity极简入门第二十讲:发送ETH transfer,send和call

call

- 用法是 call{value: 发送 ETH 数额}("")。

- call() 没有 gas 限制,可以支持对方合约 fallback() 或 receive() 函数实现复杂逻辑。

- call() 如果转账失败,不会 revert。

- call() 的返回值是 (bool, data),其中 bool 代表着转账成功或失败,需要额外代码处理一下。

代码样例:

WTF Solidity极简入门第二十讲:发送ETH transfer,send和call

运行三种方法,可以看到,他们都可以成功的向 ReceiveETH 合约发送 ETH。

总结

这一讲,我们介绍 solidity 三种发送 ETH 的方法:transfer,send 和 call。

call 没有 gas 限制,最为灵活,是最提倡的方法;transfer 有 2300 gas 限制,但是发送失败会自动 revert 交易,是次优选择;send 有 2300 gas 限制,而且发送失败不会自动 revert 交易,几乎没有人用它。

推特:@0xAA_Science

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

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

分享至:

作者:0xAA

本文为PANews入驻专栏作者的观点,不代表PANews立场,不承担法律责任。

文章及观点也不构成投资意见

图片来源:0xAA如有侵权,请联系作者删除。

关注PANews官方账号,一起穿越牛熊
推荐阅读
8分钟前
1小时前
4小时前
6小时前
9小时前
15小时前

热门文章

行业要闻
市场热点
精选读物

精选专题

App内阅读