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