Solidity 小白教程:20. 发送 ETH

news2024/11/15 19:39:51

Solidity 小白教程:20. 发送 ETH

Solidity有三种方法向其他合约发送ETH,他们是:transfer()send()call(),其中**call()**是被鼓励的用法。

接收 ETH 合约

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

contract ReceiveETH {
    // 收到eth事件,记录amount和gas
    event Log(uint amount, uint gas);

    // receive方法,接收eth时被触发
    receive() external payable{
        emit Log(msg.value, gasleft());
    }

    // 返回合约ETH余额
    function getBalance() view public returns(uint) {
        return address(this).balance;
    }
}

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

发送 ETH 合约

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

contract SendETH {
    // 构造函数,payable使得部署的时候可以转eth进去
    constructor() payable{}
    // receive方法,接收eth时被触发
    receive() external payable{}
}

transfer

  • 用法是接收方地址.transfer(发送 ETH 数额)
  • transfer()gas限制是2300,足够用于转账,但对方合约的**fallback()receive()**函数不能实现太复杂的逻辑。
  • transfer()如果转账失败,会自动revert(回滚交易)。

代码样例,注意里面的**_toReceiveETH合约的地址,amountETH**转账金额:

// 用transfer()发送ETH
function transferETH(address payable _to, uint256 amount) external payable{
    _to.transfer(amount);
}

部署SendETH合约后,对ReceiveETH合约发送 ETH,此时amount为 10,value为 0,amount>value,转账失败,发生revert
image.png
此时amount为 10,value为 10,amount<=value,转账成功。
image.png
ReceiveETH合约中,运行getBalance()函数,可以看到当前合约的ETH余额为10
image.png

send

  • 用法是接收方地址.send(发送 ETH 数额)
  • send()gas限制是2300,足够用于转账,但对方合约的**fallback()receive()**函数不能实现太复杂的逻辑。
  • send()如果转账失败,不会revert
  • send()的返回值是bool,代表着转账成功或失败,需要额外代码处理一下。

代码样例:

// send()发送ETH
function sendETH(address payable _to, uint256 amount) external payable{
    // 处理下send的返回值,如果失败,revert交易并发送error
    bool success = _to.send(amount);
    if(!success){
        revert SendFailed();
    }
}

ReceiveETH合约发送 ETH,此时amount为 10,value为 0,amount>value,转账失败,因为经过处理,所以发生revert
image.png
此时amount为 10,value为 11,amount<=value,转账成功。
image.png

call

  • 用法是接收方地址.call{value: 发送 ETH 数额}(“”)
  • call()没有gas限制,可以支持对方合约**fallback()receive()**函数实现复杂逻辑。
  • call()如果转账失败,不会revert
  • call()的返回值是(bool, data),其中bool代表着转账成功或失败,需要额外代码处理一下。

代码样例:

// call()发送ETH
function callETH(address payable _to, uint256 amount) external payable{
    // 处理下call的返回值,如果失败,revert交易并发送error
    (bool success,) = _to.call{value: amount}("");
    if(!success){
        revert CallFailed();
    }
}

ReceiveETH合约发送 ETH,此时amount为 10,value为 0,amount>value,转账失败,因为经过处理,所以发生revert
image.png
此时amount为 10,value为 11,amount<=value,转账成功。
image.png
运行三种方法,可以看到,他们都可以成功地向ReceiveETH合约发送ETH

总结

这一讲,我们介绍solidity三种发送ETH的方法:transfersendcall

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1019289.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue项目中使用element-plus UI库-并对下拉搜索框样式修改-el-select代码封装

对下列列表进行自定义 基础代码 <template><el-selectclass"ly-tab-sou"popper-class"popper-ly-tab-sou"v-model"selectVal":filterable"filterable":placeholder"placeholder"change"selectChange"&…

Dpi解析与adb 查看dpi

