网赚论坛
标题:
比特币如何抵制伪造慢链
[打印本页]
作者:
uat43668xlb
时间:
2017-11-24 20:52
标题:
比特币如何抵制伪造慢链
我对原有的区块链采取了新的协议,试图弄清楚如何正确应对“慢链”问题。
在比特币协议中,节点不断征询最新块,并尝试在其后产生一个块。但是,有时会出现并发分支,并且节点必须不时执行回滚,到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的关键是什么(关键是什么:值对)?
非常感谢您的帮助。
欢迎光临 网赚论坛 (http://www.caifuba.net/)
Powered by Discuz! X3.1