双花问题

   所谓的双花问题其实就是指的重复消费的问题,double spending双重花费。简单来说就是一笔钱花了两次。

   现金交易是不会发生之类的事情,在虚拟货币中可能会存在这样的问题,但是像数字货币,以支付宝为例,应该是不会出现一笔钱转给两个人的,为什么?首先是因为速度快,另外幂等性,所谓幂等就是发生在更新操作的情况下的(多是添加,少数更新操作),如果是转钱的话明显是更新操作,恰恰其又是需要保证幂等的。

    update user set name = 'lisi' where id = 1;   //此sql是不需要保证幂等的

    update user set money = money + 10 where id =1; //此sql是需要保证幂等的

     为什么同是更新操作,一个需要保证幂等一个不需要呢?可以理解为连续发送多次请求,多次产生的结果都是一样的就不需要保证幂等,所以查询、删除 是不需要保证幂等的,

      所以只需要保证了幂等性就可以解决双花问题,我们来看看POW是怎么实现解决双花问题的:

     1、第一笔交易已经入块,第二笔交易还未入块。交易的时候会去查看当前用户有多少BTC,如果不够用就交易失败,交易被拒绝;当即交易成功之后,需要将BTC标记为花费。

     2、第一笔交易还未入块,第二笔交易也未入块。正常操作下最终的结果会出现第一种的情况。非法操作会先另外一种情况:

     两人同时记账,一个人记录的是第一笔交易,另外一个人记录的是第二笔交易。遵循最长链原则,假设第一笔交易所属的链长称为了主链,这个时候出现这种操作可能是用户的误操作,也是没有什么问题的额,但是用户是一个技术高手,第一笔交易成功之后生成了订单拿到商品之后,又能够保证了下面的两个块都出现了短链的分支后面,这时候端链成为了主链。这种情况下是基本不可能的。当然如果能够实现,那么只能说以后你就可以在区块链的世界里遨游了。

       大致过程如图所示:

   

     为什么说基本上不可能,来说一下概率问题:

     

在B分支落后的情况下要强行让它超过A分支,其实是挺难的,假设诈骗者掌握了全网1%的计算能力,那么他争取到记账权的概率就是1%,两次就是10的负4次方。但这个概率还没有太低。

应对办法呢?建议大家在一笔交易确认后,也就是一个block被记下来之后,再等5个block,也就是等6个block被确认后再把交易对应的商品交付。这样,诈骗者还能追上的概率就几乎为0了。除非……

如果诈骗者掌握了全网50%以上的计算力,那么,即使落后很多,他追上也只是时间问题,这就是比特币的“51%攻击”。

这就是区块链需要警惕的问题。虽然在比特币网络中,用户已经极多,全网算力总和非常大,如果真掌握50%以上,也不用靠这个诈骗了,挖矿的收益都更高。但是在小的区块链网络中呢?况且,没有50%以上的算力,还是有机会成功的,只是概率低而已。

参考:

区块链中“双花”问题:https://www.cnblogs.com/10zhang/p/8616991.html

双重支付:https://blog.csdn.net/jfkidear/article/details/87868088

猜你喜欢

转载自blog.csdn.net/JavaWeb_Hao/article/details/106389182