【Solidity】支付

2024-08-22 01:28
文章标签 solidity 支付

本文主要是介绍【Solidity】支付,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

以太比的单位

wei、gwei、finney 和 ether 是以太币(Ether)的不同单位。

  1. wei 是以太币的最小单位,1 ether = 10^18 wei;这是 Solidity 中的默认单位
uint public oneWei = 1 wei;
  1. gwei 是 wei 的 10^9 倍,1 ether = 10^9 gwei;常用于表示交易费用 (gas price)
uint public oneGwei = 1 gwei;
  1. finney 是 wei 的 10^15 倍,1 ether = 10^3 finney
uint public oneFinney = 1 finney;
  1. ether 是 wei 的 10^18 倍;是以太坊的基本单位
uint public oneEther = 1 ether;



payable 修饰符

以下函数需要使用 payable 修饰:① 需要接收以太币的函数;② 需要使用 msg.value / callvalue() 且可被外部访问的函数。

contract Demo {// 使用 payable 修饰构造函数,使合约可以在部署时接收以太币constructor() payable {}// 接收以太币的函数, 必须使用 payable 修饰符function receiveEther() external payable {require(msg.value > 0, "Must send some Ether");}// 提现函数, 将合约中的以太币发送给调用者function withdraw() external {uint amount = address(this).balance;require(amount > 0, "No Ether to withdraw");payable(msg.sender).transfer(amount);}// 获取合约的以太币余额function getBalance() external view returns (uint) {return address(this).balance;}
}
  1. 设置以太币的数量,部署 Demo 合约

  2. 调用 getBalance 函数,查看合约的以太币余额

  3. 设置以太币的数量,调用 receiveEther 函数

  4. 调用 getBalance 函数,查看合约的以太币余额

  5. 调用 withdraw 函数,将合约中的以太币发送给调用者

  6. 再次调用 getBalance 函数,查看合约的以太币余额



receive & fallback 方法

在 Solidity 中,receive & fallback 是一种特殊的函数。它不需要 function 关键字、没有参数、也没有返回值。

特性:

  • receive & fallback 函数必须声明为 external,表示只能通过外部调用来触发。
  • receive 必须使用 payable 修饰符;fallback 可以使用 payable 修饰符。

receive & fallback 的区别:

  • receive:专门用于处理没有附加数据的以太币转账。
  • fallback:用于处理所有其他情况,包括调用不存在的函数或接收带有附加数据的以太币转账。如果合约没有定义 receive 方法,但定义了 payable 的 fallback 方法,那么在接收以太币时会调用 fallback 方法。
contract Demo {event Log(string message, address sender, uint value, bytes data);// 定义 receive 方法receive() external payable {emit Log("receive", msg.sender, msg.value, "");}// 定义 fallback 方法fallback() external payable {emit Log("fallback", msg.sender, msg.value, msg.data);}
}



以太币的发送与接收

接收以太币的 3 种形式:

  1. 编写 payable receive / fallback 方法,以支持直接传入以太币

  2. 用 payable 修饰 constructor 方法,以支持在部署时传入以太币

  3. 用 payable 修饰其他方法,以支持在调用方法时传入以太币

contract ReceiveEther {event Received(address, uint, uint);// 接收部署时传入的以太币constructor() payable {}// 接收直接传入的以太币receive() external payable {// 打印发送者、接收的以太币数量、剩余的 gasemit Received(msg.sender, msg.value, gasleft());}// 接收调用方法时传入的以太币function receiveEther() external payable {// 打印发送者、接收的以太币数量、剩余的 gasemit Received(msg.sender, msg.value, gasleft());}
}
  1. 设置以太币的数量,部署 ReceiveEther 合约;查看事件,可以看到接收的以太币数量

  2. 设置以太币的数量,调用 receiveEther 函数;查看事件,可以看到接收的以太币数量


用 payable 修饰的 address 变量有 3 个方法发送以太币:

  1. transfer:有 2300 gas 的限制;如果转账失败,会回滚交易

  2. send:有 2300 gas 的限制;如果转账失败,不会回滚交易,而是返回 false

  3. call:没有 gas 限制,可以指定 gas 量;如果转账失败,不会回滚交易,而是返回 false

contract SendEther {// 使用 transfer 发送以太币function sendEtherViaTransfer(address payable recipient) external payable {recipient.transfer(msg.value);}// 使用 send 发送以太币function sendEtherViaSend(address payable recipient) external payable {bool success = recipient.send(msg.value);require(success, "Send failed");}// 使用 call 发送以太币 (推荐)function sendEtherViaCall(address payable recipient) external payable {(bool success, ) = recipient.call{value: msg.value}("");require(success, "Call failed");}
}
  1. 部署 SendEther 合约

  2. 设置以太币的数量,调用 SendEther 合约的 sendEtherViaTransfer 函数,传入 ReceiveEther 合约的地址;可以看到 ReceiveEther 合约的以太币余额变化

  3. 设置以太币的数量,调用 SendEther 合约的 sendEtherViaSend 函数,传入 ReceiveEther 合约的地址;可以看到 ReceiveEther 合约的以太币余额变化

  4. 设置以太币的数量,调用 SendEther 合约的 sendEtherViaCall 函数,传入 ReceiveEther 合约的地址;可以看到 ReceiveEther 合约的以太币余额变化


