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

时间:2018-02-05 12:03:06

标签: javascript hyperledger-fabric hyperledger-composer

当我尝试在资产的基类上的事务内调用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);
  });
}

此案例没有明确记录,但是它是预期的行为吗? 它与典型的继承用例的预期有很大不同吗?

2 个答案:

答案 0 :(得分:1)

谢谢,所以我认为用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);
  });
}

答案 1 :(得分:0)

所以给出你当前的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

到你的交易,它应该工作