发布于 2020-06-10 13:28:29
SSZ部分的思想是,任何SSZ类型( SSZ就是SSZ)都只是用来提供一个类型化的“视图”:您拥有可能存在的所有内容的类型信息,但是您可能只需要访问实际值的部分。
另外,由于SSZ的目标是为所有类型的数据提供merkle证明,所以一个部分也可以有一个merkle证明,但是只证明了包含在该部分中的数据子集。
要构建这些merkle证明,每个SSZ数据类型都有一种定义良好的方法将其表示为二叉树。
对于small数据片段,更常见的做法是将其表示为与值交互所用的任何编程语言中抽象的数据类型。然后,在值的合并过程中,它只在最后一分钟被转换为二叉树。
对于large数据段,像BeaconState类型一样,Eth2信标客户端开始缓存该树的部分,或者将其完全表示为树。这里的目的是使用持久化树(函数式编程概念)来共享在不同状态之间不发生变化的子树。
当您只需要一个数据块的a小子集时,您可以省略不需要的树的部分,同时仍然能够使用它,否则,这就是为什么它被称为“部分”。
此外,使用部分数据,您可以保留您修剪的不相关子树的根节点(称为“助手”或“兄弟”节点)。然后留给您想要读取的树的部分,以及允许您为感兴趣的数据构造merkle证明的辅助节点。
理想情况下,分部仍然具有相同的类型信息,因此您不必考虑merkle证明或从部分数据中提取值。它只是作为完整的类型工作,但您不能访问某些值,因为它们不是所选值的一部分。
当您尝试访问一些不存在的值子集时,部分的简单实现可能只会引发异常。更好的实现可以定义类型的哪些部分不可用,而当使用没有打破部分信息的限制时,则可以使类型与完整版本兼容。
现在,您可以在小数据类型和大数据类型之间进行混合:当您只想读取BeaconState字段和一些验证器(例如effective_balance of validators[0]和slashed of validators[23])的信息时,不需要提供完整的latest_block_header。相反,您只需要提供所需的信息,并提供一些“助手”节点来构造更大封装类型( BeaconState)的merkle验证。
这里的意图是,轻客户可以不信任地与信息,从一个更大的状态,以一种类型安全的方式,根本不考虑所需的默克尔证明。
TLDR: Eth2中轻型客户端的一种有效的任意merkle证明
为了更好地理解Eth2规范,我建议搜索“多重证明”(包含多个值的merkle证明的类型),对于高级用法,您也可以查找"SSZ类型扩展“( Eth2标头可以表示为块的一部分)。
我还在为一个新的SSZ规范(完全兼容,没有变化,只需扩展更多的信息)编写这个草案,以涵盖这些类型的高级SSZ特性。正在进行的工作可以在这里找到:https://github.com/protolambda/eth2.0-ssz。
https://ethereum.stackexchange.com/questions/74026
复制相似问题