问题描述
我正在从我的 chaindode 的 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,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) 通过放置状态 API(用例链代码)添加对等节点(A,Aval)。此操作会生成日志。
3A) 收集链上日志,并通过跨链调用(从用例链码到基础链码)将其发送到另一个链码。
4A) 通过放置状态 API(Base Chaincode)添加对 (logUUID,base64(sha256(log(SET(A))))。
5A) 通过 get 方法查询用例链码以从 A 中检索 Aval。
6A) 通过用例链码中的获取状态 API 查询 A 的 Aval。此操作会生成一条新记录。
7A) 收集链码中的日志,并通过跨链码调用将其发送到另一个链码。
8A) 通过放置状态 API(链代码库)添加对 (logUUID,base64(sha256(log(GET(A))))。
1B) 通过 get 方法查询基础链码以检索 base64(sha256(log(SET(A)))。
2B) 通过链代码库中的获取状态 API 从 logUUID 中检索 base64(sha256(log(SET(A)))。
3B) 通过 get 方法查询基础链码以检索 base64(sha256(log(GET(A))))。
4B) 通过链代码库中的获取状态 API 从 logUUID 检索 base64(sha256(log(GET(A)))(这里发生错误)。。 >
解决方法
错误是由 Python SDK 函数 chaincode_query 产生的。
我在 Hyperledger Fabric Python SDK 中发现了一个问题。但是,为了解决这个问题,我使用了 chaincode_invoke 而不是 chaincode_query。
现在,我可以通过 [get] 方法生成和检索日志。
...并验证它: