以太坊交易事务的打包规则

2024-09-03 08:18

本文主要是介绍以太坊交易事务的打包规则,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

以太坊交易的本质

首先,大家应该都知道以太坊交易的本质:我给你 10 个以太币不是我真的把什么东西给了你,而是我向以太坊网络提出了更改余额状态的请求,让各个节点上纪录的你与我的 Ether Balance 进行更新。

以太坊交易之状态更新示意图

以太坊交易之状态更新示意图

然而,送出交易在技术上并不困难,区块链的重点是在于打包交易并出块的过程。如何验证、确认交易是否有效,让这笔交易顺利发生,并让各个节点即时更新以拥有相同的帐本,这样打包交易并出块的机制即「挖矿」。

以太坊交易送出至出块的流程

以太坊交易送出至出块流程 

以太坊交易送出至出块流程 

通过上图我们可以看出

在以太坊上一笔交易送出后经历的流程:

1.发送交易

2.私钥签名

3.交易发送至节点

4.节点间广播新接收交易

5.矿工打包交易并出块

交易送出之后,会被丢进一个「交易池」里,等待被矿工打包。

矿工从「交易池」中捞出未出块的交易来进行打包与出块。

因为每个区块有大小限制,比特币一个区块是1MB 的容量限制;以太坊的区块则是以 Gas 来计算,有 800 M Gas 的限制。若以一笔基础交易 21,000 Gas 来计算,一个以太坊区块可以容纳 380 笔交易。因此当「交易池」里的交易量大时,会有许多交易没办法即时被打包而滞留在池子中等待。

如何挑选要捞出哪些交易?

矿工节点可以自行设置参数,不过大多数矿工都是按造手续费的多寡排序,手续费高的会优先被打包出块;手续费低的则可能要等到天荒地老。

以太坊手续费计算公式:

以太坊交易手续费公式:Tx Fee(手续费)= Gas Used(燃料用量) * Gas Price(单位燃料价格)

由于 Gas Used 是由系统决定的,我们在发送交易时决定手续费多寡的决定性变因就是 Gas Price 了。下方我们以 Metamask 接口来做介绍:

Metamask发送交易的页面流程图

Metamask发送交易的页面流程图

在上图左方我们可以看到系统缺省有三个速度可以供选择,不过要更近一步设定,可以点「进阶选项」,便会进到上图右方的划面。

我们可以自行设定 Gas Price 及 调整交易的 Gas Limit。WEI 是以太坊上最小的单位(10^-18 Ether);GWEI 则是 1G 的 WEI(10^-9 Ether)。
图中的 Gas Price 设定为 10 GWEI;Gas Limit 为 21,000。因此:

10 GWEI(单位燃料价格)* 21,000(燃料用量)= 0.00021 Ether(手续费)

Gas Limit

若是要操作智慧合约等较繁复的功能,不太确定实际的 Gas Used,也可以把 Gas Limit 调高一些,被打包时只会收取实际 Gas Used 作为手续费,多给的 Gas 会退返回来。

不过由于以太坊区块有 800M 的大小限制,若把 Gas Limit 设太高,也可能产生塞不进区块中而滞留在「交易池」里的情况。

GWEI

至于要设多少 GWEI,我们可以到 ETH gas station上查看即时的「交易池」状况:

ETH GAS STATION 上的 Gas Price 建议

ETH GAS STATION 上的 Gas Price 建议

可以看到如果希望交易能尽快被确认,GWEI 可能要设到 20 以上,大约在 2 分钟内可以被确认完成(不过通常设到 FAST,应该 15~30 秒就会被确认了)。截图当下其实是偏拥堵的情形,通常 10 GWEI 左右就可以达到 FAST(<2 mins),现在却要 20 GWEI。

这边显示的 Gas Price 建议,其实就是「交易池」里的状况:池里有多少笔 pending 的交易、这些池里的交易给的手续费是多少。根据这些资讯依据来呈现设的 Gas Price 估计要多少个区块(时间)后才会被打包上链。

然而,许多人常遇到关于交易的问题:

我的交易怎么一直送不出去怎么办?

也许是 Gas Price 设太低,或是突然有大量交易湧入等各样的情况。这时其实有补救的方法:

加速交易

当交易由 Metamask 送出后,可以看到下方会有个「加速」的按钮,点进去后便可以再次设定 Gas Price,设定并重新送出交易后,就可以在底下的活动纪录看到手续费被提高了。

取消交易

除了能加速交易,其实也可以取消交易。方法便是点击等待处理的交易,展开后可以看到「取消」的按钮,点击并确认后 Metamask 会向节点发送取消交易的请求,并在确认取消后收取手续费。

若发现取消交易的请求 pending 有点久,其实在下方可以看到有「加速取消」的按钮,可以再进行进一步设定。

那麽,以上这些过程其实是发生了什么事,技术上如何做到的呢?

答案跟我们在 第一节谈到的 nonce 有关,做法是:

再发送一个同样 nonce 的交易

由于以太坊 nonce 的设计,会追踪每个地址所有交易的「序次」,也就是说每个 nonce 只会有一笔交易。

加速交易

