Как решить ошибку «создания цепочки кода» в Fabric-SDK-Java? - PullRequest
0 голосов
/ 25 апреля 2019

Я использую fabrc-sdk-java для управления сетью e2e_cli. E2e использует CA, и TLS отключен.

Я успешно создал канал и установил код цепи.

создать канал:

Channel newChannel = client.newChannel(myChannel.getChannelName(), orderer, channelConfiguration, channelConfigurationSignatures.toArray(new byte[myPeerOrgs.size()][]));

channelConfigurationSignatures содержит подписи двух организаций.

установить код цепи:

Каждая организация должна отправить предложение об установке один раз, используя собственную организацию peerAdmin.

справка: https://github.com/IBM/blockchain-application-using-fabric-java-sdk

Но, когда я готовлюсь к созданию цепного кода, я получаю сообщение об ошибке:

0endorser failed with Sending proposal to peer0.org1.example.com failed because of: gRPC failure=Status{code=UNKNOWN, description=Failed to deserialize creator identity, err MSP Org1 is unknown, cause=null}. Was verified:false

Это связанные коды:

 client.setUserContext(myPeerOrgs.get(0).getPeerAdmin());

        InstantiateProposalRequest instantiateProposalRequest = client.newInstantiationProposalRequest();
    instantiateProposalRequest.setProposalWaitTime(fabricConfig.getProposalWaitTime());
        instantiateProposalRequest.setChaincodeID(chaincodeID);

        instantiateProposalRequest.setFcn(ininFun);
        instantiateProposalRequest.setArgs(args);

        Map<String, byte[]> tm = new HashMap<>();
        tm.put("HyperLedgerFabric", "InstantiateProposalRequest:JavaSDK".getBytes(UTF_8));
        tm.put("method", "InstantiateProposalRequest".getBytes(UTF_8));
        instantiateProposalRequest.setTransientMap(tm);

        ChaincodeEndorsementPolicy chaincodeEndorsementPolicy = new ChaincodeEndorsementPolicy();
        chaincodeEndorsementPolicy.fromYamlFile(new File(myChaincode.getChaincodeEndorsementPolicyPath()));
        instantiateProposalRequest.setChaincodeEndorsementPolicy(chaincodeEndorsementPolicy);

        logger.trace("Sending instantiateProposalRequest to all peers with arguments: " + Arrays.toString(args));

        Collection<ProposalResponse> successful = new LinkedList<>();
        Collection<ProposalResponse> failed = new LinkedList<>();

        Collection<ProposalResponse> responses = channel.sendInstantiationProposal(instantiateProposalRequest);

        for (ProposalResponse response : responses) {
            if (response.isVerified() && response.getStatus() == ProposalResponse.Status.SUCCESS) {
                successful.add(response);
                logger.trace(String.format("Succesful instantiate proposal response Txid: %s from peer %s", response.getTransactionID(), response.getPeer().getName()));
            } else {
                failed.add(response);
            }
        }
        logger.trace(String.format("Received %d instantiate proposal responses. Successful+verified: %d . Failed: %d", responses.size(), successful.size(), failed.size()));
        if (failed.size() > 0) {
            ProposalResponse first = failed.iterator().next();
            logger.error("Not enough endorsers for instantiate :" + successful.size() + "endorser failed with " + first.getMessage() + ". Was verified:" + first.isVerified());
            System.exit(1);
        }

Я думал, что это проблема с сериализацией, но класс MyUser и класс MyEnrollement наследуют интерфейс Serializable и оба определяют serialVersionUID.

Я сравнил blockchain-application-using-fabric-java-sdk и не выявил проблему.

1 Ответ

0 голосов
/ 28 апреля 2019

Я наконец решил эту проблему. Проблема в следующем коде:

Channel newChannel = client.newChannel(myChannel.getChannelName(), orderer, channelConfiguration, channelConfigurationSignatures.toArray(new byte[myPeerOrgs.size()][]));

Приведенный выше код написан мной со ссылкой на End2endIT:

//Create channel that has only one signer that is this orgs peer admin. If channel creation policy needed more signature they would need to be added too.
Channel newChannel = client.newChannel(name, anOrderer, channelConfiguration, client.getChannelConfigurationSignature(channelConfiguration, sampleOrg.getPeerAdmin()));

Я не знаю, если это неправильно с моим использованием. Но мой код, ошибка в этом предложении, при присоединении к узлу позже, ошибка сообщается.

Я сослался на https://github.com/IBM/blockchain-application-using-fabric-java-sdk/blob/master/java/src/main/java/org/app/network/CreateChannel.java и нашел правильный способ написания.

public Channel createChannel() {

        logger.info("Begin  create channel: " + myChannel.getChannelName());

        ChannelConfiguration channelConfiguration = new ChannelConfiguration(new File(fabricConfig.getChannelArtifactsPath() + "/" + myChannel.getChannelName() + ".tx"));
        logger.trace("Read channel " + myChannel.getChannelName() + " configuration file:" + fabricConfig.getChannelArtifactsPath() + "/" + myChannel.getChannelName() + ".tx");
        byte[] channelConfigurationSignatures = client.getChannelConfigurationSignature(channelConfiguration, myPeerOrgs.get(0).getPeerAdmin());

        Channel newChannel = client.newChannel(myChannel.getChannelName(), orderer, channelConfiguration, channelConfigurationSignatures);;

        for (Peer peer : myPeerOrgs.get(0).getPeers()) {
            // create a channel for the first time, only `joinPeer` here, not `addPeer`
            newChannel.joinPeer(peer);
        }
        for (EventHub eventHub : myPeerOrgs.get(0).getEventHubs()) {
            newChannel.addEventHub(eventHub);
        }

        if (!newChannel.isInitialized()) {
            newChannel.initialize();
        }

        // I have only tested two organizations
        // I don’t know if there are any errors in the three organizations.
        for (int i = 1; i < myPeerOrgs.size(); i++) {
            client.setUserContext(myPeerOrgs.get(i).getPeerAdmin());
            newChannel = client.getChannel(myChannel.getChannelName());
            for (Peer peer : myPeerOrgs.get(i).getPeers()) {
                newChannel.joinPeer(peer);
            }
            for (EventHub eventHub : myPeerOrgs.get(i).getEventHubs()) {
                newChannel.addEventHub(eventHub);
            }
        }

        logger.trace("Node that has joined the channel:");
        Collection<Peer> peers = newChannel.getPeers();
        for (Peer peer : peers) {
            logger.trace(peer.getName() + " at " + peer.getUrl());
        }

        logger.info("Success, end create channel: " + myChannel.getChannelName() + "\n");

        return newChannel;
    }

Связанный код позже, такой как установка и инициализация цепного кода, также см. https://github.com/IBM/blockchain-application-using-fabric-java-sdk. Это отличный пример.

Если кто-нибудь знает, как использовать четвертый переменный параметр newChannel, пожалуйста, дайте мне знать. Благодаря.

Наконец, я не знаю, как динамически объединять узлы, организации и каналы, я ищу и тестирую, в сети есть только примеры nodejs, нет java, если кто-то знает, скажите, пожалуйста, Мне очень нужно. Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...