同时需要生成两个值,第一个叫 c,它是对 V 的承诺,代表的是此时该分片所有账户和账户里的余额。出块节点手中都握有 c,(可以对比 Merkle 树根来便于理解),它是将来用于验证的摘要。 第二个叫π(i),它是对 v(i) 是 V 的成员的证明,代表第 i 个账户及该账户的余额是在总账本 V 中。每个账户都握有且只握有自己的π(i),它是将来发送交易时提交给出块节点的 proof。 在初始化阶段,承诺和证明的生成是需要初始「状态」的。 2. 第一笔交易。账户 i 发起整个分片的第一笔交易,此时它需要把π(i) 和交易一起提交给出块节点,出块节点对π(i) 进行计算,看结果是否与自己手中的 c 相符合,如果一致就可以相信发送方账户确实有多少余额,并以此判断它提交的交易是否合法。 3. 接下来是关键之处:对 c 和π(i) 进行更新。 c (对整个账本的承诺)不再是根据状态生成,它是用第一笔交易发生之前的 c,以及第一笔交易引起的余额变动生成的;π(i)(账户对自己的证明)也不是根据状态生成,它是用第一笔交易发生之前的π(i),以及第一笔交易对该账户的改变生成的。 在完成 c 和π(i) 的更新之后,出块节点手中便有了可以承诺所有用户新余额的新承诺(新 c),账户手中也有了可以证明自己新余额的新 proof (新π(i))。 以此类推,每笔交易都会改变一次 c,改变一次全部π(i),但这种改变不再依赖于状态数据,它取决于旧的 c 和π(i),以及上一笔交易;当需要验证一笔新交易时,出块节点手中总有最新的 c,它通过 c 和账户提供的π(i) 就能判断某笔交易是否合法,是否可被打包进区块。 那么到这一步,就终于实现了「不需要账本就能记账」,不管对于出块节点,还是对于账户,它们手中握着的都是某种密码学的证明,而不是账本的状态。另需一提的是,无状态与分片似乎是绝配,但无状态并不是针对分片的一种设计,它是针对公链的一种设计。 aSVC 的设计目标是要成为一个高效的成员证明,降低上述过程中的通信开销和计算开销,使得这种方案可用于无状态区块链的实现。从论文来看,使用 aSVC 方案,c 和π(i) 的大小仅为几十个字节,π(i) 的更新时间为 O(1),验证时间也为 O(1),该方案还支持把多个 proof 聚合为一个 O(1) 大小的 proof,这种低开销的实现正是 aSVC 的意义所在。不过就像 Vitalik 在以太坊研究者论坛中展开的相关讨论,aSVC 还需要做进一步的优化。 文章的最后是对全文的简要总结:分布式系统的状态分片设计与密码学的成员证明设计相结合,实现以太坊 2.0 在性能上突破。 为了安全,以太坊 2.0 的状态分片需要随机分配出块节点。 (责任编辑:admin) |