2017-08-25 45 views
0

根据我从我的previous post获得的与本地运行进行通信的建议,我完成了以下操作Hyperledger Fabric V1.0网络来自java应用程序。但是我得到了下面给出的例外情况,无法理清它为什么会发生。在Hyperledher Fabric V1.0的本地开发环境中使用结构客户端java sdk时出现问题(因为没有Rest API支持)

public class Test { 

    final HFClient client = HFClient.createNewInstance(); 
    Channel channel; 
    TransactionProposalRequest proposalRequest; 

    void setupCryptoMaterialsForClient() throws CryptoException, InvalidArgumentException{ 
     // Set default crypto suite for HF client 

     client.setCryptoSuite(CryptoSuite.Factory.getCryptoSuite()); 

     client.setUserContext(new User() { 

      public String getName() { 
       return "PeerAdmin"; 
      } 

      public Set<String> getRoles() { 
       return null; 
      } 

      public String getAccount() { 
       return null; 
      } 

      public String getAffiliation() { 
       return null; 
      } 

      public Enrollment getEnrollment() { 
       return new Enrollment() { 
        public PrivateKey getKey() { 
         PrivateKey privateKey = null; 
         try { 
          File privateKeyFile = findFileSk("C:/Users/Public/HyperledgerFabricV1/fabric-samples/first-network/crypto-config/peerOrganizations/org1.example.com/users/[email protected]/msp/keystore"); 
          privateKey = getPrivateKeyFromBytes(IOUtils.toByteArray(new FileInputStream(privateKeyFile))); 
         } catch (InvalidKeySpecException e) { 
          e.printStackTrace(); 
         } catch (IOException e) { 
          e.printStackTrace(); 
         } catch (NoSuchProviderException e) { 
          e.printStackTrace(); 
         } catch (NoSuchAlgorithmException e) { 
          e.printStackTrace(); 
         } 
         return privateKey; 
        } 

        public String getCert() { 

         String certificate = null; 
         try { 
          File certificateFile = new File("C:/Users/Public/HyperledgerFabricV1/fabric-samples/first-network/crypto-config/peerOrganizations/org1.example.com/users/[email protected]/msp/signcerts/[email protected]"); 
          certificate = new String(IOUtils.toByteArray(new FileInputStream(certificateFile)), "UTF-8"); 
         } catch (UnsupportedEncodingException e) { 
          e.printStackTrace(); 
         } catch (FileNotFoundException e) { 
          e.printStackTrace(); 
         } catch (IOException e) { 
          e.printStackTrace(); 
         } 
         return certificate; 
        } 
       }; 
      } 

      public String getMspId() { 
       return "Org1MSP"; 
      } 
     }); 
    } 

    static File findFileSk(String directorys) { 

     File directory = new File(directorys); 

     File[] matches = directory.listFiles((dir, name) -> name.endsWith("_sk")); 

     if (null == matches) { 
      throw new RuntimeException(format("Matches returned null does %s directory exist?", directory.getAbsoluteFile().getName())); 
     } 

     if (matches.length != 1) { 
      throw new RuntimeException(format("Expected in %s only 1 sk file but found %d", directory.getAbsoluteFile().getName(), matches.length)); 
     } 

     return matches[0]; 
    } 

