以太坊Block Gaslimit动态调整机制分析

比特币每个区块的大小固定为1M,这使得每个区块所容纳的交易固定,当交易量过大的时候单笔交易的确认时间将会变得非常漫长。以太坊使用了动态调整区块块的gas上限来解决这个问题,让矿工可以投票决定块gas上限为多少。本篇为关于这个机制的一些研究。

动态Gaslimit机制

这里讨论的 Gaslimit 是 Block Gaslimit,区别于交易中的Gaslimit,指的是每个块最多可使用的gas。举个例子,现在交易池中有3笔交易,分别消耗 10gas、20gas、30gas,而当前Block Gaslimit为60gas,那么这个块就可以同时打包这三笔交易,并且超过消耗超过60gas的交易会失败;而如果Block Gaslimit 为 50gas,那么最多只能打包其中的两笔交易。Block Gaslimit越大,单个块能包含的交易越多,也就意味着以太坊处理交易的能力(TPS)越强。

Gaslimit在区块链的创世块中就有定义,但是后续可通过矿工的投票来提高区块的gas限制。我们可以在以太坊技术黄皮书 4.3.4章节的公式(47)中找到Block Gaslimit限制的定义。公式比较难排版,简单翻译一下就是:

每个块的Gaslimit可以调整范围为上一个块Gaslimit的正负 1/1024

也就是说,不能一下子把gaslimit提高到很高,需要一个一个块慢慢调整。在geth和parity两个客户端中分别有矿工设置gaslimit的选项:

1
2
3
4
# geth
--targetgaslimit 3300000
# parity
--gas-floor-target 3300000

矿工就是靠这两个选项进行投票。需要理解的是,这里设置的是目标gaslimit,因为上面说了共识机制中限制了gaslimit的范围,所以在达到这个目标之前,节点会自动把gaslimit设置到最接近target的数值,直到与目标数值一致。

OK,看完这段一般会有一个疑问,设置高Gaslimit理论上既能打包更多交易,矿工能收取更多交易费,又能提高以太坊处理交易的能力,那为什么矿工们不会一直投票提高Gaslimit?

为什么需要Gaslimit机制 以及 为什么Gaslimit不会无限高?

这个问题其实黄皮书里也没有做具体分析,但是从目前以太坊实际运行情况来看,以太坊的设计者设计Gaslimit的原因可能是多方面的:

  1. 这是我查到我认为到最为合理的一个解释。一个块打包的交易越多,意味着区块信息越大,导致该区块传播到整个网络所需要的时间更长;如果每个矿工打包的交易确认时间都很长,那就意味着产生的孤儿块(被抛弃的块)和叔伯块(不被承认但是能获取矿工费的块,以太坊用来降低矿工损失的一种机制)的概率越大,这样不仅减少的矿工的收入,而且因为叔伯块的比例变大,交易费也就越高。

  2. 以太坊上运行着智能合约,打包交易不仅包含PoW的计算量,还包含所有交易中的智能合约的运算量,所以一些不太先进的设备发布块的速度会较慢好几秒,这好几秒的延迟可能就导致变成叔伯块了。如果gaslimit无限上升,以太坊的算力又会和比特币一样掌握在少数拥有高级装备的玩家手里。这不符合以太坊的设计初衷。这条我认为也比较靠谱,但可能只是Gaslimit恰好体现出来的好处。

  3. 目前没有一个合适的数学算法可以动态计算出Gaslimit应该有的值,所以现在决定权还是放在矿工的手里,以保证灵活性。

相关链接