【问题标题】:Data structure for nested storage map嵌套存储映射的数据结构
【发布时间】:2021-11-08 13:24:08
【问题描述】:

下面的数据结构如何声明类型?

一个产品可以有很多候选人,每个候选人都有股份。但同一候选人可以留在不止一种产品中,具有不同的利害关系。我还需要从候选 ID 中查询权益,并从产品 ID 中查询候选 ID。

    #[pallet::storage]
    #[pallet::getter(fn governor_group)]
    pub type ProductId<T> = StorageMap<_, Blake2_128Concat, ProductId, Vec<CandidateId>>; 

    #[pallet::storage]
    #[pallet::getter(fn candidate_nominee)]
    pub type Stakes<T> = StorageMap<_, Blake2_128Concat, CandidateId, Stake>;

在上述代码中,每个候选人只能拥有一个股份。

在基板中不允许嵌套存储映射:

    #[pallet::storage]
    #[pallet::getter(fn governor_group)]
    pub type ProductId<T> = StorageMap<_, Blake2_128Concat, ProductId, Stakes>; 

【问题讨论】:

    标签: substrate polkadot


    【解决方案1】:

    我认为您正在寻找StorageDoubleMap

    这让你拥有:

    Key -> Key -> Value
    

    所以看起来像:

    #[pallet::storage]
    #[pallet::getter(fn governor_group)]
    pub type ProductId<T> = StorageMap<
        _,
        Blake2_128Concat,
        ProductId,
        Blake2_128Concat,
        CandidateId,
        Stakes,
    >;
    

    您可能需要介绍其他地图以阐明此双重地图的子上下文,或创建一些数据结构来保存您正在寻找的信息。

    请注意,我们支持使用StorageNMap 任意嵌套映射,这只会进一步扩展此概念。

    【讨论】:

    • 但是我想要productid (key1) 的候选ID (key2) 的数量(长度),我怎样才能得到呢?有什么功能吗?
    • 我还需要两个键来获取值,如何获取 productId 的所有候选 ID 和赌注?
    • 知道了,有一个函数叫做iter_key_prefix。谢谢。 crates.parity.io/frame_support/pallet_prelude/…
    • 您的第一个问题,您需要在单独的存储值中跟踪地图的长度。在运行时一次获取所有内容并不是一个好主意,这将是一个非常昂贵的存储读取操作,并且可能对您的链非常不利。如果您需要所有数据,则应该使用大小有限的 vec。如果这回答了您的问题,请将其标记为已回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-03
    • 2020-06-16
    相关资源
    最近更新 更多