向 Substrate 中的账户信息添加额外的数据字段

Adding additional data fields to account information in Substrate

对 Substrate 和 Rust 非常陌生。我对 ChainState 的理解是它有点像一个数据库,其中包含帐号(在本例中为 public 键)及其相关余额。在进行交易时,Substrate 基本上会检查您是否有足够的余额,如果有,交易就会成功。 (这与比特币中使用的 UTXO 方法不同。)

首先,如果我上面说的不对,请指正。

如果我是正确的(或至少接近),我想找到一种将其他数据与每个帐户相关联的方法。我注意到在演示中,帐户也与名称相关联,如 Alice、Bob 等。这是保存在 ChainState 中,还是只能存储在自己节点上的东西?

我正在尝试确定一种将附加数据与 ChainState 中的帐户相关联的方法。例如,我如何在 ChainState 中存储一个名字(如 Alice、Bob 等)(假设它们只存储在本地)甚至其他信息,例如账户所有者的生日,或他们最喜欢的作者,或者什么任意信息?

链状态只是所有事物的状态,不一定与账户 ID 相关联。它确实,除其他外,存储余额等等,是的,还有许多其他的东西,链条以这种或那种方式存储。

要添加自定义数据,您需要创建一个新结构(映射),然后将帐户 ID 映射到您想要的任何数据。例如:

decl_storage! {
    trait Store for Module<T: Trait> as TemplateModule {
        /// The storage item for our proofs.
        /// It maps a proof to the user who made the claim and when they made it.
        Proofs: map hasher(blake2_128_concat) Vec<u8> => (T::AccountId, T::BlockNumber);
    }
}

上面声明了一个存储映射,它将哈希与帐户和块号的元组相关联。这样,查询哈希将 return 这两个值。您也可以反过来将 AccountID 与其他值相关联,例如字符串 (Vec<u8>).

我建议您仔细阅读 this tutorial,我从中提取了上面的代码片段:它将向您展示如何将自定义信息添加到链中。

@Swader 的回答很好,范围很笼统。当我尝试关联更多类型的信息时,我将更多地研究这个答案。 (我投了赞成票,但看不到我的投票,因为我对 Whosebug 比较陌生,至少在这个帐户上是这样。)

经过更多搜索,我还找到了这个教程:Add a Pallet to Your Runtime. 这个 pallet 恰好专门添加了将昵称与帐户 ID 相关联的功能,这是我在问题中给出的示例。然而,@Swader 的回答更为笼统,因此更有用,也更准确地回答了我的问题。

顺便说一下,昵称以十六进制编码保存,返回时也是十六进制编码。检查十六进制编码是否实际上等同于设置的昵称的一种简单方法是访问 https://convertstring.com/EncodeDecode/HexDecode 并粘贴十六进制字符串,不带初始 0x。