Hyperledger Composer - 错误 8:RESOURCE_EXHAUSTED

Hyperledger Composer - Error 8: RESOURCE_EXHAUSTED

我在尝试更新与同一资产相关的两个资产时遇到错误。从 HL Composer v0.18.1 升级到 v0.19.4 后出现错误。

这里是模型:

asset Order identified by pullID {
  o String pullID
  --> PackCase caseNumber optional
}

asset PackCase identified by caseNumber{
    o String caseNumber
    --> Order[] orders optional
}

我想将 Order1 和 Order2 关联到 Packcase1。为此,我在交易处理器中使用此方法,它将订单插入 packcase.orders 数组并同时更新 order.casenumber 的引用:

function AssociatePackCaseToOrder(tx){

    tx.order.caseNumber = tx.packCase;
    tx.packCase.orders.push(tx.order);

    return getAssetRegistry(namespaceAsset+'.Order')
    .then(function(ordersRegistry){
        return ordersRegistry.update(tx.order)
        .then(function(){
            console.info("Order Updated");
            return getAssetRegistry(namespaceAsset+'.PackCase')
            .then(function(packCaseRegistry){
                return packCaseRegistry.update(tx.packCase)
                .then(function(){
                    console.info("PackCase Updated");
                })
            })
        })
    })
}

但是当我尝试连续两次调用此方法时,出现此错误:

Error trying invoke business network. Error: No valid responses from any peers.\nResponse from attempted peer comms was an error:
Error: 8 RESOURCE_EXHAUSTED: received trailing metadata size exceeds limit",
"stack":"Error: Error trying invoke business network. Error: No valid responses from any peers.
Response from attempted peer comms was an error: Error: 8 RESOURCE_EXHAUSTED: received trailing metadata size exceeds limit
at _initializeChannel.then.then.then.then.catch (/usr/lib/node_modules/composer-rest-server/node_modules/composer-connector-hlfv1/lib/hlfconnection.js:967:34)
at <anonymous>

有谁知道错误的原因是什么?

我认为您的代码存在问题,并且 RESOURCE_EXHAUSTED(这可能来自 grpc 消息大小限制)- 可能是您将对象分配给字符串的第一行。

目前(虽然您还没有发布事务模型)您正在尝试将订单(或集合)与 PackCase 相关联 - 您的代码一次显示它的一个事务(您更新每个资源的注册表).下面显示的代码将 casenumber 引用添加到订单并将订单 ID(FQ 标识符)推送到 PackCase 上的数组中。

所以有了这样的模型:

asset Order identified by pullID {
  o String pullID
  o String caseNumber optional
  --> PackCase packcase optional // this would make more sense naming-wise
}

asset PackCase identified by caseNumber {
    o String caseNumber
    --> Order[] orders optional    
    // o Order[] orders optional   // alternative, see below.
}

transaction acpto {
  --> Order order
  --> PackCase packCase
}

您的交易码是这样的:

/**
     * Associate the Packcase to order
     * @param {org.acme.mynetwork.acpto} tx - the tx to be processed
     * @transaction
**/



function AssociatePackCaseToOrder(tx){

   var namespaceAsset = 'org.acme.mynetwork';
    tx.order.caseNumber = tx.packCase.getIdentifier(); // eg. '1'
   console.log(" case ref is " +  tx.packCase.getIdentifier() ); 
   console.log(" order ref is " +  tx.order.getIdentifier() );

 //  tx.order.pullID  = tx.order.getIdentifier(); // because its a relationship, will still have the FQ identifer hence commented out FYI


    if(tx.packCase.orders == null) {
        tx.packCase.orders  = []; // initialise
    }

    tx.packCase.orders.push(tx.order);

    return getAssetRegistry(namespaceAsset+'.Order')
    .then(function(ordersRegistry){
        return ordersRegistry.update(tx.order)
        .then(function(){
            console.info("Order Updated");
            return getAssetRegistry(namespaceAsset+'.PackCase')
            .then(function(packCaseRegistry){
                return packCaseRegistry.update(tx.packCase)
                .then(function(){
                    console.info("PackCase Updated");
                })
            })
        })
    })
}

你的方法:--> Order[] orders optional

{
      "$class": "org.acme.mynetwork.PackCase",
      "caseNumber": "5",
      "orders": [
        "resource:org.acme.mynetwork.Order#1",
        "resource:org.acme.mynetwork.Order#2",
        "resource:org.acme.mynetwork.Order#3"
      ]
    }

备选方案Order[] orders optional

为订单 1、订单 2 和订单 3 提交 3 笔交易后,您将在 PackCase 资产中获得:

{
  "$class": "org.acme.mynetwork.PackCase",
  "caseNumber": "3",
  "orders": [
    {
      "$class": "org.acme.mynetwork.Order", 
      "pullID": "1",
      "caseNumber": "3"
    },
    {
      "$class": "org.acme.mynetwork.Order",
      "pullID": "2",
      "caseNumber": "3"
    }
    {
      "$class": "org.acme.mynetwork.Order",
      "pullID": "3",
      "caseNumber": "3"
    }
  ]
}

可以这么说,订单案例编号已使用 PackCase 中的案例参考编号更新。