Javascript hyperledger composer事务中父资产类型的getAssetRegistry失败

Javascript hyperledger composer事务中父资产类型的getAssetRegistry失败,javascript,hyperledger-fabric,hyperledger-composer,Javascript,Hyperledger Fabric,Hyperledger Composer,当我尝试在从基继承的资产的基类上的事务内部调用getAssetRegistry时,它失败了,因为ID为“asset:org.acme.model.PolygonMarble”的集合中有一个ID为“poly1”的对象不存在 调用changeOwner(org.acme.model.PolygonMarble#poly1,org.acme.model.Collector#owner2) model.cto: namespace org.acme.model asset Marble identif

当我尝试在从基继承的资产的基类上的事务内部调用
getAssetRegistry
时,它失败了,因为ID为“asset:org.acme.model.PolygonMarble”的集合中有一个ID为“poly1”的
对象不存在

调用
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(正如您最初发布的那样)的

你必须进去 org.acme.model.Marble#marble1,org.acme.model.Collector#owner2

这是因为您选择在函数中使用“大理石”资产注册表。您的建模事务也需要这样做——这就是您设置它的方式(即更新“大理石”资产注册表)

如果要更新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类对我来说很有效。 继承类的另一个步骤

/*@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);
  });
}

我说得对吗,它不像其他语言中的典型继承那样工作,在基类上定义的方法将在继承类中自动工作?模型确实观察到继承是的。请在此处查看更多->。它返回一个承诺,然后您就可以使用注册表了。这就是您在事务处理器代码中所做的。您试图更新的资源实例存储在注册表中(例如PolyCommarble-如果您愿意,这是区块链的一个视图),这是一个完全独立的资源注册表-到“大理石”注册表。但是在MABLE中定义的任何属性都是任何PolygonMABLE资源(正如您所定义的)所必需的。所以这是预期的行为。那么上面的答案有意义吗?是的。您要做的是获取传入资源的字符串(使用getFullyQualifiedType())。我将把它作为一个选项添加到我的答案中,这将验证您添加的答案(因为)。
/*@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);
  });
}