Hyperledger Fabric 1.4: ошибка при попытке подключения ChannelEventHub.connect (true). Ошибка: ошибка подключения ChannelEventhub к равноправному узлу - PullRequest
0 голосов
/ 11 марта 2019

Это дополнительный вопрос к тому, который я задавал ранее ( здесь ), и я пытаюсь реализовать решение, предложенное @ david_k.

Я использую пример Fabcar в качестве базы и строю на этом.

Я запустил startFabric.sh, мне пришло сообщение «Успешно отправлено предложение присоединиться к каналу»

docker exec -e "CORE_PEER_LOCALMSPID = Org1MSP" -e "CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/msp/users/Admin@org1.example.com/msp" peer0.org1.example.com равноправный канал create -o orderer. example.com:7050 -c mychannel -f /etc/hyperledger/configtx/channel.tx

2019-03-11 08: 54: 51.857 UTC [channelCmd] InitCmdFactory -> ИНФО 001 Инициализированные соединения с заказчиком и заказчиком

2019-03-11 08: 54: 52.076 UTC [cli.common] readBlock -> INFO 002 Полученный блок: 0

Присоедините peer0.org1.example.com к каналу.

docker exec -e "CORE_PEER_LOCALMSPID = Org1MSP" -e "CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/msp/users/Admin@org1.example.com/msp" peer0.org1.example.com присоединение к равноправному каналу -b mychannel.block

2019-03-11 08: 54: 52.387 UTC [channelCmd] InitCmdFactory -> INFO 001 Инициализированные соединения с заказчиком и заказчиком

2019-03-11 08: 54: 52.481 UTC [channelCmd] executeJoin -> INFO 002 Успешно отправлено предложение присоединиться к каналу

Затем я пытаюсь инициализировать channelEventHub из класса «Channel», используя Fabric Node SDK (fabric-client), чтобы подписаться на события, генерируемые моим цепным кодом.

const channel = new Channel('mychannel',ccp);
const channelEventHub = channel.getChannelEventHub('peer0.org1.example.com')

Я получаю следующую ошибку:

Не удалось отправить транзакцию: ошибка: не удалось обнаружить :: ошибка: узел с именем "peer1.org1.example.com", не назначенным этому каналу

После этого я попытался использовать функцию getPeers () из Channel Object, но получил пустой массив, который в противном случае должен был бы вернуть массив пиров, зарегистрированных на канале.

const channel = new Channel('mychannel',ccp);

let peers = channel.getChannelPeers();

Консоль зарегистрировала одноранговые узлы, и она вернулась [].

Мой профиль подключения JSON выглядит следующим образом (это профиль в базовой сети, я его не менял).

{ "имя": "основной-сеть", "версия": "1.0.0", "Клиент": { "организация": "Org1", "Соединение": { "тайм-аут": { "равный": { "Индоссант": "300"}, "заказчик": "300"}}}, "каналы": {"мой канал": { "" заказчики: [ "orderer.example.com"], «коллеги»: { "Peer0.org1.example.com": {} } } }, "Организации": { "Org1": { "mspid": "Org1MSP", "сверстники": [ "peer0.org1.example.com"], "certificateAuthorities": [ "ca.example.com"]} , "Org2": { "mspid": "Org2MSP", "коллеги": [ "peer0.org2.example.com"], "certificateAuthorities": [ "ca.example.com"]}} "" заказчики: { "orderer.example.com": { "URL": "КПГР: // локальный: 7050"}}, "сверстники": { "peer0.org1.example.com": { "URL": "КПГР: / /localhost:7051"},"peer0.org2.example.com":{"url":"grpc://localhost:7052"}},"certificateAuthorities":{"ca.example.com":{"url ":" http://localhost:7054","caName":"ca.example.com"}}}

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

Я не понимаю, почему я получаю эту ошибку. Любые указатели о том, как это исправить, будут очень благодарны.

Обновление:

