(28DW-S8-Day6) 区块链如何解决双重支付及防篡改
今天学习下区块链如何进行余额检查、避免双重支付以及防止篡改。
余额检查
A 说支付给 B 同学 10 个 BTC,那大家怎么才能知道 A 到底有没有 10 个 BTC?
余额检查的方法就是在链中向前回溯,看 A 到底获得过多少个,以往支出过多少个,现在还剩多少个。 否则,其他人不进行确认,也就不会被打包、上链。
避免双重支付
A 只有 10 个 BTC,如果他同时发出两个消息:支付给 B 10 个 BTC,支付给 C 10 个 BTC,那不是会超付吗?
假设分别有两组人,第一组人最先收到消息(A->B 10BTC),第二组人最先收到消息(A->C 10BTC),且分别追溯确认余额没问题。随后,第一组人收到消息(A->C 10BTC)时就会拒绝,第二组类似。于是,他们就开始挖矿(求那个合法的 hash 值),最先得到打包上链权的那个幸运儿所在的组(比如 A 组),就会把对应的交易信息(比如,A->B 10BTC)成功上链。另一组,大家就放弃了。
因此,在 BTC 交易时,收到别人要给你支付的消息时,还需要等这个交易信息被打包上主链确认后才行。
防止篡改/删除
如果一个人 A,想把之前的一条记录删除可以实现吗? 比如,之前 A 付给 B 10 BTC,现在 B 这个人出问题了,A 想删除当时那个给 B 的支付记录以撇清关系? 再比如,如果不是支付信息,而是某些其他的文字信息,后面想删除了,可以吗? 答案是:基本上不可能,除非你的计算能力超过除你之外的全世界。
怎么实现呢?
最长链原则
比特币里面一个最长链原则。
在某个时刻,主链可能出现分叉,但是随后很快,大家会迅速跑到最长的分叉上,其他分叉会被废弃。
所以,挖矿成功,也有可能被废弃?
想篡改/删除记录块如何做?
如果 A 想篡改/删除某个历史的区块 b101,就需要在 b101,挖矿打包产生一个分叉 b101_pre 插入到 b101 前面。 而且假设现在主链上已经到 b110 了,A 就需要开足马力把 b101_pre 搞出来这个分叉的长度超越(b101->b110),而且关键是他在疯狂挖矿的时候,全世界其他人都在挖,其他人依然在(->b101->b110->...)这个主链上往后延长,。A 想达到目的,就得超越全世界其余人的计算力能力总和,以一己之力对抗全世界,这个基本上不太可能。
小结:篡改删除记录块,相当于对抗全世界,基本没可能。 经验:大额的交易,一般等 6 个块以后,就可以确认,因为被篡改基本不可能了。
参考文献
中本聪的白皮书:《比特币:一种点对点的电子现金系统》
李永乐:《比特币和区块链的原理》视频
版权声明: 本文为 InfoQ 作者【mtfelix】的原创文章。
原文链接:【http://xie.infoq.cn/article/504e3bcb8b7b4fc42bfa12f69】。文章转载请联系作者。
评论