美文网首页
PalletOne技术讲堂之P2P网络数据同步的实现

PalletOne技术讲堂之P2P网络数据同步的实现

作者: PalletOne | 来源:发表于2018-09-08 15:39 被阅读0次

原创: PalletOne Pallet  昨天

讲师介绍:

王继有:渤海大学硕士。精通C,C++,Go语言,拥有丰富的DHCPv6、ND、RUI协议,以及高性能服务器的设计开发经验;熟悉区块链P2P网络的设计与开发。

一、主动同步

(一)算法介绍:

快速同步算法的概要:

参考: https://blog.csdn.net/itcastcpp/article/details/80305748

- 与原有的同步类似,下载组成区块链的区块头和区块body;

- 类似于原有的同步,验证区块头的一致性(POW,总难度等);

- 下载由区块头定义的交易收据,而不是处理区块;

- 存储下载的区块链和收据链,启用所有历史查询;

- 当链条达到最近的状态(头部– 1024<128>个块)时,暂停状态同步;

-获取由pivot point定义的区块的完整的Merkel Patricia Trie状态;

-对于Merkel Patricia Trie里面的每个账户,获取他的合约代码和中间存储的Trie;

- 当Merkel Patricia Trie下载成功后,将pivot point定义的区块作为当前的区块头;

- 通过像原有的同步一样对其进行完全处理,导入所有剩余的块(1024<128>);

1、女巫攻击

解释一: 大规模的p2p系统面临着有问题的和敌对的节点的威胁,为了应付这种威胁,很多系统采用了冗余。然而,如果一个有恶意的实体模仿了多个身份,他就可以控制系统的很大一部分,破坏了系统的冗余策略。我们把这种模仿多个身份的攻击定义为女巫攻击(Sybil Attack)。

解释二: 女巫攻击是在P2P网络中,因为节点随时加入退出等原因,为了维持网络稳定,同一份数据通常需要备份到多个分布式节点上,这就是数据冗余机制。女巫攻击是攻击数据冗余机制的一种有效手段。如果网络中存在一个恶意节点,那么同一个恶意节点可以具有多重身份,就如电影里的女主角都可以分裂出16个身份,那么恶意节点比它还能分。这一分可好,原来需要备份到多个节点的数据被欺骗地备份到了同一个恶意节点(该恶意节点伪装成多重身份),这就是女巫攻击。

解决女巫攻击的方法:

1、POW证明你是一个节点而不是伪造出来的。

2、身份认证(相对于PoW协议,女巫攻击是基于BFT拜占庭使用容错协议的Blockchain需要考虑的问题,需要采用相应的身份认证机制)。 基于第三方的身份认证: 每加入一个新的节点都需要与某一个可靠的第三方节点进行身份验证。 纯分布式的身份认证: 每加入一个新的节点都需要获得当前网络中所有可靠节点的认证,这种方法采用了随机密钥分发验证的公钥体制的认证方式,需要获得网络中大多数节点的认证才能加入该网络。

举例:以太坊的Proof-of-Individuality机制。基于以太坊的个人证明可以防止sybil攻击。

参考:https://translate.google.com/translate?hl=zh-CN&sl=en&u=https://decentralize.today/ethereum-based-proof-of-individuality-prevents-sybil-attacks-9757864bbf61&prev=search

2、Eclipse攻击

这种攻击通常需要Sybil攻击配合。是一种针对区块链点对点节点的攻击方法,可以让使用者用已经支付给其他人的数字货币转账,而接受者无法查证。

研究人员表示,他们建议了诸多对策,开发人员已将它们添加到两周前发布的geth 1.8.0中,这是在以太坊节点上运行的软件。

这些对策无法完全防止日食攻击,而是只是将实施这种攻击所需的恶意节点数量从两个增加到了几千个。

