主页 > imtoken下载app > 以太坊手续费详解

以太坊手续费详解

imtoken下载app 2023-04-13 07:38:51

2021-06-27

前言

以太坊是一个新兴的区块链技术平台,其目标是成为“永不停止的世界计算机”,人们可以在上面部署各种应用程序供全球使用。 以太坊是运行在以太坊公链虚拟世界计算机器上的“燃料”(Ethereum的英文名称,词根eum,含有燃料的意思)。 其思路是以太坊平台的运行需要消耗资源,比如每个节点的CPU和存储、带宽等资源,而这些资源的消耗由以太坊平台进行计量和定价,并通过奖励补偿给采矿时的矿工。 这个奖励也是以太坊的去中心化发行机制。

一、以太坊转账手续费的特点

资源消耗的度量和定价在以太坊中有自己的术语,称为某笔交易的gasUsed和gasPrice。 前者反映了这笔交易在以太坊的虚拟世界计算机中消耗的资源量(比如多少CPU时间),后者反映了这笔交易消耗的资源量的单价(比如每单位价值CPU 时间)多少以太币)。 打个比方,比如你去旅行,过程中消耗了20升油,那么现在的油价是6元一升,相当于你这次旅行的油费(20升*6元每升=120元)。 同样,一笔以太坊交易的手续费计算公式为:

交易手续费Fee(单位:Ether)=过程gasUsed *当前gas价格gasPrice

以太坊的交易手续费具有三个特点,值得注意:

手续费与转账金额无关。 与银行不同,您转账的钱越多以太坊最新价格美元计价,费用就越高。 事先不知道谁来支付手续费。 与银行不同,手续费必须支付给银行。 费用不会固定。 由于 gasPrice 的实时变化,对于经常相隔几分钟的交易,交易费用是不同的。

比如给4个同事转ETH,每个同事分到2个ETH。 截图说明一下实际情况。 以下交易均在较短时间内陆续完成。

以太坊手续费详细分析

交易号:0x1ed1dbbe611cbaf6447aab61165b4d5ff49c061cad7665d6a23ec8df346412d1(同事A,价格为每单位油耗10Gwei)

以太坊手续费详细分析

交易号:0x0b6e798951aa7786b6484df6e2924489af338c9dbb8c30bd64c9954e56ea55c0(同事B,价格是7Gwei/单位油耗)

以太坊手续费详细分析

交易号:0x7df8116e1825c944f260e71ab8f0e00da6e45859afa7a196ebe7258656f31d60(同事C,价格12Gwei/单位油耗)

以太坊手续费详细分析

交易ID:0xa9787e69f484329723dbb46b0c446f1756301c28e70929fda5f358958ebbee50(给D同事,价格是9Gwei/单位油耗)

以太坊手续费详细分析

如上所记录的发送给4位同事的交易记录显示交易类型相同但金额不同; 每次的油耗都是一样的,但是gas price是不一样的。 看起来,以太坊交易的 gasPrice 就像现实生活中的油价一样,也会涨跌,取决于计算资源和交易量之间的供求关系。

一笔交易计算3次手续费,最后扣除手续费。

sitesina.com.cn 以太坊最新价格走势图_以太坊最新价格美元计价_以太坊最新美金价格

第一次检查是在交易挂起时。 这时候计算手续费只是看余额是否足够支付手续费。 是对单笔交易的模拟校验,这笔交易不计入整个区块的整体计算。

|--JsonRpcImpl.eth_sendTransaction(CallArguments args)

|---前端向节点发送新的交易请求时的程序入口

|----EthereumImpl.submitTransaction(tx)

|----- 节点收到后创建Transaction对象,初步数据非空校验后提交

|------pendingState.addPendingTransaction(交易)

|-----节点新建广播任务,异步广播交易; 并添加到本地待确认交易表中

|------PendingStateImpl.addPendingTransactionImpl(最终交易tx)

|------------验证交易,每个数据项的格式是否符合要求,在模拟环境下验证

