#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