    static PrivateKey getPrivateKeyFromBytes(byte[] data) throws IOException, NoSuchProviderException, NoSuchAlgorithmException, InvalidKeySpecException { 
     final Reader pemReader = new StringReader(new String(data)); 

     final PrivateKeyInfo pemPair; 
     try (PEMParser pemParser = new PEMParser(pemReader)) { 
      pemPair = (PrivateKeyInfo) pemParser.readObject(); 
     } 

     PrivateKey privateKey = new JcaPEMKeyConverter().setProvider(BouncyCastleProvider.PROVIDER_NAME).getPrivateKey(pemPair); 

     return privateKey; 
    } 


void createChannel() throws InvalidArgumentException, TransactionException{ 
    channel = client.newChannel("mychannel"); 
    Properties ordererProperties = new Properties(); 
    ordererProperties.setProperty("pemFile", "C:/Users/Public/HyperledgerFabricV1/fabric-samples/first-network/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls/server.crt"); 
    ordererProperties.setProperty("trustServerCertificate", "true"); //testing environment only NOT FOR PRODUCTION! 
    ordererProperties.setProperty("hostnameOverride", "orderer.example.com"); 
    ordererProperties.setProperty("sslProvider", "openSSL"); 
    ordererProperties.setProperty("negotiationType", "TLS"); 
    ordererProperties.put("grpc.NettyChannelBuilderOption.keepAliveTime", new Object[] {5L, TimeUnit.MINUTES}); 
    ordererProperties.put("grpc.NettyChannelBuilderOption.keepAliveTimeout", new Object[] {8L, TimeUnit.SECONDS}); 
    channel.addOrderer(client.newOrderer("orderer.example.com", "grpc://192.168.99.100:7050",ordererProperties)); 

    Properties peerProperties = new Properties(); 
    peerProperties.setProperty("pemFile", "C:/Users/Public/HyperledgerFabricV1/fabric-samples/first-network/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/server.crt"); 
    peerProperties.setProperty("trustServerCertificate", "true"); //testing environment only NOT FOR PRODUCTION!  
    peerProperties.setProperty("hostnameOverride", "peer0.org1.example.com"); 
    peerProperties.setProperty("sslProvider", "openSSL"); 
    peerProperties.setProperty("negotiationType", "TLS"); 
    peerProperties.put("grpc.NettyChannelBuilderOption.maxInboundMessageSize", 9000000); 
    channel.addPeer(client.newPeer("peer0.org1.example.com", "grpc://192.168.99.100:7051",peerProperties)); 
    channel.initialize(); 
} 

    void creteTransactionalProposal(){ 
     proposalRequest = client.newTransactionProposalRequest(); 

     final ChaincodeID chaincodeID = ChaincodeID.newBuilder() 
       .setName("asset") 
       .setVersion("1.0") 
       .setPath("github.com/mygitId/myFabricRepo/assetChainCode") 
       .build(); 

     proposalRequest.setChaincodeID(chaincodeID); 
     proposalRequest.setFcn("createAsset"); 
     //proposalRequest.setFcn("init"); 
     proposalRequest.setProposalWaitTime(TimeUnit.SECONDS.toMillis(10)); 
     proposalRequest.setArgs(new String[]{"ORG1", "{\"assetKey\":\"a1\",\"assetName\":\"aname1\",\"assetType\":\"atype1\",\"slNo\":\"slno1\",\"orderDate\":\"19-05-2017\"}"}); 
    } 

    void sendProposal() throws ProposalException, InvalidArgumentException, InterruptedException, ExecutionException{ 
     final Collection<ProposalResponse> responses = channel.sendTransactionProposal(proposalRequest); 
     CompletableFuture<BlockEvent.TransactionEvent> txFuture = channel.sendTransaction(responses, client.getUserContext()); 
     BlockEvent.TransactionEvent event = txFuture.get(); 
     System.out.println(event.toString()); 
    } 

    public static void main(String args[]) throws Exception { 
     Test t = new Test(); 
     t.setupCryptoMaterialsForClient(); 
     t.createChannel(); 
     t.creteTransactionalProposal(); 
     t.sendProposal(); 
    } 
} 

这是我docker ps enter image description here

,并通过运行在Eclipse的Java项目中的代码收到以下异常。

Exception in thread "main" org.hyperledger.fabric.sdk.exception.TransactionException: INTERNAL 
    at org.hyperledger.fabric.sdk.OrdererClient.sendDeliver(OrdererClient.java:286) 
    at org.hyperledger.fabric.sdk.Orderer.sendDeliver(Orderer.java:165) 
    at org.hyperledger.fabric.sdk.Channel.getLatestBlock(Channel.java:1074) 
    at org.hyperledger.fabric.sdk.Channel.getConfigurationBlock(Channel.java:898) 
    at org.hyperledger.fabric.sdk.Channel.parseConfigBlock(Channel.java:826) 
    at org.hyperledger.fabric.sdk.Channel.initialize(Channel.java:526) 
    at com.ibs.blockchain.client.test.Test.createChannel(Test.java:151) 
    at com.ibs.blockchain.client.test.Test.main(Test.java:179) 
