【问题标题】:Cannot get state in Hyperledger fabric correctly?无法正确获取 Hyperledger 结构中的状态?
【发布时间】:2019-05-10 12:59:10
【问题描述】:

问题:

我已经开发了一个 Hyperledger 结构网络,之后我在其中安装了一个链码。这是我的 Initialize ledger 方法的样子。

async initLedger(stub, args) {
    console.info("============= START : Initialize Ledger ===========");
    let drivers = [];

    drivers.push({
      nic: "123",
      firstName: "Saman",
      lastName: "Frenando",
      status: "Not verified",
      licenceNo: "1234"
    });

    drivers.push({
      nic: "124",
      firstName: "Janith",
      lastName: "Bentharaarachchi",
      status: "Not verified",
      licenceNo: "1235"
    });


    for (let i = 0; i < drivers.length; i++) {
      drivers[i].docType = "driver";
      console.log(drivers[i].nic); 
      await stub.putState(
        drivers[i].nic,
        Buffer.from(JSON.stringify(drivers[i]))
      );
      console.info("Added <--> ", drivers[i]);
    }

 console.info("============= END : Initialize Ledger ===========");
  }

这就是我检索这些数据的方式。

async selectNthDriver(stub, args) {
    if (args.length != 1)  {
      throw new Error(
        "Incorrect number of arguments. Expecting NIC ex: 123"
      );
    }
    let nic = args[0];
    console.log(`nic: ${nic}`);

    let driverAsBytes = await stub.getState(nic); 
    console.log("hi"+driverAsBytes);
    if (!driverAsBytes || driverAsBytes.toString().length <= 0) {
      throw new Error("Driver with NIC" + nic + " does not exist");
    }
    console.log(driverAsBytes.toString());
    return driverAsBytes;
  }

当我在对等节点上发出这个命令时,它成功地初始化了账本。

peer chaincode invoke -o orderer.example.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C myc -n mycc -c '{"Args":["initLedger"]}'

当我尝试检索驱动程序时发出以下命令,这样说会留下一个错误。

错误:调用期间背书失败。响应:状态:500 消息:“事务返回失败:错误:带有 NIC123 的驱动程序不存在”

peer chaincode invoke -o orderer.example.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C myc -n mycc -c '{"Args":["selectNthDriver","123"]}

这是链码日志。

2019-05-09T05:18:51.184Z 信息 [lib/handler.js]
信息:[myc-09f261c4] 调用链码 Init() 成功。 将 COMPLETED 消息发送回对等方 {“时间戳”:“2019-05-09T05:18:51.184Z”} { fcn:'initLedger',参数: [] } ============= 开始:初始化分类帐 =========== 123 已添加 { nic: '123', firstName: 'Saman', lastName: '费尔南多,状态: “未验证”,licenceNo:“1234”,docType:“驱动程序”} 124 添加 { nic: '124', firstName: 'Janith', lastName: 'Bentharaarachchi',状态:'未验证',licenceNo:'1235',
文档类型:'驱动程序'} ============= END : 初始化分类帐 =========== { fcn: 'selectNthDriver', params: [ '123' ] } nic: 123 hi 错误:带有 NIC123 的驱动程序不存在 在 selectNthDriver (/usr/local/src/mycc.js:494:13) 在 在 process._tickCallback (internal/process/next_tick.js:188:7) 2019-05-09T05:43:42.430Z 错误 [lib/handler.js]
错误:[myc-e7aef847] 调用链码 Invoke() 返回 错误响应 [错误:带有 NIC123 的驱动程序不存在]。 将错误消息发送回对等方 {"时间戳":"2019-05-09T05:43:42.430Z"}

当我通过浏览器访问 CouchDB 时,它没有显示我初始化的数据。它只显示这些数据。

{
  "_id": "mycc",
  "_rev": "1-5c5ecfec35f65ec74cbe52a52be96048",
  "~version": "\u0000CgMBBwA=",
  "_attachments": {
    "valueBytes": {
      "content_type": "application/octet-stream",
      "revpos": 1,
      "digest": "md5-SkPMcpW++nrvo5v00rCdRQ==",
      "length": 424,
      "stub": true
    }
  }
}

谁能帮我找出我哪里做错了?谢谢。

【问题讨论】:

    标签: hyperledger-fabric hyperledger


    【解决方案1】:

    您应该使用“query”命令使用对等二进制文件从分类帐中查询状态,您使用的调用命令用于生成事务,查询操作不需要.

    您应该尝试用查询替换调用,它应该看起来像这样:

    peer chaincode query -o orderer.example.com:7050 -C myc -n mycc -c '{"Args":["selectNthDriver","123"]}
    

    编辑:另外请检查 selectNthDriver 方法中 if 语句中的以下条件:

    if (!driverAsBytes.toString()) 
    

    还请在代码中此 if 语句之前的行中为相同的 (driverAsBytes.toString()) 进行控制台。

    【讨论】:

    • 请检查新的编辑并发布相同的链码日志
    猜你喜欢
    • 2020-02-23
    • 2012-01-27
    • 1970-01-01
    • 2017-05-24
    • 1970-01-01
    • 2020-07-13
    • 2017-04-08
    • 2021-03-30
    • 1970-01-01
    相关资源
    最近更新 更多