“双花”问题及解决之道

 郭知行 2018-03-28 23:05:09

比特币作为一个去中心化的点对点电子现金系统,主要依靠UTXO和时间戳来解决“双花”问题。

比特币

提个问题先:

小明在星巴克点了杯拿铁,付给漂亮的收银员小姐姐30元现金。喝完咖啡,小明走进隔壁的花店,准备为女朋友买束玫瑰,一摸口袋发现最后的30元现金已经用来买咖啡了。这时候,如果小明想用给星巴克小姐姐的那30元买花。可能吗?

不可能。除非他从小姐姐那把钱偷回来。

如果小明使用的不是现金,而是数字货币呢?

要回答这个问题,你需要了解“双花”问题。

01 什么是“双花”问题?

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

“双花”是任何一种数字货币都要解决的问题。为什么?

如果某种数字货币能被人重复使用,同样一笔钱被花掉两次或多次,它没有价值。

在上述星巴克买咖啡的情境中,小明使用的30元现金可以很容易地被小姐姐确认。但如果小明使用的是某种数字化货币,小姐姐想确认就不那么容易了。事实上,30元数字货币背后的数据是相同的,伪造数据的成本远远低于伪造现金。

02 “支付宝”们如何解决“双花”问题?

那你可能要问了,我每天都在淘宝上买买买,也不需要使用现金。支付宝如何解决“双花问题”呢?

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

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

更简单地说,支付宝仅仅是一个第三方中介。当你走进任何一家商店,星巴克也好,花店也好,如果你想使用数字货币进行支付,你必须将钱交给一个第三方中介,可以是支付宝,也可以是微信等。这类机构对数据进行中心化管理,并通过实时修改账户余额的方法来防止“双花”的出现。只有经过第三方确认后,小姐姐们才会把咖啡和玫瑰给小明。

这样有什么问题吗?

人类需要为交易中第三方验证支付巨额费用。

虽然每一笔交易的“中介费”并不高,但如果交易数量十分大呢?要知道,全球总共有超过75亿人,每天交易量高达以万亿级别。更值得注意的是,这类第三方机构对数据进行的是中心化管理,它们会不会有意或无意(被黑客攻击)篡改数据呢?我不知道。以支付宝、微信举例子,仅仅是因为我日常生活中常使用它们,并非有意诋毁,它们都是伟大的公司。

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

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

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

什么是UTXO?

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

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

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

小明给李雷转账1个BTC。整个过程如下:

  • 小明要发送的那1个比特币存在于小明的UTXO中;
  • 小明发送的金额等于李雷接受的金额,即1BTC;
  • 李雷接收后,1个比特币从李雷的UTXO中解锁,进入李雷的UTXO中。

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

什么是时间戳?

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

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

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

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

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

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

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

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

有没有例外?

有。如果小明能掌握比特币网络中50%以上的节点,即使他落后最长的区块链(记录“小明在12点34分56秒转给李雷1个比特币”)也没关系,他可以一直在另一条区块链(记录“小明在12点34分57秒转给韩梅梅1个比特币”)上构建区块,直到追上并成为新的最长链,这就是比特币的“51%攻击”。

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

04 总结

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

本文首发于微信公众号:郭知行。知者行之始,行者知之成,和你一起终身成长。

