以太坊燃料费用定价机制Ethereum Gas Fee Pricing Mechanism

这篇具有很好参考价值的文章主要介绍了以太坊燃料费用定价机制Ethereum Gas Fee Pricing Mechanism。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1 以太坊燃料的作用

        以太坊燃料在交易过程中起着重要作用。从以太坊系统的角度,通过燃料费用提高恶意交易的成本减少攻击者的攻击收益,增强了以太坊交易的安全性,也促使合约开发者优化设计减少合约对以太坊算力的消耗;从交易发起者角度,通过设定燃料相关的参数,以尽可能小的代价完成交易,以及通过燃料费用上限的设置,防止合约自身漏洞或者调用不安全合约导致的攻击。

2 以太坊燃料的构成

        以太坊交易的燃料费用GasFee是燃料价格Gasprice与实际使用燃料Gasused的乘积,即GasFee = Gasprice × Gasused,当实际消耗的燃料费用大于交易发起者在交易中预设的燃料上限Gaslimit时,当前交易所做的所有状态修改将回滚,但燃料费用不会退回。

3 以太坊燃料定价机制的缺陷

        伦敦分叉之前和之后采用不同的燃料定价机制。

        伦敦分叉之前燃料价格由交易发起者根据历史交易的统计值预先设定,矿工选择出价高的交易打包。这种类似于拍卖的燃料价格生成机制导致四方面的低效:

        1)交易费用水平的波动与交易的社会成本不匹配。交易发起者自主设定的燃料价格通常导致交易费用的变化远大于交易成本的变化。

        2)非必要的用户交易延迟。每个区块总燃料的硬性限制以及交易数量的自然波动,导致交易经常需要等好几个区块才能被打包。

        3)低效的首次出价。交易发起者为了提高交易成功概率,会设置较高的交易费用,导致经常性的多支付交易费用。

        4)没有出块奖励时区块链变得不稳定。矿工通过挖掘“姐妹区块”的方式“偷取”交易手续费导致了区块链的不稳定。

4 伦敦分叉燃料定价机制的优化

4.1 新定价机制

        为了解决以太坊燃料定价机制的缺陷,EIP-1559提出了燃料费用生成机制的优化,EIP-1559是伦敦分叉引入的主要变化。

        EIP-1559引入每份燃料最大小费maxPriorityFeePerGas、每份燃料最大费用maxFeePerGas、每份燃料基础费用baseFeePerGas这几个新的参数。

        maxPriorityFeePerGas代表每份燃料支付给矿工的最大小费。

        maxFeePerGas代表每份燃料支付给矿工的最大费用,包含baseFeePerGas和maxPriorityFeePerGas。

        baseFeePerGas代表每份燃料的基础费用,由系统自动生成,且会被以太坊系统燃烧掉。

        交易所消耗的燃料费用计算公式是:

        GasFee = Gasused × (maxFeePerGas) = Gasused × (baseFeePerGas + maxPriorityFeePerGas)。

4.2 基础燃料费的算法

        go-ethereum的eip1559.go实现了基础燃料费的算法,算法总结如下:

        伦敦分叉之后的初始基础燃料费InitialBaseFee是1Gwei,基础费用变化因子BaseFeeChangeDenominator定义了区块间基础费用变化值的边界,值为8,弹性倍乘系数ElasticityMultiplier定义了燃料上限的最大倍乘边界,值为2;

        父区块的燃料目标值parentGasTarget = parent.GasLimit / ElasticityMultiplier;

        当父区块的实际燃料值parent.GasUsed等于父区块的燃料目标值parentGasTarget时,当前区块的基础费用就等于父区块的基础费用parent.BaseFee;

        当父区块的实际燃料值parent.GasUsed大于父区块的燃料目标值parentGasTarget时,说明当前区块的基础费用应该增加,以减小区块包含交易的计算量,基础费用的增加值取(1,parent.BaseFee * gasUsedDelta / parentGasTarget / BaseFeeChangeDenominator)的最大值;

        当父区块的实际燃料值parent.GasUsed小于父区块的燃料目标值parentGasTarget时,说明当前区块的基础费用应该减小,以增加区块包含交易的计算量,基础费用的减小值取(0,parent.BaseFee * gasUsedDelta / parentGasTarget / BaseFeeChangeDenominator)的最大值。

        实现基础燃料费算法的代码如下:

