decl_storage中的“ pub”的作用是什么?

时间:2019-06-14 13:33:16

标签: substrate parity-io

在基板中实现运行时模块时,应提供以下存储空间

decl_storage! {
  trait Store for Module<T: Trait> as CatAuction {
    Kitties get(kitties): map T::Hash => Kitty<T::Hash, T::Balance>;
    KittyOwner get(owner_of): map T::Hash => Option<T::AccountId>;
    OwnedKitties get(kitties_owned): map T::AccountId => T::Hash;

    pub AllKittiesCount get(all_kitties_cnt): u64;
    Nonce: u64;

    // if you want to initialize value in storage, use genesis block
  }
}

pub前面AllKittiesCount的目的是什么?因为是否存在pub,所以polkadot UI仍然可以查询它,就好像它是一个公共变量一样。

2 个答案:

答案 0 :(得分:3)

decl_storage!为每个存储生成一个结构,该结构实现指定的存储特征。

$vis指定此结构的可见性。

请注意:getter get($getter)是在模块上实现的公共函数,不受此$vis的影响。

注意:最后,所有模块都写入唯一的trie存储,因此仍然可以通过请求正确的键来访问值。

编辑:我可以补充一点,拥有一个存储公共结构的兴趣在于,然后其他模块可以使用Storage{Value, Map, ..}特性直接向其写入。

答案 1 :(得分:2)

要像任何Rust类型一样在此处进行扩展,您需要明确说明不同类型的可见性。 decl_storage宏会为您的每个存储项目生成一个struct。例如:

decl_storage! {
    trait Store for Module<T: Trait> as TemplateModule {
        Something get(something): u32;
    }
}

会导致(为清楚起见,删除了一些东西):

struct Something<T: Trait>(...);

impl <T: Trait> ... for Something<T> {
    fn get<S: ... >(storage: &S) -> Self::Query {
        storage.get(...).unwrap_or_else(|| Default::default())
    }
    fn take<S: ...>(storage: &S) -> Self::Query {
        storage.take(...).unwrap_or_else(|| Default::default())
    }
    fn mutate<R, F: FnOnce(&mut Self::Query) -> R, S: ...>(f: F, storage: &S) -> R {
        let mut val = <Self as ...>::get(storage);
        let ret = f(&mut val);
        <Self as ...>::put(&val, storage);
        ret
    }
}

如果您制作存储项目pub,只需在pub上插入一个struct Something标签。这意味着,您现在可以从其他模块调用该结构公开的所有这些函数,例如gettakemutate。否则,您将需要创建自己的公用函数,该公用函数公开用于修改存储的API。