2016 年,我刚加入区块链行业,当时在 imToken 做钱包就遇到了一个问题:
交易为什么需要 6 个区块链确认才会被认为难以篡改?
得到的比较笼统的回答一般是,这样做矿工篡改的成本过高。这当然是一个正确的答案,但却过于表面。
最近在重读《精通比特币》第三版,这是去年年底最新修订的版本,看到书中提及了这一内容,所以单独拿出来说说。
首先我们要明确两个概念:
区块高度:告诉我们在该区块之前有多少个区块;
确认:代表区块深度,即在该区块之后已经存在多少区块,表明改变该区块中任何交易的难度。
我们通过 getblockhash
命令,从 bitcoin core 的 API 拉取区块信息的时候会得到如下信息
{
"hash": "0000000000002917ed80650c6174aac8dfc46f5fe36480aaef682ff6cd83c3ca",
"confirmations": 651742,
"height": 123456,
"version": 1,
"versionHex": "00000001",
"merkleroot": "0e60651a9934e8f0decd1c[...]48fca0cd1c84a21ddfde95033762d86c",
"time": 1305200806,
"mediantime": 1305197900,
"nonce": 2436437219,
"bits": "1a6a93b3",
"difficulty": 157416.4018436489,
"chainwork": "[...]00000000000000000000000000000000000000541788211ac227bc",
"nTx": 13,
"previousblockhash": "[...]60bc96a44724fd72daf9b92cf8ad00510b5224c6253ac40095",
"nextblockhash": "[...]00129f5f02be247070bf7334d3753e4ddee502780c2acaecec6d66",
"strippedsize": 4179,
"size": 4179,
"weight": 16716,
"tx": [
"5b75086dafeede555fc8f9a810d8b10df57c46f9f176ccc3dd8d2fa20edd685b",
"e3d0425ab346dd5b76f44c222a4bb5d16640a4247050ef82462ab17e229c83b4",
"137d247eca8b99dee58e1e9232014183a5c5a9e338001a0109df32794cdcc92e",
"5fd167f7b8c417e59106ef5acfe181b09d71b8353a61a55a2f01aa266af5412d",
"60925f1948b71f429d514ead7ae7391e0edf965bf5a60331398dae24c6964774",
"d4d5fc1529487527e9873256934dfb1e4cdcb39f4c0509577ca19bfad6c5d28f",
"7b29d65e5018c56a33652085dbb13f2df39a1a9942bfe1f7e78e97919a6bdea2",
"0b89e120efd0a4674c127a76ff5f7590ca304e6a064fbc51adffbd7ce3a3deef",
"603f2044da9656084174cfb5812feaf510f862d3addcf70cacce3dc55dab446e",
"9a4ed892b43a4df916a7a1213b78e83cd83f5695f635d535c94b2b65ffb144d3",
"dda726e3dad9504dce5098dfab5064ecd4a7650bfe854bb2606da3152b60e427",
"e46ea8b4d68719b65ead930f07f1f3804cb3701014f8e6d76c4bdbc390893b94",
"864a102aeedf53dd9b2baab4eeb898c5083fde6141113e0606b664c41fe15e1f"
]
}
这其中有一个 mediantime
字段,我们称之为「中位时间」- MTP。该「中位时间」是从(该区块的)之前 11 个区块计算得到的中位时间。
中位数具有更好的「抗操纵性」,它是统计学上用于测量数据集中趋势的一个稳健估计值,特别适合处理含有异常值(outliers)的数据。相比于平均值(容易受到极端值的影响),中位数只关心排序后最中间的值,因此少量极端值(时间戳被操控的区块)不会显著改变结果。
首先如果计算中位数,那么最好选择一个「奇数」,奇数的好处是中位数始终是一个确定的值,因为可以准确地取中间的那个值(比如第 6 个区块),避免了偶数情况下取两个中间值再平均的复杂性。
而选择 11 个区块的原因与中位数的特性有关,因为它能很好地处理小样本中的极端值,同时保持计算的简便性。
简单来说就是它足够小以保持计算效率,同时又足够大确保抗操纵性:
足够大:选择较少的区块(比如 3 个、5 个)可能会使中位数过于容易受到单个矿工的操纵;
足够小:如果选择更多的区块(比如 21 个、31 个),虽然抗操纵性会更强,但计算复杂度和资源消耗也会增加,效率降低。
之前我们谈到,中位数是将数据排序后,选择中间位置的那个数值。而在 11 个区块的情况下,中位数是第 6 个区块的时间戳(按照时间戳大小排序后)。
要改变中位数的值,矿工至少需要控制超过一半的区块。因为中位数是基于排序后的位置值决定的,改变排序的多数才能影响最终的中位数。 💡 在 11 个区块的情况下:
如果矿工只控制 5 个区块,这些区块的时间戳只能影响排序的前半部分,但无法影响中位数(第 6 个位置)。
如果矿工控制了 6 个区块,他们就能确保排序后的中位数被自己的区块所决定,从而对整个链的时间戳产生影响。
我们有 11 个区块,假设这些区块的时间戳如下(单位是时间):
区块 1: 1628000000
区块 2: 1628000600
区块 3: 1628001200
区块 4: 1628001800
区块 5: 1628002400
区块 6: 1628003000
区块 7: 1628003600
区块 8: 1628004200
区块 9: 1628004800
区块 10: 1628005400
区块 11: 1628006000
现在,我们将这些时间戳从小到大进行排序(这里时间戳已经是按时间顺序递增的):
[1628000000, 1628000600, 1628001200, 1628001800, 1628002400,
1628003000, 1628003600, 1628004200, 1628004800, 1628005400, 1628006000]
在这个排序列表中,第 6 个区块的时间戳是 1628003000,这是过去 11 个区块的中位时间,也就是 MTP。
现在,假设一个矿工控制了一些区块,并试图通过篡改时间戳来影响中位数。
假设矿工控制了 区块 1、2、3、4、5,并且他们想通过操控这些区块的时间戳来改变 MTP。为了做到这一点,矿工将这些区块的时间戳篡改为一个非常小的值,假设为 1627000000。
篡改后的时间戳如下:
区块 1: 1627000000
区块 2: 1627000000
区块 3: 1627000000
区块 4: 1627000000
区块 5: 1627000000
区块 6: 1628003000
区块 7: 1628003600
区块 8: 1628004200
区块 9: 1628004800
区块 10: 1628005400
区块 11: 1628006000
排序后的时间戳为:
[1627000000, 1627000000, 1627000000, 1627000000, 1627000000,
1628003000, 1628003600, 1628004200, 1628004800, 1628005400, 1628006000]
你可以看到,虽然前 5 个区块的时间戳被篡改得很低,但中位数仍然是 1628003000,因为第 6 个区块的时间戳没有被矿工控制。
现在,假设矿工控制了 区块 1、2、3、4、5、6,并且他们同样篡改这些区块的时间戳为 1627000000。篡改后的时间戳如下:
区块 1: 1627000000
区块 2: 1627000000
区块 3: 1627000000
区块 4: 1627000000
区块 5: 1627000000
区块 6: 1627000000
区块 7: 1628003600
区块 8: 1628004200
区块 9: 1628004800
区块 10: 1628005400
区块 11: 1628006000
排序后的时间戳为:
[1627000000, 1627000000, 1627000000, 1627000000, 1627000000,
1627000000, 1628003600, 1628004200, 1628004800, 1628005400, 1628006000]
此时,新的中位数是 1627000000(第 6 个位置的时间戳),这是矿工篡改的时间戳。因此,通过控制 6 个区块,矿工成功操纵了 MTP。
所以,如果矿工控制了 6 个区块,他们就能保证至少有 6 个区块的时间戳是他们自己设定的。这样,无论剩余 5 个区块的时间戳如何,矿工控制的区块一定会影响或决定中位数。
要想了解为什么需要 6 个区块确认,就要了解为什么选择 11 作为「中位时间」校验。因为 11 相较于其他数字,具有足够的抗操纵性和高效性,这是一个权衡后的神奇数字。而如果想操纵 11 个区块的中位数,则需要满足 6 个确认才可以,这是一个简单的数学问题。