gpt4 book ai didi

substrate - decl_storage 中 `pub` 的用途是什么?

转载 作者:行者123 更新时间:2023-12-05 09:13:11 25 4
gpt4 key购买 nike

在substrate中实现runtime模块时,给定以下存储

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
}
}

AllKittiesCount 前面的pub 有什么用?因为无论有没有pub,polkadot UI 仍然可以查询到它,就好像它是一个公共(public)变量一样。

最佳答案

在这里稍微扩展一下,就像任何 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 来修改存储。

关于substrate - decl_storage 中 `pub` 的用途是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56599293/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com