当前位置: 首页 > news >正文

solidity高阶 -- Eth支付

        在区块链的世界里,智能合约是实现去中心化应用(DApp)的核心技术之一。Solidity 是一种专门用于编写以太坊智能合约的编程语言,它可以帮助开发者构建各种功能,包括支付功能。

        今天,我们就来探讨如何使用 Solidity 实现以太坊主币的支付功能,以及如何通过智能合约接收和管理这些资金。

        注意:使用继承时请确保代码的正确性,以防丢失个人财产,在这里友情提示您,不要复制来源不明的solidity代码并进行部署。本文为自己梳理总结,如有不足还请指出,感谢包容。

        学习更多solidity知识请访问 Github -- solidity基础 ,更多实例在 Smart contract

1. 以太坊支付的原理

        在以太坊网络中,支付功能的核心是通过智能合约接收和管理以太币(ETH)。Solidity 提供了一个关键字 payable,它允许一个地址或函数接收以太币。当一个函数被标记为 payable 时,用户可以通过调用该函数并发送以太币来执行合约逻辑。

1. 什么是payable

在Solidity中,payable是一个修饰符,用于标记函数或地址可以接收以太坊主币。如果一个函数被标记为payable,那么当调用该函数时,可以附带发送ETH。同样,如果一个地址被标记为payable,那么可以向该地址发送ETH。

2. 实现支付功能的代码示例