Я создал класс StateStore, который реализует интерфейс fabric_client.IKeyValueStore

Обосновал это. Затем установите государственный магазин, используя

await fabric_client.setStateStore(stateStore);

После чего я создал пользователя и установил контекст пользователя с помощью следующих команд

    let user = await fabric_client.createUser(userOpts);
    // Set the userContext by passing the User Context
    await fabric_client.setUserContext(user);

Затем я установил права подписи администратора (не уверен, если это необходимо). Затем сохранил пользователя в State Store.

ждут fabric_client.setAdminSigningIdentity(admin_pk,admin_cert,admin_mspid);

await fabric_client.saveUserToStateStore ();

Затем я консоль Logged EventHub, который ясно показывает, что есть clientContext.

{
  "_last_block_seen": null,
  "_starting_block_number": null,
  "_ending_block_number": null,
  "_ending_block_seen": false,
  "_ending_block_newest": false,
  "_allowRegistration": true,
  "_start_stop_registration": null,
  "_chaincodeRegistrants": {},
  "_block_registrant_count": 0,
  "_blockRegistrations": {},
  "connectCallback": null,
  "_transactionRegistrations": {},
  "_event_client": null,
  "_stream": null,
  "_connected": false,
  "_connect_running": false,
  "_disconnect_running": false,
  "_filtered_stream": true,
  "_current_stream": 0,
  "_clientContext": {
    "name": "basic-network",
    "version": "1.0.0",
    "client": {
      "organization": "Org1",
      "connection": {
        "timeout": {
          "peer": {
            "endorser": "300"
          },
          "orderer": "300"
        }
      }
    },
    "channels": {
      "mychannel": {
        "orderers": [
          "orderer.example.com"
        ],
        "peers": {
          "peer0.org1.example.com": {}
        }
      }
    },
    "organizations": {
      "Org1": {
        "mspid": "Org1MSP",
        "peers": [
          "peer0.org1.example.com"
        ],
        "certificateAuthorities": [
          "ca.example.com"
        ]
      },
      "Org2": {
        "mspid": "Org2MSP",
        "peers": [
          "peer0.org2.example.com"
        ],
        "certificateAuthorities": [
          "ca.example.com"
        ]
      }
    },
    "orderers": {
      "orderer.example.com": {
        "url": "grpc://localhost:7050"
      }
    },
    "peers": {
      "peer0.org1.example.com": {
        "url": "grpc://localhost:7051"
      },
      "peer0.org2.example.com": {
        "url": "grpc://localhost:7052"
      }
    },
    "certificateAuthorities": {
      "ca.example.com": {
        "url": "http://localhost:7054",
        "caName": "ca.example.com"
      }
    }
  },
  "_channel": {
    "_name": "mychannel",
    "_channel_peers": {},
    "_anchor_peers": [],
    "_orderers": {},
    "_kafka_brokers": [],
    "_clientContext": {
      "name": "basic-network",
      "version": "1.0.0",
      "client": {
        "organization": "Org1",
        "connection": {
          "timeout": {
            "peer": {
              "endorser": "300"
            },
            "orderer": "300"
          }
        }
      },
      "channels": {
        "mychannel": {
          "orderers": [
            "orderer.example.com"
          ],
          "peers": {
            "peer0.org1.example.com": {}
          }
        }
      },
      "organizations": {
        "Org1": {
          "mspid": "Org1MSP",
          "peers": [
            "peer0.org1.example.com"
          ],
          "certificateAuthorities": [
            "ca.example.com"
          ]
        },
        "Org2": {
          "mspid": "Org2MSP",
          "peers": [
            "peer0.org2.example.com"
          ],
          "certificateAuthorities": [
            "ca.example.com"
          ]
        }
      },
      "orderers": {
        "orderer.example.com": {
          "url": "grpc://localhost:7050"
        }
      },
      "peers": {
        "peer0.org1.example.com": {
          "url": "grpc://localhost:7051"
        },
        "peer0.org2.example.com": {
          "url": "grpc://localhost:7052"
        }
      },
      "certificateAuthorities": {
        "ca.example.com": {
          "url": "http://localhost:7054",
          "caName": "ca.example.com"
        }
      }
    },
    "_msp_manager": {
      "_msps": {}
    },
    "_discovery_interests": {},
    "_discovery_results": null,
    "_last_discover_timestamp": null,
    "_discovery_peer": null,
    "_use_discovery": false,
    "_as_localhost": true,
    "_endorsement_handler": null,
    "_commit_handler": null
  },
  "_peer": {
    "_options": {
      "grpc.max_receive_message_length": -1,
      "grpc.max_send_message_length": -1
    },
    "_url": "grpc://localhost:7051",
    "_endpoint": {
      "addr": "localhost:7051",
      "creds": {}
    },
    "_name": "localhost:7051",
    "_request_timeout": 45000,
    "_grpc_wait_for_ready_timeout": 3000,
    "_endorserClient": {
      "$interceptors": [],
      "$interceptor_providers": [],
      "$channel": {}
    },
    "_discoveryClient": {
      "$interceptors": [],
      "$interceptor_providers": [],
      "$channel": {}
    }
  }
}

