TRANSIENT_FAILURE возникает, когда транзакция отправляется с помощью шлюза, настроенного с использованием «WithSDK» в fabric-go-sdk

#hyperledger-fabric #hyperledger-fabric-sdk-go

Вопрос:

Я создаю клиентский сервер для подключения к сети Hyperledger Fabric с помощью fabric-go-sdk . Чтобы использовать пользовательскую систему ведения журнала, я получаю FabricSDK объект с помощью fabsdk.New() , а затем внедряю его в Gateway объект с помощью gateway.WithSDK функции. Проверьте код ниже:

     ccpPath := getPath("connection-profile.json", staticPath)
    sdk, err := fabsdk.New(config.FromFile(ccpPath),
        fabsdk.WithLoggerPkg(amp;FabSDKLoggerProvider{}), // using my custom logging system
    )
    if err != nil {
        return nil, errors.Wrap(err, "failed to create a new fabsdk")
    }

    gw, err := gateway.Connect(
        gateway.WithSDK(sdk),
        gateway.WithIdentity(wallet, "admin"),
    )
    if err != nil {
        return nil, errors.Wrap(err, "failed to connect the network via a fabric gateway")
    }
 

Когда я запускаю тест, я получаю сообщение об ошибке:

 Failed to submit: error registering for TxStatus event: could not create client conn: could not connect to peer0.test.bpl:7051: dialing connection on target [peer0.test.bpl:7051]: connection is in TRANSIENT_FAILURE
 

Тест, который я провел, — это тест на отправку транзакции с использованием Gateway объекта и его Submit метода.

Когда я определил Gateway объект без FabricSDK , он работает нормально. То есть, если я использую приведенный ниже код, тест проходит хорошо. Однако в этом случае я не могу использовать свою пользовательскую систему ведения журнала. (Я просто хочу отключить систему ведения журнала Fabric SDK.)

     ccpPath := getPath("connection-profile.json", staticPath)
    gw, err := gateway.Connect(
        gateway.WithConfig(config.FromFile(ccpPath)),
        gateway.WithIdentity(wallet, "admin"),
    )
    if err != nil {
        return nil, errors.Wrap(err, "failed to connect the network via a fabric gateway")
    }
 

Согласно моему исследованию, разница между FabricSDK объектами, инициализированными fabsdk.New() и gateway.Connect(gateway.WithConfig()) , заключается в том, что у FabricSDK объекта, который создается, gateway.Connect(gateway.WithConfig()) есть опция fabsdk.WithMSPPkg(gw.mspfactory) , а у другого ее нет. Я пытаюсь дать такой же вариант своему fabsdk.New() коду, но не смог найти, как это сделать.

Итак, мой вопрос таков:

  • Как я могу справиться с ошибкой «TRANSIENT_FAILURE» или
  • Как я могу отключить систему ведения журнала Fabric SDK по умолчанию?

Спасибо.

Ответ №1:

У меня просто были точно такие же два вопроса, когда я писал небольшой пример интерфейса командной строки, чтобы получить метаданные цепного кода

Как я могу справиться с ошибкой «TRANSIENT_FAILURE»

В моем случае dialing connection on target [peer0.org1.example.com:7051]: connection is in TRANSIENT_FAILURE ошибка произошла из-за того, что я использовал среду настройки тестовой сети Fabric, но не установил переменную среды DISCOVERY_AS_LOCALHOST. DISCOVERY_AS_LOCALHOST определяет, переводятся ли IP-адреса, найденные во время обнаружения службы, из сети docker на локальный хост, что описано в документации по параметрам подключения для разработки приложений.

Как я могу отключить систему ведения журнала Fabric SDK по умолчанию?

Я все еще хотел видеть сообщения об ошибках, но мне удалось изменить уровень ведения журнала, чтобы избавиться от нежелательных информационных сообщений с помощью logging.SetLevel("", logging.ERROR)

Образец ccmetadata находится на GitHub, если это вам поможет