Обновление одного и того же списка несколько раз одним и тем же методом — Hyperledger Fabric Chaincode node js

#node.js #list #hyperledger-fabric #hyperledger-chaincode

#node.js #Список #hyperledger-fabric #hyperledger-цепной код

Вопрос:

Итак, я пытался создать простой цепной код лояльности в js.

Я начал с этого репозитория: https://github.com/IBM/customer-loyalty-program-hyperledger-fabric-VSCode/blob/master/contract/lib/customerloyalty.js

И я пытался написать функцию, в которой два пользователя могли бы менять точки между ними. Это означает, что мне пришлось обновить member1 в списке участников и member2 в списке участников.

Проблема в том, что я не могу обновить оба элемента. Только последний (member2) зарегистрирован в списке участника со значением точек обновления.

Это функция для добавления элементов в список и перевода его в состояние цепочки блоков:

     async function addElementToList(ctx, listKey, elementJSON){
        let currentList = await ctx.stub.getState(listKey);
        currentList = JSON.parse(currentList);
        currentList.push(elementJSON);

        await ctx.stub.putState(listKey, Buffer.from(JSON.stringify(currentList)));
    }
  

И это то, что я пытаюсь сделать в своей функции точек обмена:

     //update member's points
        member2.points  = exchangePoints.points;
        member1.points -= exchangePoints.points;

        let member1_Stringify = JSON.stringify(member1);
        let member2_Stringify = JSON.stringify(member2);
        let exchangePointsStringify = JSON.stringify(exchangePoints);

        await utils.addElementToList(ctx, allMembersKey, member1_Stringify); //update member1 in member's list
        await utils.addElementToList(ctx, exchangePointsKey, exchangePointsStringify); //add to earn points list
        await utils.addElementToList(ctx, allMembersKey, member2_Stringify); //update member2 in member's list

        return exchangePointsStringify;
  

Кто-нибудь знает, как я могу это исправить?

Большое спасибо!

Ответ №1:

Проблема в том, что вы не можете прочитать свои собственные записи в chaincode, как описано в документации по семантике набора чтения-записи. В принципе, если у вас есть ключ, который в настоящее время содержит текст current stuff в мировом состоянии (т.Е. Был зафиксирован), и Вы делаете следующее

 await ctx.stub.putState(key, Buffer.from('new data'));
const readvalue = ctx.stub.getState(key).toString();
  

тогда значение readvalue будет содержать исходное значение current stuff (т. Е. Текущее значение в книге), Оно не будет содержать значение, которое вы только что записали.

Комментарии:

1. Хорошо, я этого не знал. Как я могу это исправить? Большое спасибо за ваш ответ 🙂

2. Не уверен, что вы под fix этим подразумеваете. Так оно и работает, вы не можете изменить поведение, вам нужно изменить свое приложение, чтобы приспособиться к этому.