node.js - 无法使用启用了 TLS 的 NodeJS SDK 连接到 Hyperledger Fabric

标签 node.js hyperledger-fabric hyperledger

我已经在 fabric-samples 中启动了第一个网络示例。默认情况下启用 TLS。

我想做的是使用提供的 NodeJS SDK 连接到 peer1/org1 并执行一些智能合约查询。以下是我的js脚本,大部分是从fabcar示例中复制的。我已经在peer1/org1上安装并实例化了链码。

'use strict';

var hfc = require('fabric-client');
var path = require('path');

var options = {
    wallet_path: path.join(__dirname, './creds'),
    user_id: 'PeerAdmin',
    channel_id: 'mychannel',
    chaincode_id: 'prov',
    network_url: 'grpc://localhost:8051',
};

var channel = {};
var client = null;

Promise.resolve().then(() => {
    console.log("Create a client and set the wallet location");
    client = new hfc();
    return hfc.newDefaultKeyValueStore({ path: options.wallet_path });
}).then((wallet) => {
    console.log("Set wallet path, and associate user ", options.user_id, " with application");
    client.setStateStore(wallet);
    return client.getUserContext(options.user_id, true);
}).then((user) => {
    console.log("Check user is enrolled, and set a query URL in the network");
    if (user === undefined || user.isEnrolled() === false) {
        console.error("User not defined, or not enrolled - error");
    }
    channel = client.newChannel(options.channel_id);
    channel.addPeer(client.newPeer(options.network_url));
    return;
}).then(() => {
    console.log("Make query");
    var transaction_id = client.newTransactionID();
    console.log("Assigning transaction_id: ", transaction_id._transaction_id);

    // queryCar - requires 1 argument, ex: args: ['CAR4'],
    // queryAllCars - requires no arguments , ex: args: [''],
    const request = {
        chaincodeId: options.chaincode_id,
        txId: transaction_id,
        fcn: 'lastWrtTxn',
        args: ['a']
    };
    return channel.queryByChaincode(request);
}).then((query_responses) => {
    console.log("returned from provenance query");
    if (!query_responses.length) {
        console.log("No payloads were returned from query");
    } else {
        console.log("Query result count = ", query_responses.length)
    }
    if (query_responses[0] instanceof Error) {
        console.error("error from query = ", query_responses[0]);
    }
    console.log("Response is ", query_responses[0].toString());
}).catch((err) => {
    console.error("Caught Error", err);
});

不幸的是,我收到以下错误:

ruanpingcheng@ruanpingcheng-OptiPlex-990:~/Desktop/fabric-samples/first-network/prov_js$ node provenance_query.js  Create a client and set the wallet location Set wallet path, and associate user  PeerAdmin  with application Check user is enrolled, and set a query URL in the network Make query Assigning transaction_id:  542a40479598fa78ac9cf478b57629dc55b09c82651953146bcf6eb6eb81e800 error: [client-utils.js]: sendPeersProposal - Promise is rejected: Error: Endpoint read failed
    at /home/ruanpingcheng/Desktop/fabric-samples/first-network/prov_js/node_modules/grpc/src/node/src/client.js:554:15 returned from provenance query Query result count =  1 error from query =  { Error: Endpoint read failed
    at /home/ruanpingcheng/Desktop/fabric-samples/first-network/prov_js/node_modules/grpc/src/node/src/client.js:554:15 code: 14, metadata: Metadata { _internal_repr: {} } } Response is  Error: Endpoint read failed

我认为这与 TLS 通信问题有关。但我还没有找到使用 SDK 并连接启用了 TLS 的对等点的示例。 Fabcar fabric-samples禁用其 TLS 选项。任何人都可以帮助如何设置 TLS 身份和连接? BTW,钱包路径有什么用?选项中的user_id是什么?非常感谢!!

最佳答案

@user1584887 启用 TLS 后,您需要使用 grpcs,因此您的 network_url 应为 'grpcs://localhost:8051'。您还需要通过 tls 证书。

您的addPeer api 应如下所示

let grpcOpts = { pem: Buffer.from(<<< readTLS cert here >>>).toString(), 'ssl-target-name-override': << server-hostname override here>> }; channel.addPeer(client.newPeer(options.network_url, grpcOpts));

fabcar 应用程序是在禁用 tls 的情况下编写的。 请引用balance-transfer样本。示例中启用了 TLS。

关于node.js - 无法使用启用了 TLS 的 NodeJS SDK 连接到 Hyperledger Fabric,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46296376/

相关文章:

node.js - 使用 Mongoose 的动态子文档

javascript - 准备部署express js应用程序,我应该担心哪些安全问题?

hyperledger-fabric - 将新节点加入 channel 时出现管理员身份错误

hyperledger-fabric - Hyperledger Fabric 1.0 中的读集和写集是什么?

node.js - Passport.js 总是执行 "failureRedirect"

javascript - 如何构造一个 javascript 类以同时使用多个子方法?

hyperledger-fabric - Hyperledger Explorer 配置错误

hyperledger-fabric - Hyperledger Fabric 和 Hyperledger Iroha 的区别?

hyperledger - 如何使用 Hyperledger 锯齿波部署合约

hyperledger-fabric - 为什么 hyperledger-fabric 需要不止一个 orderer?