比特币的双花问题——哈尔滨工程大学计算机学院2021区块链技术课程

比特币的双花问题

作者:
2018201104刘誉丹
2018201501邓明雪

1.1 什么是“双花”问题?

“双花”,即双重支付,指的是在数字货币系统中,由于数据的可复制性,使得系统可能存在同一笔数字资产因不当操作被重复使用的情况。

在区块链加密技术出现之前,加密数字货币和其他数字资产一样,具有无限可复制性,如果没有一个中心化的媒介机构,人们没有办法确认一笔数字现金是否已经被花掉。因此,在交易中必须有一个可以信贷的第三方来保留交易总账,从而保证每笔数字现金只会被花掉一次。

如果某种数字货币能被人重复使用,同样一笔钱被花掉两次或多次,它就没有价值了。数字货币背后的数据是相同的,伪造数据的成本远远低于伪造现金。所以在数字货币的交易中,双花问题必须得到解决。

2.1 平常使用的支付工具是如何解决“双花”问题的?

我们每天都在淘宝等各种平台上购物,也不需要使用现金。支付宝如何解决“双花问题”呢?

其实,支付宝中的钱并不存在于数字世界。相反,它仍存在于现实世界的银行中。当你在淘宝上下单并付款给卖家时,你实际上做的是:
1.你把钱付给支付宝;
2.支付宝将你的钱存在他们的银行账户中;
3.你确认收货后,支付宝将钱从他们的银行账户中取出,并支付给卖家。

更简单地说,支付宝仅仅是一个第三方中介。如果你想使用数字货币进行支付,你必须将钱交给一个第三方中介,可以是支付宝,也可以是微信等。这类机构对数据进行中心化管理,并通过实时修改账户余额的方法来防止“双花”的出现。只有经过第三方确认后,交易才能成功发生。

但这样就出现了一个问题,人类需要为交易中第三方验证支付巨额费用。

虽然每一笔交易的“中介费”并不高,但全球有几十亿人口,交易数量是巨大的。并且这类第三方机构对数据进行的是中心化管理,我们不好判断它们会不会有意或无意(被黑客攻击)篡改数据(当然只是提出一种可能,并无明确指向)。

2.2 比特币如何解决“双花”问题?

我们先来假设两种场景:

场景1(假设诈骗者是用户):诈骗者使用数字货币购买数字产品如买一本电子书,价格为1个EOS。他先将EOS发送给店家,假设这笔交易是tx1;然后同时将相同数量EOS发给自己另外一个钱包地址,称这笔交易为tx2。店家网站程序检测到交易tx1后,觉得没有问题,程序自动发电子书过去;但因交易tx1和交易tx2是相冲突,矿工只会在一个时间点打包一个交易,万一不小心都打包了,其他节点矿工会验证并拒绝这个区块打包成功,所以如果交易tx2打包成功了,交易tx1会作废,这种情况下,诈骗者成功双花了EOS,即买到了电子书,也收回了自己的EOS。

解决办法:这种场景下的双花比较好解决,店家网站程序自动发电子书前,先让区块确认交易,至少一个区块交易,而只有被至少一个区块确认过的交易,就会盖上时间戳且之前从未存在过,才被认为交易的有效性。目前比特币的交易要被6个区块确认才算安全有效可靠,以避免孤立区块的情况;EOS的充值确认在币安里是需要至少32个区块确认数。

场景2(假设诈骗者是矿池或矿工):诈骗者矿工先构造交易tx1和tx2,tx1的手续费很低,将tx1发给商家买电子书,但是交易tx2隐藏起来不广播,只保存在自己的区块内。因为tx1的手续费太低,所以其他节点矿工们不想打包;而tx2被隐藏起来了,所以区块链浏览器是不可能发现有相冲突的交易,商家也就不可能发现。当商家认为是正常的交易一旦发货了,诈骗者矿工就会在自己挖到的区块打包进去,这个时候广播这个区块,全网所有的节点就会发现tx1是非法的了,直接作废掉,商家就收不到币了。

解决办法:想防御这类双花攻击就要依赖其他矿池矿工的协作。因为诈骗构造的tx2交易是不会被广播的,是以直接打包进诈骗矿池挖到的区块才会被其他矿池发现。如果其他矿池如果针对这种包含了延迟出现交易(tx2)的区块进行孤立,那这个诈骗矿池的这个块就白挖了,损失区块奖励,这是非常惨的事。具体的设定可以是矿池将超出一定时间,比如10秒内,都没有见到的交易(tx2),却包含在最新的区块里,则直接孤立掉这个块,在这个块的前一个高度上挖矿。

(但如果执行这种孤立政策的算力超过51%,那基本上就没有矿池敢发起这一类隐藏交易(tx2)来攻击零确认交易了。)

比特币作为一个去中心化的点对点电子现金系统,主要依靠未花费的交易输出(unspend transaction output, UTXO)和时间戳来解决“双花”问题。

2.21 什么是UTXO?

比特币交易的基本单位是未花费的一个交易输出,简称UTXO。UTXO是不能再分割、被所有者锁住和记录区块链网络中的一定数量的比特币货币。当一个用户接收比特币时,金额被当作UTXO记录到区块链里。一个用户拥有的比特币实际上会被当作UTXO分散到数百个交易和数百个区块中。
“一个用户的比特币余额”,这个概念是通过比特币钱包创建的派生之物。比特币钱包通过扫描区块链并聚合所有属于该用户的UTXO来计算该用户的比特币余额。事实上,比特币现金系统中并没有账户,没有钱包,没有余额,有的只是记录在区块链中,被所有者锁住的UTXO。
当某一笔比特币交易被创建并广播到区块链网络之后,接收到此交易信息的节点会对交易进行验证,检查其是否存在于UTXO中。如果交易输出已不存在于UTXO中,则验证失败。

