Solidity transfer、send、call的区别和用法

transfer、send、call都可以在合约之间相互转账,但是用法有很大的不同!

1. transfer

  • 如果异常会转账失败,抛出异常(等价于require(send()))(合约地址转账)
  • 有gas限制,最大2300
  • 函数原型:<address payable>.transfer(uint256 amount)

2. send

  • 如果异常会转账失败,仅会返回false,不会终止执行(合约地址转账)
  • 有gas限制,最大2300
  • 函数原型:<address payable>.send(uint256 amount) returns (bool)

3. call

  • 如果异常会转账失败,仅会返回false,不会终止执行(调用合约的方法并转账)
  • 没有gas限制
  • <address>.call(bytes memory) returns (bool, bytes memory)

4. 共同点

  • addr.transfer(1 ether)、addr.send(1 ether)、addr.call.value(1 ether)的接收方都是addr。
  • 如果使用addr.transfer(1 ether)、addr.send(1 ether),addr合约中必须增加fallback回退函数!
  • 如果使用addr.call.value(1 ether),那么被调用的方法必须添加payable修饰符,否则转账失败!
// SPDX-License-Identifier: SimPL-3.0
pragma solidity ^0.7.0;

contract  cs{
    constructor() payable{
    }
    
    function getETH() public returns(bool) {
        address payable _owner = msg.sender;
        return(_owner.send(1 ether));
    }
    # 如果使用transfer或send函数必须添加fallback回退函数
    fallback() external{
    }
    
    receive() payable external{
    }
}
}

1. EtherEther的单位关键字有wei, gwei, finney, szabo, ether,换算格式如下:1 ether = 1 * 10^18 wei1 ether = 1 * 10^9 gwei1 e ...