// CalcBaseFee calculates the basefee of the header.
func CalcBaseFee(config *params.ChainConfig, parent *types.Header) *big.Int {
	// If the current block is the first EIP-1559 block, return the InitialBaseFee.
	if !config.IsLondon(parent.Number) {
		return new(big.Int).SetUint64(params.InitialBaseFee)
	}

	parentGasTarget := parent.GasLimit / params.ElasticityMultiplier
	// If the parent gasUsed is the same as the target, the baseFee remains unchanged.
	if parent.GasUsed == parentGasTarget {
		return new(big.Int).Set(parent.BaseFee)
	}

	var (
		num   = new(big.Int)
		denom = new(big.Int)
	)

	if parent.GasUsed > parentGasTarget {
		// If the parent block used more gas than its target, the baseFee should increase.
		// max(1, parentBaseFee * gasUsedDelta / parentGasTarget / baseFeeChangeDenominator)
		num.SetUint64(parent.GasUsed - parentGasTarget)
		num.Mul(num, parent.BaseFee)
		num.Div(num, denom.SetUint64(parentGasTarget))
		num.Div(num, denom.SetUint64(params.BaseFeeChangeDenominator))
		baseFeeDelta := math.BigMax(num, common.Big1)

		return num.Add(parent.BaseFee, baseFeeDelta)
	} else {
		// Otherwise if the parent block used less gas than its target, the baseFee should decrease.
		// max(0, parentBaseFee * gasUsedDelta / parentGasTarget / baseFeeChangeDenominator)
		num.SetUint64(parentGasTarget - parent.GasUsed)
		num.Mul(num, parent.BaseFee)
		num.Div(num, denom.SetUint64(parentGasTarget))
		num.Div(num, denom.SetUint64(params.BaseFeeChangeDenominator))
		baseFee := num.Sub(parent.BaseFee, num)

		return math.BigMax(baseFee, common.Big0)
	}
}

5 以太坊燃料价格查询

        在网站中https://ethereumprice.org/gas/可以查询到最近一周的平均燃料价格。

maxpriorityfeepergas

 参考

[1] 以太坊开发文档, Gas and fees | ethereum.org

[2] 以太坊改进提议EIP-1559, https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1559.md

[3] 开源以太坊客户端go-ethereum源代码eip1559.go,go-ethereum/eip1559.go at master · ethereum/go-ethereum · GitHub

[4] 以太坊燃料费用查询网站,Ethereum Gas Price Charts & Historical Gas Fees – ethereumprice文章来源地址https://www.toymoban.com/news/detail-791479.html

