parity_codec :: codec :: Input не реализован для Vec <u8> при декодировании внешнего объекта в структуру - PullRequest
0 голосов
/ 17 мая 2019

Как бы я декодировал стандартный внешний формат субстрата в 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? Или лучше сказать, какие функции из структуры Substrate мне не хватает, поэтому черта Input предоставляется автоматически?

1 Ответ

0 голосов
/ 17 мая 2019

Если да, то как добавить эту черту в Vec?

В вашем коде вы не можете. По причинам согласованности Руст говорит, что реализация признака X для типа Y должна существовать в ящике для X или в ящике для Y.

Или лучше сказать, какие функции из среды Susbtrate мне не хватает, поэтому автоматически вводится входная черта?

Если вы посмотрите на часть "Implemenors" документации черт Input - вы увидите, что каждый тип, который реализует std::io::Read, будет реализовывать Input.

Как отмечается в комментариях, полезной для вас реализацией является реализация на &[u8], которая существует, потому что она реализует std::io::Read.

...