如何在交易中对同一资产进行多次更新

How to do multiple updates for the same asset in a transaction

这里我想根据条件在单个事务中对同一资产执行多个更新命令。

这是我的示例 CTO 文件:

asset SampleAsset identified by id{
  o String id
  o Integer value 
  o Integer value2 
  o Integer value3 
}

transaction SampleTransaction {
  o Integer value
}

这是我的示例 JS 文件:

async function sampleTransaction(tx) {  
var value = tx.value;
await updateValue(value);

if(value < MAX){ //MAX=10000
    const assetRegistry1 = await getAssetRegistry('org.example.basic.SampleAsset');
    var data1 = await assetRegistry.get("1");
    data1.value2 = max;
    await assetRegistry1.update(data1); //updateNo2
}
else{
    const assetRegistry1 = await getAssetRegistry('org.example.basic.SampleAsset');
    var data1 = await assetRegistry.get("1");
    data1.value3 = value;
    await assetRegistry1.update(data1); //UpdateNo2
 }
}

async function updateValue(value){
  const assetRegistry = await getAssetRegistry('org.example.basic.SampleAsset');
  var data = await assetRegistry.get("1");
  data.value = value;
  await assetRegistry.update(data); //UpdateNo1
}

使用上面的代码,只有最新的更新 (UpdateNo2) 命令正在对资产进行更改。第一次更新呢?

在提案模拟期间,在 Hyperledger fabric 中,任何对密钥的写入都无法回读。 Hyperledger composer 在与真实结构实现一起使用时以及在模拟模式下使用时(例如在 composer-playground 中使用网络连接时)都受到相同的限制。 这是您在 TP 功能中看到的问题。每次执行

let data = await assetRegistry.get("1");

在同一笔交易中,您获得的是原始资产,您没有获得在交易早期更新过的资产版本。因此,当事务提交时最终放入世界状态的将只是您所做的最后一次更改,这就是为什么只看到 UpdateNo2 的原因。 尝试这样的事情(注意我没有测试过)

async function sampleTransaction(tx) {
    const assetRegistry = await getAssetRegistry('org.example.basic.SampleAsset');
    const data = await assetRegistry1.get("1");
    const value = tx.value;
    updateValue(data, value);

    if(value < MAX){ //MAX=10000
        data.value2 = MAX;
    }
    else{
        data.value3 = value;
    }
    await assetRegistry1.update(data);
}

function updateValue(data, value){
    data.value = value;
}

(注意,我保留了函数结构只是为了显示等价物,但可以轻松删除 updateValue)