Я пытаюсь вызвать 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';
}