|------------PendingStateImpl.executeTx(tx)

|------------这里进行交易沙盒验证,因为是单笔交易验证,会创建假块

|------------ 假块中没有其他交易,已经发生的油耗也设置为0,这样只检查单笔交易是否超标

2) 第二项检查是出块前的模拟计算。 此时,是一整块。 除了检查账户中是否有足够的余额来支付单笔交易费用外,还取决于区块中所有交易的余额。 手续费总和是否超过区块总手续费限额,检查开始有全局观

3)第三次检查和最终扣费是在挖出区块后实际执行。 检查限额与第二次相同,但这次是实际扣缴,即使在虚拟机中执行合约交易失败,也会照常扣除手续费

上面第二点和第三点的过程基本相同,区别在于执行环境是否真实,调用关系如下:

|----BlockchainImpl.createNewBlock(parent, txs, uncles, time)

|-----第二点,创建新区块时,需要模拟验证手续费,沙盒执行

|----BlockchainImpl.addPendingTransaction(交易)

|-----第三点,区块被挖出后,最终执行交易,扣除手续费,真实环境执行

|--------BlockchainImpl.applyBlock(repo, block)

sitesina.com.cn 以太坊最新价格走势图_以太坊最新价格美元计价_以太坊最新美金价格

|--------输入执行环境和当前区块,验证区块中的交易

|------------for (Transaction tx : block.getTransactionsList())

|------------ 检查并执行区块中每笔交易的交易费用

|------------ 2和3的区别在于前者是模拟执行环境,后者是真实执行环境

以太坊交易过程中有四个重要的函数,分别是:init()、execute()、go()、finalization()

(完整图片见附件)

以太坊手续费详细分析

对应的手续费有3个动作:

注意,上述费用检查的限制都是针对gas的量,最终费用的计算是乘以gasPrice。

这部分的代码分析:

四个变量:

currentBlock.getGasLimit() 动态限制本区块可消耗的gas量 gasUsedInTheBlock简单累加计算本区块已消耗的gas量 gas amount basicTxCost 读取配置的基本交易gas量

二判断关系:

1) 如果: (tx.getGasLimit() + gasUsedInTheBlock) > currentBlock.getGasLimit()

然后提示:Too much gas used in this block:

业务意义是本次区块消耗的gas,如果本次交易消耗的gas超过整个区块的gasLimit,就会报错

2) 如果:txGasLimit.compareTo(BigInteger.valueOf(basicTxCost)) < 0

然后提示:Not enough gas for transaction execution: Require: basicTxCost Got: txGasLimit

业务含义是,如果本次交易消耗的gas太大,会超过区块的gasLimit,如果太小,则达不到最低交易手续费要求

与比特币不同,以太坊有统一的手续费,因为以太坊是为运行智能合约而设计的,每个智能合约所消耗的资源明显不同,所以无法收取统一的手续费。因此,以太坊对各种基础操作进行了分类,评估每个细节操作的成本,并总结一个指令的燃料消耗

以太坊最新美金价格_sitesina.com.cn 以太坊最新价格走势图_以太坊最新价格美元计价

计算方法见《以太坊黄皮书》附录以太坊最新价格美元计价,费率表:

不同类型的指令有不同的成本。 目前最贵的合约创建需要32000个单位的油耗,最便宜的跳转指令只需要1个单位的油耗。 最贵和最便宜的资源消耗相差32000倍!

以太坊手续费详细分析

最常用的交易指令是普通转账交易,根据表定义为21000单位油耗。 之前的实际运行例子也表明,确实是21000台的油耗。

以太坊的石油价格一直在变化。 如果你打开以太坊钱包的客户端,比如Mist,打开转账界面,钱包已经显示了交易手续费和交易手续费,然后再输入金额等元素。 随着油价的变化,页面会刷新并发生变化。

以太坊手续费详细分析

那么油价的形成机制是什么? 有点类似于证券交易所的股票报价。

首先,油价是由矿工节点产生的。

