两种不同链码方法的不同跨链码行为

问题描述

我正在从我的 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。

chaincode_invoke

现在,我可以通过 [get] 方法生成和检索日志。

log

...并验证它:

base64 of the log