Различное поведение перекрестного чейнкода для двух разных методов чейнкода

Я вызываю кроссчейнкод из метода 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 получения состояния в базе чейнкода (Здесь происходит ошибка).


person sfl0r3nz05    schedule 04.05.2021    source источник


Ответы (1)


Ошибка была вызвана функцией chaincode_query Python SDK.

Я открыл проблему в SDK Hyperledger Fabric Python. Однако для решения проблемы я использую chaincode_invoke вместо chaincode_query.

chaincode_invoke

Теперь я могу генерировать и получать журналы из метода [get].

журнал

... а также проверьте это:

base64 журнала

person sfl0r3nz05    schedule 07.05.2021