authordaisy.skye的博客_CSDN博客-嵌入式,Qt,Linux领域博主 ro.sf.lcd_density属性指定了这个机型使用的dpi是多少&#xff0c;dpi全称是dots per inch&#xff0c;对角线每英寸的像素点的个数。 密度 ldpi mdpi hdpi xhdpi xxhdpi 分辨率 240x320 320x480 480x800 7…

查看c语言库函数源码 glibc,glibc下载

1 简介 glibc是GNU发布的libc库&#xff0c;即c运行库。glibc是linux系统中最底层的api&#xff0c;几乎其它任何运行库都会依赖于glibc。glibc除了封装linux操作系统所提供的系统服务外&#xff0c;它本身也提供了许多其它一些必要功能服务的实现。由于 glibc 囊括了几乎所有的…

【直播回顾】应对数智化时代下SAP用户的系统转型挑战——SNP TDO

“京西重工通过20天的项目周期&#xff0c;实现了将SAP ECC系统2.5T的总数据量&#xff0c;按13个月以时间切片方式刷新测试数据。存储和管理成本降低多达 80%、测试数据量减少70%、生产系统零停机。” “海尔日日顺历经不到3个月的时间&#xff0c;将70多家公司代码从海尔源…

C++深度优化——无锁队列实现及测试

最近在研究无锁队列&#xff0c;从网上学习到了lock-free的定义&#xff0c;特此摘录如下&#xff1a; 如果涉及到共享内存的多线程代码在多线程执行下不可能互相影响导致被hang住&#xff0c;不管OS如何调度线程&#xff0c;至少有一个线程在做有用的事&#xff0c;那么就是lo…

计网第五章(运输层)(七)(TCP的连接建立)

目录 一、基本概述 二、连接建立 1.基本任务 2.具体实现 三、经典问题之为什么不用“两次握手”&#xff1f; 一、基本概述 在前面的部分提到过&#xff0c;TCP是基于运输连接来传输TCP报文段。 所以TCP的连接和释放是每次面向连接的通信过程中必不可少的过程。 TCP运输…

Linux设备驱动模型之platform设备

Linux设备驱动模型之platform设备 上一章节介绍了Linux字符设备驱动&#xff0c;它是比较基础的&#xff0c;让大家理解Linux内核的设备驱动是如何注册、使用的。但在工作中&#xff0c;个人认为完全手写一个字符设备驱动的机会比较少&#xff0c;更多的都是基于前人的代码修修…

Vue3+移动端适配屏幕+默认横屏展示

