РЯДОМ с полем FunctionCall `args`

#blockchain #near

Вопрос:

В near_primitives::views args поле на поле FunctionCall представлено как String тип. Из модели данных цепочки, то есть transaction::Action::FunctionCall в ее args поле есть » Vec.

Вопрос в том, всегда ли в этом args поле будут содержаться допустимые полезные данные JSON в качестве содержимого? Мы предполагаем, что ответ, вероятно, будет a No , поскольку базовое поле содержит чистые байты.

В каких обстоятельствах это будет допустимая строка JSON и в каких обстоятельствах это будет двоичный формат?

Наконец, если двоичный формат возможен (вероятно), как его можно декодировать? Это в руках разработчиков и может быть любым двоичным форматом?

Видеть

Ответ №1:

В большинстве случаев args это будет строка JSON в кодировке base64.

Вот пример того, как мы декодируем их на стороне БЛИЖАЙШЕГО индексатора для проводника.

 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(amp;decoded_args) {
            escape_json(amp;mut args_json);
            arguments["args_json"] = args_json;
        }
    }
 

Это в руках разработчиков и может быть любым двоичным форматом?

ДА.

Транзакции, связанные с радужным мостом, имеют сериализованные по боршу аргументы, которые невозможно декодировать в JSON.

ссылка: https://github.com/near/near-indexer-for-explorer/blob/master/src/models/serializers.rs#L94-L103

Ответ №2:

args не ограничены каким-либо форматом вообще, они просто двоичный двоичный объект. То, что вы видите в views.rs частично сериализованных данных, где args ожидается, что они будут в кодировке base64, таким образом, это a String (таким образом, там всегда есть данные base64; будь то JSON, сериализованные данные Borsh или просто необработанный двоичный двоичный объект, например, изображение PNG).