无状态全节点(Stateless Full Node)

作者:扎克-赫斯, Zack Hess https://github.com/zack-bitcoin/amoveo-docs/blob/master/design/stateless_full_node.md amoveo-docs/stateless_full_node.md at master - zack-bitcoin/amoveo-docs

无状态全节点 #

共识状态是区块链以去中心化的无信任方式维护的信息。例如,你的账户余额是共识状态的一部分。没有人可以操纵你的余额,即使他们愿意花很多钱来做这件事。

无状态全节点策略是指全节点和矿池不需要为了验证区块是否有效而存储一份共识状态。

Amoveo自2018年3月推出以来,一直被设计为使用无状态全节点。

区块链网络中的节点种类 #


  • 轻节点。他们下载报头并验证Pow。他们可以验证你的账户余额证明并签署txs。
  • 无状态全节点。他们下载和验证区块,但只存储头文件。可以是一个矿池。
  • 共识状态的完整节点。他们下载和验证区块,但只存储头文件和共识状态。他们可以向轻型节点证明账户余额,并为任何人生成无符号的txs。
  • 归档的完整节点。他们下载和验证区块,并存储区块。

不通过硬盘验证一个的区块 #

无状态全节点中的区块验证过程。全节点验证头的PoW。一旦一个头是有效的,那么全节点就会下载该头的块。全节点扫描区块中的merkle证明,它对merkle证明的各块进行散列,以验证每个merkle证明是否有效,并建立一个小型的ram数据库,其中包括验证该区块中的txs所需的部分共识状态。最后,全节点可以检查该块中的txs是否有效。

平行验证区块 #

无状态全节点策略的一个优点是,全节点可以以任何顺序验证区块。由于全节点没有维护任何数据库来验证区块,它可以知道一个区块是有效的,而不需要记住关于之前区块的任何信息。因此,我们可以以相反的顺序验证区块,或者并行验证。

Amoveo目前默认是平行验证区块,有一个配置选项可以按相反顺序验证区块。反向验证区块意味着,如果发生分叉,你的节点可以立即查看与该分叉有关的区块,你不需要等待几个小时来验证历史,以达到分叉的目的。这大大降低了我们对全节点的CPU能力所需的安全系数。我们可以使用50%或更多的CPU能力来保持同步。

消极的方面 #

无状态全节点策略的最大缺点是,每个区块都需要包括处理该区块所需的所有共识状态的加密证明。例如,如果你想做一个tx来花掉你的一些钱,包含这个tx的区块需要包括你的余额的加密证明。这样,全部节点就可以确定你有足够的钱来负担你想花的金额。

在未来,我们可能会找到更有效的方法来向全部节点加密证明共识状态,但我们目前的策略是使用Merkle证明。这些Merkle证明是很大的,它们使一个典型的交易比原来大十倍左右。所以每笔交易在一个区块中占用的空间比在比特币中多10倍。这意味着一个使用无状态全节点策略的1兆字节的区块所能容纳的交易比普通比特币少10倍。

平行硬盘 #

今天,按顺序写入硬盘的速度可以非常快,甚至消费类产品也在每秒1千兆字节左右。这些硬盘可以在RAID中被微不足道地并行化,以提供我们需要的任何速度。

也可以使用有状态全节点的并行化数据库,但非常复杂。txs需要并行处理,所以有不同的线程想访问不同的硬盘来读/写数据页,如果他们想同时看不同的硬盘,他们可以。

没有随机的硬盘读/写 #

在大多数区块链中,交易处理的瓶颈在于对硬盘的读取和写入。这是因为当你处理一个区块时,你需要随机地读写散落在硬盘上的一点点数据。像这样到处读和写数据位,比顺序读/写慢3倍左右,即使你使用最佳页面大小。例如,在比特币中,当每个交易被处理时,它消耗了一些未用的输出,并创造了一些未用的输出。所以为了处理这个交易,全节点需要在其数据库中搜索那些被消耗的输出,并将其删除。而全节点需要将新的未花费的产出插入其数据库中。读取和写入这些未花费的产出来维护数据库是非常慢的。

计算无状态全节点的速度限制 #

无状态全节点设计中的交易需要一个merkle证明。Merkle证明的大小,对于一个二进制的Merkle树,其加密哈希值为32字节,系统中有1000亿个账户。322log2(1000亿) = 32236.5 = 2336字节 平均来说,我们每笔tx需要大约3个merkle证明。交易本身大约是400字节,因此,所有这些加在一起,每个tx被处理约为7.5千字节。

现代光缆每秒可发送100兆字节。因此,带宽限制是每秒100亿次txs。意味着地球上的每个人每秒都可以进行一次tx。

带宽不是区块链的瓶颈,因此拥有更大的区块和需要更多的带宽并不是一个问题。

共识状态全节点的比较 #

现代固态硬盘的随机读/写速度比连续读/写速度慢3倍左右,如果你读/写的是4千字节的最佳页面大小。

如果我们使用的是二进制merkle树,并且我们以4KB的最佳方式打包,那么这意味着数据库树的每个节点将有~64个孩子。如果树上有1000亿个账户,那么读/写将意味着访问log64(1000亿),或者大约6页。平均而言,我们需要在每个tx上读/写3个位置。(3个位置)

