首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从链上实现Merkle

从链上实现Merkle
EN

Ethereum用户
提问于 2022-09-23 23:55:29
回答 1查看 52关注 0票数 1

我对Merkle和它的工作原理有基本的理解,现在我将它作为白名单验证来实现到我的智能契约中。

我将根存储在智能契约中,在智能契约中实现了验证功能(以验证为参数)。

使用smart契约进行验证,我们将调用smart契约中的验证函数,并通过验证。这就是困扰我的原因。为了得到证明,我们需要完整的叶子列表,生成一棵树,并得到证明。

实现这一点的最佳方法是什么?我心里有几个想法。

  1. 生成树,并得到每一个叶子的证明,存储在一个键值对中。当叶(键)需要验证时,获取证明(值)并发送到智能契约进行验证。
  2. 每当用户要求提供证明时,都生成树。

大多数教程不显示脱链部分。

希望你能帮我。

谢谢。

EN

回答 1

Ethereum用户

回答已采纳

发布于 2022-09-24 14:19:47

如果一组叶子是不可变的,这意味着一旦生成它们就不会改变(不会添加新的休假)。然后您可以在需要时生成特定休假的证据,然后缓存它。只在需要的时候生成证据,如果你知道它会经常被使用,你就可以缓存它。如果没有,就没有必要缓存它,它可以在需要时生成。

如果要经常使用任何叶子,那么您可以创建树并将它保存/缓存到某个地方,因此,当有人想要为特定的叶子生成一个证据时,他们可以在O(log n)时间完成它,这是非常有效的。

现在的问题是,如果要将更多的叶子添加到集合中,那么叶子集是否是可变的。因为您将不能简单地生成一次树并重用它。如果叶集已被修改,则每次要生成叶的证明时,都需要生成树,因为根会明显改变。

如果这组叶子将是可变的,那么契约就需要知道根目录何时发生变化并更新其根。

这是块链的优点之一,因为事务存储在一个不可变的块中,所以不需要每次都生成Merkle树。因此,检查您需要的需求,并验证这组叶子是否是不可变的,或者您是否可以做一些其他的事情来确保它们不会。

结论

如果叶子集是不可变的,那么只生成一次树,并且需要O(log n)来生成任何休假的证明。这是有效的,可以在任何时候完成。

为每一次休假保存证据是很浪费空间的。如果存储Merkle树,就不需要这样做,因为从它生成任何证据是非常有效的。

没有必要生成树,然后每次生成证明,除非这组叶子是可变的,我不建议您保留一组可变的叶子。检查您是否可以以某种方式避免它是可变的,并将它们组织在“块”中,以防需要。

票数 1
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/136258

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档