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支付有所帮助!如果你有任何问题或建议,欢迎在评论区留言。


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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

14-9-1C++STL的set容器

(一)set容器的基本概念 1. set是一个集合容器,其中所包含的元素是唯一的,集合中的元素按一定的顺序排列,元素插入过程是按排序规则插入,所以不能指定插入位置 2. set深用红黑树变体的数据结构实现&#xff…

数据分析系列--②RapidMiner导入数据和存储过程

一、下载数据 二、导入数据 1. 在本地计算机中创建3个文件夹 2. 从本地选择.csv或.xlsx 三、界面说明 四、存储过程 1.保存 Congratulations, you are done. 一、下载数据 点击下载AssociationAnalysisData.xlsx数据集 二、导入数据 1. 在本地计算机中创建3个文件夹 2. 从…

被裁与人生的意义--春节随想

还有两个月就要被迫离开工作了十多年的公司了,不过有幸安安稳稳的过了一个春节,很知足! 我是最后一批要离开的,一百多号同事都没“活到”蛇年。看着一批批仁人志士被“秋后斩首”,马上轮到我们十来个,个中滋味很难言清…

Docker自定义镜像

Dockerfile自定义镜像 一:镜像结构 镜像是将应用程序及其需要的系统函数库、环境、配置、依赖打包而成。 我们以MySQL为例,来看看镜像的组成结构: 简单来说,镜像就是在系统函数库、运行环境基础上,添加应用程序文件、…

论文阅读(十六):利用线性链条件随机场模型检测阵列比较基因组杂交数据的拷贝数变异

1.论文链接:Detection of Copy Number Variations from Array Comparative Genomic Hybridization Data Using Linear-chain Conditional Random Field Models 摘要: 拷贝数变异(CNV)约占人类基因组的12%。除了CNVs在癌症发展中的…

ASP.NET Core 中间件

目录 一、常见的内置中间件 二、自定义中间件 三、中间件的执行顺序 四、其他自动逸中间件案例 1. 身份验证中间件 2、跨域中间件(CORS) ASP.NET Core 中,中间件(Middleware)是处理 HTTP 请求和响应的组件链。你…

JavaScript中的数组方法总结+详解

在JS中,数组方法是非常重要且常用的方法.在此整理总结一番. 1. javaScript常用数组方法 2.方法详解 1.push(); 功能: 在数组最后一位添加一个或多个元素,并返回新数组的长度,改变原数组.(添加多个元素用逗号隔开) var arr [1, 2, "c"];var rel arr.push(&q…

「全网最细 + 实战源码案例」设计模式——桥接模式

核心思想 桥接模式(Bridge Pattern)是一种结构型设计模式,将抽象部分与其实现部分分离,使它们可以独立变化。降低代码耦合度,避免类爆炸,提高代码的可扩展性。 结构 1. Implementation(实现类…

动态规划DP 背包问题 完全背包问题(题目分析+C++完整代码)

概览检索 动态规划DP 概览(点击链接跳转) 动态规划DP 背包问题 概览(点击链接跳转) 完全背包问题 原题链接 AcWiing 3. 完全背包问题 题目描述 有 N种物品和一个容量是 V的背包,每种物品都有无限件可用。 第 i种物…

开源智慧园区管理系统对比五款主流产品探索智能运营新模式

内容概要 在这个数字化迅速发展的时代,园区管理也迎来了全新的机遇和挑战。众所周知,开源智慧园区管理系统作为一种创新解决方案,正逐步打破传统管理的局限性。它的开放性不仅使得系统可以根据具体需求进行灵活调整,也为用户提供…

Unity实现按键设置功能代码

一、前言 最近在学习unity2D,想做一个横版过关游戏,需要按键设置功能,让用户可以自定义方向键与攻击键等。 自己写了一个,总结如下。 二、界面效果图 这个是一个csv文件,准备第一列是中文按键说明,第二列…

稀疏混合专家架构语言模型(MoE)

注:本文为 “稀疏混合专家架构语言模型(MoE)” 相关文章合辑。 手把手教你,从零开始实现一个稀疏混合专家架构语言模型(MoE) 机器之心 2024年02月11日 12:21 河南 选自huggingface 机器之心编译 机器之心…

C++哈希(链地址法)(二)详解

文章目录 1.开放地址法1.1key不能取模的问题1.1.1将字符串转为整型1.1.2将日期类转为整型 2.哈希函数2.1乘法散列法(了解)2.2全域散列法(了解) 3.处理哈希冲突3.1线性探测(挨着找)3.2二次探测(跳…

29.Word:公司本财年的年度报告【13】

目录 NO1.2.3.4 NO5.6.7​ NO8.9.10​ NO1.2.3.4 另存为F12:考生文件夹:Word.docx选中绿色标记的标题文本→样式对话框→单击右键→点击样式对话框→单击右键→修改→所有脚本→颜色/字体/名称→边框:0.5磅、黑色、单线条:点…

深入理解Java引用传递

先看一段代码: public static void add(String a) {a "new";System.out.println("add: " a); // 输出内容:add: new}public static void main(String[] args) {String a null;add(a);System.out.println("main: " a);…

Python从零构建macOS状态栏应用(仿ollama)并集成AI同款流式聊天 API 服务(含打包为独立应用)

在本教程中,我们将一步步构建一个 macOS 状态栏应用程序,并集成一个 Flask 服务器,提供流式响应的 API 服务。 如果你手中正好持有一台 MacBook Pro,又怀揣着搭建 AI 聊天服务的想法,却不知从何处迈出第一步,那么这篇文章绝对是你的及时雨。 最终,我们将实现以下功能: …

Qt之数据库操作三

主要介绍qt框架中对数据库的增加&#xff0c;删除和修改功能。 软件界面如下 程序结构 tdialogdata.h中代码 #ifndef TDIALOGDATA_H #define TDIALOGDATA_H#include <QDialog> #include<QSqlRecord> namespace Ui { class TDialogData; }class TDialogData : pub…

neo4j入门

文章目录 neo4j版本说明部署安装Mac部署docker部署 neo4j web工具使用数据结构图数据库VS关系数据库 neo4j neo4j官网Neo4j是用ava实现的开源NoSQL图数据库。Neo4作为图数据库中的代表产品&#xff0c;已经在众多的行业项目中进行了应用&#xff0c;如&#xff1a;网络管理&am…

JVM-运行时数据区

JVM的组成 运行时数据区-总览 Java虚拟机在运行Java程序过程中管理的内存区域&#xff0c;称之为运行时数据区。 《Java虚拟机规范》中规定了每一部分的作用 运行时数据区-应用场景 Java的内存分成哪几部分&#xff1f; Java内存中哪些部分会内存溢出&#xff1f; JDK7 和J…

Java篇之继承

目录 一. 继承 1. 为什么需要继承 2. 继承的概念 3. 继承的语法 4. 访问父类成员 4.1 子类中访问父类的成员变量 4.2 子类中访问父类的成员方法 5. super关键字 6. super和this关键字 7. 子类构造方法 8. 代码块的执行顺序 9. protected访问修饰限定符 10. 继承方式…