恢复单一资产历史记录

问题描述 投票:0回答:1

我正在尝试恢复单个资产的历史记录。该模型的定义如下所示

namespace org.example.basic

asset SampleAsset identified by assetId {
  o String assetId
  --> SampleParticipant owner
  o String value
}

participant SampleParticipant identified by participantId {
  o String participantId
  o String firstName
  o String lastName
}

transaction GetAssetHistory {
    o String assetId
}

event SampleEvent {
  --> SampleAsset asset
  o String oldValue
  o String newValue
}

我生成一个参与者,并引用前一个参与者的新资产。然后,我继续更新资产价值变量值。但是阅读有关资产更新的内容后,我发现了以下内容:

async function getAssetHistory(tx) {
    //How can I get a single asset history using the tx.assetId value??
    let historian = await businessNetworkConnection.getHistorian();
    let historianRecords = historian.getAll();
    console.log(prettyoutput(historianRecords));
}

当我部署bna并调用该函数时,我得到以下信息:

img在其他函数中,我使用RuntimeApi,但我不知道businessNetworkConnection是否是Runtime API调用。

关于如何获取单个资产历史记录的任何想法?互联网上有什么例子吗?

*****************更新

我更改了恢复特定资产历史记录的方式。执行以下操作:在js文件中

/**
 * Sample read-only transaction
 * @param {org.example.trading.MyPartHistory} tx
 * @returns {org.example.trading.Trader[]} All trxns  
 * @transaction
 */
async function participantHistory(tx) {
    console.log('1');
    const partId = tx.tradeid;
    console.log('2');
    const nativeSupport = tx.nativeSupport;
    // const partRegistry = await getParticipantRegistry('org.example.trading.Trader')
    console.log('3');
    const nativeKey = getNativeAPI().createCompositeKey('Asset:org.example.trading.Trader', [partId]);
    console.log('4');
    const iterator = await getNativeAPI().getHistoryForKey(nativeKey);
    let results = [];
    let res = {done : false};
    while (!res.done) {
        res = await iterator.next();

        if (res && res.value && res.value.value) {
            let val = res.value.value.toString('utf8');
            if (val.length > 0) {
               console.log("@debug val is  " + val );
               results.push(JSON.parse(val));
            }
        }
        if (res && res.done) {
            try {
                iterator.close();
            }
            catch (err) {
            }
        }
    }
    var newArray = [];
    for (const item of results) {
            newArray.push(getSerializer().fromJSON(item));
    }
    console.log("@debug the results to be returned are as follows: ");

    return newArray; // returns something to my NodeJS client (called via REST API)
 }

在模型文件中

@commit(false)
@returns(Trader[])
transaction MyPartHistory {
    o String tradeId
}

我创建了一个资产,然后使用其他值进行了更新。但是当我调用MyPartHistory时,我收到以下消息:

错误:本机API在Web运行时中不可用

hyperledger hyperledger-composer
1个回答
0
投票

仅当您在真实结构环境中运行业务网络时,才可以使用本机api。您不能在在线游乐场环境中使用它。您将必须设置一个真实的架构环境,然后在本地运行连接到该架构的游乐场以测试您的业务网络。

© www.soinside.com 2019 - 2024. All rights reserved.