父资产类型上的 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);
  });
}