为什么我应该散列 Near Protocol Unordered_Map 中的密钥?
Why should I hash keys in the NearProtocol UnorderedMap?
在 Near NFT 示例中,为什么键在 account_gives_access
Unordered_Map 哈希中?
https://github.com/near-examples/NFT/blame/master/contracts/rust/src/lib.rs
pub struct NonFungibleTokenBasic {
pub token_to_account: UnorderedMap<TokenId, AccountId>,
pub account_gives_access: UnorderedMap<AccountIdHash, UnorderedSet<AccountIdHash>>,
pub owner_id: AccountId,
}
UnorderedMap
类型使用 trie。攻击者可以通过以下方式使 trie 失衡
反复将键推到 trie 上,从而推动一侧的深度
尝试深入。这会降低 trie 查找下面名称的性能
攻击者的。
缓解攻击的一种方法是存储密钥的哈希值。哈希将是
在可能的值之间平均分配。攻击者仍然可以执行
攻击,但生成特定的哈希值很难,所以一些协议说。
另一种缓解攻击的方法是使用 LookupMap
,它使用 AVL
树,它会自动重新平衡它的树。
这次袭击没有太大威胁。攻击者能做的最坏的事情是
通过重复支付存储成本来惩罚小范围的键值
将极其有限的键值范围推到 trie 的更下方。因此,大概
不值得支付散列密钥的费用。
然而,对于存储大量键、散列键或LookupMap
的树,可能仍然
值得考虑,因为很可能会导致不平衡的 trie。
回顾一下,我们回顾了以下之间的成本比较:
- 在存储和检索到
UnorderedMap
之前散列每个键
- 允许上述“攻击”
- 使用
LookupMap
而不是 UnorderedMap
感谢@MikePurvis 的解释。
在 Near NFT 示例中,为什么键在 account_gives_access
Unordered_Map 哈希中?
https://github.com/near-examples/NFT/blame/master/contracts/rust/src/lib.rs
pub struct NonFungibleTokenBasic {
pub token_to_account: UnorderedMap<TokenId, AccountId>,
pub account_gives_access: UnorderedMap<AccountIdHash, UnorderedSet<AccountIdHash>>,
pub owner_id: AccountId,
}
UnorderedMap
类型使用 trie。攻击者可以通过以下方式使 trie 失衡
反复将键推到 trie 上,从而推动一侧的深度
尝试深入。这会降低 trie 查找下面名称的性能
攻击者的。
缓解攻击的一种方法是存储密钥的哈希值。哈希将是 在可能的值之间平均分配。攻击者仍然可以执行 攻击,但生成特定的哈希值很难,所以一些协议说。
另一种缓解攻击的方法是使用 LookupMap
,它使用 AVL
树,它会自动重新平衡它的树。
这次袭击没有太大威胁。攻击者能做的最坏的事情是 通过重复支付存储成本来惩罚小范围的键值 将极其有限的键值范围推到 trie 的更下方。因此,大概 不值得支付散列密钥的费用。
然而,对于存储大量键、散列键或LookupMap
的树,可能仍然
值得考虑,因为很可能会导致不平衡的 trie。
回顾一下,我们回顾了以下之间的成本比较:
- 在存储和检索到
UnorderedMap
之前散列每个键
- 允许上述“攻击”
- 使用
LookupMap
而不是UnorderedMap
感谢@MikePurvis 的解释。