(6页) * (每页4千字节) = #

72千字节/tx。由于是随机读/写,它比顺序读/写慢3倍。所以这需要的时间和顺序写入216千字节一样多。有内存的完整节点需要读取所有内容,处理区块,然后写入所有内容的新版本。它在不同的步骤中读取和写入,给另一个2倍的缓慢系数。所以它需要的时间和432千字节的顺序一样多。

一个无状态的全节点在每个tx上需要大约3个merkle证明。证明的大小是log2(1000亿)。因此,每个tx大约7.5千字节。

432/7.5大约是60。因此,一个存储所有共识状态的无状态全节点,比一个存储共识状态的全节点的效率要高60左右。其中,效率是指在每个tx上读/写硬盘的总时间。

不存储区块的无状态全节点可以比归档节点便宜得多。非归档的无状态全节点永远不需要对硬盘进行读或写。

归档全节点的比较 #

无状态的全节点区块链,它们的txs每个大约是7.5千字节。相比之下,存储共识状态的区块链约为400字节。这意味着无状态全节点的区块约为40倍大。

如果我们存储2个月的区块,平均每个人每天做2次txs,有100亿用户,这意味着我们存储了大约1万亿txs。

所以有状态的全节点,档案节点将需要大约400兆字节的硬盘空间。一个拥有无状态全节点的区块链,每个档案节点需要7500兆字节的硬盘空间。

在无状态设计中,归档节点的成本明显较高,但预计归档节点将是网络中的少数,所以使用无状态全节点设计的网络的总成本可以更低。

矿池的比较 #

在无状态全节点设计中,一个矿池可以是一个无状态全节点。但在有状态的全节点设计中,一个矿池需要成为一个共识状态的全节点,这要昂贵得多。

在不存储区块的情况下验证区块的成本。

如果我们不断向区块链添加更多的用户,那么共识状态的总规模最终会变得非常大。对于有状态的全节点,它们需要访问所有这些共识状态,以便能够验证区块。如果有1000亿个账户,每个账户有64字节的merkle证明数据,和32字节的地址,以及少量的其他字节。那每个账户大约是100字节。所以我们需要10万亿字节的共识空间,或大约10兆字节。因此,一个10兆字节的固态硬盘是强制性的,只是为了验证区块,目前它们的成本远远超过1000美元。由于速度原因,可能需要在RAID中运行多个这样的硬盘,这使得成本更高。

相比之下,用于挖矿的无状态全节点需要大约1千兆字节的内存,以便能够验证区块,其成本约为10美元。

共识状态全节点的比较 #

在无状态的全节点策略中,共识状态的全节点可以存储他们感兴趣的任何部分的共识状态。所以这是一种分片的做法。我们可以将共识状态划分到不同的节点上,而任何一个单独的节点的内存需求都可以得到限制。

如果我们不使用无状态的全节点策略,那么每个cosnensus状态的全节点都需要存储整个共识状态,因为这是验证区块的唯一方法。对于一个全球区块链来说,这意味着一个10兆字节的硬盘。

在无状态全节点中并行验证Txs #

用于验证txs的ram内数据库的共识状态。我们可以在txs之间的不同点设置检查点,并且为每个检查点设置不同版本的ram内共识状态。这样一来,被这些检查点隔开的区域就可以被平行处理。在处理完一个区域后,全节点需要检查该区域的最终共识状态,它与该区域结束时的检查点数据一致。Amoveo目前没有并行验证txs,但我们有计划增加这方面的支持。

在无状态全节点中并行验证智能合约 #

并行验证智能合约与TXS并行非常相似。我们需要将智能合约的执行分割到一个以上的 tx 上。在这些txs之间,我们需要一个智能合约在该执行点的状态的检查点。在处理区块时,在智能合约的每个块之后,全节点需要验证智能合约的状态是否与检查点相符。

Amoveo使用的其他技巧使智能合约具有可扩展性 #

有人说,无状态的全节点只会让以太坊的可扩展性提高3倍,但这种设计将使Amoveo的规模远远超过这个数字。Amoveo的智能合约系统完全针对这种设计进行了优化。

Amoveo的智能合约系统是基于欺诈证明的。大多数智能合约都不需要上链,因为如果参与者对结果达成一致,他们可以在不需要区块链强制执行的情况下解决正确的结果。他们被激励在没有区块链的情况下解决他们的合同,因为使用区块链来执行结果对他们来说成本更高。相对于其他智能合约区块链,如以太坊,这大大降低了CPU成本。

Amoveo的智能合约系统使用Merklized抽象语法树。这意味着只有合同的实际执行部分才需要上链。与其他智能合约区块链(如以太坊)相比,这大大降低了CPU成本。

Amoveo的智能合约交易总是可并行的。不可能使它们成为单线程任务,就像在其他智能合约区块链中可能发生的那样,比如以太坊或任何使用EVM的区块链。这大大降低了Amoveo的智能合约系统的CPU成本。

相关链接 #

以太坊正在研究类似的想法