到了这里,关于以太坊燃料费用定价机制Ethereum Gas Fee Pricing Mechanism的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 以太坊gas

    eip-1559提案更新了以太坊的奖励机制,新增了 maxFeePerGas 和 maxPriorityFeePerGas ;区块打包时,使用区块中小费(priorityFee)最少的区块作为基础费用(baseFeePerGas);小费用于支付给矿工,基础费则销毁。 maxFeePerGas : 每笔gas最大费用 maxPriorityFeePerGas : 给矿工的小费 ​ TransactionFee :(

    2024年01月22日
    浏览(39)
  • Ethereum以太坊事件日志查询参数

    详见:https://www.quicknode.com/docs/ethereum/eth_getLogs address:合约地址 fromBlock:开始区块 toBlock:结束区块 topics:主题数组 blockHash:区块哈希,优先级高于fromBlock、toBlock 这里主要介绍topics参数,其他参数都比较好理解,topics是长度为4的数组集合,topic分为2种:一种事件签名topic,

    2024年02月07日
    浏览(42)
  • 04-Solidity8.0以太单位Gas和全局变量

    04-Solidity8.0以太单位Gas和全局变量 以太和Wei 交易ether. 类似于1美元等于 100 美分,1ether等于 10**18 wei。 Gas ether您需要为交易支付多少费用? 您支付gas spent * gas price的金额ether,在哪里 gas是一个计算单位 gas spentgas是交易中使用的总金额 gas priceether是你愿意支付多少gas 具有较高

    2024年02月02日
    浏览(64)
  • 118 以太坊 ethereum hardhat :编译 artifacts

    • 介绍 • 构建信息文件 • 读取artifacts • 目录结构 • hardhat Tutorials , hardhat 教程 • Contact 联系方式 使用 Hardhat 编译会为每个编译的合约生成两个文件(不是每个 .sol 文件):一个工件和一个调试文件。 artifact 拥有部署和与合约交互所需的所有信息。这些与大多数工具兼容

    2023年04月08日
    浏览(38)
  • 什么是Ethereum以太坊(ETH)?以及以太坊的一些基础知识

    Ethereum以太坊(ETH)是由Vitalik Buterin所创建,一种允许智能合约和去中心化应用程序(dapps)在其网络上运行的加密货币。 以太坊是仅次于比特币的第二大加密货币,它是一个基于区块链的平台,用于创建去中心化应用程序(dapps)。 比特币被设计成一种货币和价值储存手段,而

    2024年02月03日
    浏览(37)
  • 11M 以太坊 ethereum OpenZeppelin : 开发智能合约

    • 设置项目 • 第一份合同 • 编译 Solidity • 添加更多合约 • 使用 OpenZeppelin 合约 • OpenZeppelin Tutorials 教程 • Contact 联系方式 创建项目后的第一步是安装开发工具。 以太坊最流行的开发框架是Hardhat,我们用ethers.js介绍了它最常见的用途。下一个最受欢迎的是使用web3.js的

    2024年02月11日
    浏览(41)
  • 以太坊创建私有链 go-ethereum

    目录 启动节点同步 同步主网区块 同步测试网络的区块 同步Ropsten测试网络的区块  同步RinkeyBy测试网络区块 搭建自己的私有链  创建genesis.json init初始化gensis.json  启动私链 安装好了Geth,现在我们可以尝试运行以下它。执行下面的命令,geth就会开始同步区块,并存储在当前

    2024年02月08日
    浏览(34)
  • 11U 以太坊 ethereum OpenZeppelin : 升级智能合约

    • 升级中有什么 • 使用升级插件升级 • 升级如何运作 • 初始化 • 升级 • 测试 • OpenZeppelin Tutorials 教程 • Contact 联系方式 使用OpenZeppelin 升级插件部署的智能合约可以升级以修改其代码,同时保留其地址、状态和余额。这使您可以迭代地向项目添加新功能,或修复您在

    2023年04月08日
    浏览(48)
  • 以太坊go-ethereum源码研读(二)applyTransaction相关

    在前面以太坊go-ethereum源码研读(一)中所讨论的 Process 函数调用了该 applyTransaction 函数来执行交易相关指令,于是进一步对该函数进行分析,以明晰以太坊交易的全过程。 分析过程中一些结构体或函数在以太坊go-ethereum源码研读(一)中已经讨论到,对这些结构体和函数则

    2023年04月25日
    浏览(36)
  • 【区块链 | 智能合约】Ethereum源代码(8)- Ethereum服务和以太坊P2P协议发送广播源码分析

    在“【区块链 | 智能合约】Ethereum源代码(2)- go-ethereum 客户端入口代码和Node分析”一文中,我们提到Ethereum作为一个service,被Node 注册进去。Node start的时候会启动其注册的所有服务,Ethereum service也是一样。 初始化方法

    2024年01月21日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包