提交交易时出错

Error when submitting transaction

我有一点不寻常的问题。以下代码适用于在线游乐场,但当我在本地部署的休息服务器上使用生成的 API 时,id 不起作用。尝试 post 交易时出现错误。 cto 文件:

namespace org.dps.track

asset Item identified by itemId{
    o String itemId
    o String name
    o String idgId
    o String serialNumber
    o String comment
    --> BU owner
    --> Item [] items optional
}

participant BU identified by buId{
    o String buId
    o String name
    o String country
    o String city
}

participant Assembler extends BU{
}

participant Manufacturer extends BU{
}

transaction Trade{
    --> Item item
    --> BU newOwner
}

enum status{
  o IN_TRANSIT
  o DEPARTURED
  o DELIVERED
}

链码:

/**
 * Sample transaction processor function.
 * @param {org.dps.track.Trade } trade - the sample transaction instance.
 * @transaction
 */
async function tradeCommodity(trade) {

    const factory = getFactory();
    trade.item.owner = trade.newOwner;
    var list = [];
    if (trade.item.items && trade.item.items.length > 0) {
        trade.item.items.forEach((asset) => {
        list.push(asset);
        });
    }  


    const assetRegistry = await getAssetRegistry('org.dps.track.Item');


    // persist the state of the current ITEM
    await assetRegistry.update(trade.item);

    for (var i = 0; i < list.length; ++i) {

         let res = await assetRegistry.get(list[i].getIdentifier());
         res.owner = factory.newRelationship('org.dps.track', 'Assembler', trade.newOwner.getIdentifier());
         // persist the state of the ITEM with new owner as a relationship
         await assetRegistry.update(res);
    }

}

尝试通过 Rest post 交易时 API 我收到错误:

{

  "error": {
    "statusCode": 500,
    "name": "Error",
    "message": "Error trying invoke business network. Error: No valid responses from any peers.\nResponse from attempted peer comms was an error: Error: transaction returned with failure: Error: Could not find any functions to execute for transaction org.dps.track.Trade#e4764be8e037c7186774512860c0cde6d7eaed5c301ddf36c4c1ab560577861a",
    "stack": "Error: Error trying invoke business network. Error: No valid responses from any peers.\nResponse from attempted peer comms was an error: Error: transaction returned with failure: Error: Could not find any functions to execute for transaction org.dps.track.Trade#e4764be8e037c7186774512860c0cde6d7eaed5c301ddf36c4c1ab560577861a\n    at HLFConnection.invokeChainCode (/home/bryczek/.nvm/versions/node/v8.11.3/lib/node_modules/composer-rest-server/node_modules/composer-connector-hlfv1/lib/hlfconnection.js:1002:30)\n    at <anonymous>"
  }
}

有谁知道哪里出了问题?非常感谢您的帮助。

您的问题是您的模型文件,而不是交易代码。在 ItemTrade

的关系字段中,您需要 Assembler 而不是 BU
  1. 您的资产应该是:

    asset Item identified by itemId{
            o String itemId
            o String name
            o String idgId
            o String serialNumber
            o String comment
            --> Assembler owner
            --> Item [] items optional
        }

因为 Assembler 是资源 class(不是 BU,它是扩展的 class - 没有用于此的注册表)。

  1. 您的交易 Trade 也应该反映相同的资源,即(不是 BU):

     transaction Trade{
            --> Item item
            --> Assembler newOwner
        }

除此之外,它应该可以与您现有的代码一起正常工作(已经针对 Fabric 网络对其进行了测试,在我的 REST API 中使用以下示例 Trade 事务,其中之前的所有者是 Assembler#1 并且它从 Itemitems 数组更改相关的 Items #1)

{
  "$class": "org.dps.track.Trade",
"item":"resource:org.dps.track.Item#1",
"newOwner":"resource:org.dps.track.Assembler#2"
}

我修改了模型文件,现在当我尝试生成 rest 时 API 我只得到系统(一般业务网络方法),没有项目、BU 和贸易 API,为什么会这样?

cto:

/**
 * New model file
 */

namespace org.dps.track


//asset section
asset Item identified by itemId{
    o String itemId
    o String name
    o String idgId
    o String serialNumber
    o String comment
    --> BU owner
    --> Item [] items optional

} 

//participant section
participant BU identified by buId{
    o String buId
    o String name
    o String country
    o String city
    o participantType type
}


//tranasaction section

transaction Trade{
    -->Item item
    -->BU newOwner
}

enum status {
    o IN_TRANSIT
    o DEPARTURED
    o DELIVERED
}

enum participantType{
    o Manufacturer
    o Assembler
}

抄送:

/**
 * Sample transaction processor function.
 * @param {org.dps.track.Trade } trade - the sample transaction instance.
 * @transaction
 */
async function tradeCommodity(trade) {

    const factory = getFactory();
    trade.item.owner = trade.newOwner;
    var list = [];
    if (trade.item.items && trade.item.items.length > 0) {
        trade.item.items.forEach((asset) => {
        list.push(asset);
        });
    }  


    const assetRegistry = await getAssetRegistry('org.dps.track.Item');


    // persist the state of the current ITEM
    await assetRegistry.update(trade.item);

    for (var i = 0; i < list.length; ++i) {

         let res = await assetRegistry.get(list[i].getIdentifier());
         res.owner = factory.newRelationship('org.dps.track', 'BU', trade.newOwner.getIdentifier());
         // persist the state of the ITEM with new owner as a relationship
         await assetRegistry.update(res);
    }

}