其次,矿工根据待确认交易池中的交易列表,按照gasPrice排序,在考虑历史区块的影响后,最终取一个中间值公布。 由于新交易的不断涌入,每笔交易的gasPrice报价可能不同,导致gasPrice报价不断变化。

|--GasPriceTracker.onBlock

|--- 每当一个新的区块被添加到区块链中时,该区块中交易的gasPrice计算用于更新该类的参数

|----GasPriceTracker.onTransaction

|-----这个类有一个长度为512的价格池,每个价格从后往前加入池中,满了会循环覆盖

|------GasPriceTracker.getGasPrice

|-----另一个线程负责发布实时油价

具体如何根据价格池中的价格发布一个油价,代码如下:

公共长 getGasPrice() {

if (!filled) { //如果没有交易,返回默认油价

返回默认价格;

} 别的 {

sitesina.com.cn 以太坊最新价格走势图_以太坊最新美金价格_以太坊最新价格美元计价

if (lastVal == 0) { //如果标志为0,重新计算油价,当价格池满时设置此标志

long[] longs = 数组。 copyOf(窗口,窗口。长度);

Arrays.sort(longs); //种类

lastVal = longs[longs.length / 4]; // 取第 25 个百分位数位置的油价

}

返回最后一个值;

}

}

有一个专门统计以太坊油价的网站: ,以图表的方式展示了油价的变化。

以太坊手续费详细分析

以太坊手续费不仅仅是一个技术问题,更是一个经济问题。 上一篇文章提到过,我们可以把以太坊想象成一台超级计算机,而智能合约就是运行在这台计算机上的程序。 因为这台电脑不是我们自己的,更像是我们在网上租用的服务器,所以我们要使用就必须付费。

如果gas使用的多,gasPrice不变,那么使用以太坊搭建分布式应用的成本会越来越高(上式的成本会越来越大)。 实际上,为了解决这个问题,以太坊特意将ether(ETH的单位)和gas解耦,在gasPrice和ether之间保持动态变化,这样当ETH价格大幅上涨时,gasPrice的价格下降(计算出来的)以太币价格); 当 ETH 价格下跌时,gasPrice 价格上涨(以以太币计算的价格)。 只有这样,以太坊的使用成本才能在合理的范围内,不会出现较大的波动。

以太坊 gasPrice 的动态变化图:

之前以太坊价格低,gasPrice比较高。 随着以太坊的升值,gasPrice的价格下降,使得以太坊的运营成本保持稳定,起到了调节市场的作用。

以太坊手续费详细分析

此外,比特币目前正面临扩容问题。 由于在设计之初考虑不足,比特币的手续费未能像以太坊那样实现动态调整机制。 目前遇到交易拥堵问题,交易体验远不如以太坊。 正方形。 因此,比特币社区目前正在讨论扩容问题。 但是,以太坊不存在这个问题。 以太坊的gasLimit可以动态调整,容纳交易的能力也可以动态扩展。 以下是截至发稿时最近10个区块的交易数:

以太坊手续费详细分析

最新区块(300万以上)的交易容量可以达到100级,开始时第13万个区块附近的交易容量和gasLimit如下:

以太坊手续费详细分析

gasLimit从3141592增加到4712394,交易容量也相应增加。 可以看出,以太坊本身可以动态调整容量以满足交易量增加的需要。

sitesina.com.cn 以太坊最新价格走势图_以太坊最新美金价格_以太坊最新价格美元计价

附:以太坊交易的整体流程:

以太坊手续费详细分析

目前已经调用了5次,每次费用在10元左右。

注意:由于gasPrice等因素,每次调用的费用不同。 同事提供的通话费用如下:

通话次数

费用(以太币)

1个

0.0058

2个

0.0052

3个

0.0048

4个

0.0049

5个

0.0079

目前,以太坊上的合约调用活动已经比较频繁,各类合约账户已达75万个(即合约类型有75万个),区块链应用呈现落地趋势。 以下是调用存证系统时同区块内其他调用合约的交易。

分类:

技术要点:

相关文章: