Я вызываю кроссчейнкод из метода set моего чейндода, и он правильно записывает информацию, которую я отправляю. Однако, когда я вызываю кроссчейнкод из метода get, данные не записываются.
Чтобы убедиться, что это не ошибка реализации, я скопировал функцию, которая входит в метод get, в метод set в качестве теста, и она ответила правильно, поэтому я подозреваю, что это факт вызова того же кроссчейнкода из другого метода.
Часть кода метода set, которая работает правильно, включая функцию, скопированную из метода get:
log.SetFlags(0)
uuid = uuidgen()
TxID = stub.GetTxID()
timestamp = timeNow()
log.Println("["+timestamp+"]["+uuid+"]["+CHANNEL_ENV+"]["+TxID+"][usecase_cc][Transaction] Transaction makes payment of X units from A to B")
re = captureOutput(func(){
log.Println("["+timestamp+"]["+uuid+"]["+CHANNEL_ENV+"]["+TxID+"][usecase_cc][Transaction] Transaction makes payment of X units from A to B")
})
invokeArgs = prepareToInvoke(uuid, re)
stub.InvokeChaincode("base_cc", invokeArgs, CHANNEL_ENV)
//IMPORTED FROM GET METHOD
Avalbytes, err = stub.GetState(A) // Get the state from the ledger
log.SetFlags(0)
uuid = uuidgen()
TxID = stub.GetTxID()
timestamp = timeNow()
jsonResp := "{\"Name\":\"" + A + "\",\"Amount\":\"" + string(Avalbytes) + "\"}"
log.Println("["+timestamp+"]["+uuid+"]["+CHANNEL_ENV+"]["+TxID+"][Get] Query Response: "+jsonResp)
re = captureOutput(func(){
log.Println("["+timestamp+"]["+uuid+"]["+CHANNEL_ENV+"]["+TxID+"][Get] Query Response: "+jsonResp)
})
invokeArgs = prepareToInvoke(uuid, re)
stub.InvokeChaincode("base_cc", invokeArgs, CHANNEL_ENV)
//IMPORTED FROM GET METHOD
Неудача заключается в том, что при запросе кроссчейнкода он возвращает, что актив не был вставлен. Первые четыре журнала были вставлены с помощью метода set, а последний, который не удалось вставить, был предпринят с помощью метода get:
response 3zjRkx5KXL65KPn4XGc9SjgWBRVS07i07ecWTMmCRf8=
response A+Mq4UjLrvTRyVXEgBsgA5Pvk2WTUjKYa0NYKxMwtG0=
response vlstiHrCz2tw3t8Ba4C9GbHo/nYrVwstP8JnEPhRAJc=
response KYE+acbDesekYslXT87EEZ546eVSIUREJlHI+8f8ZNY=
Traceback (most recent call last):
File "query.py", line 91, in <module>
response = loop.run_until_complete(cli.chaincode_query(
File "/usr/lib/python3.8/asyncio/base_events.py", line 616, in run_until_complete
return future.result()
File "/usr/local/lib/python3.8/dist-packages/fabric_sdk_py-0.9.0-py3.8.egg/hfc/fabric/client.py",
line 1328, in chaincode_query
return await chaincode.query(requestor, channel_name, peers, args,
File "/usr/local/lib/python3.8/dist-packages/fabric_sdk_py-0.9.0-py3.8.egg/hfc/fabric/chaincode.py",
line 316, in query
raise Exception(res)
Exception: [response {
status: 500
message: "Asset not found: 3280ca60-0352-40c4-83ab-b9c8e25d0f1f"
Чтобы прояснить ошибку, я создал это изображение, где: Cross-Chaincode
1A) Вызовите транзакцию (код цепочки вариантов использования) через Python SDK и задайте метод для добавления однорангового узла (A, Aval) в цепочку блоков.
2A) Добавьте одноранговый узел (A, Aval) через API состояния размещения (код цепочки вариантов использования). Это действие создает журнал.
3A) Соберите журнал в цепочке и отправьте его в другой чейнкод через кросс-чейн вызов (от чейнкода варианта использования к базовому чейнкоду).
4A) Добавьте пару (logUUID, base64(sha256(log(SET(A))))) через API состояния размещения (Base Chaincode).
5A) Запросите чейнкод варианта использования с помощью метода get, чтобы получить Aval из A.
6A) Запросите Aval из A через API получения состояния в коде цепочки вариантов использования. Это действие создает новую запись.
7A) Соберите журнал в чейнкоде и отправьте его в другой чейнкод с помощью вызова перекрестного чейнкода.
8A) Добавляет пару (logUUID, base64(sha256(log(GET(A))))) через API состояния размещения (базу чейнкода).
1B) Запросить базовый чейнкод с помощью метода get для получения base64(sha256(log(SET(A))).
2B) Получить base64(sha256(log(SET(A))) из logUUID через API получения состояния в базе чейнкода.
3B) Запросите базовый чейнкод с помощью метода get для получения base64(sha256(log(GET(A)))).
4B) Получить base64(sha256(log(GET(A))) из logUUID через API получения состояния в базе чейнкода (Здесь происходит ошибка).