2

我如何将标准的Substrate 外部格式解码为一个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 cratesr_io :panic_impl.目前不存在。

如果我理解正确,它不起作用,因为Vec没有实现parity_codec::Inputtrait,对吗?如果是这样,如何将这一特征添加到Vec?或者更好地说,我缺少 Substrate 框架的哪些功能,因此Input自动提供特征?

4

1 回答 1

0

如果是这样,如何将这个特征添加到 Vec ?

在您的代码中,您不能。出于连贯性的原因,Rust 表示类型 Y 的特征 X 的实现必须存在于 X 的 crate 或 Y 的 crate 中。

或者更好地说,我缺少什么来自 Susbtrate 框架的功能,所以输入特征是自动提供的?

如果您查看 Input trait 文档的“实现者”部分- 您会看到实现的每种类型都std::io::Read将实现Input.

正如评论所说,对您有用的实现是 on &[u8],它之所以存在是因为它实现了std::io::Read.

于 2019-05-17T19:37:23.577 回答