Hyperledger fabric 使用基于java sdk的客户端连接到HyperLedger的Order节点时超时

Hyperledger fabric 使用基于java sdk的客户端连接到HyperLedger的Order节点时超时,hyperledger-fabric,hyperledger,Hyperledger Fabric,Hyperledger,我试图使用Java客户机(利用JavaSDK集成)调用Hyperledger fabcar的现有示例。我已经在我的一个AWS实例上安装了fabric,并且正在按原样运行一切。但是,当我执行程序时,它到达Channel.initialize()时,会引发以下异常 2017年9月12日上午8:57:08 org.hyperledger.fabric.sdk.Channel getConfigurationBlock严重:通道mychannel sendDeliver时间 orderer.exampl

我试图使用Java客户机(利用JavaSDK集成)调用Hyperledger fabcar的现有示例。我已经在我的一个AWS实例上安装了fabric,并且正在按原样运行一切。但是,当我执行程序时,它到达
Channel.initialize()
时,会引发以下异常

2017年9月12日上午8:57:08 org.hyperledger.fabric.sdk.Channel getConfigurationBlock严重:通道mychannel sendDeliver时间 orderer.example.com超过,在3000时超时 org.hyperledger.fabric.sdk.exception.TransactionException:频道 orderer.example.com已超过mychannel sendDeliver时间, 在3000时超时 位于org.hyperledger.fabric.sdk.orderClient.sendDeliver(orderClient.java:282) 位于org.hyperledger.fabric.sdk.order.sendDeliver(order.java:172) 位于org.hyperledger.fabric.sdk.Channel.seekBlock(Channel.java:1220) 位于org.hyperledger.fabric.sdk.Channel.getLatestBlock(Channel.java:1296) 位于org.hyperledger.fabric.sdk.Channel.getLastConfigIndex(Channel.java:1119) 位于org.hyperledger.fabric.sdk.Channel.getConfigurationBlock(Channel.java:1046) 位于org.hyperledger.fabric.sdk.Channel.parseConfigBlock(Channel.java:967) 位于org.hyperledger.fabric.sdk.Channel.initialize(Channel.java:694) 位于Client.main(Client.java:73)

2017年9月12日上午8:57:08 org.hyperledger.fabric.sdk.Channel parseConfigBlock严重:超过通道mychannel sendDeliver时间 对于orderer.example.com,在3000时超时 org.hyperledger.fabric.sdk.exception.TransactionException:频道 orderer.example.com已超过mychannel sendDeliver时间, 在3000时超时 位于org.hyperledger.fabric.sdk.orderClient.sendDeliver(orderClient.java:282) 位于org.hyperledger.fabric.sdk.order.sendDeliver(order.java:172) 位于org.hyperledger.fabric.sdk.Channel.seekBlock(Channel.java:1220) 位于org.hyperledger.fabric.sdk.Channel.getLatestBlock(Channel.java:1296) 位于org.hyperledger.fabric.sdk.Channel.getLastConfigIndex(Channel.java:1119) 位于org.hyperledger.fabric.sdk.Channel.getConfigurationBlock(Channel.java:1046) 位于org.hyperledger.fabric.sdk.Channel.parseConfigBlock(Channel.java:967) 位于org.hyperledger.fabric.sdk.Channel.initialize(Channel.java:694) 位于Client.main(Client.java:73)

2017年9月12日上午8:57:08 org.hyperledger.fabric.sdk.Channel初始化 严重:订购方超过通道mychannel sendDeliver时间 orderer.example.com,在3000时超时 org.hyperledger.fabric.sdk.exception.TransactionException:频道 orderer.example.com已超过mychannel sendDeliver时间, 在3000时超时 位于org.hyperledger.fabric.sdk.orderClient.sendDeliver(orderClient.java:282) 位于org.hyperledger.fabric.sdk.order.sendDeliver(order.java:172) 位于org.hyperledger.fabric.sdk.Channel.seekBlock(Channel.java:1220) 位于org.hyperledger.fabric.sdk.Channel.getLatestBlock(Channel.java:1296) 位于org.hyperledger.fabric.sdk.Channel.getLastConfigIndex(Channel.java:1119) 位于org.hyperledger.fabric.sdk.Channel.getConfigurationBlock(Channel.java:1046) 位于org.hyperledger.fabric.sdk.Channel.parseConfigBlock(Channel.java:967) 位于org.hyperledger.fabric.sdk.Channel.initialize(Channel.java:694) 位于Client.main(Client.java:73)

编辑1:同样的问题在Ubuntu 16.04上运行。在
channel.initialize()上我得到:

