# VICOINDAO 一、区块链小白初级教程29·双花问题的解答

By [VICOINDAO](https://paragraph.com/@vicoindao) · 2022-01-06

---

![](https://storage.googleapis.com/papyrus_images/f9a41f109d909aff943c5b3fbedc80a40ded13da0ef9201eb663ca53128a53df.jpg)

之前的课程，我们已经讲过了区块链的四大核心技术都有哪些，它们共同决定了区块链的整个基础框架。可是在区块链网络中，还有一些问题是四大核心技术也没有办法完全解决的，比如网络拥堵问题、效率问题等等。而今天，我们要说的就是其中的一种，也就是双花问题。

所谓双花问题，顾名思义，就是一笔钱被重复花了两次。比如，我们微信钱包里有100块钱，我们先去饭店吃了顿饭，结果微信出了bug，这一笔钱并没有被银行同步，还留在钱包里，于是我们又能拿着同样的100块钱去看场电影，这就属于双花问题。

  

一般来说，双花问题分为两种情况：一种是记账前双花，比如同一笔钱，因为银行同步延迟的问题，被多次使用，像我们刚才举的例子就是这种情况；另一种是记账后的双花，一笔钱花出去，银行已经记账，但如果你攻击银行，从银行账本上删除了这笔花费，就可以再花一次了，即双花。

那在现实生活和区块链中，我们该如何解决双花问题呢？

  

在现实生活中，作为收款者来说，比如商店老板，防范第一种双花很容易，不以付款者的交易记录为依据，只有确认自己账户上钱到账才交付商品。比如用微信支付，不仅要看用户出示的手机支付页面，也要看自己的手机上是否收到。当然，如果很小额的交易，生意又忙，用户也是街坊邻里，只看支付页面也可以，这个小风险商店可以承担。

在区块链应用中，防范未记账前的双花也与之类似，最好的解决方案也是等记账后，再完成交易，大额交易一般都是走这种路径。不过，如果金额很小，人又熟，交易是可以不记入区块链的，即没有记账的情况下，也可以完成支付。这叫“零确认支付”，只不过这种方式，收款方是要承担被双花的风险。

  

而防范第二种双花就比较难了。在生活中，比如微信已经记了账，但黑客攻击了微信的服务器，商户收款的交易记录一旦丢失，商户自然就受到了损失，付款者又可以使用原来的这笔钱。不过，这种情况极少出现，既然要记账，那一定是非常小心保存账本的。

区块链应用也类似，整个区块链技术的核心就是保障账本的安全，记了账就不能被双花。但安全不是绝对的，即使记了账，仍然有可能被双花。因为，区块链应用不是依靠中央银行这样的机构的权威来保障账本安全的，而是依靠分布世界各地的节点都保存统一份的账本，并且由全世界的矿工用算力来竞争记账，产生完全一致的新账页的。

当有人掌握了全网51%以上的算力时，就能够将刚刚记过的账页作废，把里面的一笔花费恢复成没被花掉的状态。这就是记账后的双花了，这种攻击方法叫“51%攻击”。这种双花相对于记账前的双花比较难实现，因为掌握51%算力需要很多钱。但如果双花的收益足够大，攻击仍然是有可能的。怎么办呢？

解决的办法是，等待更多确认。51%的算力要作废最新账页，其成功概率是51%，但作废连续两个新账页的概率就是51%\*51%=26%，作废3个的概率是13.3%，作废6个的概率只有0.46%了。如果攻击者没有掌握51%的算力，只掌握20%的算力，那么攻击成功的概率就只有0.0064%了。

这样，问题就简单了。商户可以根据交易金额的大小来决定如何防范双花。

如果交易金额很小，比如卖支铅笔，完全可以接受零确认，对用户既省时又贴心。万一双花也不在乎。如果交易金额大一些，比如卖件衣服，那建议等待一个确认就可以了。不会有黑客为了你一套衣服动用51%的算力发起攻击的。如果交易金额很大，比如买钻石，那就要小心了。要根据全网算力的成本估算一下需要多少个确认，金额越大，需要的确认数就越多。

  

比如这个区块链是10分钟确认一次，全网51%的算力每10分钟的成本是10万元。你卖的钻石价值100万元。那么你至少要10个确认以上才能交付钻石。最好是20个以上确认。

总之，预防双花攻击，一个基本的原理就是，让攻击者赔钱的概率远远高于你被双花的概率。

当然，为了预防双花问题，区块链本身从技术方面，也在共识机制的基础上，引入了一些其他技术，比如时间戳和UTXO模型。通过它们，进一步提高区块链的记账安全性、以及双花的作恶成本。至于它们具体是如何解决的，容小K君卖个关子，我们下节课再说~

注：这些例子数据都是为了简便给的估值，真实的攻击成本收益分析非常复杂。

【welcome to join us】 WeChat1：victeam005 WeChat2：shijie20170405 Telegream：[https://t.me/VICOINDAOCHAT](https://t.me/VICOINDAOCHAT) Twitter：@VICOINDAO

---

*Originally published on [VICOINDAO](https://paragraph.com/@vicoindao/vicoindao-29)*
