#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).