想了解更进一步的细节,请参阅尤瓦尔•马库斯(Yuval Marcus)等研究人员共同撰写的《针对以太坊的点对点网络发动的低资源日食攻击》(http://www.cs.bu.edu/~goldbe/projects/eclipseEth.pdf)。

以太坊发布补丁Geth v1.8.1以解决该问题。

(二)dag数据同步介绍

1、  按不同的共识机构,逐一同步。

2、找到共同祖先,开始从前往后下载。 

(三)技术实现

1、以下三种情形会进行主动同步

(1)新peer加入,并且有5个对端

(2)定时10s同步

(3)接收到新单元产生NewBlockMsg

 备注:

进行主动同步的前提:

前两张情况需要查找最优节点。最优节点指的是unit高度最高的节点。

最优节点的设置是通过接收新单元(NewBlockMsg)时,在本地保存的所有远端节点信息进行设置。

2、主动同步大致流程:

(1)找到最优节点。在本地保存的所有远端节点中,找出高度最大的节点。并和本地高度做对比。

(2)查找共同祖先。

这个模块,比特币和以太币的实现很不一样。

· 比特币是将本地chain顶端N个block的hash及后续以1/2跳跃的方式得到m个block的hash(blocklocator)发送给外部节点,这样外部节点能轻松的找到两个节点的链的共同祖先;

· 以太币不一样,它分两个步骤来操作,第一步是向外部节点请求N个block的hash并和本地对比找到共同祖先,如果第一步没有找到祖先,则按照类似1/2跳跃的方式循环请求更前面的区块的hash,并和本地对比来找到共同祖先;

·可见两种方式的核心区别是,比特币是主动提供本地链区块头信息,外部节点负责找出祖先,而以太币是从外部节点获取数据,本地负责找出祖先。如果共同祖先大部分都是在前N个区块,这两种方式差不多,但是如果进行到1/2跳跃请求,则以太坊的请求次数明显增多。

(3)循环下载,先下载header后下载body。

3、开始下载,大致流程如下:

总结的一些流程:

1、  主流程

2、header下载

2、  body下载

二、被动同步

  被动同步由fetcher完成,被动模式又分为两种:

· 收到完整的block广播消息(NewBlockMsg)

·收到blockhash广播消息(NewBlockHashesMsg)

(一)NewBlockHashesMsg被动模式

四个map:announced,   fetching,   fetched, completing 

四个状态:等待fetch,  正在fetch,  fetch完头等待fetch body, fetch完成

两个定时器:fetchTimer和completeTimer,分别负责获取区块头和获取区块body。

状态转换announced --fetchTimer(fetch header)---> fetching --(headerFilter)--> fetched --completeTimer(fetch body)-->completing --(bodyFilter)--> enqueue --task.done--> forgetHash

大致流程如下:

(二) NewBlockMsg被动模式 

参考:

1、以太坊源码情景分析之区块(block)数据同步

https://blog.csdn.net/ITleaks/article/details/80110262

2、以太坊fast sync算法

https://blog.csdn.net/itcastcpp/article/details/80305748

参考更多:

PalletOne技术讲堂之Omni协议简介

PalletOne技术讲堂之以太坊区块解析流程

PalletOne技术讲堂之 Protobuf原理及使用

PalletOne技术讲堂之玩转Git

PalletOne技术讲堂之RLP编码和解码

PalletOne技术讲堂之密码学基础

PalletOne技术讲堂之货币简史

PalletOne技术讲堂之智能合约漏洞解析

PalletOne技术讲堂之golang编程经验总结

PalletOne技术讲堂之BitShares 2.0 多节点私链部署PalletOne技术讲堂之区块链与比特币特辑(一)

PalletOne技术讲堂之区块链P2P网络解析

PalletOne技术讲堂之DAG技术知多少(一)

区块链世界的IP协议高性能分布式账本

更多有价值的悄悄话,欢迎加入PalletOne社群

添加PalletOne小红微信

加入社区,咨询更多消息

官网:https://pallet.one/

官方邮箱:contact@pallet.one

 Telegram:http://t.me/PalletOneOfficialEN

Github:https://github.com/PalletOne

Twitter:https://twitter.com/PalletOne_org

Medium:https://medium.com/palletone

更多官方咨询,关注公众号获得

相关文章

网友评论

      本文标题:PalletOne技术讲堂之P2P网络数据同步的实现

      本文链接:https://www.haomeiwen.com/subject/kwzkgftx.html