Skip to content

GitLab

  • Projects
  • Groups
  • Snippets
  • Help
    • Loading...
  • Sign in
issue
issue
  • Project overview
    • Project overview
    • Details
    • Activity
    • Releases
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributors
    • Graph
    • Compare
  • Issues 23
    • Issues 23
    • List
    • Boards
    • Labels
    • Service Desk
    • Milestones
  • Wiki
    • Wiki
  • Snippets
    • Snippets
  • Members
    • Members
  • Activity
  • Graph
  • Create a new issue
  • Commits
  • Issue Boards
Collapse sidebar

新注册的用户请输入邮箱并保存,随后登录邮箱激活账号。后续可直接使用邮箱登录!

  • chainmaker
  • issueissue
  • Issues
  • #236

Closed
Open
Opened Jul 07, 2022 by fei xin@xinfei1 of 1 task completed1/1 task

更新证书新增组织同步问题反馈

【系统信息】(请填写系统信息,方便定位问题)

  • 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 

image

2.6 修改四个组织下 config/../chainconfig/bc.yml nodes模块的 ${被替换组织}node_id

image

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]

image

定位问题

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. 当然从别的节点拷贝数据过来 重新节点是可以的
Edited Jul 08, 2022 by fei xin
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information
Assignee
Assign to
None
Milestone
None
Assign milestone
Time tracking
None
Due date
None
Reference: chainmaker/issue#236

Copyright © 2021 ChainMaker Org. All Rights Reserved. 长安链 版权所有。