这篇关于【Solidity】支付的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1094849

相关文章

jsapi 支付缺少appid ¬ify_url

$.ajax({url: 'url',type: 'get',dataType: "json",//改成jsonsuccess: function (data) {//$('#xx').val(data)WeixinJSBridge.invoke('getBrandWCPayRequest', $.parseJSON(data),function(res){if(res.err_msg == "

“设计模式双剑合璧:工厂模式与策略模式在支付系统中的完美结合”

工厂模式(Factory Pattern)和策略模式(Strategy Pattern)都是常见的设计模式,但它们解决的问题和应用场景不同。下面是它们的区别: 1. 目的不同: 工厂模式(Factory Pattern): 工厂模式的主要目的是创建对象。它通过定义一个创建对象的接口,让子类决定实例化哪一个具体类,从而将对象创建的逻辑与使用的代码分离。 工厂模式可以分为简单工厂、工厂方法和抽象

社群空间站付费入群系统易支付版全套搭建教程

社群空间站9.9付费入群系统易支付版全套搭建教程 1.创建站点 2.搭建环境 php7.2 3.上传源码包 数据库批量修改sq9.dongge1.icu s10.dongge1.icu 改为你的域名 4.上传数据库 修改数据库文件/data/config/ 5.访问域名 6.账户密码 admin 123456 7.易支付修改地址是在/data/tpl/app/default/yy_

店匠科技携手Stripe共谋电商支付新篇章

在全球电商行业蓬勃发展的背景下,支付环节作为交易闭环的核心,其重要性日益凸显。随着消费者对支付体验要求的不断提高,以及跨境电商的迅猛发展,支付市场正经历着前所未有的变革与挑战。在这一充满机遇与竞争的领域,店匠科技(Shoplazza)凭借其创新的嵌入式支付解决方案—— Shoplazza Payments,成功在市场中占据了一席之地。 近日,在新加坡举办的 Stripe Tour 新加坡站 20

浪子易支付8.29版本PHP网站源码

源码下载 浪子易支付8.29版本PHP网站源码 更新记录 2024/08/29: 1.付款记录管理支持批量操作 2.优化数据清理功能 3.修复了一些已知问题 2024/07/21: 1.更新全新的V2版API接口,使用RSA公私钥验证 2.支持通过接口发起代付转账、退款、查询等 3.支持通过接口发起付款码支付、JSAPI支付、APP支付 4.订单退款支持多次部分金额退款 5.针对插件开

微信支付商家转账到零钱:快速开通攻略及功能全解

一、申请资格与条件 哪些商家可以申请商家转账到零钱功能? 仅公司性质的商户可以申请,个体工商户当前不支持此功能。商户账号应无正在进行的处罚,且历史无风险行为。微信支付账户没有历史违规记录。商家系统已经上线并可以访问。是否需要满足开通满90天和连续交易30天的要求? 目前商家转账到零钱及现金红包功能已取消该限制,新注册公司可直接申请,无需等待。 二、申请流程 如何申请开通商家转账到零钱功能

微信扫码支付模式二支付状态Ajax轮询实例

Ajax 轮训支付状态代码: <span style="font-size:18px;"><script>//设置每隔1000毫秒执行一次load() 方法setInterval(function(){load()},1000);function load(){var xmlhttp; if (window.XMLHttpRequest){ // code for IE7+, Firef

Java对接微信支付V3流程及示例代码

微信支付V3对接流程如下: 创建商户平台账号:在微信支付商户平台(pay.weixin.qq.com)上注册并创建商户平台账号。 开通微信支付功能:在商户平台上完成实名认证,并申请开通微信支付功能。 获取API证书:在商户平台上下载API证书,并将证书保存在安全的地方。 配置回调接口:在商户自己的服务器上配置一个用于接收微信支付结果通知的回调接口,并确保能够正确处理通知。 获取接口调用

ios 中 localStorage 与 微信支付 的坑(工作记实)

系统:IOS 浏览器:Safari 上星期遇到一个IOS支付的问题。需求如下: 在 页面A 拉起 微信支付;支付成功后返回 页面A 弹出支付确认弹窗;点击弹窗校验订单支付情况; 根据需求代码实现如下: 在 页面A 请求后端接口 创建 微信支付链接 和 订单编号 并 通过 localStorage 保存本次的 订单编号(设id:1);在 页面A 打开 微信支付链接 成功拉起微信支付功能

支付后全局变量改变

if (router.query.recharge_back_URI) {const _url = decodeURIComponent(router.query.recharge_back_URI as string);const url = new URL(_url, location.href);if (url.origin === location.origin) {router.repl