而为了让无状态节点能够进行验证,以太坊 1.x 提出了以下三项主要改动,我们将逐一来进行介绍:
(1) 区块见证机制 无状态节点如何参与验证 简单来说,作法是:拥有全网状态资讯的「完整状态节点 Full State Node」在打包新区块时会一并产生「区块见证 Block Witness」,让没有保存全网状态的「无状态节点」能藉由区块见证提供的资讯对新区块进行验证。 什么是「区块见证 Block Witness」 前面提到,以太坊的资料结构是由约 5 亿个状态值所构成的 Merkle-Patricia Trie。然而,其中大约只有 0.1% 状态值(约 50 万个)会随着区块高度产生变化,如:个人帐户的 ETH 余额、合约底下记载的每个地址持有 Token 数量。99.9% 的状态值如:智能合约的程式码、Uniswap 手续费 0.3% 的参数等资讯一但智能合约部署完成便不会再进行更动。 由于一个新的区块(目前为 1,200 万 Gas Limit)至多只能容纳 571 笔交易,其涉及的状态值更改是十分有限的。那么一个没有储存所有状态值的无状态节点只要向拥有完整状态的节点请求涉及交易的相关状态值与未涉及到的 hash 值其实即可算出 Merkle Root 进行验证。 如下图所示,假设底层的 14 个菱形代表以太坊网络中所有的状态值,而新区块中仅有一笔交易,针对绿色的状态值进行更改,那么无状态节点其实只需要 1 个绿色的原状态值以及紫色的 Hash 值与其它未变动的 6 个Hash 值资讯即能透过 4 次 Hash 值计算,算出新的 Root Hash(Merkle Root),而不需要拥有所有的 14 个状态值来进行 9 次 Hash 值计算。 -图片来源:https://blog.ethereum.org/- 这些为了完成 Root Hash 计算所需要向拥有全网状态资讯的「完整状态节点(全节点)」请求的「最小资讯量」即为「区块见证 Block Witness」,包含了状态 Trie 中「不涉及变动的部分 Hash 值」与「涉及变动的原状态值」。如此一来,没有保存完整全网状态的「无状态节点 Stateless Client」将可以藉由请求而来的「区块见证」资讯计算出新的 Root Hash。 (责任编辑:admin) |