Hyperledger Fabric javascript 链码读取瞬态数据

Hyperledger Fabric javascript chaincode read transient data

我正在从 hyperledger fabric 节点应用程序传递一个 json 对象并将其转换为缓冲区,如下所示:

const transientData = (transient && transient.length > 0) ? {data: Buffer.from(JSON.stringify(transient[0]))} : null;

然后将此 transientData 传递给请求对象,如下所示:

        let request = {
            chaincodeId: smartContractName,
            fcn: funcName,
            args: args ? [JSON.stringify(args)] : [],
            chainId: channelName,
            txId: tx_id,
            collection-config: collections,
            transientMap: transientData
        };

问题是,当我尝试将此瞬态映射接收到链代码中并尝试使用 transientData.get('data').toString() 将转换后的缓冲区记录为字符串时,它显示以下输出:

ByteBufferNB(offset=1029,markedOffset=-1,limit=1222,capacity=1222)

但是,我期待的是字符串对象。我无法将此 ByteBuffer 转换为字符串。 我还尝试打印此缓冲区,它显示以下输出:

ByteBuffer {
  buffer: <Buffer 0a c6 07 0a 91 01 08 03 10 01 1a 0c 08 df ef ca f8 05 10 80 bf df 80 01 22 0c 61 73 73 65 74 63 68 61 6e 6e 65 6c 2a 40 66 61 32 36 33 61 32 30 65 61 ... >,
  offset: 1029,
  markedOffset: -1,
  limit: 1222,
  littleEndian: true,
  noAssert: false }

如有任何建议,我们将不胜感激

更新:当我记录 transientData.get('data').buffer.toString() 的输出时,它显示了以下输出:

�
�
������߀"
        assetchannel*@fa263a20eaf15aac5eeac0ad2056a25193acc66f05c3316f1ee8d5062ac75de8:
                                                                                        assetccB �_찣ݹ��,R�Z���眕ӳ8v�pP�
�
+
)       assetcc��
submitTransactionReqLock�
data�{"sonefield":"T08700d-5c63-49a2-914f-535fd1abb045","collection":"xxxx","xxx":"xxx","xxxx":"xxx xx xxxx,"locked":false}

这不应该被标记为结构问题。纯js问题 使用 toString('utf8') 而不是 toString() 您需要明确指定编码。 参见 https://github.com/protobufjs/bytebuffer.js/wiki/API

在此处发布解决方案,以供所有正在寻找答案的人使用。

我设法通过将 ByteBuffer 转换为 ArrayBuffer 来实现此功能。使用 ArrayBuffer,我创建了一个新的缓冲区对象,然后使用它。

const data = JSON.parse(new Buffer(transient.get('data').toArrayBuffer()).toString());