

- Gas 使用量
- 区块大小(以字节为单位)
译者注:
在上面的几个段落中,作者在固定 gas 上限 30 M 的情况下,想要让 block size 最大,尝试计算最多可以把区块塞到多大。
如果固定 gas 上限,要让 block size 变大,那么只能塞 calldata(因为计算/STORE之类的字节码其实是不会消耗区块存储空间的)。
所以,要让区块变大,无非就是尽量往交易塞 calldata。然后,有“塞 0 calldata” 和 “塞非 0 calldata” 两种方法,需要计算才能知道哪种能让 block size 更大。最终结果是“塞非 0 calldata” 的 block size 更大。
基于 Geth 客户端限制每笔交易最多 128 KB 这一前提,下面开始计算两个例子。
case 1: 56 个大小为 130,900 B (< 128 KB) 的交易(里面都是零 calldata,4 gas/B):用的 gas = 56* (130,900 * 4+21000) = 30497600 > (30 M),所以最多只能塞 55 个上述交易+ 1 个小于上述交易的交易。对应的区块大小约为 55*128 = 7040 kB = 6.875 MB。然而,由于 calldata 全是 0,所以压缩后区块大小约为 0.32 MB。
case 2: 15 个大小为 130,900 B (< 128 KB) 的交易(里面都是非零 calldata,16 gas/B):用的 gas = 15 *(130900 *16+21000) = 31731000 > 30 M。对应的区块大小约为 14 *128 = 1792 kB = 1.75 MB ~ 15 * 128 = 1.875 M。然而,由于 calldata 是非零,不好压缩,所以压缩后区块大小约为 1.77 MB。)就这个最大区块大小而言,我们可以识别出几个影响它的因素:
- Gas 上限:Gas 上限会影响最大区块大小,这是毋庸置疑的。上限越高,区块中可以塞进的数据就越多。
- 操作和数据的定价:操作的 gas 越便宜,区块内就能执行越多次操作。虽然像 CALLDATALOAD 或 CALLDATACOPY 这样的操作,它们的开销都是 3 Gas,相对便宜;但其他操作码如 CREATE 则更昂贵。区块中使用的操作码越昂贵,该区块中用于 calldata(或其他操作)的空间就越少。
- 客户端限制:虽然客户端限制的影响不那么明显,但比如像 Geth 客户端这样对每笔交易的 128 kb 限制也可以影响最终区块大小。由于每笔交易的固定费用是 21k Gas,客户端每笔交易的大小限制越低,就需要更频繁地支付固定费用,从而“浪费”本可以用于 calldata 的 gas。所以最终,这个限制可以导致最大区块大小减少约 0.07 MB。需要注意的是,客户端限制只影响交易的广播,并不影响已经被确认的区块。


