后来有人想出一个主意:把绑了一根细绳的硬币投进去,待通话结束后将硬币拉出来继续投币使用,如此反复……
这其实就是双花,即将同一笔货币重复花费了两次或以上,也被人们称为“双重支付”。
01 什么是双重支付
双重支付(Double Spending),指因设计缺陷而使某些货币被重复支付两次或以上。
一手交钱一手交货,这是人们普遍的共识。但如果使用同一笔货币先后买入两份货物,就必然使对方产生财产上的损失。这是不应当也不道德的,和骗子没有什么区别。
在我们的生活中,传统货币的确会有双花的情况,那么数字货币的表现又怎么样呢?
实际上,很多在早期出现的数字货币,就是因为双重支付的问题而纷纷夭折,都未能实现大规模的应用。
这种情况一直延续到能完美解决双重支付问题的比特币出现。
02 如何解决双重支付
在人们用实体货币进行交易时,基本不会出现双重支付,因为你不能把一块金子交到别人手里同时自己还拿着同一块金子去做另一笔交易。但随着数字化记账,双重支付的问题就出现了——比如某一款项已支付但未移除,从而可以给另一账户支付的情况。
传统货币系统通过大家都信任的银行机构来记账,他们验证每笔交易的正确性。人们信任它们,默认双重支付不会发生。但其实从根本上来讲,对于这种记账方式,人们并不能确信记账不出错、记账的人不作恶,这时候的信任是一种没有其他选择的选择。
比特币是通过技术手段来解决双重支付问题的。比特币通过UTXO数据结构记录每笔交易,使得它的每笔交易都能追根溯源到比特币发行时产生的第一笔交易。这就像是一棵树,树干是比特币发行时产生的第一笔交易,比如是10BTC,而这10BTC在以后的交易中被不断拆分,形成一个个树枝,我们顺着树枝往回看的话,就能且只能找到最初的那个树干。
双重支付在这种数据结构下,相当于在一个树枝长出来后,把它取消,让它在另一个地方再长出来。在物理世界,这是很难办到的,但是在数字世界去却能够通过篡改数据来办到。但是,比特币又用另外两个机制使得它的记账数据是几乎难以被篡改的,那就是工作量证明和最长链原则。
比特币系统将交易记录在一个个区块上,每一个区块都包含上一个区块的独一无二的信息,从而串成一条链。全网的矿工节点会对每个区块上的交易信息进行验证,保障信息的准确无误。如果有人想要篡改记账数据,实现双重支付,那么就相当于要在他要篡改的地方分出一个支链来,并且让所有矿工都认为同这条链才是正确的,旁边那条不对。那不好意思,矿工们不会承认这条新分叉的链,因为根据最长链原则,矿工们只承认最长链——最长链是得到最多矿工的算力验证的链,理论上是正确的链。
正是因为这种技术保障,当你接收比特币时才能够放心——这笔交易记录会带着时间戳,得到网络所有节点的共同验证,再确认后被添加到新区块上成为难以篡改的交易记录。 而且,比特币中的交易数据是公开可查询的,所以这是一个完全公开透明的账本。
03 潜在风险
虽然这个机制设计得非常巧妙,但仍要注意两种情况。
一种情况是,比特币新区块的产生时间是10分钟,即系统记账的时间区间是10分钟。正常情况下,交易要经过6次确认后,最终被记录在区块中。如果收款人B在交易确认数为零(即系统尚未记账)的情况下,将货物交给了付款人A,就冒了很大的风险。
因为付款人A可以在这10分钟之内重新将这笔比特币支付给其他人,当矿工接收到一笔比特币的两个交易请求时,最终会根据“最长链”原则选取最长链中的交易记录来确认。一旦收款人B的交易记录不在最长链中,就会导致收款人B被双重支付。
正确的做法应该是等待交易确认数为1以上,更保险的做法是等到6个交易确认数。当然,这需要收款人等待1个小时的时间。
还有一种情况是,有人掌握了比特币网络51%以上的算力,就可以在想要篡改交易记录的位置分出一个支链,然后利用其强大的算力在这个支链的基础上不断挖出新的区块,来追赶、超越原来的最长链。一旦这条支链的长度超越原来那条链,它就会成为矿工眼中的最长链并得到承认,从而达到篡改交易数据的目的。这种情况下,这个人就能够使已经花出去的比特币重新回到自己地址上,这些比特币就能够进行再一次的支付。
但在文章《天使与魔鬼,51%的胜利属于谁?》中我们曾提到过的,虽然在理论上有算力攻击的可能,但从经济上来看这是得不偿失的。所以比特币网络在经过了多年之后,依然十分地安全,没有出现算力攻击的情况。
04 结语对于双重支付的知识来说,除了理解和掌握之外,能在生活中应用才是所学知识的价值体现。
比如等待6个交易确认数之后再完成交易,以免被别人送上“双花”甚至“一束花”。不然,你肯定要把别人的脸抓花!
参考资料:
《比特币:一种点对点的电子现金系统》中本聪
链客道每周二、四、六晚上8:00发文。期待你的进步。
版权声明:本文版权归链客道所有,未经授权不得转载。
Linker DAO
网友评论