首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

你的币会被双花攻击吗?

不容错过的区块链报道

——

员外在一次交易的过程中,收到一张20万的支票。员外心想这么大的面额,不能被忽悠了,于是给银行打个电话确认了一下,在得到确认后,员外才放心把货物给了对方。

在第二天员外需要用这笔钱的时候,才想起来要去银行提款,结果被银行告知,对方账户已经没有存款。员外如遭五雷轰顶,之后他才知道原来自己的遭遇被称为“双花”。

存在的问题

这个故事中,员外被双重支付了。就是持有人的一份钱,被花了多次,总有一方被骗,没有收到款项。

双重支付:就是一份钱被花了两次。

在传统货币中,这样的情况是不会出现的,一块钱就是一块钱,你花钱的时候,总不能把钱从中间劈开来花吧。除非对方用的是假币,把你给骗过去了,如果数额巨大的话,你还可以报警追回。

但是在电子货币领域就不一样了,因为电子货币它没有实体,只是存在于账户中的一串数字,它不可能像真实的货币一样有复杂的防伪技术,不管使用多严密的算法机制,它都是一串二进制的数字。

在电脑上,大家都知道,很多文件只要拥有权限,是可以随意更改、复制、粘贴的。所以在电子货币领域才会有双重支付的问题,因为同样一串二进制的数字,你能验证它是可用的,可是其他人也能啊,那么谁又能证明它没有被花过呢?

如何解决

其实,无论是中心化的系统,还是去中心化的系统,要想解决这个双重支付的问题,就需要对每一笔交易 建立共识。我们以比特币为例。

其实大家熟知的比特币的账本,就是解决这个问题的,因为它做到了真正的公开透明。

所有的交易公开且可查

历史交易是全网公开的,每个人都可以去查任何一笔交易。因为每一笔交易都是通过全网确认,且打包进区块的,一旦交易成功就无法更改数据。还可以通过历史交易记录来查看每个账户中的余额,因为账户中的余额是通过历史交易记录推算出来的,而不是实时显示的。

为每一笔交易添加时间戳

时间戳:一份能够表示一份数据在一个特定时间点已经存在的完整的可验证的数据。其实就是为一笔交易加上当前的时间。

为每一笔交易加上时间戳后,让这些交易都有了先后顺序,当前一笔交易被确认成功后,后一笔交易才能基于前一笔交易被确认,才能让每一笔交易有据可循,否则就乱套了。、

如何确认交易

既然交易需要被确认,那么谁来做这个工作呢?所以比特币引入了工作量证明机制(POW),也就是矿工。矿工需要投入大量的算力来做这个事情,通过打包交易来对每一笔交易进行确认,然后全网公开,让每一个节点都听到,从此该区块内的所有交易都无法赖账。

整个比特币网络中的每一个节点都可获知每一笔交易的来龙去脉,因为它们是有先后关系的,所有只有当大部分节点都认同这笔交易是首次出现时,这笔交易才能发生。

就像你明明做了一件好事,然后村里人都说不是你做的,最后大家一定相信大多数人。

员外接触了数字货币以后就决定以后只接受比特币付款。于是他的合作伙伴就答应给员外 1 个比特币,但是合作伙伴想要赖掉这笔账,把这 1 个比特币退回给自己。

所以进行了如下操作:

1.发起了转账交易,并给员外看了(只是发起了交易,并没有交易成功);

2.这笔交易会放入到交易池中,等待被正常打包上链;

3.汇集至少 51% 的算力,开始攻击;

4.比特币网络上很多节点都收到了这笔交易,并加入区块准备打包运算;

5.同时计算,但是他在开始之前把这笔交易里的收款地址和签名改成了自己的(这个是很容易的),也就是说这是一笔自己给自己转账的交易;

因为合作伙伴有占全网 51% 的算力,所以他很有可能币其他矿机更早解出这道哈希难题,然后他就可以把这笔伪造的交易加入区块中,进行上链;

这时,整个区块链网络中,会存在两条链,一条是原来的主链,一条是带有这笔假交易的主链,且这条链比原来的那条链多一个区块,也就是说这条带有假交易的链更长;

根据区块链的规则,更长的那条链就可以替代较短的链,成为后面的主链了。这笔伪造交易的 51% 算力攻击,可能就成功了。

员外就再也没有收到这个比特币了,那为什么这样就可以成功赖账了呢?

这也就是为什么比特币交易必须等到6个区块确认后,才被视为有效。因为上面这笔伪造的交易,很有可能被识别出来,从而被废弃掉,那么这笔交易当然就随之失效了。

当然这个攻击只是在理论上可能成功,实际的操作中,没有这么容易的。

那为什么至今也没有出现过一次攻击呢?

现在所有的矿工都会通过挖矿来获取收益,这几乎是矿工们的共识了,只有这样,才能保证所有矿工的利益最大化。因为在挖矿的过程中,每挖到一个区块,就可以得到 25 个比特币的奖励,这个奖励虽然会每隔四年减半,但是手续费也是一笔可观的收益了。

如果真的攻击比特币网络,对谁都没有好处。现在的矿池基本上形成了一个共识,那就是所有的矿池都自觉的把算力维持在 30% 左右,因为如果某个矿池的算力过大,就会对整个比特币网络形成威胁,所以当一个矿池的算力越来越大的时候,就会自觉的把部分算力分配到其他矿池。

2018比特币矿池分布图.jpg

如果有一个矿池拥有了大量的算力,对整个比特币网络进行了攻击,集体伪造了交易,并想从中谋取暴利,那他就是在自断财路。一旦比特币网络被攻破,这个世界上再也没有人使用比特币了,所有的比特币都会变得一文不值,所有的矿工再也不能通过挖比特币来获得收益了。要知道建立一个矿厂,动辄需要几百万、几千万甚至上亿的费用,如果这些矿机不能挖其他矿的话,那这些矿机就是一堆废铜烂铁。

虽然攻击有可能成功,但也没人会去这么做!

-END-

作者:刘飞

责编:张昆

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180607G1BJXM00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券