因此加速交易便是我再发送一笔同个 nonce、同样内容的交易。因为提高了交易手续费,所以当同样 nonce 的两个交易都位于「交易池」中,后发的手续费较高的交易原则上会被优先打包出块。

因为每个 nonce 只能有一笔交易,先发的那笔手续费较低的交易永远不会被打包,于是便会被系统给丢弃,因而交易失败。

取消交易

取消交易其实也是类似的逻辑,做法是:

我再发送一笔给自己 0 Ether 的同 nonce 交易。由于这笔交易手续费较高,会优先被打包出块,让原交易被系统丢弃而交易失败,如此来达到取消交易的目的。

结论

1.交易送出后会被丢到一个交易池中等待被矿工打包,决定先后顺序的主要因子为单位 Gas Price(GWEI)给的多寡。

2.发送交易时可以到 ETH gas station参考即时的交易池状况再来决定要设多少 GWEI 以能在预期的时间内被打包上链。

3.若发现交易持续滞留在交易池中等待被处理,可以加速交易或取消交易。

综上所述,大家应该都对以太坊交易的背后逻辑与打包规则有更深一层的认识了。

​区块链技术知识:以太坊交易的打包规则-有一亿

这篇关于以太坊交易事务的打包规则的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

springboot3打包成war包,用tomcat8启动

1、在pom中,将打包类型改为war <packaging>war</packaging> 2、pom中排除SpringBoot内置的Tomcat容器并添加Tomcat依赖,用于编译和测试,         *依赖时一定设置 scope 为 provided (相当于 tomcat 依赖只在本地运行和测试的时候有效,         打包的时候会排除这个依赖)<scope>provided

MySql 事务练习

事务(transaction) -- 事务 transaction-- 事务是一组操作的集合,是一个不可分割的工作单位,事务会将所有的操作作为一个整体一起向系统提交或撤销请求-- 事务的操作要么同时成功,要么同时失败-- MySql的事务默认是自动提交的,当执行一个DML语句,MySql会立即自动隐式提交事务-- 常见案例:银行转账-- 逻辑:A给B转账1000:1.查询

Lua 脚本在 Redis 中执行时的原子性以及与redis的事务的区别

在 Redis 中,Lua 脚本具有原子性是因为 Redis 保证在执行脚本时,脚本中的所有操作都会被当作一个不可分割的整体。具体来说,Redis 使用单线程的执行模型来处理命令,因此当 Lua 脚本在 Redis 中执行时,不会有其他命令打断脚本的执行过程。脚本中的所有操作都将连续执行,直到脚本执行完成后,Redis 才会继续处理其他客户端的请求。 Lua 脚本在 Redis 中原子性的原因

Adblock Plus官方规则Easylist China说明与反馈贴(2015.12.15)

-------------------------------特别说明--------------------------------------- 视频广告问题:因Adblock Plus的局限,存在以下现象,优酷、搜狐、17173黑屏并倒数;乐视、爱奇艺播放广告。因为这些视频网站的Flash播放器被植入了检测代码,而Adblock Plus无法修改播放器。 如需同时使用ads

android6/7 system打包脚本

1.android5打包system就是网站上常见的制作ROM必备的解包打包system脚本 指令如下:mkuserimg.sh -s out/target/product/$TARGET_PRODUCT/system out/target/product/$TARGET_PRODUCT/obj/PACKAGING/systemimage_intermediates/system.img

android打包解包boot.img,system.img

原帖地址:http://www.52pojie.cn/thread-488025-1-1.html 转载Mark一下,日后研究 最近工作需要对boot.img,system.img进行破解。顺便将心得分享一下。 我的工作环境是在linux下的。所以工具都是针对linux的。 boot.img破解相关工具: 1、split_boot    perl脚本 2、boot_i

MTK Android P/Q system/vendor/super快速打包

一、Android 新版本默认开启了动态分区,把system vendor  product等分区打包成一个super分区。这对于我们使用替换分区的方法来排查问题不是很方便,直接替换一个super也不知道到底是哪个部分导致的。所以我们需要自己制作super.img来缩小范围。下面讲讲如何快速生成system、vendor、super,以及vbmeta(校验image,不匹配可能会导致不开机) 二

MTK AndroidP/Q快速打包ramdisk

一、Android P/Q ramdisk与老版本的差异 Android老版本的ramdisk是out下的root/ramdisk打包而来,里面包含了init  /sbin  init.rc   default.prop等文件。是一个完整的ramdisk Android新版本ramdisk分为了out 下的ramdisk目录和root目录,init ,init.rc等文件大部分都放到了syst

Android P/Q MTK平台无依赖打包boot.img

背景:        有时排查版本问题,需要用到替换img的方式来查找问题出现在哪个img,若出现在bootimg,那到底是kernel、DTB 还是ramdisk。此时就需要单独替换其中一个的方式来打包,之前直接make bootimage-nodeps就可以了,但现在发现执行这个命令无效了。下面就分析下新版本如何找到正确的打包命令。 一、找到编译boot的命令 之前Android编译lo

spring事务属性的xml格式配置

实际是使用代理做的事务优化 <!--配置事务的属性--><tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <!--匹配所有以add开头的方法--><tx:method name="add*" propagation="REQUIRED" /> <tx:metho