效果图展示区: 1. 想要把px自动转换单位为vw需要项目根目录.postcssrc.js中进行配置以下代码 module.exports {plugins: {autoprefixer: {}, // 用来给不同的浏览器自动添加相应前缀&#xff0c;如-webkit-&#xff0c;-moz-等等"postcss-px-to-viewport": {unitTo…

C/C++计算表达式的值 2023年5月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析

目录 C/C计算表达式的值 一、题目要求 1、编程实现 2、输入输出 二、解题思路 1、案例分析 三、程序代码 四、程序说明 五、运行结果 六、考点分析 C/C计算表达式的值 2023年5月 C/C编程等级考试一级编程题 一、题目要求 1、编程实现 给定整数x,y的值&#xff0c…

视频号挂公众号链接引流到公众号还能加,好消息来了

视频号挂公众号链接要求在八月初出来了新规则&#xff0c;相信玩视频号的人大家都应该清楚&#xff0c;这两个新规则第一个看似简单&#xff0c;但是第二个却堵住了99%的人 接着看看视频号挂链接发展的来龙去脉 要点一&#xff1a;早在前两年&#xff0c;视频号链接直接显示在视…

基于springboot的流沐商城的设计与实现(前后端分离)

博主主页&#xff1a;一季春秋博主简介&#xff1a;专注Java技术领域和毕业设计项目实战、Java、微信小程序、安卓等技术开发&#xff0c;远程调试部署、代码讲解、文档指导、ppt制作等技术指导。主要内容&#xff1a;毕业设计(Java项目、小程序等)、简历模板、学习资料、面试题…

【JavaSE笔记】运算符

一、前言 作为Java编程中最基本的语法元素之一&#xff0c;运算符在编写程序时扮演着至关重要的角色。 运算符被用于执行各种数学和逻辑运算&#xff0c;以及比较操作&#xff0c;运算符的使用可以使代码更加简洁、易读和高效。在本文中&#xff0c;我们将会详细介绍Java中常…

nginx反向代理,用户访问服务器1的80端口,请求转发至服务器2,3的8882端口

两台应用服务器&#xff0c;一台nginx&#xff0c;用户访问nginx服务器80端口&#xff0c;将请求转发至服务器2和服务器3的8882端口。 1、修改nginx配置文件 upstream backend {server 10.60.16.187:8882;server 10.60.16.188:8882;}server {listen 80;server_name 10.6…

Git(9)——Git多人协同开发之创建初始项目

目录 一、简介 二、创建新项目 三、本地Git接入 四、创建远端仓库——Gitee 五、推送代码至远端仓库 一、简介 前面8章都是我们一个人独自开发&#xff0c;如果现在项目新增两名同事&#xff0c;我们就需要使用Git来实现多人协同开发&#xff0c;从第九章开始将介绍从零到…

Atlas VPN 曝零日漏洞,允许查看用户真实 IP 地址

Atlas VPN 已确认存在一个零日漏洞&#xff0c;该漏洞允许网站所有者查看 Linux 用户的真实 IP 地址。不久前&#xff0c;发现该漏洞的人在Reddit上公开发布了有关该零日漏洞的详细信息以及漏洞利用代码。 关于 Atlas VPN 零日漏洞 Atlas VPN提供 "免费 "和付费的 …

GemBox.Bundle 47.0.1227 Crack

GemBox.Document 35.0.1480 GemBox.Email 17.0.1147 GemBox.Imaging 10.0.1096 GemBox.Pdf 17.0.1404 GemBox.Presentation 25.0.1526 GemBox.Spreadsheet 49.0.1454 GemBox.Spreadsheet 从 .NET 应用程序读取、写入、转换和打印 XLSX、XLS、XLSB、CSV、HTML 和 ODS 电子表…

算法题笔记 1-5

目录 week 11. 找出数组中重复的数字题目数据范围样例题解(数组遍历) O(n) 2. 不修改数组找出重复的数字题目数据范围样例题解(分治&#xff0c;抽屉原理) O(nlogn) 3. 二维数组中的查找题目题解(单调性扫描) O(nm) 4.替换空格题目题解(线性扫描) O(n)(双指针扫描) O(n) 5.从尾…

一阶滞后低通滤波器(支持采样频率设置 博途SCL代码)

一阶低通滤波器算法介绍这篇博客不再赘述&#xff0c;专栏有很多的文章讲过。之前的低通滤波器都是没有采样频率接口的&#xff0c;低通滤波器的采样频率都等于定时中断周期&#xff0c;实际滤波效果和信号采样频率、滤波系数、信号采样频率都有关系&#xff0c;所以这里我们将…

【C语言】指针的进阶(二)—— 回调函数的讲解以及qsort函数的使用方式

目录 1、函数指针数组 1.1、函数指针数组是什么&#xff1f; 1.2、函数指针数组的用途&#xff1a;转移表 2、扩展&#xff1a;指向函数指针的数组的指针 3、回调函数 3.1、回调函数介绍 3.2、回调函数的案例&#xff1a;qsort函数 3.2.1、回顾冒泡排序 3.2.1、什么是qso…

Python 10之异常模块包

&#x1f600;前言 在Python编程中&#xff0c;我们时常会遇到各种异常和错误&#xff0c;同时我们也会使用多个模块和包来组织和结构化我们的代码。理解如何有效地处理异常和组织我们的代码是成为一个成功的Python程序员的关键。 . 在本教程中&#xff0c;我们将深入探讨Pytho…