“双花”问题及解决之道相关推荐

  1. 异数OS-织梦师-管仲(八) 并发危机解决之道

    异数OS-织梦师-管仲(八) 并发危机解决之道 文章目录 异数OS-织梦师-管仲(八) 并发危机解决之道 前言 管仲佐纠 <管子>专用申明 解不开的并发障碍 Redis的并发障碍 MapR ...

  2. 小程序一次性上传多个本地图片,上拉加载照片以及图片加载延迟解决之道

    一:小程序之一次性上传多个本地相片 最近由于项目需要所以学了下小程序,也做了一些东西,随后便有了以下的一些总结了,现在说说如何使用小程序一次性上传多个本地相片. 问题描述 最近做项目的时候要实现一个上 ...

  3. java中文乱码解决之道(二)—–字符编码详解:基础知识 + ASCII + GB**

    原文出处:http://cmsblogs.com/?p=1412 在上篇博文(java中文乱码解决之道(一)-–认识字符集)中,LZ简单介绍了主流的字符编码,对各种编码都是点到为止,以下LZ将详细阐述 ...

  4. 企业互联网应用高性能解决之道

    本文介绍了企业互联网开发及运维的一些实践,深入剖析了互联网项目开发及上线过程中的各种痛点及解决之道. 一个互联网项目的上线并不是那么容易,需要经过很多的环节:从服务器的准备开始,紧接着是业务系统的搭建 ...

  5. Delphi Access violations 问题的解决之道

    Delphi Access violations 问题的解决之道 Windows用户可能经常会看到类似于错误提示:"Error:Access violation at address 836 ...

  6. [转]SQLObject加MySQL的 utf-8解决之道

    SQLObject加MySQL的 utf-8解决之道 软件技术 lhwork 发表于 2007-2-1 21:17:57 SQLObject对utf-8的支持一直为很多人所诟病,MySQL对utf-8 ...

  7. Atitit.软件GUI按钮与仪表盘--db数据库区--导入mysql sql错误的解决之道

    Atitit.软件GUI按钮与仪表盘--db数据库区--导入mysql sql错误的解决之道 Keyword::截取文本文件后部分 查看提示max_allowed_packet限制 Target Se ...

  8. 创业失败的七个原因及解决之道

    摘要:Arkenea联合创始人Rahul Varshneya认为创业公司失败主要是因为:没有用户就开始算计收入.眼界太小.聘用了平庸的人.拖延发布.适应不了变化.没有优化资源和缺乏正确的营销等.创业不 ...

  9. 秒杀系统的架构解决之道

    http://www.infoq.com/cn/articles/solution-to-the-architecture-of-spike-system 本文将会从三个方面来分别探讨如何设计应用架构 ...

最新文章

  1. CNN光流计算2--FlowNet 2.0: Evolution of Optical Flow Estimation with Deep Networks
  2. 1 编码_TMS320F28379D之CLB解码多摩川编码器1——入手小知识(原创)
  3. Best Time to Buy and Sell Stock with Cooldown
  4. 开发工具总结(6)之Android Studio模板配置详解(提高开发效率必备技能)
  5. b站黑马程序员java视频学习笔记01
  6. 电脑ps计算机磨皮,ps磨皮教程
  7. 养猫有哪些坏处哪些好处呢?
  8. s5pv210 linux,S5PV210-零基础体验uboot
  9. 三轮全向底盘:运动学性能分析
  10. 运算符-12-多学一招原码反码补码,隐式和强制转换,位运算
  11. 小伙子不讲武德,竟用Python爬取了B站上1.4w条马老师视频数据来分析
  12. 太原理工大学计算机复试面试,太原理工大学备考复试注意事项经验分享
  13. 三角函数与反三角函数(图像)
  14. ug侧铣头编程_数控机械加工侧铣头(角度头)编程入门知识
  15. 打印复印机一直提示稿台上留有原稿怎么办?
  16. Java基础案例2-4为新员工分配部门
  17. STC15单片机——外部中断
  18. java中fido_使用YOCTO fido分支创建的工具链问题
  19. 基于Verilog HDL 和FPGA的寻线小车设计代码
  20. 快速成长期的云原生应用架构实践

热门文章

  1. python键盘记录工具开发_多功能Python键盘记录工具:Radium
  2. showdown解析md文件
  3. 怎样开发微信小程序(最初的页面)
  4. 07-图6 旅游规划
  5. android 方法映射,高通Android平台驱动层 MSM8916 键值映射方法
  6. git clone之报错git@gitee.com: Permission denied (publickey).fatal: Could not read from remote repositor
  7. 【IDEA】IDEA修改项目名称
  8. js任意进制转换(二进制,八进制,十进制...三十六进制)
  9. Zhishi.me - Weaving Chinese Linking Open Data
  10. 大型养猪场智能监控系统开发