更新证书新增组织同步问题反馈
【系统信息】(请填写系统信息,方便定位问题)
- chainmaker-go version * : [v2.2.0_alpha]
【问题分类】
- bug
背景
测试每个组织根证书过期,再替换证书之后,新增组织同步数据出现问题
具体操作步骤
部署背景
一台机器, 四个组织节点,使用PermissionedWithCert tifoc创建证书,
步骤
1. 使用cmc 先更新了新证书别名
2. 使用cmc命令 更新块配置每一个组织(重复四次 一个组织一次)
2.1 移除共识节点
2.2 更新组织证书
2.3 重新加入共识
2.4 修改四个组织下 cert/${被替换证书组织}/ca/ca.crt
2.5 修改四个组织下 config/../chainmaker.yml 中 seeds模块${被替换组织}node_id
2.6 修改四个组织下 config/../chainconfig/bc.yml nodes模块的 ${被替换组织}node_id
2.7 一次重启四个节点
3. 使用chaimaker-cryptogen创建新组织证书
4. 组建新组织的配置
5. 启动并使用cmc命令加入共识
6. 等待同步时出现问题
问题
日志
2022-07-07 16:18:18.891 [INFO] [Sync] @hxyz sync/scheduler.go:90 receive [SyncedBlockMsg] msg, start handle...
2022-07-07 16:18:18.892 [INFO] [Sync] @hxyz sync/scheduler.go:391 received block [height:1:754691b944ea1dcef3a99792fbf58efcb0956799001ccf59a803ec188715e2aa] needToProcess: true from node [QmSPBLZ9nZ4CUXHNAhmrYCNkBRfr8QHHWUmiwonpxGmUun]
2022-07-07 16:18:18.892 [INFO] [Sync] @hxyz sync/processor.go:68 handleReceivedBlockInfos start
2022-07-07 16:18:18.910 [INFO] [Sync] @hxyz sync/processor.go:117 ==============xinfei==========handleProcessBlockMsg pendingBlockHeight=1
2022-07-07 16:18:18.911 [INFO] [Core] @hxyz common/block_helper.go:546 =================xinfei========FetchLastBlock currentHeight= block.height0 1
2022-07-07 16:18:18.911 [INFO] [Core] @hxyz common/block_helper.go:553 ==========xinfei======= FetchLastBlock currentHeight+1 == block.Header.BlockHeight
2022-07-07 16:18:18.911 [INFO] [Core] @hxyz verifier/block_verifier_impl.go:369 =================xinfei============validateBlock lastBlock-height0
2022-07-07 16:18:18.911 [WARN] [Core] @hxyz verifier/block_verifier_impl.go:192 verify failed [1](754691b944ea1dcef3a99792fbf58efcb0956799001ccf59a803ec188715e2aa),preBlockHash:eace65e5cc3ae2f34cb94a04e958f8b9fdde84bcedd6ebfd2fcb0efda20f56b0, prehash expect 04be81e21bf365e47da65c5c53446443085ee5237586ac7cac5d09529da7ab63, got eace65e5cc3ae2f34cb94a04e958f8b9fdde84bcedd6ebfd2fcb0efda20f56b0
2022-07-07 16:18:18.911 [WARN] [Sync] @hxyz sync/blockchain_sync_server.go:421 fail to verify the block whose height is 1, err: prehash expect 04be81e21bf365e47da65c5c53446443085ee5237586ac7cac5d09529da7ab63, got eace65e5cc3ae2f34cb94a04e958f8b9fdde84bcedd6ebfd2fcb0efda20f56b0
2022-07-07 16:18:18.911 [INFO] [Sync] @hxyz sync/processor.go:129 process block [height: 1] success, status [4]
定位问题
chainmaker-go 源码
目录
chainmaker-go/module/blockchain/blockchain_init.go
函数 行数大约No.362 line
func (bc *Blockchain) initCache() (err error) {
....
if bc.lastBlock != nil {
...
}else{ //创建新的创始区块
....
}
...
//创建区块被设置到缓存中
bc.ledgerCache = cache.NewLedgerCache(bc.chainId)
bc.ledgerCache.SetLastCommittedBlock(bc.lastBlock)
...
}
分析
其中逻辑是如果是全新数据库 就需要根据 bc1.yml创建创始区块 这个时候bc1.yml中trust_roots模块每个组织ca.crt已经变为新的证书 其中nodes的node_id也不一样了 导致创建创始区块与一开始部署链不一致,后来同步第一个区块 获取第一个块里前一个区块hash 进行hash比较判断时候出现问题,导致同步失败。
同步问题代码
目录 chainmaker-go/module/core/syncmode/verifier/block_verifier_impl.go
函数 大约行数:No.115 line
func (v *BlockVerifierImpl) VerifyBlock(block *commonpb.Block, mode protocol.VerifyMode) (err error){
.....
//从缓存拿取本的同步最新块
lastBlock, err := v.verifierBlock.FetchLastBlock(block)
....
//在此错误返回的 具体函数是v.validateBlock里面的common.CheckPreBlock(block, lastBlock, err, lastBlockHash, proposedHeight)
txRWSetMap, contractEventMap, timeLasts, err := v.validateBlock(newBlock, lastBlock)
.....
}
大体过程
从其他节点获取到第一个区块 ==> 这时候验证 ==> 首先获取本的同步最新的区块(这时由于新添加的 所有从缓存获取出来第0个块就是 配置bc1.yml创建的) ==> 其中其他验证省略... ==> 读取第一个区块prehash(前一个区块hash)值与 第0个块本区块hash对比(出现问题所在)
反馈
需要处理 当新增组织因创始区块与原先不一致情况
1. 当然从别的节点拷贝数据过来 重新节点是可以的
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information