Но все же, когда я пытаюсь подключиться с помощью EventHub.connect(true), я получаю следующую ошибку.

Не удалось отправить транзакцию: Ошибка: Ошибка при подключении ChannelEventhub к одноранговому узлу, либо clientContext не был должным образом инициализирован, отсутствует идентификатор userContext или идентификация администратора, либо отсутствует подписанное событие

Ответы [ 2 ]

0 голосов
/ 14 марта 2019

Я использовал подход @david_k и реализовал класс ChaincodeEventEmitter и просто использовал API-интерфейс Fabric-Network для создания канала.

    const walletPath = path.join(process.cwd(), 'wallet');
    const wallet = new FileSystemWallet(walletPath);
    const useDiscovery = false;
    const convertDiscoveredToLocalHost = null;
    const userExists = await wallet.exists('user1');
        if (!userExists) {
            console.log('An identity for the user "user1" does not exist in the wallet');
            console.log('Run the registerUser.js application before retrying');
            return;
        }
    const gateway = new Gateway();
    const discoveryOptions = {
            enabled: useDiscovery
        };
    if (useDiscovery && convertDiscoveredToLocalHost !== null) {
            discoveryOptions.asLocalhost = convertDiscoveredToLocalHost;
     }

    await gateway.connect(ccp, {
            wallet,
            identity: 'user1',
            discovery: discoveryOptions
    });

    const network = await gateway.getNetwork('mychannel');
    const chaincodeEventEmitter = new ChaincodeEventEmitter(network, 'Org1MSP', 'Fabcae');
    await chaincodeEventEmitter.initialize();

    chaincodeEventEmitter.on('eventName', async (event) => {
            console.log('Event Received');
            console.log('Received Event --> ', event);

    });

    await gateway.disconnect();

И я использовал тот же код для класса ChaincodeEventEmitter, что и здесь https://github.com/davidkel/bnaport/blob/master/trade-network/native/client-new-js/chaincodeeventemitter.js.

Еще раз @david_k Спасибо !!!

0 голосов
/ 11 марта 2019

Я не уверен, что это решение, но, с моей стороны, оно работает, и есть небольшая разница.

Вместо передачи имени однорангового узла в концентратор событий я передаю одноранговый объект:

var peer = fabric_client.newPeer(creds.peers['org1-peer1'].url, { pem: creds.peers['org1-peer1'].tlsCACerts.pem, 'ssl-target-name-override': null });
var channel = fabric_client.newChannel('defaultchannel');
let event_hub = channel.newChannelEventHub(peer);

Примечание: creds - это объект, содержащий профиль соединения aas json.

Полный образец доступен здесь: https://github.com/IBM/car-auction-network-fabric-node-sdk

...