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



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

这是我的示例 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结构中,对密钥所做的任何写入都无法读回。Hyperledger composer 在与真实 fabric 实现一起使用时以及在模拟模式下使用时(例如在 composer-playground 中使用 Web 连接时(都受到同样的限制。 这是您在 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(

最新更新