以下是一个简单的 Solidity 合约示例,展示了如何实现接收以太币的功能:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.3;contract Payable {address public owner;constructor() {owner = payable(msg.sender); // 将合约部署者设置为所有者,并确保其地址是 payable 类型}// 接收以太币的函数function deposit() external payable {}// 查询合约余额的函数function getBalance() external view returns (uint) {return address(this).balance; // 返回合约当前的以太币余额}
}

 

代码解析

  1. payable 关键字

    • payable 是 Solidity 中的一个关键字,用于标记地址或函数可以接收以太币。

    • constructor() 中,owner = payable(msg.sender) 将合约部署者的地址标记为 payable 类型,这样就可以接收以太币。

    • deposit() 函数中,payable 关键字使得该函数可以接收用户发送的以太币。

  2. msg.senderaddress(this)

    • msg.sender 是一个全局变量,表示调用当前函数的地址。

    • address(this) 表示当前合约的地址,address(this).balance 可以获取合约当前的以太币余额。

  3. externalview

    • external 表示函数只能从合约外部调用。

    • view 表示该函数不会修改区块链上的状态,只是读取数据。

 

3. 如何使用这个合约

部署合约

  1. 使用以太坊开发工具(如 Remix、Truffle 或 Hardhat)将合约部署到以太坊网络上。

  2. 部署完成后,合约会生成一个地址,你可以通过这个地址与合约交互。

发送以太币

  1. 在支持以太坊的钱包(如 MetaMask)中,找到合约地址。

  2. 调用 deposit() 函数,并在交易中附带一定数量的以太币。

  3. 交易完成后,合约会接收这些以太币,并存储在合约地址中。

查询余额

  1. 调用 getBalance() 函数,可以查询合约当前的以太币余额。

 

4. 注意事项

  1. 安全性:在处理以太币时,确保合约逻辑安全,避免漏洞导致资金损失。

  2. Gas 费用:所有以太坊交易都需要支付 Gas 费用,确保用户有足够的以太币支付这些费用。

  3. 测试环境:在将合约部署到主网之前,建议在测试网络(如 Ropsten 或 Rinkeby)上进行充分测试。

5.官方文档

发送以太币:转账、发送、调用(Solidity 代码示例)

如何发送以太币?

您可以通过以下方式将 Ether 发送到其他合约

  • transfer(2300 gas,抛出错误)
  • send(2300 gas,返回 bool)
  • call(forward all gas 或 set gas,返回 bool)

如何获得以太币?

接收以太币的合约必须至少具有以下功能之一

  • receive() external payable
  • fallback() external payable

receive()如果为空,则调用 ,否则调用。msg.datafallback()

您应该使用哪种方法?

call与 re-entrancy guard 结合使用是推荐在 2019 年 12 月之后使用的方法。

防止重入

  • 在调用其他 Contract 之前进行所有 state 更改
  • 使用 Re-entrancy Guard 修饰符
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;import {SafeTransferLib} from "@solady/utils/SafeTransferLib.sol";contract ReceiveEther {/*Which function is called, fallback() or receive()?send Ether|msg.data is empty?/ \yes  no/     \receive() exists?  fallback()/   \yes   no/      \receive()   fallback()*/// Function to receive Ether. msg.data must be emptyreceive() external payable {}// Fallback function is called when msg.data is not emptyfallback() external payable {}function getBalance() public view returns (uint256) {return address(this).balance;}
}contract SendEther {function sendViaTransfer(address payable _to) public payable {// This function is no longer recommended for sending Ether._to.transfer(msg.value);}function sendViaSend(address payable _to) public 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) public 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");}// This is 0.36% more gas-efficient per call and is more concise as wellfunction sendViaSolady(address payable _to) public payable {// Reverts with ETHTransferFailed error// this is the most gas-efficient method to useSafeTransferLib.safeTransferETH(to, msg.value);}
}

6. 总结

通过使用payable关键字,我们可以轻松地在Solidity合约中处理ETH的支付。本文中的示例合约展示了如何接收ETH并查询合约余额。你可以在此基础上扩展功能,例如实现ETH的提现、设置支付条件等。

希望这篇博客对你理解Solidity中的ETH支付有所帮助!如果你有任何问题或建议,欢迎在评论区留言。


注意:在实际开发中,请务必注意安全性问题,尤其是在处理资金相关的逻辑时。建议在部署到主网之前,充分测试合约并在测试网上进行验证。

相关文章:

solidity高阶 -- Eth支付

在区块链的世界里,智能合约是实现去中心化应用(DApp)的核心技术之一。Solidity 是一种专门用于编写以太坊智能合约的编程语言,它可以帮助开发者构建各种功能,包括支付功能。 今天,我们就来探讨如何使用 Sol…...

深入理解Java中的String

前言 在Java中,String类是一个非常重要的内置类,用于处理字符串数据。字符串是不可变的(immutable),这意味着一旦创建,字符串的内容不能被修改。作为Java中最为基础和常用的类之一,String类在内…...

洛谷 P1734 最大约数和 C语言

P1734 最大约数和 - 洛谷 | 计算机科学教育新生态 题目描述 选取和不超过 S 的若干个不同的正整数,使得所有数的约数(不含它本身)之和最大。 输入格式 输入一个正整数 S。 输出格式 输出最大的约数之和。 输入输出样例 输入 #1复制 …...

Golang 执行流程分析

文章目录 1. 编译和运行2. 编译和运行说明 1. 编译和运行 如果是对源码编译后,再执行,Go的执行流程如下图 如果我们是对源码直接 执行 go run 源码,Go的执行流程如下图 两种执行流程的方式区别 如果先编译生成了可执行文件,那么…...

python学opencv|读取图像(五十一)使用修改图像像素点上BGR值实现图像覆盖效果

【1】引言 前序学习了图像的得加方法,包括使用add()函数直接叠加BGR值、使用bitwise()函数对BGR值进行按位计算叠加和使用addWeighted()函数实现图像加权叠加至少三种方法。文章链接包括且不限于: python学opencv|读取图像(四十二&#xff…...

Flask数据的增删改查(CRUD)_flask删除数据自动更新

查询年龄小于17的学生信息 Student.query.filter(Student.s_age < 17) students Student.query.filter(Student.s_age.__lt__(17))模糊查询&#xff0c;使用like&#xff0c;查询姓名中第二位为花的学生信息 like ‘_花%’,_代表必须有一个数据&#xff0c;%任何数据 st…...

kamailio-ACC模块介绍【kamailio6.0. X】

Acc 模块 作者 Jiri Kuthan iptel.org jiriiptel.org Bogdan-Andrei Iancu Voice Sistem SRL bogdanvoice-system.ro Ramona-Elena Modroiu rosdev.ro ramonarosdev.ro 编辑 Bogdan-Andrei Iancu Voice Sistem SRL bogdanvoice-system.ro Sven Knoblich 1&1 Internet …...

数据库对象

数据库对象 数据库对象是构成数据库结构的基本单位&#xff0c;它们定义了数据库存储的数据类型、数据的组织方式以及数据之间的关系。在数据库中&#xff0c;对象可以包括表&#xff0c;视图&#xff0c;索引&#xff0c;触发器&#xff0c;存储过程&#xff0c;函数等多种类…...

EtherCAT主站IGH-- 27 -- IGH之globals.h文件解析

EtherCAT主站IGH-- 27 -- IGH之globals.h文件解析 0 预览一 该文件功能宏定义数据结构打印宏三 h文件翻译四 c文件翻译该文档修改记录:总结0 预览 一 该文件功能 该文件包含了一些全局定义和宏,用于 IgH EtherCAT 主站(EtherCAT Master)的实现。包括了一些超时设定、宏定义…...

2025多目标优化创新路径汇总

多目标优化是当下非常热门且有前景的方向&#xff01;作为AI领域的核心技术之一&#xff0c;其专注于解决多个相互冲突的目标的协同优化问题&#xff0c;核心理念是寻找一组“不完美但均衡”的“帕累托最优解”。在实际中&#xff0c;几乎处处都有它的身影。 但随着需求场景的…...

15JavaWeb——Maven高级篇

Maven高级 Web开发讲解完毕之后&#xff0c;我们再来学习Maven高级。其实在前面的课程当中&#xff0c;我们已经学习了Maven。 我们讲到 Maven 是一款构建和管理 Java 项目的工具。经过前面 10 多天 web 开发的学习&#xff0c;相信大家对于 Maven 这款工具的基本使用应该没什…...

使用Ollama本地化部署DeepSeek

1、Ollama 简介 Ollama 是一个开源的本地化大模型部署工具&#xff0c;旨在简化大型语言模型&#xff08;LLM&#xff09;的安装、运行和管理。它支持多种模型架构&#xff0c;并提供与 OpenAI 兼容的 API 接口&#xff0c;适合开发者和企业快速搭建私有化 AI 服务。 Ollama …...

蓝桥杯刷题DAY1:前缀和

所谓刷题&#xff0c;讲究的就是细心 帕鲁服务器崩坏【算法赛】 “那个帕鲁我已经观察你很久了&#xff0c;我对你是有些失望的&#xff0c;进了这个营地&#xff0c;不是把事情做好就可以的&#xff0c;你需要有体系化思考的能力。” 《幻兽帕鲁》火遍全网&#xff0c;成为…...

【基于SprintBoot+Mybatis+Mysql】电脑商城项目之用户注册

&#x1f9f8;安清h&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;【计算机网络】【Mybatis篇】 &#x1f6a6;作者简介&#xff1a;一个有趣爱睡觉的intp&#xff0c;期待和更多人分享自己所学知识的真诚大学生。 目录 &#x1f3af;项目基本介绍 &#x1f6a6;项…...

MINIRAG: TOWARDS EXTREMELY SIMPLE RETRIEVAL-AUGMENTED GENERATION论文翻译

感谢阅读 注意不含评估以后的翻译原论文地址标题以及摘要介绍部分MiniRAG 框架2.1 HETEROGENEOUS GRAPH INDEXING WITH SMALL LANGUAGE MODELS2.2 LIGHTWEIGHT GRAPH-BASED KNOWLEDGE RETRIEVAL2.2.1 QUERY SEMANTIC MAPPING2.2.2 TOPOLOGY-ENHANCED GRAPH RETRIEVAL 注意不含评…...

微服务入门(go)

微服务入门&#xff08;go&#xff09; 和单体服务对比&#xff1a;里面的服务仅仅用于某个特定的业务 一、领域驱动设计&#xff08;DDD&#xff09; 基本概念 领域和子域 领域&#xff1a;有范围的界限&#xff08;边界&#xff09; 子域&#xff1a;划分的小范围 核心域…...

Baklib揭示内容中台实施最佳实践的策略与实战经验

内容概要 在当前数字化转型的浪潮中&#xff0c;内容中台的概念日益受到关注。它不再仅仅是一个内容管理系统&#xff0c;而是企业提升运营效率与灵活应对市场变化的重要支撑平台。内容中台的实施离不开最佳实践的指导&#xff0c;这些实践为企业在建设高效内容中台时提供了宝…...

C++11新特性之lambda表达式

1.介绍 C11引入了lambda表达式。lambda表达式提供一种简洁的方式来定义匿名函数对象&#xff0c;使得在需要临时定义一个函数时非常方便。 2.lambda表达式用法 lambda表达式的基本用法为&#xff1a; [捕获列表]&#xff08;参数列表&#xff09;->返回类型 { 函数体 …...

洛谷 P10289 [GESP样题 八级] 小杨的旅游 C++ 完整题解

一、题目链接 P10289 [GESP样题 八级] 小杨的旅游 - 洛谷 二、题目大意 n个节点之间有n - 1条边&#xff0c;其中k个节点是传送门&#xff0c;任意两个传送门之间可以 以0单位地时间相互到达。问从u到v至少需要多少时间&#xff1f; 三、解题思路 输入不必多讲。 cin >> …...

使用 Tauri 2 + Next.js 开发跨平台桌面应用实践:Singbox GUI 实践

Singbox GUI 实践 最近用 Tauri Next.js 做了个项目 - Singbox GUI&#xff0c;是个给 sing-box 用的图形界面工具。支持 Windows、Linux 和 macOS。作为第一次接触这两个框架的新手&#xff0c;感觉收获还蛮多的&#xff0c;今天来分享下开发过程中的一些经验~ 为啥要做这个…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

【HTTP三个基础问题】

面试官您好&#xff01;HTTP是超文本传输协议&#xff0c;是互联网上客户端和服务器之间传输超文本数据&#xff08;比如文字、图片、音频、视频等&#xff09;的核心协议&#xff0c;当前互联网应用最广泛的版本是HTTP1.1&#xff0c;它基于经典的C/S模型&#xff0c;也就是客…...

10-Oracle 23 ai Vector Search 概述和参数

一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI&#xff0c;使用客户端或是内部自己搭建集成大模型的终端&#xff0c;加速与大型语言模型&#xff08;LLM&#xff09;的结合&#xff0c;同时使用检索增强生成&#xff08;Retrieval Augmented Generation &#…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机

这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机&#xff0c;因为在使用过程中发现 Airsim 对外部监控相机的描述模糊&#xff0c;而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置&#xff0c;最后在源码示例中找到了&#xff0c;所以感…...

虚拟电厂发展三大趋势:市场化、技术主导、车网互联

市场化&#xff1a;从政策驱动到多元盈利 政策全面赋能 2025年4月&#xff0c;国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》&#xff0c;首次明确虚拟电厂为“独立市场主体”&#xff0c;提出硬性目标&#xff1a;2027年全国调节能力≥2000万千瓦&#xff0…...

scikit-learn机器学习

# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...

LabVIEW双光子成像系统技术

双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制&#xff0c;展现出显著的技术优势&#xff1a; 深层组织穿透能力&#xff1a;适用于活体组织深度成像 高分辨率观测性能&#xff1a;满足微观结构的精细研究需求 低光毒性特点&#xff1a;减少对样本的损伤…...

消息队列系统设计与实践全解析

文章目录 &#x1f680; 消息队列系统设计与实践全解析&#x1f50d; 一、消息队列选型1.1 业务场景匹配矩阵1.2 吞吐量/延迟/可靠性权衡&#x1f4a1; 权衡决策框架 1.3 运维复杂度评估&#x1f527; 运维成本降低策略 &#x1f3d7;️ 二、典型架构设计2.1 分布式事务最终一致…...