#typescript #hyperledger-fabric
Вопрос:
Во время написания некоторого цепного кода я внезапно начал получать эту ошибку:
2021-06-05T20:45:34.045 Z — ошибка: [Транзакция]: Ошибка: Нет допустимых ответов от одноранговых узлов. Ошибки: одноранговый узел=peer1.локальный:7051, статус=500, сообщение=ошибка в моделировании: не удалось выполнить транзакцию c33493ce22005d9e73b02e2b99d1d19daceb04f0ee9fb8fede0a3e1081ca9943: не удалось запустить цепной код basic_1.0:32ca3f181f42e66b77c1026c31c92049336315143142535955a3f256d0249c18: не удалось зарегистрировать цепной код: контейнер вышел с 1
Мой код и раньше работал нормально, и машинопись по-прежнему компилируется без ошибок.
При проверке статуса с docker logs ...
помощью я вижу это:
2021-06-05 19:33:09.259 UTC [жизненный цикл] Работа -> ПРЕДУПРЕДИТЬ 073 не удалось запустить цепной код ‘basic_1.0:5a649b5a8d084d83c86b02231ffa1b8e3e32e95f99de46e52588244fb9c99c59’: не удалось зарегистрировать цепной код: контейнер вышел с 1
Как мне узнать, в чем заключается ошибка кода?
Кроме того, даже если контейнер не запускается, вызов для проверки успешной установки кода цепочки возвращает значение true.
Ответ №1:
Копаясь вокруг, я заметил, что контейнер с цепным кодом автоматически останавливался после неудачной загрузки. Чтобы найти разбившийся контейнер, я использовал docker ps -a
. Когда я бежал docker logs ...
на этом или прыгал внутри контейнера, docker run -it ... /bin/sh
я смог получить больше информации:
******** НЕ удалось запустить приложение: Ошибка: ошибка в моделировании: не удалось выполнить транзакцию 6caf98016e71974a987a7f3a5295b518026c1f25ac117646db3dfcad89d179f7: не удалось запустить код цепочки basic_1.0:5a649b5a8d084d83c86b02231ffa1b8e3e32e95f99de46e52588244fb9c99c59: не удалось зарегистрировать код цепочки: контейнер вышел с 1
структура-цепной код-начало узла —одноранговый.адрес локального хоста:7051 —цепной код-идентификатор-имя mycc
Параметры: —справка Показать справку [логическое значение] -v, —версия Показать номер версии [логическое значение] —одноранговый адрес [строка] [требуется]
—grpc.max_send_message_length [номер] [по умолчанию: -1] —grpc.max_receive_message_length [номер] [по умолчанию: -1] —grpc.keepalive_time_ms [номер] [по умолчанию: 110000] —grpc.http2.min_time_between_pings_ms [номер] [по умолчанию: 110000] —grpc.keepalive_timeout_ms [номер] [по умолчанию: 20000] —grpc.http2.max_pings_without_data [номер] [по умолчанию: 0] —grpc.keepalive_permit_without_calls [номер] [по умолчанию: 1] —переопределение имени цели ssl [строка] —имя идентификатора цепочки [строка] [требуется] —путь к модулю [строка] [по умолчанию: «/usr/локальный/src»][Ошибка MissingRefError: не удается разрешить ссылочный массив из идентификатора SomeClass#] { сообщение: «не удается разрешить ссылочный массив из идентификатора SomeClass#», Ошибка: ‘Массив’, ошибка: ‘Массив’ } ОШИБКА npm! код ELIFECYCLE npm ОШИБАЕТСЯ! ошибка 1
К сожалению, это все еще не очень полезно, потому Array
что в моем коде нет отсутствующих ссылок, и, судя по тому, что я вижу в Интернете, эта ошибка вызвана библиотекой проверки JSON. Похоже, что Hyperledger Fabric делает что-то внутренне, что вызывает некоторые конфликты.
Я сузил его до следующего: пакет SDK Hyperledger Fabric TypeScript выйдет из строя, если вы попытаетесь ссылаться на статическую функцию или статическую переменную из класса, украшенного @Object
внутри класса, который наследуется от Contract
.
Так, например, НЕ делайте этого:
@Object()
export class SomeClass {
public static PREFIX: string = "TEST";
...
}
а затем в классе контрактов:
export class SomeContract extends Contract {
@Transaction()
public async SomeFunction(ctx: Context): Promise<string> {
return SomeClass.PREFIX;
}
Вместо этого выполните рефакторинг статических переменных и функций из SomeClass
файла в SomeClassHelper
или в какой-либо другой файл. При такой переработке точно такой же код работает нормально.