线程“main”中出现异常 org.hyperledger.fabric.sdk.exception.TransactionException:频道 已超出订购方的mychannel sendDeliver时间,在处超时 3000分 org.hyperledger.fabric.sdk.orderClient.sendDeliver(orderClient.java:282) 位于org.hyperledger.fabric.sdk.order.sendDeliver(order.java:172) 位于org.hyperledger.fabric.sdk.Channel.seekBlock(Channel.java:1198) 在 org.hyperledger.fabric.sdk.Channel.getLatestBlock(Channel.java:1274) 在 org.hyperledger.fabric.sdk.Channel.getLastConfigIndex(Channel.java:1097) 在 org.hyperledger.fabric.sdk.Channel.getConfigurationBlock(Channel.java:1028) 在 org.hyperledger.fabric.sdk.Channel.parseConfigBlock(Channel.java:949) 位于org.hyperledger.fabric.sdk.Channel.initialize(Channel.java:676) 位于com.test.test.Program.main(Program.java:65)

以下是示例代码:

package com.test.test;


import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.security.GeneralSecurityException;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.util.Collection;
import java.util.Date;
import java.util.HashSet;
import java.util.Random;
import java.util.Set;

import javax.xml.bind.DatatypeConverter;

import org.hyperledger.fabric.sdk.ChaincodeID;
import org.hyperledger.fabric.sdk.Channel;
import org.hyperledger.fabric.sdk.Enrollment;
import org.hyperledger.fabric.sdk.HFClient;
import org.hyperledger.fabric.sdk.ProposalResponse;
import org.hyperledger.fabric.sdk.QueryByChaincodeRequest;
import org.hyperledger.fabric.sdk.TransactionProposalRequest;
import org.hyperledger.fabric.sdk.User;
import org.hyperledger.fabric.sdk.security.CryptoSuite;

public class Program {

    private static HFClient client = null;

    public static void main(String[] args) throws Throwable {
        /*
         * wallet_path: path.join(__dirname, './creds'), user_id: 'PeerAdmin',
         * channel_id: 'mychannel', chaincode_id: 'fabcar', network_url:
         * 'grpc://192.168.99.100:7051', orderer: grpc://192.168.99.100:7050
         * 
         */

        // just new objects, without any payload inside
        client = HFClient.createNewInstance();
        CryptoSuite cs = CryptoSuite.Factory.getCryptoSuite();
        client.setCryptoSuite(cs);

        // We implement User interface below in code
        // folder c:\tmp\creds should contain PeerAdmin.cert (extracted from HF's fabcar
        // example's PeerAdmin json file)
        // and PeerAdmin.priv (copy from
        // cd96d5260ad4757551ed4a5a991e62130f8008a0bf996e4e4b84cd097a747fec-priv)
        User user = new SampleUser("/home/brankoterzic/Desktop/HyperledgerFabric/fabric-samples/fabric-samples/fabcar/creds", "PeerAdmin");
        // "Log in"
        client.setUserContext(user);

        // Instantiate channel
        Channel channel = client.newChannel("mychannel");
        channel.addPeer(client.newPeer("peer", "grpc://192.168.99.100:7051"));
        // It always wants orderer, otherwise even query does not work
        channel.addOrderer(client.newOrderer("orderer", "grpc://192.168.99.100:7050"));
        channel.initialize();

        // below is querying and setting new owner

        String newOwner = "New Owner #" + new Random(new Date().getTime()).nextInt(999);
        System.out.println("New owner is '" + newOwner + "'\n");

        queryFabcar(channel, "CAR1");
        updateCarOwner(channel, "CAR1", newOwner, false);

        System.out.println("after request for transaction without commit");
        queryFabcar(channel, "CAR1");
        updateCarOwner(channel, "CAR1", newOwner, true);

        System.out.println("after request for transaction WITH commit");
        queryFabcar(channel, "CAR1");

        System.out.println("Sleeping 5s");
        Thread.sleep(5000); // 5secs
        queryFabcar(channel, "CAR1");
        System.out.println("all done");
    }

    private static void queryFabcar(Channel channel, String key) throws Exception {
        QueryByChaincodeRequest req = client.newQueryProposalRequest();
        ChaincodeID cid = ChaincodeID.newBuilder().setName("fabcar").build();
        req.setChaincodeID(cid);
        req.setFcn("queryCar");
        req.setArgs(new String[] { key });
        System.out.println("Querying for " + key);
        Collection<ProposalResponse> resps = channel.queryByChaincode(req);
        for (ProposalResponse resp : resps) {
            String payload = new String(resp.getChaincodeActionResponsePayload());
            System.out.println("response: " + payload);
        }

    }

