Hyperledger Fabric - 如何在每次区块链网络测试后清除 DEV 环境?
Posted
技术标签:
【中文标题】Hyperledger Fabric - 如何在每次区块链网络测试后清除 DEV 环境?【英文标题】:Hyperledger Fabric - How to clear out the DEV environment after each blockchain network test? 【发布时间】:2020-07-08 11:31:56 【问题描述】:Fabric 1.4.3 版本。具有 1 个 Oderer (solo) + 1 个 Org 的区块链网络,在 Docker 上运行。
由于 PEER0 上的 PANIC 错误和对等崩溃,尝试实例化链代码。
无法实例化链码,因为 PEER0 在执行该过程时会崩溃。
在 CLI docker 提示符下,我执行了以下命令序列:
1) $> peer channel create -o $ORDERERNAME -c $CHANNELNAME -f $CONFIGTXFOLDER/devchannel.tx --tls --cafile=$ORDERER_TLSCACERT
Cli 中的结果:UTC [cli.common] readBlock -> INFO 04e Received block: 0
2) $> peer channel join -o $ORDERERNAME -b $CONFIGTXFOLDER/devgenesis.block --tls --cafile=$ORDERER_TLSCACERT
Cli 中的结果:UTC [channelCmd] executeJoin -> INFO 03e Successfully submitted proposal to join channel
3)$> peer chaincode install -n $CHCODENAME -p $CHCODEPATH -v $CHCODEVERSION -l node --tls --cafile $ADMIN_PEER_TLSCACERT
Cli 中的结果:UTC [chaincodeCmd] install -> INFO 04a Installed remotely response:<status:200 payload:"OK" >
4) $> peer chaincode instantiate -C $CHANNELNAME -n $CHCODENAME -v $CHCODEVERSION -o $ORDERERNAME -c '"Args":["init","a","100","b","200"]' -P "AND ('GuaraniMSP.admin')" --tls --cafile $ORDERER_TLSCACERT --tlsRootCertFiles $CORE_PEER_TLS_ROOTCERT_FILE
PEER0 崩溃前的结果:
UTC [gossip.state] commitBlock -> ERRO 87e Got error while committing(unexpected Previous block hash. Expected PreviousHash = [c87a4b77e4c790f78b0c2e3c97d97de9907a09daf5dc2f039c7e3b3e1440f5d1], PreviousHash referred in the latest block= [953e31164a84d6d1b9b446130d1e7d5af8ede818284e8fa7c315b2125b519e38]
github.com/hyperledger/fabric/common/ledger/blkstorage/fsblkstorage.(*blockfileMgr).addBlock
[...]
UTC [gossip.state] deliverPayloads -> PANI 87f Cannot commit block to the ledger due to unexpected Previous block hash. Expected PreviousHash = [c87a4b77e4c790f78b0c2e3c97d97de9907a09daf5dc2f039c7e3b3e1440f5d1], PreviousHash referred in the latest block= [953e31164a84d6d1b9b446130d1e7d5af8ede818284e8fa7c315b2125b519e38]
github.com/hyperledger/fabric/common/ledger/blkstorage/fsblkstorage.(*blockfileMgr).addBlock
[...]
/opt/go/src/runtime/asm_amd64.s:1333
panic: Cannot commit block to the ledger due to unexpected Previous block hash. Expected PreviousHash = [c87a4b77e4c790f78b0c2e3c97d97de9907a09daf5dc2f039c7e3b3e1440f5d1], PreviousHash referred in the latest block= [953e31164a84d6d1b9b446130d1e7d5af8ede818284e8fa7c315b2125b519e38]
github.com/hyperledger/fabric/common/ledger/blkstorage/fsblkstorage.(*blockfileMgr).addBlock
[...]
我在 Hyperledger Fabric JIRA 上就这种情况提出了一个问题,我收到了我需要清除环境以确保没有先前试验的工件的信息。 Issue FABB-147 at Hyperledger Fabric(我的日志在那里)。
我在peers get crash after anchor peer update 看到了一个与我很接近但存在差异的问题
现在我必须证明我的 Hyperledger Fabric 环境是清晰的。但是怎么做呢?
是否有任何记录在案的程序或清单来验证 Hyperledger Fabric 中是否没有来自先前试验的工件?
如果我抑制 orderer.yaml 和 docker-compose.yaml 的 ORDERER_GENERAL_GENESISFILE 和 ORDERER_GENERAL_GENESISPROFILE 设置,orderer 元素是否会正常启动,然后网络会理解它应该在创建新通道时使用 genesis.block 通知?
提前感谢您的帮助。
【问题讨论】:
你是如何运行所有节点的?码头工人?二进制文件? Hyperledger Fabric 1.4.3 在我的私人计算机上的 Ubuntu 操作系统上运行在 Docker 上。区块链网络有 1 个 Orderer 和 1 个 Anchor Peer (+ CouchDB),具有特定配置。我没有使用织物样品中的 BYFN。 【参考方案1】:-
运行此命令
docker system prune
启动您的网络
再次
希望这能帮助你,因为它帮助了我
【讨论】:
【参考方案2】:虽然不是清洁环境的解决方案,但这里有一个可能解决您潜在问题的方法。
peer channel create
命令将在其当前工作目录中生成一个$CHANNELNAME.block
文件。这是您在运行peer channel join
时需要使用的块,不是创世块。
$> peer channel create ... -c $CHANNELNAME
$> peer channel join ... -b $CONFIGTXFOLDER/devgenesis.block
会导致你的同伴大部分时间崩溃,并且在从新的创世区块重新创建分类帐后很少工作,这会毁掉你的一天。试试这个:
$> peer channel create ... -c $CHANNELNAME
$> peer channel join ... -b $CHANNELNAME.block
【讨论】:
【参考方案3】:我使用来自系统结构网络的创世块,加载到 Ordener(来自 orderer.yaml
或 docker-compose.yaml
),加入频道,这是错误的。
我的错误来源是我使用系统创世块而不是使用peer channel create
命令中生成的创世块。
我了解到peer channel create
命令使用交易块模型 (.tx) 作为输入,并作为输出生成一个创世块 (.block),该创世块必须用作peer channel join
命令的输入。
正确的顺序是:
第 1 步)$> peer channel create -o $ORDERERNAME -c $CHANNELNAME -f $CONFIGTXFOLDER/devchanneltrack.tx --outputBlock $CHANNELFOLDER/devchannelgen.block --tls --cafile=$ORDERER_TLSCACERT
第 2 步)$> peer channel join -o $ORDERERNAME -b $CHANNELFOLDER/devchannelgen.block --tls --cafile=$ORDERER_TLSCACERT
我对脚本进行了更正,现在我可以加入频道了。然后我在频道上安装和实例化了新的链码,它们运行良好。
【讨论】:
以上是关于Hyperledger Fabric - 如何在每次区块链网络测试后清除 DEV 环境?的主要内容,如果未能解决你的问题,请参考以下文章
如何编写一个企业级Hyperledger Fabric开源框架
Hyperledger Fabric - 如何在每次区块链网络测试后清除 DEV 环境?
区块是不是在 HyperLedger Fabric 中开采?
如何使用Hyperledger Fabric和Composer构建区块链网络(上)