Я пытаюсь перенести решение фабрики гиперледжеров, используя узел sdk. Нынешняя система использует ткань 1.2 и работает, как и ожидалось, но я бы хотел, чтобы новые функции 1.3.
Я обновил сеть до 1.3, узел sdk до 1.3.0 и изменил код приложения на использование канала eventhub. Но у меня есть проблемы с организациями, которые имеют более 1 пира при установке цепного кода. По какой-то причине я могу установить цепной код только в тех организациях, в которых есть один узел? Кажется, что концентратор событий не может подключиться к другим партнерам в той же организации. Глядя на логи от пиров, я также вижу трафик только от того, который может подключиться к eventhub
Что я делаю:
Для данной организации у меня есть 3 пира, где должен быть установлен цепной код. Для тестирования у меня есть 3 пира на локальном хосте со следующим конфигом:
{
host: "peer0",
url: `grpcs://${Config.ip}:8001`,
publicKey: readFileSync(resolve("./resources/certs/some.org/peer0.pem")).toString()
},
{
host: "peer1",
url: `grpcs://${Config.ip}:8002`,
publicKey: readFileSync(resolve("./resources/certs/some.org/peer1.pem")).toString()
},
{
host: "peer2",
url: `grpcs://${Config.ip}:8003`,
publicKey: readFileSync(resolve("./resources/certs/some.org/peer2.pem")).toString()
}
Поэтому перед выполнением каких-либо операций я инициализирую концентратор событий для каждого узла примерно так:
initEventHubs() {
// Setup event hubs
try {
// Now: 1.3.0
this._peers.forEach((peer: Peer) => {
const eventHub = this._channel.newChannelEventHub(peer);
eventHub.registerBlockEvent((block: any) => {
logger.debug('block', Utils.unmarshalBlock(block));
this.emit('block', Utils.unmarshalBlock(block));
}, (err) => {
logger.error(err);
});
eventHub.connect(true);
this._eventHubs.push(eventHub);
});
// Before: 1.2.0
/*this._organisation.peers.forEach((peer: any) => {
const eventHub = this._client.newEventHub();
const peerOptions: object = {
pem: peer.publicKey,
'ssl-target-name-override': peer.host
};
eventHub.setPeerAddr(peer.eventHub, peerOptions);
eventHub.connect();
eventHub.registerBlockEvent((block: any) => {
this.emit('block', Utils.unmarshalBlock(block));
});
this._eventHubs.push(eventHub);
});*/
} catch (e) {
logger.error(`Failed to configure event hubs. Error ${e.message}`);
}
}
Когда я выполняю создание канала или пытаюсь присоединиться к каналу, peer2
работает и ведет себя как ожидалось.
Двое других выбрасывают Error: 14 UNAVAILABLE: Connect Failed
из концентратора событий error: [Remote.js]: Error: Failed to connect before the deadline URL:grpcs://localhost:8001
. Они находятся в правильном порту и достижимы. Если я просто использую один узел на одном и том же порту с той же конфигурацией, это будет работать.
У кого-нибудь есть опыт работы с 1.3 и установкой цепного кода через узел sdk на несколько пиров той же организации? Если так, то может кто-нибудь объяснить, как это произошло?
Я также искал другие примеры, но не нашел их для нескольких пиров одной организации с 1.3. Есть несколько примеров для 1.2, но не этот точный сценарий: образцы фабрики , фабрика узлов sdk и тесты от фабрики узлов sdk