Не удается правильно получить состояние в ткани Hyperledger? - PullRequest
0 голосов
/ 09 мая 2019

Проблема:

Я разработал матричную сеть Hyperledger, и после этого я установил там цепной код.Вот как выглядят мои методы Инициализации регистра.

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 info [lib / handler.js]
info: [myc-09f261c4] Вызов цепного кода Init () выполнен успешно.Отправка сообщения COMPLETED обратно равноправному пользователю {"отметка времени": "2019-05-09T05: 18: 51.184Z"} {fcn: 'initLedger', params: []} ============= START: Инициализировать книгу =========== 123 Добавлено <-> {nic: '123', firstName: 'Saman', lastName: 'Fernando', статус: 'Не проверено', licenceNo: '1234', docType:' driver '} 124 Добавлено <-> {nic:' 124 ', firstName:' Janith ', lastName:' Bentharaarachchi ', статус:' Не проверен ', номер лицензии:' 1235 ',
docType: 'driver'} ============= END: Инициализировать книгу =========== {fcn: 'selectNthDriver', params: ['123']} nic:123 Привет Ошибка: Драйвер с NIC123 не существует в selectNthDriver (/usr/local/src/mycc.js:494:13) в at process._tickCallback (внутренний / 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
    }
  }
}

Может кто-нибудь помочь мне выяснить, где я делаю неправильно?Спасибо.

1 Ответ

0 голосов
/ 09 мая 2019

Вы должны использовать команду " query " для запроса состояния из бухгалтерской книги с использованием однорангового двоичного файла; команда invoke, которую вы использовали, предназначена для генерации транзакции, которая не требуется для операции запроса.

Вы должны просто попытаться заменить invoke запросом, и это должно выглядеть примерно так:

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

РЕДАКТИРОВАТЬ: Также проверьте следующее условие в вашем операторе if в методе selectNthDriver:

if (!driverAsBytes.toString()) 

Также, пожалуйста, консоль для того же (driverAsBytes.toString ()) в строке перед оператором if в вашем коде.

...