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

本文介绍了在Solidity中如何通过transfer,send和call三种方式向合约发送ETH。每个方法都有其特性和限制,如transfer在失败时会自动revert,send不会revert且不常用,而call则更为灵活但需处理失败情况。同时,文章提到了接收ETH的合约ReceiveETH,其包含记录ETH接收事件和查询余额的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

接收 ETH 合约

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

e4f5edd0f72180cce67288bb29f3f59a.jpeg

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

发送 ETH 合约

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

ced238a03daf2c5222f613dda5e66840.jpeg

transfer 

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

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

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

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

2997384624c8eac069ae20536d03afe1.jpeg

send 

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

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

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

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

代码样例:

6e01960481ec97fc443b08cf1d226b8a.jpeg

call 

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

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

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

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

代码样例:

d93aa6e0c86b5f2efd8bd8ad41f423c6.jpeg

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

总结

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值