OK区块链60讲 | 啥是双花问题?

时间:2021-07-27 18:37编辑:未知

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

所谓双花问题,顾名思义,就是一笔钱被重复花了两次。譬如,大家微信钱包里有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君卖个关子,大家下节课再说~

注:这部分例子数据都是为了方便给的估值,真实的攻击本钱收益剖析很复杂。