以太坊交易的本质

首先,大家应该都知道以太坊交易的本质:我给你 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发送交易的页面流程图

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

我们可以自行设定 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 建议

可以看到如果希望交易能尽快被确认,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.btcinst.com/blockchain/tech/1069.html

以太坊交易的打包规则相关推荐

  1. 以太坊交易信息及event、input、logs、topics等概念机制

    文章目录 一.交易信息获取 1.1 合约事件例子定义 1.2 以太坊交易获取 二.input解析 2.1 input内容解析 2.2 input处理逻辑 三.logs解析 3.1 logs解析代码 四 ...

  2. 以太坊交易中的nonce和confirmation

    1. 以太坊交易中的nonce及其价值 1.1 以太坊交易中的nonce值 在以太坊中,每笔交易都有一个nonce值,该nonce值代表的是从该交易发起地址发出的交易数.(当存在使用同一地址从多个客户 ...

  3. 区块链 以太坊 交易结构、执行、存储 解析 交易中为什么没有包含发送者地址这条数据

    一. 交易的结构 1. Transaction结构 交易结构定义在 core/types/transaction.go 中: type Transaction struct {//交易数据data t ...

  4. 以太坊交易Nonce设置

    1 什么是nonce? 以太坊中的nonce有两个意义: 1.工作量证明:为了证明工作量的无意义的值,这是采矿的本质,这个值将决定采矿的难度, 2.账户的随机数:在一个账户中的防止多重交易的用途.例如 ...

  5. java如何监听以太坊交易

    2019独角兽企业重金招聘Python工程师标准>>> 你可以在web3j库的帮助下使用java轻松监听以太坊交易,但此库无法监听Erc20 Token交易. 要监听Erc20Tok ...

  6. Infura Http 客户端 以太坊 交易

    web3j Infura 模块提供了一个Infura Http 客户端(InfuraHttpService),它为Infura特定的Infura-Ethereum-Preferred-Client提供 ...

  7. 以太坊地址和公钥_以太坊交易签名解析源码解读

    上篇文章<以太坊交易签名过程源码解析[1]>从源码角度分析了一个合约调用的的签名过程,签名后的交易发送到以太坊节点后,节点需要从签名交易中还原出公钥(从公钥中单向计算出账号地址),进而将交 ...

  8. 观点:以太坊交易费市场泡沫预警,交易费日渐成为用户难以承受之重

    在经历了一次大熊市之后,以太坊已经再次流行起来.受包括 ETH 价格反弹以及所谓"去中心化金融"(DeFi)的采用等因素的综合影响,以太坊区块链的活跃用户和日交易量都出现了强力增长 ...

  9. Web3j通过合约地址监听transfer事件获取以太坊交易数据

    Web3j通过合约地址监听transfer事件获取以太坊交易数据 We3j web3j是一个轻量级的Java库,用于在Ethereum网络上集成客户端(节点). 核心特性 通过Java类型的JSON- ...

  10. 如何用树莓派和PHP开发一个比特币和以太坊交易机器人

    我最近得到了Raspberry Pi Zero Wifi,我告诉你这个东西是改变游戏规则的.我之前使用过RasPis,但由于该设备的占地面积小得多,耗电少,价格便宜且无线上网,因此非常适合低端或物联网 ...

最新文章

  1. 甲小姐对话稚晖君:深度学习并非AI的终点
  2. lnmp安装博客系统WordPress
  3. spring-data-redis 使用过程中需要注意的地方
  4. 搭建S3C6410开发板的测试环境
  5. paper 46 :中文latex的安装与使用
  6. C++ 系列:extern
  7. 聚焦效率与目标差距,数据才是远程办公的内核!
  8. Python练习:期末测评
  9. intellij IDEA 报 非法字符 \65279 原因及解决方法
  10. mysql语句优化 explai_mysql使用explain优化sql语句
  11. 第十七章——配置SQLServer(4)——优化SQLServer实例的配置
  12. LINQ查询表达式详解(2)——查询表达式的转换
  13. JAVA学习笔记之复用类之重载和重写
  14. 职场真正的潜规则,毕业生却一直不重视!还自以为是的认为这是优点!!HR直接会pass这一群人!!
  15. 洛谷4173(fft带通配符字符串匹配)
  16. php调用itunes,使用cURL和PHP检索iTunes App Store XML
  17. vue怎么制作甘特图——dhtmlx-gantt
  18. Godaddy域名申请及设置
  19. 如何删除windows的WSL
  20. html调用wifi热点,笔记本如何做wifi热点

热门文章

  1. 深度技术 GHOSTXPSP3 快速装机 2013圣诞节专版
  2. 通过编程方式在InfoPath 2010表单的下拉框修改事件中获取数据
  3. 这一刻只想好好做个平凡的人
  4. 5 获取Form表单取值
  5. springboot输出日志到文件配置
  6. Laravel 学习笔记之文件上传
  7. 关于人生观与方法论的两篇文章
  8. C#自动识别文件编码
  9. java本地方法如何调用其他程序函数,方法详解
  10. 算法设计——极大极小搜索