Получите подробную информацию о транзакциях по TxID в hyperledger farbic

#hyperledger-fabric #hyperledger #hyperledger-fabric-ca

Вопрос:

В настоящее время я запускаю hyperledger fabric версии 2.2. Я разработал цепной код с использованием contractapi и разрабатываю приложение с использованием fabric-sdk-go/pkg/gateway

Как я могу получить статус транзакции и полезную нагрузку транзакции? Я знаю о GetHistoryByKey (), который доступен в contractapi, но это не подходит для моего приложения.

Я знаю, что есть hyperledger-explorer, который можно использовать для поиска транзакций по TxID, но мой вариант использования-мое приложение будет запрашивать TxID, а затем оно проверит статус этой конкретной транзакции (TxID).

Кроме того, я пытался добиться этого с помощью fabsdk, но я получаю ошибку, когда пытаюсь создать экземпляр fabsdk с помощью fabsdk.New() . Похоже, что с профилем подключения возникли некоторые проблемы с совместимостью.json,который я использую в проекте образца ткани.

Ошибка, которую я получаю, заключается в:

failed to create identity manager provider: failed to initialize identity manager for organization: MyOrgName: Either a cryptopath or an embedded list of users is required

Тот же профиль подключения использовался для запуска и работы сети, и, похоже, все работает хорошо. Я могу отправлять и оценивать транзакции.

решение

Системные цепные коды встроены в сам узел. поэтому нам нужно установить цель, иначе это просто выдаст ошибку обнаружения, поскольку контракт QSCC явно не развернут на канале.

Обязательно проверьте сердечник.файловый канал yaml.system — системный цепной код должен быть включен channel.system.qscc: включить

 qsccContract := network.GetContract("qscc")
txn, err := qsccContract.CreateTransaction("GetTransactionByID", gateway.WithEndorsingPeers("peer0.org1.com:8051"))
if err != nil {
    fmt.Printf("Failed to create transaction: %sn", err)
    return
}

result, err := txn.Evaluate("mychannel", "4b1175335bdfe074d516a69df180ed6bc14591543eb26c10e21df2c67602b2dc")
if err != nil {
    fmt.Printf("Failed to submit transaction: %sn", err)
    return
}

fmt.Println(string(result))
 

Примечание: Результат должен быть расшифрован, чтобы быть читаемым человеком

Ответ №1:

Ваше клиентское приложение может использовать клиентский SDK, соответствующий вашему языку программирования, для оценки функции GetTransactionByID транзакции в qscc системном цепном коде, который доступен для всех одноранговых узлов. Эта функция транзакции принимает идентификатор транзакции в качестве единственного аргумента и возвращает peer.ProcessedTransaction протобуф, который содержит конверт транзакции и код проверки.

Комментарии:

1. я попробовал нижеприведенный снипер кода: qsccContract := network.GetContract("qscc") res, err := qsccContract.EvaluateTransaction("GetTransactionByID", "xxxxxx") if err != nil { log.Fatalf("error:%v", err) } log.Printf("res:%v", string(res)) и это выдало мне ошибку: Failed constructing descriptor for chaincode chaincodes:<name:"qscc" > ,: No metadata was found for chaincode qscc in channel mychannel

2. именно так я обычно отправляю/оцениваю транзакции из своего клиентского приложения

3. Возможно, возникла проблема с использованием обнаружения служб для вызова системных цепных кодов (которые не отображаются в результатах обнаружения) с помощью Go SDK. Возможно, стоит сначала проверить, используете ли вы последнюю версию Go SDK, и, если проблема все еще существует, сообщить об ошибке в Jira: jira.hyperledger.org/projects/FABG