Caused by: io.grpc.StatusRuntimeException: INTERNAL 
    at io.grpc.Status.asRuntimeException(Status.java:540) 
    at io.grpc.stub.ClientCalls$StreamObserverToCallListenerAdapter.onClose(ClientCalls.java:392) 
    at io.grpc.internal.ClientCallImpl.closeObserver(ClientCallImpl.java:426) 
    at io.grpc.internal.ClientCallImpl.access$100(ClientCallImpl.java:76) 
    at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl.close(ClientCallImpl.java:512) 
    at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl.access$700(ClientCallImpl.java:429) 
    at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl$1StreamClosed.runInContext(ClientCallImpl.java:544) 
    at io.grpc.internal.ContextRunnable.run(ContextRunnable.java:52) 
    at io.grpc.internal.SerializingExecutor.run(SerializingExecutor.java:117) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: io.netty.handler.codec.http2.Http2Exception: First received frame was not SETTINGS. Hex dump for first 5 bytes: 1503010002 
    at io.netty.handler.codec.http2.Http2Exception.connectionError(Http2Exception.java:85) 
    at io.netty.handler.codec.http2.Http2ConnectionHandler$PrefaceDecoder.verifyFirstFrameIsSettings(Http2ConnectionHandler.java:309) 
    at io.netty.handler.codec.http2.Http2ConnectionHandler$PrefaceDecoder.decode(Http2ConnectionHandler.java:217) 
    at io.netty.handler.codec.http2.Http2ConnectionHandler.decode(Http2ConnectionHandler.java:401) 
    at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:411) 
    at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:248) 
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:363) 
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:349) 
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:341) 
    at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1334) 
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:363) 
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:349) 
    at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:926) 
    at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:129) 
    at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:642) 
    at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:565) 
    at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:479) 
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:441) 
    at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:858) 
    at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:144) 
    ... 1 more 

有人请查看代码帮助我找到我在做错的地方。

给出的IP 192.168.99.100是虚拟机的ip

注: 我使用Windows 7的Docker Toolbox由以下步骤Building Your First Network并通过Eclipse中运行我的Java应用程序。

更新:
通过参照fabric-sdk-java源添加TLS按照@Gari辛格回答更新功能createChannel。但现在也是同样的错误。 更新:
运行Java客户端后,该码头工人快速启动终端控制台,似乎没有日志来 enter image description here

+0

您可以发送订单中的日志吗?你有没有登录Peer?你能展示他们全部吗? – Urko

+0

连接码头终端,但在那里显示没有日志 – Girish007

回答

1

你是如何创建加密材料的?我没有询问您使用的工具,我的问题更多地与您为证书定义的通用名称有关。证书的CN必须与要连接的主机相同。

如果我是你,我会用cryptogen工具创建加密材料。然后,我会更改该通话的网址。我知道您处于本地主机,因此您可以尝试呼叫orderer.example.com,而不是192.168.99.100。

另一方面,我认为你不必执行createchannel,因为你之前已经创建了它。

2

如果使用第一网络样本,它已启用TLS并在代码中你上面没有使用TLS。所以我最好的猜测是这个错误是由于你的客户端没有使用TLS导致的。

+0

感谢您的回应,那么我现在可以做些什么来使它工作?由于我对此没有更深入的了解,你能不能给我更多的提示。除了这部分以外的所有东西都可以正常工作:(如果它正在工作,我可以继续我的工作 – Girish007

+0

因此,您使用的是第一个网络示例? –

+0

是的,我正在使用第一个网络并使用'./ byfn.sh -m up' – Girish007