以相同的方法多次更新相同的列表 - Hyperledger Fabric Chaincode node js

Updating same list, multiple times in the same method - Hyperledger Fabric Chaincode node js

所以我试图在 js 中构建一个简单的忠诚度链代码。

我从这个 repo 开始: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;

有人知道我该如何解决这个问题吗?

非常感谢!

问题是您无法在链代码中读取自己的写入,如 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 的原始值(即账本上的当前值),它不会包含您刚刚写入的值。