使用Hyperledger fabric 的坑

在使用测试网络部署的时候,使用了以下步骤

1、启动测试网络,并创建channel

./network.sh up createChannel -c mychannel -ca

2、部署链码chaincode

./network.sh deployCC -ccl java

3、使用官方自带的java 示例程序尝试访问账本

在asset-transfer-basic/application-java目录 下

使用gradle run

可以得到正确的结果:对账本的一系列操作

在第一次启动并使用示例程序访问账本的时候,一切正常。

 

但是,,,当使用./network.sh down 关闭区块链网络之后,,再次按照上述1,2,3的步骤,

就会报错,报错如下:

> Task :run
An identity for the admin user "admin" already exists in the wallet
An identity for the user "appUser" already exists in the wallet
Channel Channel{id: 1, name: mychannel} Sending proposal with transaction: b84847ac413ec8388fa890988436489155382719ac32f47b844b7300755bae0d to Peer{ id: 2, name: peer0.org1.example.com, channelName: mychannel, url: grpcs://localhost:7051, mspid: Org1MSP} failed because of: gRPC failure=Status{code=UNKNOWN, description=error validating proposal: access denied: channel [mychannel] creator org [Org1MSP], cause=null}
java.lang.Exception: io.grpc.StatusRuntimeException: UNKNOWN: error validating proposal: access denied: channel [mychannel] creator org [Org1MSP]
        at org.hyperledger.fabric.sdk.Channel.sendProposalToPeers(Channel.java:4965)
        at org.hyperledger.fabric.sdk.Channel.sendProposalToPeers(Channel.java:4868)
        at org.hyperledger.fabric.sdk.Channel.getConfigBlock(Channel.java:941)
        at org.hyperledger.fabric.sdk.Channel.getConfigBlock(Channel.java:907)
        at org.hyperledger.fabric.sdk.Channel.parseConfigBlock(Channel.java:1994)
        at org.hyperledger.fabric.sdk.Channel.loadCACertificates(Channel.java:1831)
        at org.hyperledger.fabric.sdk.Channel.initialize(Channel.java:1222)
        at org.hyperledger.fabric.gateway.impl.NetworkImpl.initializeChannel(NetworkImpl.java:59)
        at org.hyperledger.fabric.gateway.impl.NetworkImpl.<init>(NetworkImpl.java:50)
        at org.hyperledger.fabric.gateway.impl.GatewayImpl.getNetwork(GatewayImpl.java:252)
        at application.java.App.main(App.java:53)
Caused by: io.grpc.StatusRuntimeException: UNKNOWN: error validating proposal: access denied: channel [mychannel] creator org [Org1MSP]
        at io.grpc.Status.asRuntimeException(Status.java:533)
        at io.grpc.stub.ClientCalls$UnaryStreamToFuture.onClose(ClientCalls.java:490)
        at io.grpc.PartialForwardingClientCallListener.onClose(PartialForwardingClientCallListener.java:39)
        at io.grpc.ForwardingClientCallListener.onClose(ForwardingClientCallListener.java:23)
        at io.grpc.ForwardingClientCallListener$SimpleForwardingClientCallListener.onClose(ForwardingClientCallListener.java:40)
        at io.grpc.internal.CensusStatsModule$StatsClientInterceptor$1$1.onClose(CensusStatsModule.java:700)
        at io.grpc.PartialForwardingClientCallListener.onClose(PartialForwardingClientCallListener.java:39)
        at io.grpc.ForwardingClientCallListener.onClose(ForwardingClientCallListener.java:23)
        at io.grpc.ForwardingClientCallListener$SimpleForwardingClientCallListener.onClose(ForwardingClientCallListener.java:40)
        at io.grpc.internal.CensusTracingModule$TracingClientInterceptor$1$1.onClose(CensusTracingModule.java:399)
        at io.grpc.internal.ClientCallImpl.closeObserver(ClientCallImpl.java:510)
        at io.grpc.internal.ClientCallImpl.access$300(ClientCallImpl.java:66)
        at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl.close(ClientCallImpl.java:630)
        at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl.access$700(ClientCallImpl.java:518)
        at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl$1StreamClosed.runInternal(ClientCallImpl.java:692)
        at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl$1StreamClosed.runInContext(ClientCallImpl.java:681)
        at io.grpc.internal.ContextRunnable.run(ContextRunnable.java:37)
        at io.grpc.internal.SerializingExecutor.run(SerializingExecutor.java:123)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)
getConfigBlock for channel mychannel failed with peer peer0.org1.example.com.  Status FAILURE, details: Channel Channel{id: 1, name: mychannel} Sending proposal with transaction: b84847ac413ec8388fa890988436489155382719ac32f47b844b7300755bae0d to Peer{ id: 2, name: peer0.org1.example.com, channelName: mychannel, url: grpcs://localhost:7051, mspid: Org1MSP} failed because of: gRPC failure=Status{code=UNKNOWN, description=error validating proposal: access denied: channel [mychannel] creator org [Org1MSP], cause=null}
org.hyperledger.fabric.sdk.exception.ProposalException: getConfigBlock for channel mychannel failed with peer peer0.org1.example.com.  Status FAILURE, details: Channel Channel{id: 1, name: mychannel} Sending proposal with transaction: b84847ac413ec8388fa890988436489155382719ac32f47b844b7300755bae0d to Peer{ id: 2, name: peer0.org1.example.com, channelName: mychannel, url: grpcs://localhost:7051, mspid: Org1MSP} failed because of: gRPC failure=Status{code=UNKNOWN, description=error validating proposal: access denied: channel [mychannel] creator org [Org1MSP], cause=null}
        at org.hyperledger.fabric.sdk.Channel.getConfigBlock(Channel.java:952)
        at org.hyperledger.fabric.sdk.Channel.getConfigBlock(Channel.java:907)
        at org.hyperledger.fabric.sdk.Channel.parseConfigBlock(Channel.java:1994)
        at org.hyperledger.fabric.sdk.Channel.loadCACertificates(Channel.java:1831)
        at org.hyperledger.fabric.sdk.Channel.initialize(Channel.java:1222)
        at org.hyperledger.fabric.gateway.impl.NetworkImpl.initializeChannel(NetworkImpl.java:59)
        at org.hyperledger.fabric.gateway.impl.NetworkImpl.<init>(NetworkImpl.java:50)
        at org.hyperledger.fabric.gateway.impl.GatewayImpl.getNetwork(GatewayImpl.java:252)
        at application.java.App.main(App.java:53)
Submit Transaction: InitLedger creates the initial set of assets on the ledger.
Error access denied
org.hyperledger.fabric.gateway.GatewayRuntimeException: org.hyperledger.fabric.sdk.exception.ServiceDiscoveryException: Failed to find any endorsers for chaincode basic. See logs for details

 

 

直接说解决方案:

在asset-transfer-basic/application-java目录下,把程序生成的wallet文件夹删除掉即可。

 

原因:

application-java示例程序里使用了基于文件的“钱包”,也就是在文件系统中新建了一些文件来存放关于账本的信息,

这些信息中必要有一些关于证书公钥的信息,但是这些文件并不会被自动删除。当使用network.sh down命令删除区块链网络后,下次启动区块链网络的时候,,会重新生成证书的公私钥,,,就和之前的本地”钱包“中的公钥不一样了,,于是,就报这些错误了。。

 

以上,,仅仅是官方示例中才会出现的问题,,当然,正常情况想区块链网络也不会频繁重启,但是上述的情况在进行开发的时候,还是很容易引起各种问题的。


版权声明:本文为qq_30078365原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。