比特币的“双花”问题

Posted TiercelChow

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了比特币的“双花”问题相关的知识,希望对你有一定的参考价值。

课程信息:哈尔滨工程大学计算机学院2021年区块链技术课程
小组成员:

  • 2018065230周宇琛(撰文)
  • 2018065227曾启健(审稿)
  • 2018065229赵政(排版)

在这里插入图片描述

1. 问题引入

小明一早出门只带了20元钱,他来到肯德基吃早餐,点了20元的套餐,把钱付给了肯德基的收银员,这20元钱得到收银员的确认。小明吃完早餐出门,发现自己并没有吃饱,抬头一看有个麦当劳,于是他走进麦当劳,想再点一个20元的汉堡。这时候,如果小明想用之前买肯德基套餐的那20元钱买麦当劳汉堡,可能吗?当然不可能。因为那20元钱是独一无二的,已经被花出去了。
但如果小明使用的不是现金,而是数字货币呢?
要回答这个问题,你需要了解“双花”问题。

什么是双花问题?

双花问题就是一个数字货币被使用2次或者多次。
在现实世界中,我们可以使用人民币,美元进行交易。买方把100美元付给卖方,由于100美元是实物,买方无法再使用这100美元进行新的交易。当我们使用信用卡的时候,当我们支付了100美元以后,也无法再使用这100美元进行新的交易,因为信用卡用户的所有交易记录被信用卡公司的中心数据库记录着。由于比特币不是实物,也没有中心数据库,因此,避免双花问题就成了比特币体系要解决的重要问题。

2. 支付宝,微信支付如何解决“双花”问题?

事实上,支付宝中的钱并不存在于数字世界。相反,它仍存在于现实世界的银行中。当在淘宝上下单并付款给卖家时,实际上做的是:

  1. 你把钱付给支付宝;
  2. 支付宝将你的钱存在他们的银行账户中;
  3. 你确认收货后,支付宝将钱从他们的银行账户中取出,并支付给卖家。

更简单地说,支付宝仅仅是一个第三方中介。当你走进任何一家商店,如果你想使用数字货币进行支付,你必须将钱交给一个第三方中介,可以是支付宝,也可以是微信等。这类机构对数据进行中心化管理,并通过实时修改账户余额的方法来防止“双花”的出现。

那我们有没有可能,在不需要信任中心化第三方机构的情况,向某人转移数字资产?
有的,那就是比特币。

在这里插入图片描述

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

2008年,有个叫中本聪的人发表了一篇论文《比特币:一个点对点的电子现金系统》,这篇论文描述了比特币的详细操作方案,标志着“比特币”的诞生。

比特币白皮书,也就是中本聪写的那篇论文《比特币:一个点对点的电子现金系统》,看似非常复杂,其实通过白皮书的简介,我们可以发现,中本聪想要解决的终极问题是“去中心化问题”,去中心化是他的终极理想。但是,想要实现去中心化,要面很多,对现在中心化体系来说,不是问题的问题。在中本聪看来,其中最大的问题就是“双重支付”的问题,就是我们说的“双花问题”。

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

什么是UTXO?

比特币交易的基本单位是未花费的一个交易输出,简称UTXO。UTXO是不能再分割、被所有者锁住和记录区块链网络中的一定数量的比特币货币。当一个用户接收比特币时,金额被当作UTXO记录到区块链里。一个用户拥有的比特币实际上会被当作UTXO分散到数百个交易和数百个区块中。

“一个用户的比特币余额”,这个概念是通过比特币钱包创建的派生之物。比特币钱包通过扫描区块链并聚合所有属于该用户的UTXO来计算该用户的比特币余额。事实上,比特币现金系统中并没有账户,没有钱包,没有余额,有的只是记录在区块链中,被所有者锁住的UTXO。

当某一笔比特币交易被创建并广播到区块链网络之后,接收到此交易信息的节点会对交易进行验证,检查其是否存在于UTXO中。如果交易输出已不存在于UTXO中,则验证失败。

用户A给用户B转账1个BTC。整个过程如下:

  1. 用户A要发送的那1个比特币存在于用户A的UTXO中;
  2. 用户A发送的金额等于用户B接受的金额,即1BTC;
  3. 用户B接收后,1个比特币从用户A的UTXO中解锁,进入用户B的UTXO中。

比特币现金系统中记录着当前每一笔“未花费的交易输出”。当节点接收到一笔交易信息的时候,它需要去 UTXO 数据库里查,看看这笔交易所引用的 UTXO 是否存在,它的收款人(拥有者)是不是当前新交易的付款者。交易结束之后,系统会做相应的更新。
在这里插入图片描述

什么是时间戳?

在这里插入图片描述

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

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

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

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

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

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

总结一下,面对“双花问题”,比特币现金系统是这样解决的:

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

一个例外:比特币的“51%攻击”

在这里插入图片描述

如果能掌握比特币网络中50%以上的节点,即使落后最长的区块链也没关系,可以一直在另一条区块链上构建区块,直到追上并成为新的最长链,这就是比特币的“51%攻击”。

“51%攻击”的确是比特币需要警惕的问题,但目前尚未发生过。原因也很简单,首先没有人能轻易掌握51%的节点;其次,如果一个人或机构已经掌握51%的节点,他是比特币现金系统中的最大受益者。如果他发动51%攻击,比特币的价值将立刻归零(能够“双花”的比特币一文不值),届时他将成为最大的受害者。

总结

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

本文参考自以下文章:
DxChain研究:深刻理解比特币中双花问题
“双花问题”的解决之道
比特币如何解决“双花”问题
什么是比特币双花问题
比特币核心技术之双花问题

以上是关于比特币的“双花”问题的主要内容,如果未能解决你的问题,请参考以下文章

比特币的“双花”问题

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

比特币的共识协议

比特币的共识协议

比特币双花攻击

区块链知识点总结BTC-4比特币协议 (北大肖臻老师)