【问题标题】:"The collection is an inconsistent state." with nested NEAR collection“集合是一种不一致的状态。”带有嵌套的 NEAR 集合
【发布时间】:2020-11-26 07:54:51
【问题描述】:

我遇到了一个问题,即嵌套 NEAR 集合(在本例中为 TreeMap)可能会出现此错误:

集合状态不一致。之前的智能合约执行是否意外终止?

我使用的结构是这样的:

pub struct CollectionIssues {
    nested_treemap: TreeMap<AccountId, TreeMap<u128, String>>,
}

那么我们:

  1. 向内部和外部 TreeMap 添加条目。
  2. 删除出 TreeMap 的键(这里是 AccountId
  3. 尝试重新添加相同的条目。
  4. 收到上述错误。

我在这里提供了一个演示库:

https://github.com/mikedotexe/near-collections-issue

复制、克隆和运行./test.sh

【问题讨论】:

    标签: nearprotocol


    【解决方案1】:

    问题在于TreeMap 是如何创建的。初始化集合时,需要指定唯一前缀。默认情况下,它使用全局自动增量。当集合被保存到状态时,它的前缀也被保存到状态,但全局自增计数器不会被持久化。因此,当您重新插入新地图时,它会使用不唯一的自增前缀值并与现有集合发生冲突。

    避免它的最佳方法是为使用TreeMap::new(unique_prefix) 创建的每个TreeMap 提供一个唯一前缀。在您的情况下,唯一前缀可以是env::sha256(account_id),作为第一个集合中的键。

    FungibleToken 实现中的示例:https://github.com/near/near-sdk-rs/blob/ac8c849fba6b912a5ef46d156662b3e1f6b56894/examples/fungible-token/src/lib.rs#L43

    请注意如何为给定帐户初始化配额映射。

    【讨论】:

      猜你喜欢
      • 2014-01-30
      • 2018-08-02
      • 2011-10-11
      • 2021-01-26
      • 2022-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多