在锯齿 node.js 事务处理器中序列化状态数据的推荐方法?

Recommended way to serialize state data in sawtooth node.js transaction processor?

根据文档: “这对 select 序列化方案至关重要,该方案在事务执行、跨平台和序列化框架版本之间具有确定性。不强制执行有序序列化的数据结构(例如集合、映射、字典)应该避免。” https://sawtooth.hyperledger.org/docs/core/releases/1.2.6/architecture/global_state.html?highlight=deterministic

因为在javascript中大多数变量都是映射,所以不清楚应该如何存储数据。

因此,存储一般 JSON 数据似乎不是一个好主意,如:

context.setState({[address]:Buffer.from(JSON.stringify({key1:"value", key2:"value"}))});

虽然JSON.stringify在一定程度上是确定性的()

另外,可能不推荐使用 cbor 和 protobuff,因为它们不强制执行顺序:

“地图的 CBOR 数据模型不允许将语义归因于 key/value 对在地图表示中的顺序。” https://www.rfc-editor.org/rfc/rfc7049

“默认情况下,在同一协议缓冲区消息实例上重复调用序列化方法可能不会return 输出相同的字节;即默认序列化不是确定性的。” https://developers.google.com/protocol-buffers/docs/encoding

“地图值的连线格式排序和地图迭代排序未定义,因此您不能依赖地图项的特定顺序。” https://developers.google.com/protocol-buffers/docs/proto3#maps

从文档中我看到的唯一示例是存储具有特定格式的字符串: https://github.com/hyperledger/sawtooth-sdk-javascript/blob/master/examples/xo/state.js

或存储单个 cbor 编码值: https://github.com/hyperledger/sawtooth-sdk-javascript/blob/master/examples/intkey/handler.js

然而,这两种方法似乎都非常有限。

您应该开发一个辅助函数来执行字符串化的确定性版本,或者您应该考虑使用提供确定性字符串化的库,例如:json-stringify-deterministic (https://github.com/kikobeats/json-stringify-deterministic )