在事务中搜索特定资产

时间:2017-10-11 11:23:11

标签: hyperledger-composer

我尝试制作一个Composer事务,根据我作为事务参数引入的资产,它会搜索另一种类型的资产,以获得具有一些共同参数的资产。

型号:

namespace org.acme.sample

abstract asset Generic identified by ID {
 o String ID
 --> Owner owner
}

asset Asset1 extends Generic{
 o Boolean done
}

asset Asset2 extends Generic{
}

participant Owner identified by ownerID{
  o String ownerID
  o String ownerName
}

transaction Transaction {
  --> Asset2 in
}

所以,鉴于该模型,我想做的是以下(至少这样的事情):

function Transaction (tx){
  var aux = query('org.acme.sample.Asset1', {owner.ownerID : tx.in.owner.ownerID})
  aux.done = true
  return getAssetRegistry('org.acme.sample.Asset1')
   .then(function (assetRegistry) {
       return assetRegistry.update(aux);
   })
}

这比伪代码更接近于其他任何东西(我不相信查询的工作方式就像那样,但那是我最大的不确定性) 让我们假设查询足够精确,只能找到一个有效资产。

理论上,这将使得一个Asset1与参数中给出的Asset2具有相同的ownerID,并且它会改变它的完成布尔值。问题是,我尝试的一切都不会工作,我不知道如何在交易中使用这样的查询(我也尝试过单独的查询,但我没有运气使它工作)。

我希望有人能够帮助我:D

1 个答案:

答案 0 :(得分:0)

首先,您需要定义一个查询。您可以通过在Composer项目的主目录中添加queries.qry文件来完成此操作。例如,查询可以是这样的:

query getSpecificAsset1 {
  description: "Get a specific task with id"
  statement:
    SELECT org.acme.sample.Asset1
      WHERE (owner == _$ownerID)
}

然后,您可以在事务处理器函数中使用此查询,例如:

function updateAsset(tx) {
// tx.in.owner is the ID from Asset2
// this query will return a Asset1 with the same ID
  return query('getSpecificAsset1', { owner: tx.in.owner })
  .then(function (asset) {        
    var serializer = getSerializer();
    var json = serializer.toJSON(asset);
    json.done = true
    return getAssetRegistry("org.acme.sample.Asset1")
    .then(function(asset1Registry) {
      return asset1Registry.updateAll([json]);
    })
  })
  .catch(function(error) {
  // Add optional error handling here.
  throw new Error(error);
  });
}