作者:Johnny Wang / 来源:medium
当前 Geth 预设的同步模式称为快速同步 ( fast sync )。理由是与其从 genesis 区块开始并重新处理所有发生的交易 ( 可能需要数周时间 ),选择快速同步可以很快的下载完区块且仅需验证相关的工作证明。下载所有区块是一个相对简单且快速的过程,许多人错误地认为因为他们的节点已下载了所有区块,所以他们目前的状态是同步的。
然而实际情况并非如此,因为这是一个还没有执行过任何交易(即没有执行任何交易以验证此区块链的有效性)的新节点,因此没有任何有效的的帐户状态( 即余额,随机数,智能合约代码等资料)。这些资讯需要另外下载并与最新的区块交叉检查,这个阶段我们称为 state trie download,它实际上与区块的下载同时进行,但需要比下载区块花更久的时间。
那么 state trie 究竟是什么?我们首先需要了解以太坊的网路结构。目前以太坊主网中存在大量的帐户并可追踪该地址或是合约的余额、随机值 ( nounce ) 等资讯。
但单靠帐户本身并不足以执行一个节点,帐户还需要以加密方式连接到区块,以便节点可以实际验证该帐户资讯是否被篡改。这个加密连接是透过在帐户上方建立一个树状资料结构来完成的,该结构的每个层级都将其下一层级汇聚成更小的一层,一直持续到此树状结构的唯一根( root )为止。这个包含所有帐户和中间加密证明的庞大资料结构被称为 State Trie。
像 Trie 这样的资料结构是由无数个加密证明 ( 又称作 Trie Nodes ) 相互连结而构成。因此要真正拥有同步节点,我们还需要下载所有的帐户资料以及所有的加密证明以验证网路的正确性。所以其本身就已经是一个相当复杂的资料集。
更麻烦的是,这个资料集的状态仍在持续地改变;以太坊每生成一个新的区块 ( 平均 15 秒 ) 就会从这个 trie 中剔除约 1000 个节点,并加入大约 2000 个新节点。这代表节点需要具有能以每秒 200 次的速度修改此 dataset 的能力才能完成同步。
当我们正在进行同步时,以太坊网路仍在不停更新,因此我们在初期获得的状态可能会在下载进行途中消失,进而导致节点需要不断地追踪网路状态,同时尝试收集所有最新资料。
很多人发现当同步已进行到只落后主网最新高度后几个区块,却不知道这仅仅是完成了区块链的主要下载阶段且仍在执行前面提到的状态下载。若要确认真实同步进度,需要透过日志中 ( 或是 nohup 日志 ) 导入的状态条目去观察。由于节点无法事先预知 state trie 有多大,所以它只能持续地执行,直到搜索及下载完所有的资讯。
原因是以太坊中的区块仅包含状态根 ( state root ),也就是根节点 ( root node ) 的一个杂凑值。启动同步后节点会开始从另一个节点下载区块,该节点最多可以再引用其他 16 个新节点。在下一阶段,初始节点将连结到约 16 个新节点并尝试下载。在下载进行的同时,这16个节点之中的多数节点将继续引入其他新的节点。这就是为什么有时候会发现区块的同步值一直停顿在相同的数字。事实上是它仍正在搜寻和下载 trie。这个状态同步的过程主要受于储存装置本身 I/O 的限制,而不是网路的频宽。
7,200 RPM SATA3(Serial ATA)的主流硬盘在容量上已经可达到3–4TB空间大小,售价相比SSD 通常也非常便宜,但在效能表现方面,亦即IOPS 数值,则大约落在75 左右。而 15,000 RPM SAS(Serial Attached SCSI)主流硬盘容量为 300–900 GB,虽然售价是 SATA 硬盘的好几倍,并且空间也小很多,但是其 IOPS 效能数值大约可达 175 左右。
以太坊中的 state trie 结构包含数亿个节点,其中大多数节点采用单一杂凑的形式,允许引用其他最多 16个杂凑。这是将资料储存在硬盘上的一种可怕方式,因为它几乎没有结构 ( 仅是随机数引用更多的随机数 )。关于这点,恐怕任何的底层资料库都会哭泣,因为它几乎无法以任何有意义的方式去优化资料存储与搜寻。
不仅资料的存储非常不理想,且由于每秒近200次的资料修改,我们甚至无法将其以任何一种正确的预处理方式去下载,使其能更快地被导入,同时让资料库也不需要频繁地反覆修改。最终的结果是,即使是采用快速同步,也会产生巨大的硬盘 IO 成本,这对一般机械式硬盘是相当大的负荷。
对照 SSD 接近 6000 IOPS 的效能执行表现,加上自身反应延迟极低,这些都是 HDD 没有的优势,这也是为什么我们很难在单一机械式硬盘上执行并同步一个全节点。机械式硬盘执行快速同步事实上将花费非常非常久的时间。即使你愿意等待到同步完成,HDD 恐怕也无法满足目前主网对交易处理的 IOPS 请求。
除了硬盘的类型及转速影响IOPS 效能数值外,还有磁碟阵列(Redundant Array of Independent Disks,RAID)的Penalty 和Cache 部分需要考量,因为不同类型的磁碟阵列RAID 模式,仍会影响到整体IOPS 效能数值。
在不考虑透过磁碟阵列提升 I/O 输出的情况下,机械式硬盘唯一的选择就是执行对系统资源影响最低的轻节点。但就执行全节点来说,SSD 目前是唯一选择。