问题内容

  • 最近在搭建FISCO BCOS区块链系统,但是在一个旧的区块链上新增一个区块链节点时出现了一些问题
    • 目前的区块链拥有三个节点,区块链中已经部署了一些合约,产生了一些交易,因此最新的块高为21。现在我想要在这个区块链系统中新增一个节点,而且需要它同步之前产生的一些数据
    • FISCO的文档里写了新增区块链节点的方法,但是需要手动操作很多步骤,因此我在FISCO的github仓库里找到了一个他们提供的脚本,这个脚本可以根据你的配置文件实现节点的一键扩充。脚本地址为:https://github.com/FISCO-BCOS/fisco_bcos_docker_compose
    • 但是使用上述脚本扩充了节点以后,新增加的节点无法同步之前的数据,往区块链上新增交易时,这个新增加的节点也不会参与共识,块高一直为0

  • 使用区块链控制台连接区块链后,将这个新增加的节点通过addSealer方法加入区块链的共识中,但是问题仍未解决

问题原因

  • 查看新节点的log以后发现,新增加的这个节点一直报创世区块错误,因此虽然使用控制台强行将这个节点加入到共识里,但是由于创世区块就和其他节点不同,因此这个新节点无法同步数据,也无法接收新的交易产生共识

  • FISCO BCOS区块链系统中的创世区块的哈希存放于/node*/conf/group.*.genesis文件里,但是这个文件是脚本从原先存在的节点拷贝过来的,不应该有错才对。
  • 通过查看https://github.com/FISCO-BCOS/fisco_bcos_docker_compose里build.sh的脚本内容,我发现脚本在扩容区块链节点时,会修改原来的节点以及新产生的节点的/node*/conf/group.*.genesis文件,脚本的这个行为在区块链从未使用时可以让我们不用使用控制台手动将新增加的节点加入共识列表,直接使用即可。但是在扩容已经产生过数据的区块链时,这个操作由于修改了/node*/conf/group.*.genesis文件,会导致创世区块的哈希值也被同步地修改了,所以新增加的节点将无法正确同步原先区块链中的数据,也无法参与区块链的共识

解决方法

  • 当区块链从未使用时,使用https://github.com/FISCO-BCOS/fisco_bcos_docker_compose脚本即可非常方便地实现区块链节点的扩容
  • 但是当区块链已经产生过数据时,需要修改脚本里的代码,把build.sh中与gen_groups函数的相关内容全部删除,同时需要使用FISCO的区块链控制台手动将新产生的这个节点使用addLeaser方法加入共识列表即可