NEAR FunctionCall `args` 字段

NEAR FunctionCall `args` field

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

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

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

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

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

这是我们如何在浏览器端的 NEAR 索引器上解码它们的示例。

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;
        }
    }

Is this in developers hand and could be any binary format?

是的。

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

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

args 根本不限于任何格式,它们只是二进制 blob。您在 views.rs 中看到的是部分序列化数据,其中 args are expected to be in base64 encoding 因此它是一个 String (因此,它始终是 base64 数据;无论是 JSON,Borsh 序列化数据,或只是原始二进制 blob,例如 PNG 图像)