Solidity 练习:发送 Ether
睡不醒的鲤鱼 2022-12-29 Web3 Solidity
# 一、题目说明
Ether 可以通过 transfer,send 和 call 这 3 种方式从一个合约发送到另一个地址。
transfer,send 和 call 的区别?
- transfer:发送 2300 gas,失败时抛出错误。
- send:发送 2300 gas,返回 bool。
- call:发送指定的 gas 或所有可用 gas,返回 bool 和 bytes 类型的输出。
应该使用哪个函数?
出于安全原因,建议使用 call 方法。
# 二、任务列表
- 为该合约开启接收 Ether。
- 编写函数 sendEth(address payable _to, uint _amount),将 _amount Ether 发送给 _to。
# 三、解答代码
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
contract SendEther {
receive() external payable {}
function sendViaTransfer(address payable _to) external payable {
// This function is no longer recommended for sending Ether.
_to.transfer(msg.value);
}
function sendViaSend(address payable _to) external payable {
// Send returns a boolean value indicating success or failure.
// This function is not recommended for sending Ether.
bool sent = _to.send(msg.value);
require(sent, "Failed to send Ether");
}
function sendViaCall(address payable _to) external payable {
// Call returns a boolean value indicating success or failure.
// This is the current recommended method to use.
(bool sent, bytes memory data) = _to.call{value: msg.value}("");
require(sent, "Failed to send Ether");
}
function sendEth(address payable _to, uint _amount) external {
(bool sent, ) = _to.call{value: _amount}("");
require(sent, "Failed to send Ether");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30