繁体   English   中英

基板 - 在此 scope 中找不到类型“Vec”

[英]Substrate - cannot find type `Vec` in this scope

我正在尝试使用基板节点模板示例并添加一些自定义结构。

但是,我收到以下编译错误:

“在此范围内找不到类型Vec

使用的结构示例(+ 相关特征以及我从哪里导入它们)是:

    use codec::{Encode, Decode};
    use scale_info::TypeInfo;

    // , WrapperTypeDecode, WrapperTypeEncode, TypeInfo
    #[derive(Encode, Decode, Default, Clone, PartialEq, TypeInfo)]
    #[cfg_attr(feature = "std", derive(Debug))]
    pub struct Image {
        // Note: Consider changing to JPG compression in the future
        pixels: Vec<Vec<(u8, u8, u8)>>,
        height: u32,
        width: u32
    }

但鉴于该基板需要大量的引导,我无法提供一个可行的示例。

我尝试的一件事是添加#[cfg(feature = "std")]应该启用 rust 标准std中定义的标准, Cargo.toml ,我不确定哪个。 但这没有帮助。

我的主要问题是......我该如何解决这个问题? 我在哪里错过了什么进口?

我的次要更重要的问题是为什么会发生这种情况? https://docs.substrate.io/tutorials/v3/kitties/pt1/教程vec! 并且Vec似乎没有任何问题或进一步添加......或者更确切地说,我看到的一个添加是在所有使用vec!的 impl 块之前使用#[cfg(feature = "std")] 但不是在使用Vec之前。 为什么会这样? 这是否只是允许块从 rust 标准导入任何内容? 还是它指的是std中定义的Cargo.toml 为什么需要vec! 但不是Vec

#[cfg(feature = "std")]所做的是“如果我的 crate 的 Cargo 功能称为std已启用,请包含下面的代码块。这是条件编译的一种形式。显然,substrate 需要在 no 中构建代码-std 上下文也是如此。需要在 no-std 中运行的部分将无法使用 Vec。

首先,您不想在使用基板时启用std ,因为 SCALE 编解码器需要non-std ,这也启用了 wasm 编译。 更多关于 SCALE的信息

关于Vec ,您可能只是缺少使用一些frame_support板条箱,仅用于检查您提供的结构,我可以说的不多。 但是我会在这里给你关于底层文档的运行时存储的存储条目 并建议将您的代码与基板回购上的一些托盘进行比较,这样您就可以从其他使用Vec的托盘中看到您可能缺少的内容。 例如, 刻痕托盘将刻痕本身存储为Vec ,因此这可能是一个开始查找的好地方。

希望这足够有帮助。

看看 CRUST 平行链、 https://github.com/paritytech/substrate-lfs或其他 web3/IPFS 链下存储机制。

通常,您希望在链上存储尽可能少的 state。 直接存储图像数据(即使是高度压缩的 jpeg)可能不是一个很好的设计决策,因为它可能会变得非常昂贵(除非您的图像尺寸非常小)。

我通过在我的 runtime/Cargo.toml 的依赖项中添加default-features = false,来解决它

pallet-evm = { git = "https://github.com/paritytech/frontier", default-features = false, branch = "polkadot-v0.9.25" }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM