1

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

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

我正在使用的结构如下所示:

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

然后我们:

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

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

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

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

4

1 回答 1

1

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

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

这方面的例子是在 FungibleToken 实现中:https ://github.com/near/near-sdk-rs/blob/ac8c849fba6b912a5ef46d156662b3e1f6b56894/examples/fungible-token/src/lib.rs#L43

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

于 2020-08-06T15:53:48.623 回答