在这里,我想根据条件在单个事务中对同一资产执行多个更新命令。
这是我的示例 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(