网赚论坛

 找回密码
 免费注册
查看: 304|回复: 0
打印 上一主题 下一主题

比特币如何抵制伪造慢链

[复制链接]

15

主题

15

帖子

60

积分

Ⅰ级财主

Rank: 1

积分
60
跳转到指定楼层
楼主
发表于 2017-11-24 20:52:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我对原有的区块链采取了新的协议,试图弄清楚如何正确应对“慢链”问题。
在比特币协议中,节点不断征询最新块,并尝试在其后产生一个块。但是,有时会出现并发分支,并且节点必须不时执行回滚,到2、3个块之前。

我们知道,块难度取决于块之间的时间差。恶意实体可以通过从创世块开始出块,这些块有连续的、间隔超过10分钟的时间戳,以伪造一条由任意块组成的区块链。这样做的话难度不会增加,出链的成本低廉。
当然,使用这种方法,伪造链上的时间戳增加的速度远远快于真正的链。这样的话节点会将伪造链丢弃,因为合法块的时间戳必须小于或等于当前时间戳(正/负公差)。

但是问题在于:
Alice控制一个比特币节点,储存了50万个块,Bob有60万个块,但是两者间共同的块只有前面1000个。Bob的链是伪造慢链,但是Alice却不知道这一点。Alice想要下载Bob的块,检验这些是否正确。

问题:Alice在存储新块前如何检测出Bob的链是无效的?

方法1:A从B那里下载1000号块之后所有的块,检查是否一切正常,如果确认OK,通过解开两者间共同块之后的链以恢复存储状态,然后接收新区块。
在这个案例中,Alice开始下载599000个块,最后发现时间戳过于庞大。她需要在内存中存储临时链(可能成本很高)并检查所有条件。这很费时间,每一次骗局都会让她如此做上一遍。

方法2:A恢复存储到B拥有的共同块,然后将块从B那里接收过来。
在这个案例中,Alice将她的存储恢复到1000号块,试用从Bob那里接收到的块,最终丢弃使用非法时间戳的块,再恢复到共同块(1000号),重新载入下载Bob块之前的她原有的块。时间和资源又被浪费掉了。

方法3:A只能恢复过去特定的、少量的块。这样,B对其造成的伤害降至最小,伪造一条慢链代价高昂。
但是如果遇到一个长期分区的网络(大脑分裂),网络部分会出现分歧,不会就哪条链是最长的达成共识。这种情况需要从存储中手动删除记录。

方法4:A存储能探测到的所有的块(包括废弃的分叉),动态追踪最长的分叉。这种方法虽然安全,但需要大量的存储空间,并且很难有效地实现。

我倾向于第3种方法,但我想知道各种比特币客户端是如何解决这个问题的。

我看到核心客户端只存储最长链,跳过了孤立块。基于Leveldb(注:Leveldb是一个google实现的非常高效的kv数据库)存储的细节如下:用在区块链中Leveldb的关键是什么(关键是什么:值对)?
非常感谢您的帮助。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

广告合作|Archiver|手机版|小黑屋|财富吧

GMT+8, 2024-12-28 08:43 , Processed in 0.140400 second(s), 35 queries , Gzip On.

Powered by Discuz! X3.1

© 2014-2021 财富吧

快速回复 返回顶部 返回列表