    private static void updateCarOwner(Channel channel, String key, String newOwner, Boolean doCommit)
            throws Exception {
        TransactionProposalRequest req = client.newTransactionProposalRequest();
        ChaincodeID cid = ChaincodeID.newBuilder().setName("fabcar").build();
        req.setChaincodeID(cid);
        req.setFcn("changeCarOwner");
        req.setArgs(new String[] { key, newOwner });
        System.out.println("Executing for " + key);
        Collection<ProposalResponse> resps = channel.sendTransactionProposal(req);
        if (doCommit) {
            channel.sendTransaction(resps);
        }
    }

}

/***
 * Implementation of user. main business logic (as for fabcar example) is in
 * getEnrollment - get user's private key and cert
 * 
 */
class SampleUser implements User {
    private final String certFolder;
    private final String userName;

    public SampleUser(String certFolder, String userName) {
        this.certFolder = certFolder;
        this.userName = userName;
    }

    @Override
    public String getName() {
        return userName;
    }

    @Override
    public Set<String> getRoles() {
        return new HashSet<String>();
    }

    @Override
    public String getAccount() {
        return "";
    }

    @Override
    public String getAffiliation() {
        return "";
    }

    @Override
    public Enrollment getEnrollment() {
        return new Enrollment() {

            @Override
            public PrivateKey getKey() {
                try {
                    return loadPrivateKey(Paths.get(certFolder, userName + ".priv"));
                } catch (Exception e) {
                    return null;
                }
            }

            @Override
            public String getCert() {
                try {
                    return new String(Files.readAllBytes(Paths.get(certFolder, userName + ".cert")));
                } catch (Exception e) {
                    return "";
                }
            }

        };
    }

    @Override
    public String getMspId() {
        return "Org1MSP";
    }
    /***
     * loading private key from .pem-formatted file, ECDSA algorithm
     * (from some example on StackOverflow, slightly changed)
     * @param fileName - file with the key
     * @return Private Key usable
     * @throws IOException
     * @throws GeneralSecurityException
     */
    public static PrivateKey loadPrivateKey(Path fileName) throws IOException, GeneralSecurityException {
        PrivateKey key = null;
        InputStream is = null;
        try {
            is = new FileInputStream(fileName.toString());
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            StringBuilder builder = new StringBuilder();
            boolean inKey = false;
            for (String line = br.readLine(); line != null; line = br.readLine()) {
                if (!inKey) {
                    if (line.startsWith("-----BEGIN ") && line.endsWith(" PRIVATE KEY-----")) {
                        inKey = true;
                    }
                    continue;
                } else {
                    if (line.startsWith("-----END ") && line.endsWith(" PRIVATE KEY-----")) {
                        inKey = false;
                        break;
                    }
                    builder.append(line);
                }
            }
            //
            byte[] encoded = DatatypeConverter.parseBase64Binary(builder.toString());
            PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(encoded);
            KeyFactory kf = KeyFactory.getInstance("ECDSA");
            key = kf.generatePrivate(keySpec);
        } finally {
            is.close();
        }
        return key;
    }
}
package com.test.test;
导入java.io.BufferedReader;
导入java.io.FileInputStream;
导入java.io.IOException;
导入java.io.InputStream;
导入java.io.InputStreamReader;
导入java.nio.file.Files;
导入java.nio.file.Path;
导入java.nio.file.path;
导入java.security.GeneralSecurityException;
导入java.security.KeyFactory;
导入java.security.PrivateKey;
导入java.security.spec.PKCS8EncodedKeySpec;
导入java.util.Collection;
导入java.util.Date;
导入java.util.HashSet;
导入java.util.Random;
导入java.util.Set;
导入javax.xml.bind.DatatypeConverter;
导入org.hyperledger.fabric.sdk.ChaincodeID;
导入org.hyperledger.fabric.sdk.Channel;
导入org.hyperledger.fabric.sdk.Enrollment;
导入org.hyperledger.fabric.sdk.HFClient;
导入org.hyperledger.fabric.sdk.ProposalResponse;
导入org.hyperledger.fabric.sdk.QueryByChaincodeRequest;
导入org.hyperledger.fabric.sdk.TransactionProposalRequest;
导入org.hyperledger.fabric.sdk.User;
导入org.hyperledger.fabric.sdk.security.CryptoSuite;
公共课程{
私有静态HFClient=null;
公共静态void main(字符串[]args)抛出可丢弃的{
/*
*钱包路径:path.join(uuuu dirname,'./creds'),用户id:'PeerAdmin',
*频道id:'mychannel',链码id:'fabcar',网络url:
* 'grpc://192.168.99.100:7051,订购方:grpc://192.168.99.100:7050
* 
*