首页 > 其他分享 >Solidity 发送ETH和回退函数

Solidity 发送ETH和回退函数

时间:2022-12-01 11:08:56浏览次数:43  
标签:transfer Solidity gas send payable address 回退 ETH public

发送ETH 3 种方式

transfer

  1. 如果异常会转账失败,抛出异常
  2. 有gas限制,最大2300

send

  1. 如果异常会转账失败,仅会返回false,不会终止执行
  2. 有gas限制,最大2300

call

  1. 如果异常会转账失败,仅会返回false,不会终止执行
  2. 没有gas限制
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract TestAddress {
event Log(string func, uint gas);
// 回退函数必须声明为外部函数。
fallback() external payable {
// send / transfer ( 超出 2300 gas)会进入这里
// call 用光所有 gas 会进入这里
emit Log("fallback", gasleft());
}
// msg.data 为空时进入这里
receive() external payable {
emit Log("receive", gasleft());
}
// Helper function to check the balance of this contract
function getBalance() public view returns (uint) {
return address(this).balance;
}

//与其他机器语言相区别的类型就是这个address 类型,160-bit/20byte
address public addr = 0x5B38Da6a701c568545dCfcB03FcB875f56beddC4;
//合约自己的地址
address myAddress = address(this);
//跟普通的地址类型一样,但多了两个方法 transfer/send
address payable sender =
payable(0x5B38Da6a701c568545dCfcB03FcB875f56beddC4);

//可以使用 balance 属性来查询一个地址的余额
function getBalance(address _sender) public view returns(uint) {
return _sender.balance;
}
// transfer 无返回值
function testTransfer(address payable _to) public payable {
_to.transfer(msg.value);
}
// send 是 transfer 的低级版本。如果执行失败,当前的合约不会因为异常而终止,
// 但 send 会返回 false。
function testSend(address payable _to) public payable returns (bool) {
return _to.send(msg.value);
}

// 返回一个bool 和一个 bytes
function testCall(address payable _to) public payable returns (bytes memory) {
(bool sent, bytes memory data) = _to.call{value: msg.value}("");
return data;
}
}

Solidity receive和fallback的执行逻辑

Solidity 发送ETH和回退函数_Solidity

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

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

标签:transfer,Solidity,gas,send,payable,address,回退,ETH,public
From: https://blog.51cto.com/sleep666/5901348

相关文章

  • 使用Prometheus+Grafana搭建服务器监控系统
    安装$wgethttps://github.com/prometheus/prometheus/releases/download/v2.7.2/prometheus-2.7.2.linux-amd64.tar.gz$tarxvfzprometheus-2.7.2.linux-amd64.tar.gz$......
  • git的回退以及合并,删除什么的
    有时候不小心合并了别的分支中的commit.我们需要回退某些提交记录。可以通过reset来操作,reset会回退到指定commit。这种方式会删除记录,我们最好使用revert命令来操作git......
  • Solidity 函数及修改器(modifier)的用法
    //SPDX-License-Identifier:MITpragmasolidity^0.8.13;contractFunction{//多返回值函数functionreturnMany()publicpurereturns......
  • Solidity基础介绍
    solidty跟javascript有一定的相似认识一个最简单的存储合约让我们先看一下最基本的例子。现在就算你都不理解也不要紧,后面我们会有更深入的讲解。//SPDX-License-Identifi......
  • 三大实例带你搞定 Prometheus API 使用
    作为一位优秀的技术人员,往往能通过对数据的最大化利用来产生更多价值。而Prometheus的监控数据则是可以为我们所用的重要数据,它并不只能用于日常的监控和告警使用,也可以用......
  • Solidity智能合约结构介绍
    变量局部变量在函数内部声明不存储到链上状态变量在函数外部声明状态变量是永久地存储在链上的值。全局变量提供有关区块链的信息//SPDX-License-Identifier:MITpragmas......
  • Solidity中view和pure的用法
    getter类型的函数可以被view或者pure修饰。view修饰的函数不能改变状态变量。pure则既不能改变状态变量,也不取读取状态变量。//SPDX-License-Identifier:MITpragma......
  • 如何用 Prometheus Operator 监控 K8s 集群外服务?
    前言前面系列文章中:PrometheusOperator与kube-prometheus之一-简介-东风微鸣技术博客(ewhisper.cn)监控Kubernetes集群证书过期时间的三种方案-东风微鸣......
  • Python: Guess and Check algorithms, Approximate solutions, Bisection method
     判断一个整数是否为完全立方数cubicnumber:  importmathcubical=int(input('number:'))defis_cubical(cubical:int):n=math.ceil(pow(cubic......
  • @Override is not allowed when implementing interface method 解决办法
    1.现象实现接口中的方法时, @Override注解标签编译报错2.原因编译器Languagelevel版本太低,实现接口的方法时 不支持@Override注解修饰方法3.解决思路File......