fabric 2.3 Ledger Snapshot

Ledger Snapshot

新加入节点可以不用从0号区块开始同步区块,而是直接同步通道的snapshot信息,从而达到快速加入通道的作用。

snapshot的优点

  • 节点可以不用从初识区块开始处理全部的区块:节点不用处理通道的历史区块就可以加入到一个通道里,减少了节点加入到已有通道的时间。
  • 节点可以使用通道的最新配置加入通道:snapshot中包括了通道的最新配置,节点可以直接利用这些最新配置加入到通道中。这一点对于修改了orderer节点的TLS证书这样的通道更新尤为的重要。
  • 减少存储消耗:新节点通过snapshot加入到通道之后不需要再同步历史区块,减少了存储消耗。
  • 状态检查点:节点的管理者可以将当前的通道状态进行snapshot并和其他节点(同组织的或者不同组织的)的snapshot进行比较,用以做一致性和完整性的校验。

snapshot的缺点

  • snapshot之前的历史区块及历史区块中的交易无法查询。同理也无法查询snapshot之前的关于一个key的历史记录。例如一个peer使用snapshot加入通道,snapshot是在区块高度为1000时创建的,那么从0号区块-999区块都不可以查询。有需要进行相关查询的时候,应用需要找到拥有这些历史区块的节点。因此组织最好保留至少一个节点的历史数据,以供历史数据的查询。
  • 节点在某个高度进行snapshot期间,不会提交区块,但是会正常进行背书和查询。因为进行snapshot是一项资源密集型(resource-intensive)操作,节点在处理背书交易或者向其他通道提交区块时也可能会变得缓慢。由于这些原因,最好只在需要的时候进行snapshot操作。例如一个新的节点要加入到通道中,或者组织想要验证账本有没有分叉。
  • 私密数据不包含在snapshot中(私密数据的hash包含在snapshot中,但数据本身不在)。节点加入使用snapshot加入到通道将会从拥有私密数据的节点拉取私密数据信息,这可能需要一定的时间。
  • 对于通过snapshot加入到通道中的peer,不能使用reset,rollback,rebuild-dbs等命令,因为该节点并没有完整的区块信息。这些节点通过snapshot中的信息来加入通道并重建数据。

一些思考

对于节点加入通道,目前支持两种模式,即原有的通过创世块加入和新增的通过snapshot来加入。

  • 通过创世块加入,然后从排序节点或者其他记账节点拉取区块,并在本地进行处理,直到最新的区块。这种场景下,世界状态是通过区块创建的。
  • 通过snapshot加入,其中包括了通道账本在特定高度的最小集数据。不需要从其他节点拉取和处理区块,世界状态从snapshot中恢复。

对于如何选择是通过创世块加入,还是通过snapshot加入

  • 时间维度,衡量通过创世块加入所需的时间。如果历史区块非常多,时间很久,考虑通过snapshot加入。
  • orderer节点影响,衡量是否需要从通道的最原始配置的排序节点拉取区块(这些节点可能在后来更新中不再存在或者替换了tls证书)
  • 历史查询维度,如果需要查询历史的区块、交易和世界状态,则只能通过创世块加入。

流程介绍

生成snapshot

  • 安排snapshot,节点在同一高度进行snapshot(这样才可以进行一些校验),该高度必须等于或者大于当前高度。

  • 当高度到达设定后,节点生成snapshot。snapshot包括

    • 公开的世界状态(PublicState),包括所有key的最新value。(不包括历史记录)

    • 私密数据的Hash

    • 交易IDs,主要用于之后做交易ID重复性检查用。

    • Collection配置历史,包括所有链码的私密数据配置的历史记录集合。

    image-20201224162405736.png
  • _snapshot_signable_metadata.json包含

    • channel_name: 通道名称
    • last_block_number: snapshot对应的区块高度
    • last_block_hash: snapshot对应的区块hash
    • previous_block_hash:前一个区块的hash
    • state_db_type:世界状态数据库类型CouchDB或者SimpleKeyValueDB(leveldb)
    • snapshot_files_raw_hashes,记录的其它文件对应的hash
    {
        "channel_name": "channel1",
        "last_block_number": 3055,
        "last_block_hash": "1f7810f2372e74c8f35b6d6229bc66cf93e5f7117f5b2720bc0d5c66323057f8",
        "previous_block_hash": "fcd6437725e73eb359f9f3547a0d11d7bfab7ee99ea2e93d052500e0c4c4cebd",
        "snapshot_files_raw_hashes": {
            "private_state_hashes.data": "01ba011132791d18fd73bc24629bf90122713dbd4a6be2e4412067688bd20f06",
            "private_state_hashes.metadata": "053b031f9bb556bae6cec2e7692afdffc8537a9c1a4d0c7f1584fd18deedd4f9",
            "public_state.data": "2f00341f8bc7fe7f7bf40d1873e81530496c93bd58280f7b47abc2cc9be6fd0a",
            "public_state.metadata": "fc6de3a2a90fc1fa83b8abeff26fd363d99c33e6e2013256b82be220bec97143",
            "txids.data": "6970e911152d023b3b8ed29c80bf7a284d7a620fe4d457b8d3f0f23c4aca1a4b",
            "txids.metadata": "60eca34567c4b2ab62d0c934a74304c44994ec63c9b2265c34432ae7b8ad4452"
        },
        "state_db_type": "SimpleKeyValueDB"
    }
    
  • _snapshot_additional_metadata.json包含

    • snapshot_hash,文件_snapshot_signable_metadata.json的hash。
    • last_block_commit_hash,
    {
        "snapshot_hash": "272a05ee90c6dec1e0098399e292f1e1b2905e76e99107ca2992d8a6f90bc6e0",
        "last_block_commit_hash": "4ccda36b2b14edac910a09eac8e8a07b6b6bcc45d6c2139766ddf7df38628df1"
    }
    

通过snapshot加入通道

  • 通过线下方式获得snapshot文件

  • 验证snapshot或者snapshots,peer节点组织的管理员可以通过使用snapshot让peer加入到通道内,加入之前会计算snapshot文件和hash是否一致。另外管理员也可以通过可信从多个组织和节点获取snapshots,也可以要求组织对metadata文件进行签名。

  • peer使用snapshot加入到通道。当节点完成加入之后,会拉取私密数据,然后开始正常提交区块。

实际操作

生成snapshot,使用peer snapshot submitrequest命令来生成snapshot。

peer snapshot submitrequest -c <name of channel> -b <ledger height where snapshot will be taken> --peerAddress <address of peer> --tlsRootCertFile <path to root certificate of the TLS CA>

例如

peer snapshot submitrequest -c testchannel -b 1000 --peerAddress 127.0.0.1:22509 --tlsRootCertFile tls/cert.pem

如果给定的高度为0,即代表在当前高度进行snapshot。

可以通过peer snapshot listpending查询是否有待执行的snapshot操作

peer snapshot listpending -c testchannel --peerAddress 127.0.0.1:22509 --tlsRootCertFile tls/cert.pem

可以通过peer snapshot cancelrequest删除待执行的snapshot操作

peer snapshot cancelrequest -c testchannel -b 1000 --peerAddress 127.0.0.1:22509 --tlsRootCertFile tls/cert.pem

通过snapshot加入通道

  • 首先将snapshot文件放入到peer所运行的环境中(比方说peer容器内部)

  • 通过命令加入通道

peer channel joinbysnapshot --snapshotpath <path to snapshot>
  • 查询是否加入成功
peer channel getinfo -c <name of channel joined by snapshot>
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容