2

在 中near_primitives::views, 上的args字段FunctionCall表示为一个String类型。从链式数据模型,也就是transaction::Action::FunctionCall,它的args字段有一个`Vec.

问题是,这个args字段是否总是包含一个有效的 JSON 有效负载作为内容?我们假设答案可能是 a No,因为底层字段包含纯字节。

在什么情况下这将是一个有效的 JSON 字符串,在什么情况下它将是一个二进制格式?

最后,如果二进制格式是可能的(可能),怎么可能解码它?这是在开发人员手中并且可以是任何二进制格式吗?

4

2 回答 2

2

大多数情况下args将是 base64 编码的 JSON 字符串。

这是我们如何在 NEAR Indexer for Explorer 端解码它们的示例。

ActionView::FunctionCall {
    method_name,
    args,
    gas,
    deposit,
} => {
    if let Ok(decoded_args) = base64::decode(args) {
        if let Ok(mut args_json) = serde_json::from_slice(&decoded_args) {
            escape_json(&mut args_json);
            arguments["args_json"] = args_json;
        }
    }

这是在开发人员手中并且可以是任何二进制格式吗?

是的。

Rainbow Bridge 相关事务具有无法解码为 JSON 的 borsh 序列化参数。

参考:https ://github.com/near/near-indexer-for-explorer/blob/master/src/models/serializers.rs#L94-L103

于 2021-10-04T16:53:03.147 回答
1

args完全不限于任何格式,它们只是二进制 blob。您在中看到的views.rs是部分序列化的数据,args预计将采用 base64 编码,因此它是一个String(因此,它始终是 base64 数据;无论是 JSON、Borsh 序列化数据,还是只是原始二进制 blob,例如 PNG 图像)

于 2021-10-04T17:02:37.710 回答