使用相同方法多次更新同一列表-Hyperledger Fabric Chaincode Node JS

问题描述

所以我试图在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,member2_Stringify); //update member2 in member's list

        return exchangePointsstringify;

谁知道我该如何解决

非常感谢!

解决方法

问题是,您无法读取自己的链式代码,如Read-Write set semantics documentation中所述。基本上,如果您有一个键,该键当前在世界状态下包含文本current stuff(即已提交),则可以执行以下操作

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

然后,readvalue将包含current stuff的原始值(即分类帐上的当前值),而不包含您刚刚编写的值。