Цепной код Hyperledger Fabric не запускается и не говорит, почему

#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 или в какой-либо другой файл. При такой переработке точно такой же код работает нормально.