两种不同链码方法的不同交叉链码行为
Different cross chaincode behavior for two different chaincode methods
我正在从我的 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, re)
stub.InvokeChaincode("base_cc", invokeArgs, CHANNEL_ENV)
//IMPORTED FROM GET METHOD
失败是查询交叉链码时returns没有插入资产。前四个日志已从 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调用交易(usecase chaincode)并设置在区块链中添加节点(A,Aval)的方法。
2A) 通过put状态API(用例链码)添加节点(A,Aval)。此操作会生成一个日志。
3A) 收集链上日志并通过跨链调用(从用例链码到基础链码)将其发送到另一个链码。
4A) 通过 put state API (Base Chaincode) 添加对 (logUUID, base64(sha256(log(SET(A))))。
5A) 通过get方法查询用例链码,从A中获取Aval。
6A) 在用例链码中通过get状态API查询A的Aval。此操作会生成一条新记录。
7A) 收集链码中的日志并通过交叉链码调用将其发送到另一个链码。
8A) 通过放置状态 API(链代码基)添加对 (logUUID, base64(sha256(log(GET(A))))。
1B) 通过get方法查询base chaincode获取base64(sha256(log(SET(A))).
2B) 通过链代码库中的获取状态 API 从 logUUID 中检索 base64(sha256(log(SET(A)))。
3B) 通过get方法查询base chaincode获取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
我正在从我的 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, re)
stub.InvokeChaincode("base_cc", invokeArgs, CHANNEL_ENV)
//IMPORTED FROM GET METHOD
失败是查询交叉链码时returns没有插入资产。前四个日志已从 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调用交易(usecase chaincode)并设置在区块链中添加节点(A,Aval)的方法。
2A) 通过put状态API(用例链码)添加节点(A,Aval)。此操作会生成一个日志。
3A) 收集链上日志并通过跨链调用(从用例链码到基础链码)将其发送到另一个链码。
4A) 通过 put state API (Base Chaincode) 添加对 (logUUID, base64(sha256(log(SET(A))))。
5A) 通过get方法查询用例链码,从A中获取Aval。
6A) 在用例链码中通过get状态API查询A的Aval。此操作会生成一条新记录。
7A) 收集链码中的日志并通过交叉链码调用将其发送到另一个链码。
8A) 通过放置状态 API(链代码基)添加对 (logUUID, base64(sha256(log(GET(A))))。
1B) 通过get方法查询base chaincode获取base64(sha256(log(SET(A))).
2B) 通过链代码库中的获取状态 API 从 logUUID 中检索 base64(sha256(log(SET(A)))。
3B) 通过get方法查询base chaincode获取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