【问题标题】:Different cross chaincode behavior for two different chaincode methods两种不同链码方法的不同交叉链码行为
【发布时间】:2021-05-07 22:01:06
【问题描述】:

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

失败是在查询交叉链码时返回资产没有被插入。前四个日志已从 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) 通过 put state API(用例链码)添加对等点(A,Aval)。此操作会生成日志。

3A) 收集链上日志并通过跨链调用(从用例链码到基础链码)将其发送到另一个链码。

4A) 通过 put state API (Base Chaincode) 添加对 (logUUID, base64(sha256(log(SET(A))))。

5A) 通过get方法查询用例链码,从A中检索Aval。

6A) 通过用例链码中的获取状态 API 查询 A 的 Aval。此操作会生成一条新记录。

7A) 收集登录链码,并通过跨链码调用将其发送到另一个链码。

8A) 通过 put state API(链代码库)添加对 (logUUID, base64(sha256(log(GET(A))))。

1B) 通过get方法查询base chaincode以获取base64(sha256(log(SET(A)))。

2B) 通过链码库中的 get state API 从 logUUID 中检索 base64(sha256(log(SET(A))))。

3B) 通过 get 方法查询基本链码以检索 base64(sha256(log(GET(A))))。

4B) 通过链码库中的 get state API 从 logUUID 中检索 base64(sha256(log(GET(A)))(出现错误)。 p>

【问题讨论】:

    标签: hyperledger-fabric blockchain chaincode


    【解决方案1】:

    错误是由 Python SDK 函数 chaincode_query 产生的。

    我在 Hyperledger Fabric Python SDK 中提出了一个问题。但是,为了解决这个问题,我使用的是 chaincode_invoke 而不是 chaincode_query。

    chaincode_invoke

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

    log

    ...并验证它:

    base64 of the log

    【讨论】:

      猜你喜欢
      • 2017-06-27
      • 2019-09-12
      • 2014-07-19
      • 2016-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-15
      • 2014-08-12
      相关资源
      最近更新 更多