说白了,UTXO就是一个数据结构,包含交易数据和执行脚本(Pubkey s)。这个数据结构包含每一笔的交易信息和未花费的交易输出。

以现实的钱包举例,一个钱包中有一个10元、1个5元,1个1元,一共16元。比特币一个账户的余额,也是根据这个账户UTXO计算的。

当花12元买东西时,可以把10元和5元拿出去,然后得到找零的3元, 那这个时候之前的10元和5元因为已经花出去了就不再是UTXO了,新找零的3元成为新的UTXO,再加上之前未动的1元UTXO,目前的余额是4元。这次新的交易记录在了新的区块上,但没有改变历史区块的数据。

比特币使用前后链接的区块链记录所有交易记录,当之前的UTXO出现在后续交易的输入时,就会被检查这笔交易的来源已经不在UTXO列表中,也就是说这笔钱已经被花过,这个UTXO已花费掉,不再是UTXO了。 如果你用同一笔UTXO构造了两笔分别付给A和B的交易。那么bitcoin-core客户端(比特币系统节点)的规则是只转发先侦听到的那个。但至于哪笔交易会被包含进未来的区块,则取决于矿工。

矿工的挖矿程序一般是定制开发的,矿工可以自主任意选择这两笔交易里的一笔。比如有的矿工会选择先看到的交易,有的矿工会选择交易手续费更高的那个。

2.22 什么是时间戳?

时间戳(timestamp),一个能表示一份数据在某个特定时间之前已经存在的、 完整的、 可验证的数据。通常是一个字符序列,唯一地标识某一刻的时间。使用数字签名技术产生的数据, 签名的对象包括了原始文件信息、 签名参数、 签名时间等信息。广泛的运用在知识产权保护、 合同签字、 金融帐务、 电子报价投标、 股票交易等方面。

生活中时间戳也很常见,比如我们每天阅读的报纸。报纸记录是现实生活中曾经某一个时刻发生过的事件,我们通过报纸了解这个事件都是在事件发生之后。报纸便是该事件的时间戳,该事件一旦被写进报纸印刷成很多份分发后,便难以被后来人篡改。

比特币现金系统也引入了时间戳的概念。事实上,比特币现金系统是一个由众多节点共同参与的分布式数据库,是一个开放的大账本;由一串按照密码学方法产生的数据块,即区块组成。系统会对每一个区块的数据信息都自动加上时间戳,从而计算出一个数据加密数值,即哈希。每一个新区块都包含前一个区块的哈希,从创始区块开始,链接到当前区块链,形成区块链。

比特币现金系统本身就是构造了一个永不停息、无坚不摧的时间戳系统。系统利用数字时间戳保证每个区块按时间顺序相连成区块链,时间戳也为区块链链上每一笔数据打上时间标记。

假设用户将被存在于自己UTXO中的1个BTC同时转账给两个不同账户,两笔交易仅有一笔会成功完成。为什么呢?因为系统中的节点会选择性地记录先接收到的那笔交易。当两笔交易同时被同一节点记录,根据时间戳的数据,只有先被记录的交易才能被确认成功。

如果他的两笔转账的时间隔得非常非常近,“用户在12点34分56秒转给一号账户1个比特币”、“用户在12点34分57秒转给二号账户1个比特币”恰好被两个不同的节点记录,会出现“双花”吗?也不会。这两个节点会将各自挖出包含相关交易的区块同时广播到比特币网络中,此时区块链将出现分叉,剩余节点选择在他们认为的最长链上构建新的区块。最后,率先构建出新区块并成为当前最长链上的交易(通常为6个区块),才能被确认成功。之后的所有节点将在此最长链上构建新的区块。

4. 总结

比特币作为一个去中心化的点对点电子现金系统,主要依靠UTXO和时间戳来解决“双花”问题,它教会世界如何在不需要信任第三方的情况下转移数字资产。

面对“双花问题”,比特币现金系统是这样解决的:
首先,每笔交易都要先确认对应比特币之前的情况,要检查它是否存在于用户的UTXO中。如果不在,那么该交易会被系统拒绝。
如果用户用同一笔UTXO付给两个不同账户,系统中的节点只确认先接收到的那一笔。
当两笔时间上很接近的交易被不同节点确认,区块链将发生分叉。剩余节点选择在他们认为的最长链上构建新的区块。当其中一笔交易被6个节点确认后,它将成为系统最长链,可以认为这笔交易获得了最终的确认。

有没有例外?
有。如果用户能掌握比特币网络中50%以上的节点,即使他落后最长的区块链(记录“用户在12点34分56秒转给第一个账户1个比特币”)也没关系,他可以一直在另一条区块链(记录“用户在12点34分57秒转给韩第二个账户1个比特币”)上构建区块,直到追上并成为新的最长链,这就是比特币的“51%攻击”。
“51%攻击”的确是比特币需要警惕的问题,目前尚未发生过。原因也很简单,首先没有人能轻易掌握51%的节点;其次,如果一个人或机构已经掌握51%的节点,他是比特币现金系统中的最大受益者。如果他发动51%攻击,比特币的价值将立刻归零(能够“双花”的比特币一文不值),届时他自己将成为最大的受害者。

参考文献:
https://www.jianshu.com/p/56617e91b12a
https://jingyan.baidu.com/article/f7ff0bfc2a42062e26bb133d.html

你可能感兴趣的:(区块链)