Как настроить хранилище ключей для клиентского SDK Hyperledger Fabric? - PullRequest
0 голосов
/ 22 апреля 2019

Я пытаюсь вызвать chaincode из клиента node.js, но у меня возникла ошибка при вызове getUserContext() для FabricClient объекта экземпляра.

Я последовал примеру fabcar на https://github.com/hyperledger/fabric-samples,, который работаетв настройке нескольких узлов Docker для одного узла.

Затем я следовал учебнику по развертыванию нескольких узлов на https://www.skcript.com/svr/setting-up-a-multi-node-hyperledger-fabric-network-with-docker-swarm/

Но этот учебник из скрипта охватывал только вызов цепного кода из cli, не включая узел.Пример js.

Хранилище ключей, сгенерированное skcript, - это xxx-sk, которое отличается от хранилища ключей, сгенерированного fabcar (это xxx-priv и xxx-pub).Я попытался преобразовать формат вручную с помощью ssh-keygen, но все равно получаю ошибку при вызове getUserContext ().

Затем я попытался ввести свой цепной код и настройки сети в https://github.com/wearetheledger/hyperledger-typescript-boilerplate и https://github.com/hyperledger/fabric-samples fabcar javascript - пример низкого уровня.Оба не работают.Когда я запрашиваю функцию цепного кода, я получаю следующее сообщение об ошибке:

error from query =  { Error: 2 UNKNOWN: Stream removed
    at Object.exports.createStatusError (/home/ali1/testnet/sct/learn/fabric-samples/fabcar/javascript-low-level/node_modules/fabric-client/node_modules/grpc/src/common.js:91:15)
    at Object.onReceiveStatus (/home/ali1/testnet/sct/learn/fabric-samples/fabcar/javascript-low-level/node_modules/fabric-client/node_modules/grpc/src/client_interceptors.js:1204:28)
    at InterceptingListener._callNext (/home/ali1/testnet/sct/learn/fabric-samples/fabcar/javascript-low-level/node_modules/fabric-client/node_modules/grpc/src/client_interceptors.js:568:42)
    at InterceptingListener.onReceiveStatus (/home/ali1/testnet/sct/learn/fabric-samples/fabcar/javascript-low-level/node_modules/fabric-client/node_modules/grpc/src/client_interceptors.js:618:8)
    at callback (/home/ali1/testnet/sct/learn/fabric-samples/fabcar/javascript-low-level/node_modules/fabric-client/node_modules/grpc/src/client_interceptors.js:845:24)
  code: 2,
  metadata: Metadata { _internal_repr: {} },
  details: 'Stream removed' }

Ниже включен мой тестовый файл FYI.

основной тестовый файл:

import { fabric } from '../src/config/fabric';
import { ContractCall } from 'sct-domain';
import FabricClient = require('fabric-client');

function log(action) {
  console.log(action, '...');
}

log('new FabricClient()');
let fabricClient = new FabricClient();
log('newChannel()');
let channel = fabricClient.newChannel(fabric.channelName);

log('newPeer()');
let peer = fabricClient.newPeer(fabric.peerUrl);
log('addPeer()');
channel.addPeer(peer, fabric.mspid);

log('newOrderer()');
let orderer = fabricClient.newOrderer(fabric.ordererUrl);
log('addOrderer()');
channel.addOrderer(orderer);

log('newDefaultKeyValueStore()');
let ready = FabricClient.newDefaultKeyValueStore({ path: fabric.keystorePath })
  .then(store => {
    log('setStateStore()');
    // assign the store to the fabric client
    fabricClient.setStateStore(store);

    log('newCryptoSuite()');
    let cryptoSuite = FabricClient.newCryptoSuite();
    log('newCryptoKeyStore()');
    // use the same location for the state store (where the users' certificate are kept)
    // and the crypto store (where the users' keys are kept)
    let cryptoKeyStore = FabricClient.newCryptoKeyStore({ path: fabric.keystorePath });
    log('setCryptoKeyStore()');
    cryptoSuite.setCryptoKeyStore(cryptoKeyStore);
    log('setCryptoSuite()');
    fabricClient.setCryptoSuite(cryptoSuite);

    log('getUserContext()');
    // get the enrolled user from persistence, this user will sign all requests
    /* FIXME: got error here */
    return fabricClient.getUserContext('user1', true);
  });

// channel.queryInfo().then(blockchainInfo =>{
//   console.log(blockchainInfo)
// });

export async function queryFunction<C extends ContractCall>(call: C): Promise<C['Out']> {
  return channel.queryByChaincode({
    chaincodeId: 'sct',
    fcn: 'version',
    args: [],
  }).then(res => {
      console.log('res:', res);
      return res as any;
    },
  );
}

ready.then(client => {
  console.log('ready');
  console.log(client);
  return queryFunction(null);
});

файл конфигурации (../src/config/fabric.ts):

import * as path from 'path';

export namespace fabric {
  export let keystorePath = path.join(__dirname, '../../../sct-fabric/hlf-docker-swarm/network/crypto-config/peerOrganizations/org1.example.com/users/User1@org1.example.com/msp/keystore');
  keystorePath = 'hfc-key-store';
  keystorePath = 'keystore';


  export let channelName = 'mychannel';
  export let mspid = 'Org1MSP';

  // local docker swarm
  export let peerUrl = 'grpc://10.200.1.208:7051';
  export let ordererUrl = 'grpc://10.200.1.124:7050';

  // node1 docker swarm
  peerUrl = 'grpc://158.132.11.229:7051';
  ordererUrl = 'grpc://158.132.11.229:7050';
}
...