双花问题(Double Spending)
目录 |
双花,即双重支付,指的是在数字货币系统中,由于数据的可复制性,使得系统可能存在同一笔数字资产因不当操作被重复使用的情况
简单来说,同样一笔数字资产被重复支付,即同样一笔钱被花掉两次或多次。
比如,我们微信钱包里有100块钱,我们先去饭店吃了顿饭,结果微信出了bug,这一笔钱并没有被银行同步,还留在钱包里,于是我们又能拿着同样的100块钱去看场电影,这就属于双花问题。
一般来说,双花问题分为两种情况:
一种是记账前双花,比如同一笔钱,因为银行同步延迟的问题,被多次使用;
另一种是记账后的双花,一笔钱花出去,银行已经记账,但如果你攻击银行,从银行账本上删除了这笔花费,就可以再花一次了,即双花。
在区块链系统中,双花问题会在以下情况下出现:
一、 由于共识机制导致区块确认时间长,用一个数字货币去进行一次交易,可以在这笔交易还未被确认完成前,进行第二笔交易。
二、 控制算力来实现双花,第一次交易被验证通过并被记录入区块后,在该网络中有更高的算力验证出新的更长链条,在该链条中这笔钱被第二次花费,由于第二次花费的区块链条更长使第一次交易区块所在链条为无效链条,这样一来,第一次交易所在的区块链被区块链网络放弃,第一次花费的钱就又回到自己账户了,就导致了双花问题。
还有许多情况,比如利用控制矿工费来实现双花,或者一些人为了节省时间而接受0确认,这就很容易被攻击者利用。
举个简单的例子,比如你在商场刷卡买东西,这个行为面临三种风险:
1.首先,刷卡这个行为,验证的是你的信用卡信息,也就是说只要给刷卡机提供同样的信息,就能从你的账户里把钱刷走。没错,很多朋友都听说过,有犯罪组织专门从事复制卡信息的勾当,然后“盗刷”你的卡。在一些不发达国家的小店里刷卡就特别容易中招。
2.其次,负责记账和结算的卡组织和银行的服务器可能被黑客攻破,造成数据泄露和伪造交易。回想这些年一波又一波某某大公司数据库被黑客攻入的新闻,这危险并非危言耸听(好吧,可能会有认真的人说这里用词应该是Cracker骇客,而非Hacker黑客,不过这年头认真的人越来越少了)。
3.最后,还有一种可能,就是用卡人自己可能利用系统网络延迟,在进行第一笔交易、用完所有额度后,趁系统还没记账把额度扣完,立刻进行第二笔交易,形成诈P。当然,目前的结算系统延迟极小,这情况不太可能,不过像在优惠券或者抢购资格这种另外搭建的相对脆弱的系统网络上还是有可能的。
网上支付也一样,犯罪分子可以用特殊手段(例如木马,伪造WIFI等)截获你跟服务器之间的传递数据,如果商家加密技术太弱的话信息就可能被破解。有些国家很多时候数据干脆是不加密的,所以大家才一直被警告不要乱装程序、不要连可疑的WiFi。
为了解决双花问题,我们日常的数字资产使用依赖于第三方信任机构进行。这类机构对数据进行中心化管理,并通过实时修改账户余额的方法来防止双重支付的出现。
1.首先每笔交易都要先确认对应比特币之前的情况,要检查它是否存在于用户的UTXO中。如果不在,那么该交易会被系统拒绝。
2.如果用户用同一笔UTXO付给两个人,系统中的节点只确认先接收到的那一笔。
3.当两笔时间上很接近的交易被不同节点确认,区块链将发生分叉。剩余节点选择在他们认为的最长链上构建新的区块。
4.当其中一笔交易被6个节点确认后,它将成为系统最长链,可以认为这笔交易获得了最终的确认。
比特币虽然至今没有出现过双花问题,但也不是绝对不会出现,比如51%算力攻击。但为什么没有人这么做,首先是由于成本太高,没有人能轻易掌握51%的节点。即便一个人已经掌握了51%的节点,那么他就已经是比特币网络当中的最大受益者,如果发动51%攻击,可以短期获利,但是比特币的价值将会遭受毁灭性打击,届时他就会成为最大受害者。
在现实生活中,作为收款者来说,比如商店老板,防范第一种双花很容易,不以付款者的交易记录为依据,只有确认自己账户上钱到账才交付商品。比如用微信支付,不仅要看用户出示的手机支付页面,也要看自己的手机上是否收到。当然,如果很小额的交易,生意又忙,用户也是街坊邻里,只看支付页面也可以,这个小风险商店可以承担。
在区块链应用中,防范未记账前的双花也与之类似,最好的解决方案也是等记账后,再完成交易,大额交易一般都是走这种路径。不过,如果金额很小,人又熟,交易是可以不记入区块链的,即没有记账的情况下,也可以完成支付。这叫“零确认支付”,只不过这种方式,收款方是要承担被双花的风险。
在生活中,比如微信已经记了账,但黑客攻击了微信的服务器,商户收款的交易记录一旦丢失,商户自然就受到了损失,付款者又可以使用原来的这笔钱。不过,这种情况极少出现,既然要记账,那一定是非常小心保存账本的。
区块链应用也类似,整个区块链技术的核心就是保障账本的安全,记了账就不能被双花。但安全不是绝对的,即使记了账,仍然有可能被双花。因为,区块链应用不是依靠中央银行这样的机构的权威来保障账本安全的,而是依靠分布世界各地的节点都保存统一份的账本,并且由全世界的矿工用算力来竞争记账,产生完全一致的新账页的。
当有人掌握了全网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模型。通过它们,进一步提高区块链的记账安全性、以及双花的作恶成本。
2018年5月份,一名恶意矿工获得了比特币黄金(BTG)网络至少51%算力,临时控制了比特币黄金(BTG)区块链,在向交易所充值后迅速提币,再逆转区块,成功实施双花攻击。攻击者可能从交易所窃取超过388200个BTG,价值高达1860万美元。恶意矿工通过对比特币黄金(BTG)区块链实施51%攻击和双花攻击来谋取利益。