这会带来两大好处,一是不管节点被分配到哪个分片,它都可以立刻开始记账(出块)工作,几乎不用花费时间来获得以及同步该分片的账本,节点也因此可以在不同分片间轻松跳转;二是出块节点不需要存储账本,也就不需要高硬件配置,任何人抵押 32ETH 就能成为一个验证者,这非常有助于以太坊 PoS 的去中心化以及整个公链的安全。 但新问题跃然纸上:如果出块节点手中没有账本,它怎么知道交易发送方的钱够不够?密码学就在这时候登场了。 向量承诺:从查询到证明不需要账本就能记账听上去不可思议,但其思路是简单的:在以前,节点有账本,一笔交易来后它翻看账本,查询交易是否合法;在以后,节点没有账本,交易发送方在提交交易的同时需要提交一个密码学证明(为了区分,后文特指密码学证明时都用 proof 表示),自己证明自己的这笔交易是合法的。 可出块节点为什么能够通过一个 proof 来判断某笔交易是否合法?这里涉及到两个密码学的重要概念,第一个叫「成员证明」。它指的是通过某种方法,证明个体是群体的一部分。如果能够证明某个账户状态是整个账本状态的一部分,出块节点当然就能相信这个账户状态,并以此为根据进行交易合法性的判断。 第二个叫「向量承诺」,它可以将群体,不管这个群体有多庞大,压缩成仅仅一个数,然后给出成员证明,该成员证明表明的是某个个体是属于这个数背后所关联的群体的,且能证明个体在群体中的位置,以及进行证明的更新。 Merkle 树是可被用于向量承诺的方法之一,我们以它为例来看如何实现成员证明。 下图是一棵 Merkle 树,最下一层的叶子节点存储的是应用数据,其他非叶节点存储的是其子节点的哈希值。如果知道绿色节点和所有黄色节点的值,就可以从下至上进行三次哈希运算,得到该 Merkle 树根的值,也就是 6c0a。 那么,如果验证方手中有树根的值(6c0a),证明提供方把绿色节点的值和所有黄色节点的值作为一个 proof 给验证方,验证方是不是就能通过计算三次哈希的值是否等于 6c0a 来判断绿色节点的值是否在这棵 Merkle 树中?答案是可以。这就是对绿色节点属于 Merkle 树的成员证明,它是以向量承诺的方式完成的,而这也几乎就是比特币 SPV 节点(简单支付验证)的工作方式。 如下图所示,SPV 节点不存储完整的区块 / 账本,但存储了每个区块中 Merkle 树的树根(此 Merkle 树的叶子节点存储的是该区块所有交易),当它需要查询一笔交易是否存在时,会找全节点要一个该交易的 proof,该 proof 类似于上文中绿色节点和黄色节点值的一个打包(Merkle 路径),然后 SPV 节点会计算这些值的总的哈希值是否等于自己手中 Merkle 树根的值,如果相等,则说明这笔交易是该 Merkle 树的一个成员,即这笔交易是存在的。 (责任编辑:admin) |