parity_codec::codec::Input не реализован для Vec<u8> при декодировании внешнего объекта в структуру
Как бы я расшифровал стандартный внешний формат субстрата в Transaction
объект таким образом, что было бы возможно получить Sender
желательно в виде строки?
Я начал с этого кода с жестко закодированных образцов внешних данных для тестирования в extrinsic_hex
переменная:
use hex::decode;
use hex_literal::hex;
use parity_codec::{Decode, Encode, Input};
use primitives::generic::UncheckedMortalExtrinsic;
use std::fmt;
use std::fmt::Debug;
fn main() {
let extrinsic_hex: &'static str = "81ffd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d3c6b8941e2976034e67bdd1a999c3eff4403c8ceaf717f18d9760ab18573ab2ce870e9b751c2f14dd9883e54746e1eb6639978ceab49968c25176cc0d2507205040003000ca10f";
let result = hex::decode(extrinsic_hex);
match result {
Ok(v1) => {
let extr_option = UncheckedMortalExtrinsic::decode(&mut v1);
()
}
_ => {
println!("Error decoding");
()
}
}
}
Я получаю ошибку:
error: duplicate lang item in crate `sr_io`: `panic_impl`.
|
= note: first defined in crate `std`.
error: duplicate lang item in crate `sr_io`: `oom`.
|
= note: first defined in crate `std`.
error[E0277]: the trait bound `std::vec::Vec<u8>: parity_codec::codec::Input` is not satisfied
--> core/decaddr/src/main.rs:13:20
|
13 | let extr_option=UncheckedMortalExtrinsic::decode(&mut v1);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `parity_codec::codec::Input` is not implemented for `std::vec::Vec<u8>`
|
= note: required by `parity_codec::codec::Decode::decode`
Давайте представим, что ошибка error: duplicate lang item in crate
sr_io:
panic_impl.
не существует на данный момент.
Если я правильно понимаю, это не работает, потому что Vec
не реализует parity_codec::Input
черта, я прав? Если да, то как бы добавить эту черту Vec
? Или лучше сказать, какие функции из структуры субстрата мне не хватает, поэтому Input
черта автоматически предоставляется?
1 ответ
Если да, то как добавить эту черту в Vec?
В вашем коде вы не можете. По причинам согласованности, Rust говорит, что реализация признака X для типа Y должна существовать в ящике для X или в ящике для Y.
Или лучше сказать, какие функции из среды Susbtrate мне не хватает, поэтому автоматически вводится входная черта?
Если вы посмотрите на часть "Реализаторы" документации черт Input - вы увидите, что каждый тип, который реализует std::io::Read
будет реализовывать Input
,
Как говорится в комментариях, полезная для вас реализация - это &[u8]
, который существует, потому что он реализует std::io::Read
,