父资产类型上的 getAssetRegistry 在 hyperledger-composer 事务中失败
getAssetRegistry on parent asset type fails in hyperledger-composer transaction
当我尝试在资产基础 class 的交易中调用 getAssetRegistry
时,在从基础继承的资产上,它失败并出现错误 Object with ID 'poly1' in collection with ID 'Asset:org.acme.model.PolygonMarble' does not exist
致电changeOwner(org.acme.model.PolygonMarble#poly1, org.acme.model.Collector#owner2)
model.cto:
namespace org.acme.model
asset Marble identified by Id {
o String Id
--> Collector owner
}
asset PolygonMarble extends Marble {
o Integer sides
}
participant Collector identified by email {
o String email
}
transaction ChangeOwner {
--> Marble marble
--> Collector newOwner
}
script.js:
/*@param {org.acme.model.ChangeOwner} args -
* @transaction */
function changeOwner(args) {
args.marble.owner = args.newOwner;
return getAssetRegistry('org.acme.model.Marble').then(function(marbleRegistry) {
return marbleRegistry.update(args.marble);
});
}
这种情况没有明确记录,但这是预期的行为吗?
它与典型继承用例的预期有很大不同吗?
鉴于您当前的 TP(如您最初发布的那样)
/*
* @param {org.acme.model.ChangeOwner} args
* @transaction
*/
function changeOwner(args) {
args.marble.owner = args.newOwner;
return getAssetRegistry('org.acme.model.Marble')
.then(function(marbleRegistry) {
return marbleRegistry.update(args.marble);
});
}
你会(必须)通过
org.acme.model.Marble#marble1,org.acme.model.Collector#owner2
这是因为您选择在函数中使用 'Marble' 资产注册表。您的建模交易也期望 - 这就是您设置它的方式(即更新 'Marble' 资产注册表)。
如果您想更新 PolyMarble 注册表,那么您应该:
1) 更新您的模型
transaction ChangeOwner {
--> PolygonMarble marble
--> Collector newOwner
}
2) 将您的代码更新为:
/*@param {org.acme.model.ChangeOwner} args -
* @transaction */
function changeOwner(args) {
args.marble.owner = args.newOwner;
return getAssetRegistry(args.marble.getFullyQualifiedType())).then(function(marbleRegistry) {
return marbleRegistry.update(args.marble);
});
}
3) 使用上面的最新模型和交易代码更新您部署的业务网络
最后 - 显然,你会传入(和以前一样):
org.acme.model.PolygonMarble#poly1, org.acme.model.Collector#owner2
你的交易,它应该有效
谢谢,所以我认为用 getFullyQualifiedType()
替换硬编码的 AssetRegistry class 对我有用。
继承 classes.
的额外步骤
/*@param {org.acme.model.ChangeOwner} args -
* @transaction */
function changeOwner(args) {
args.marble.owner = args.newOwner;
return
getAssetRegistry(args.marble.getFullyQualifiedType()).then(function(marbleRegistry) {
return marbleRegistry.update(args.marble);
});
}
当我尝试在资产基础 class 的交易中调用 getAssetRegistry
时,在从基础继承的资产上,它失败并出现错误 Object with ID 'poly1' in collection with ID 'Asset:org.acme.model.PolygonMarble' does not exist
致电changeOwner(org.acme.model.PolygonMarble#poly1, org.acme.model.Collector#owner2)
model.cto:
namespace org.acme.model
asset Marble identified by Id {
o String Id
--> Collector owner
}
asset PolygonMarble extends Marble {
o Integer sides
}
participant Collector identified by email {
o String email
}
transaction ChangeOwner {
--> Marble marble
--> Collector newOwner
}
script.js:
/*@param {org.acme.model.ChangeOwner} args -
* @transaction */
function changeOwner(args) {
args.marble.owner = args.newOwner;
return getAssetRegistry('org.acme.model.Marble').then(function(marbleRegistry) {
return marbleRegistry.update(args.marble);
});
}
这种情况没有明确记录,但这是预期的行为吗? 它与典型继承用例的预期有很大不同吗?
鉴于您当前的 TP(如您最初发布的那样)
/*
* @param {org.acme.model.ChangeOwner} args
* @transaction
*/
function changeOwner(args) {
args.marble.owner = args.newOwner;
return getAssetRegistry('org.acme.model.Marble')
.then(function(marbleRegistry) {
return marbleRegistry.update(args.marble);
});
}
你会(必须)通过 org.acme.model.Marble#marble1,org.acme.model.Collector#owner2
这是因为您选择在函数中使用 'Marble' 资产注册表。您的建模交易也期望 - 这就是您设置它的方式(即更新 'Marble' 资产注册表)。
如果您想更新 PolyMarble 注册表,那么您应该:
1) 更新您的模型
transaction ChangeOwner {
--> PolygonMarble marble
--> Collector newOwner
}
2) 将您的代码更新为:
/*@param {org.acme.model.ChangeOwner} args -
* @transaction */
function changeOwner(args) {
args.marble.owner = args.newOwner;
return getAssetRegistry(args.marble.getFullyQualifiedType())).then(function(marbleRegistry) {
return marbleRegistry.update(args.marble);
});
}
3) 使用上面的最新模型和交易代码更新您部署的业务网络
最后 - 显然,你会传入(和以前一样): org.acme.model.PolygonMarble#poly1, org.acme.model.Collector#owner2
你的交易,它应该有效
谢谢,所以我认为用 getFullyQualifiedType()
替换硬编码的 AssetRegistry class 对我有用。
继承 classes.
/*@param {org.acme.model.ChangeOwner} args -
* @transaction */
function changeOwner(args) {
args.marble.owner = args.newOwner;
return
getAssetRegistry(args.marble.getFullyQualifiedType()).then(function(marbleRegistry) {
return marbleRegistry.update(args.marble);
});
}