引言
「6次确认」是区块链中的一个基本概念,但是很多同学没弄明白「6次确认」具体的含义,甚至会存在很多错误的理解,包括但不限于:
- 交易经过6人次的矿工确认后才被写入链条
- 区块后接上6个后续区块,区块中的交易才生效
- 区块后接上6个后续区块,区块中的数据难以被修改
以上这些理解都和实际意义存在偏差。那么,理解 「6次确认」 的正确姿势是什么呢?不想看长篇大论的同学,这里先直接放出结论:
假设攻击者拥有全网10%的算力,尝试从当前区块之前的第6个区块开始产生一条新链,并且使这条新链超过原链成为新的主链,成功的概率小于0.1%。
下面是详细阐述。
防篡改机制
不可篡改是区块链的典型特征,而防篡改机制主要基于挖矿机制和最长链原则:
- 节点想要打包交易出块,必须有足够的算力成功挖矿
- 如果同时有多条链,最长的一条被认为是主链
如果有攻击者想要篡改历史区块的交易,必须从该交易所在区块的前一个区块开始,产生一条新的链条,并使其高度超过主链,这样才能覆盖掉原来的交易。
我们设想这样一个场景:
甲想要向乙购买某个商品,双方约定使用比特币进行支付。但是甲想要不劳而获,也就是不花钱也能得到商品,但是乙没看到支付交易是不可能将商品交给甲。如果甲想要达到自己的目的,必须让乙在一段时间内相信自己已经付过款了。那么甲该怎么做呢?
甲先向乙如实转账,当乙确认交易并提供商品完毕后,甲立刻利用自己的算力,从未包含适才转账记录的区块开始生成一条新链条, 并且努力让新链超过原链,于是之前的交易就被覆盖掉了。当然,乙最终会发现这件事,但是为时已晚。
那假如乙事先知道可能会发生这种事,该如何防范呢?
乙可以在看到甲的支付交易后,不急提供商品,先等等看,让子弹飞一会嘛。如果过了好几个区块后,依然没问题,这才能放心地提供商品。 「6次确认」 在这里的含义就是说,等到过去了6个后续区块,我们就可以认为甲没有能力产生一条能超过原链的新链了。
为什么是「6次」
剩下还有个问题,为什么是6次确认,不是5次、7次?到底怎么计算来的?
要提醒的是,这个数值是基于一些特定参数假设之上计算得到的。
假设1 攻击者拥有的算力是全网的10%。
假设2 攻击者的进展服从泊松分布。
这时依照公式:
λ = z ⋅ q p \lambda = z \cdot \frac{q}{p} λ=z⋅pq
P = 1 − ∑ k = 0 z λ k e − λ k ! ⋅ ( 1 − ( q p ) ( z − k ) ) P=1-\sum^{z}_{k=0}{\frac{\lambda^ke^{-\lambda}}{k!} \cdot (1-(\frac{q}{p})^{(z-k)})} P=1−k=0∑zk!λke−λ⋅(1−(pq)(z−k))
- z为攻击者创造的新链起点区块距离当前最新区块的距离
- q为攻击者拥有的算力占全网百分比
将不同的z值和q值代入回上式,可以得到完全不一样的结果。
而6次确认的来源就是,将q=0.1和z=5代入,可计算出P为0.0009137,这就是攻击者成功的概率,完全可以忽略不计了。你问为什么z等于5却叫 「6次确认」 ?因为z是从0开始数的。
当然,完全可以使用新的假设,比如攻击者拥有的算力不是占全网10%,而是30%,那么想要让攻击者成功概率在0.1%以下,「6次确认」 就不够用了,至少得需要 「20次确认」 。
有任何疑问,可以关注我的公众号“码匠人生”并私信。