【问题标题】:Substrate - cannot find type `Vec` in this scope基材 - 在此范围内找不到类型“Vec”
【发布时间】:2021-12-25 03:53:58
【问题描述】:

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

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

“在这个范围内找不到类型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")],它应该启用了锈标准Cargo.toml中定义的std,老实说,我不确定哪个。但这没有帮助。

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

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

【问题讨论】:

    标签: rust substrate


    【解决方案1】:

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

    关于Vec,您可能只是缺少使用一些frame_support 板条箱,仅用于检查您提供的结构,我不能说太多。但我会让你在这里存储基板文档的entry about runtime storage。 并建议将您的代码与substrate repo 上的某个托盘进行比较,这样您就可以使用Vec 从其他托盘中看到您可能缺少的内容。 例如,nicks pallet 将昵称本身存储为 Vec,因此这可能是一个开始查找的好地方。

    希望这对您有所帮助。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 2022-11-27
          • 2021-09-24
          • 2021-09-21
          • 2021-08-01
          • 2022-01-16
          • 2021-08-03
          • 2021-11-29
          • 2021-09-23
          • 1970-01-01
          相关资源
          最近更新 更多