以太坊C++源码解析(五)区块链同步(6)

除了上面的同步形式外,区块链节点之间还存在另外两种特殊形式的同步,一种是交易同步,也就是当某个节点完成一笔交易后,需要向其他节点广播这个交易,另一种是矿工成功挖到一个区块,也要向其他节点广播这个新的区块。我们来看看这两种同步是怎么进行的。

交易同步

交易同步的数据包类型是TransactionsPacketEthereumPeer收到这个包以后直接就在EthereumPeerObserver里做了处理,并没有转交给BlockChainSync,可能是因为这个处理太简单的缘故,我们也可以从代码中看出来:

void onPeerTransactions(std::shared_ptr<EthereumPeer> _peer, RLP const& _r) override
{
    unsigned itemCount = _r.itemCount();
    LOG(m_logger) << "Transactions (" << dec << itemCount << " entries)";
    m_tq.enqueue(_r, _peer->id());
}

这里的处理就是放到m_tq里,这里的m_tqTransactionQueue对象,TransactionQueue是一个专门放pending交易的队列,也就是还没有正式进入区块链的“无主”交易待的地方。关于这个类,后续会专门来讲。

新区块同步

新区块包的数据类型是NewBlockPacket,这次处理的重任重新回到了BlockChainSync,因此,我们来看看BlockChainSync::onPeerNewBlock的处理吧。
这个处理分为两部分,第一部分是常规检查:

if (_r.itemCount() != 2)
{
    _peer->disable("NewBlock without 2 data fields.");
    return;
}
BlockHeader info(_r[0][0].data(), HeaderData);
auto h = info.hash();
DEV_GUARDED(_peer->x_knownBlocks)
    _peer->m_knownBlocks.insert(h);
unsigned blockNumber = static_cast<unsigned>(info.number());
if (blockNumber > (m_lastImportedBlock + 1))
{
    LOG(m_loggerDetail) << "Received unknown new block";
    // Update the hash of highest known block of the peer.
    // syncPeer will then request the highest block header to properly restart syncing
    _peer->m_latestHash = h;
    syncPeer(_peer, true);
    return;
}

这个包不同于之前的区块数据包,这个包里同时包含区块头和区块体,第一部分是对区块头里的信息进行处理。如果新收到的区块比我目前最新的节点更新,那么说明该节点有更新的数据,那么就调用syncPeer从该节点进行同步。
第二部分就是导入区块体了:

switch (host().bq().import(_r[0].data()))
{
case ImportResult::Success:
    // ...
}

这里的流程和前一节差不多,将这个区块导入二级缓冲区中去验证。

几点补充

到这里ETH区块链同步的主要流程都涉及到了,剩下的部分单独再分析。本节再对同步补充几点:

  1. 以太坊ropsten网络比主网mainnet要差很多,对于同步来说就是噩梦。如果需要测试交易什么的建议自己搭建私有链来测试.
  2. 同步过程漫长,需要有耐心,而且是越来越慢,后期单个区块包含的交易更多,计算量和存储量都巨大。
  3. 同步硬盘建议SSD,容量在1TB以上。
  4. 同步存储主要是三类数据库,Block数据库,Extra数据库和State数据库,其中State数据库最大,这个就是所谓的世界状态了。
  5. 同步有坑!!!,还记得以太坊C++源码解析(五)区块链同步(2)里的那张图吗?整个流程有两个阀门,阀门1是从BlockQueue到区块链,阀门2是从网络到一级缓冲区。这两个阀门正常工作流程是这样的:当二级缓冲区里有数据时,阀门1开启,否则关闭;另外由于数据进入二级缓冲区的速度通常比从二级缓冲区进入区块链的速度要快很多,因此二级缓冲区里有大量数据,当二级缓冲区满时,阀门2关闭,否则开启。但是这两个阀门在实际测试中是存在故障的,阀门1故障的表现是数据校验后未打开,数据不会进入区块链,导致二级缓冲区一直满,从而导致阀门2一直关闭,整个同步过程停止,这种我称为撑死;阀门2故障的表现是在已关闭的情况下,二级缓冲区未满时不能正常打开,二级缓冲区数据全部被取光后整个同步过程停止,这种我称为饿死
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,406评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,732评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,711评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,380评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,432评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,301评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,145评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,008评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,443评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,649评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,795评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,501评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,119评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,731评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,865评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,899评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,724评论 2 354

推荐阅读更多精彩内容