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 方法。

# 二、任务列表

  1. 为该合约开启接收 Ether。
  2. 编写函数 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

# 四、参考资料

Last Updated: 2023-01-28 4:31:25