编者按:要想成为以太坊网络中的活动块和事务验证的参与者,用户必须运行以太坊节点。然而很多读者对以太坊节了解甚少,分不清什么是“全节点”、“轻节点”以及“归档节点”,什么样的人需要运行这些节点,对于运行这些节点所需要的成本、占用的内存情况也并不清楚。因此我们编译了 Ryan Todd 的这篇文章,以飨读者。
要点总结:
要想成为以太坊网络中的活动块和事务验证的参与者(Dapps、矿工、Infura等),当前运行全节点所需的磁盘大小为 130—150GB;
以太坊链的大小的增长是众所周知的(+200% Y/Y),但是大小本身并不是唯一的问题,因为完全同步的节点需要不断的加密链接验证才能确认交易;
运行一个全节点的成本在终端用户中会有很大差异。对于用户而言,可以在 AWS 上运行一个完整的节点,成本是每月50- 100美元;甚至可以运行一个本地实例(大约 300 GB的SSD),成本最低是每月 30 美元;
考虑到以太坊上活跃节点的快速减少(自 2018 年初以来下降了约 66%),对于普通活跃的网络参与者来说,最小化信任的成本可能变得过高了。
什么是以太坊全节点?
围绕以太坊一个最大的困惑点是“全节点”(full nodes)、“轻节点”以及“归档节点”(archive nodes)之间的区别。
“全节点”是任何连接到以太坊网络的计算机或服务器,下载并存储整个区块链的全部状态,并可以为网络提供数据请求和块验证。
不过除非一个节点需要执行所有的交易或轻松访问历史数据,不然没必要保存整条链。通常,矿工会运行全节点,因为他们在挖矿过程中需要全节点执行交易以及访问历史数据进行验证。此外,全节点的另一个作用是网络安全与价值的守护者,一旦有算力叛变试图改变区块共识,全节点组成的网络可以拒绝掉这些交易。
“轻节点”只存储最小量的状态,只下载区块头和与其交易相关的默克尔树“分支”,只需要几百兆存储空间和 128-512M 内存,用于低容量设备,如移动设备、Dapp。
连接到以太坊网络时,可以使用全节点,也可以使用轻节点。但当发起转账、合约部署的时候,轻节点是不能独立完成的,他需要借助其他全节点以他的名义来操作。这一切本身并没有什么问题,但当遇到交易量急剧上升,区块链升级的时候,它会找不到合适的全节点给它使用。实际上,轻节点就像一个“吃白食的人”,因此在业务上使用的时候,建议使用全节点。
一个现实的案例是, 2017 年末,LES/2(Light Ethereum Subprotocol )发布——这是一项用于服务轻节点的协议升级。许多客户端切换了新的协议,但是仍然有重多旧的全节点仍然在运行旧的代码,这些代码并不支持升级,不少轻节点找不到一个与之兼容而且还留有位置的全节点导致瘫痪,Github Issues 上到处都是吐槽。
“归档节点”是全节点的特例,包含任何给定块上每个历史状态快照的数据归档。它只专注于全节点上的一些特定信息,比如事务跟踪、历史地址余额、智能合约创建,代码和代码中的历史更改、智能合约存储历史。归档节点是对上述信息进行快照,这些快照可以供区块浏览器和以太坊网络上的深度分析人员使用。事实上,只有少数终端用户(链上分析、审计员、区块浏览器等)需要存档节点。
主要的节点客户端是 Geth 和 Parity,它们都提供完整的节点实现:
Geth:默认的 Geth 同步设置,通过在填充块体和收据之前,将状态数据库的下载重新排序,实现更快的同步。
geth–syncmode full :一种较慢的 Geth 同步模式,验证从创世块(genesis)开始的所有块和事务。
Parity:默认的 Parity 同步模式,可以下载最近 30000 个“最佳块”(链上最后一个有着最大累计工作量的区块)和当前状态数据库的快照。一旦该快照同步,Parity 客户端将与先前历史保持完全同步——一旦该同步发生,Parity 默认节点将成为全节点。
parity-no-warp :一个较慢的同步模式,验证从创世块开始的所有的块和事务。
理论上,只要满足入口硬件和宽带要求,任何人都可以在计算机上运行一个完整的以太坊节点,来验证链上的事务和块。这些要求之所以五花八门,产生混淆,主要是由于对下载的数据总量以及维护节点同步所需的硬件和带宽需求有不同的看法。事实上,不同的节点客户端在进行节点实现时,都有自己的参数和配置要求,这是造成混淆的一个重要原因。
三种类型的以太坊节点,对终端用户和磁盘大小的典型要求:
简而言之,成为以太坊网络中活动块和事务验证的参与者(Dapps、矿工、Infura等),运行全节点所需的磁盘大小目前约为 130—150GB。
历史“状态”信息包括什么?
以太坊链的大小的增长是众所周知的(+200% Y/Y),但是大小本身并不是唯一的问题,因为完全同步的节点需要不断的加密链接验证来确认事务。这些证明,加上 5000 多万个地址帐户(以及它们各自的关联数据列表),构成了一个复杂的数据结构,称为 state trie。虽然有些人可能认为约 130GB 的内存相对来说不是太大(高端消费笔记本电脑的磁盘通常在 500 GB 到 1 TB 之间),但对一个需要完全同步的节点而言,持续的验证状态会不断增加节点的负担。
因此,在维护完全同步的节点时,需要考虑链路和状态大小的增长。目前的状态需求要求使用 SSD 驱动器而不是磁驱动器,而且在未来几年,链路和状态的增长速度可能会对硬件有新的需求。但是,这些问题可以在既定的 ETH 1.x 升级(缓存、数据结构等)中得到一定程度的纠正。
此外,虽然全节点包含区块链的所有核心组件(块、事务、日志和收据)的完整历史数据集,但“归档节点”在每个时间点都在维护这个核心信息以及区块链(跨越每个块高度)的额外“状态”。这些额外的“状态”信息包括:
事务跟踪(用于查看智能合约和由于合约上的计算而传播的事物之间的函数调用);
历史地址余额;
智能合约创建,代码和代码中的历史更改;
智能合约存储历史;
虽然只有少数终端用户(链上分析、审计员、区块浏览器等)需要存档节点,但这些用户还是会看到额外的数据要求,以存储超出一般链规模的“状态”相关信息。链上基础设施和数据提供商 TokenAnalyst 表示,与 TokenAnalyst 数据库中的信息相关的额外“状态”约为 640 GB。
为不同的用户运行全节点的成本是多少?
在终端用户中,运行一个全节点的成本会有很大差异。对于许多用户而言,用户可以在 AWS 上以每月 50—100美元的价格运行一个完整的节点,甚至可以以每月 30 美元的价格运行一个本地实例(大约 300 GB的SSD)。同时,对于少数需要运行规档节点的用户,2-3 TB的标准存档每月成本可以达到270 -370美元。
如果有极端的性能需求,一些用户需要最高效节点——它们可以在整个以太坊区块链上加速检索跟踪以及存储差异数据,这一过程不可避免的需要多个完全同步的专用于整个以太坊区块链上不同区块的归档节点,同样的成本也就会更高。举个例子,TokenAnalyst 在 12 月通过 AWS 进行快照——它们扩展到 95 个完全同步存档的 Parity 节点,每天花费大约3400美元。
需要注意的是,上面的成本不仅反映了节点,还反映了一些有助于简化数据管道和加速原始链上数据过程的第三代机器(tertiary machines)。此外,这种密集的设置最有可能是数据检索需求的案例研究——从整个区块链中获取每个可能的粒度数据点,包括大约两周时间内每个历史区块/时间点的状态。
此外,这些资源的很大一部分被用于从 230 万到 280 万区块中提取信息,以太坊在这些块中经历了 DDOS 攻击,该攻击基本上使区块链发生膨胀。
信任成本
虽然运行全节点确实允许用户独立验证网络的有效性,但它仍然要求你在某种程度上信任客户端实现(多数情况下是 Geth或Parity )。在这里,信任的真正含义是什么?我们认为,信任是指信任一组独立开发人员的工作,这些开发人员积极地在这些客户端上工作,尽管他们的代码不是绝对可靠的。
我们认为,真正的可信赖性和责任性,需要以可辨认的非散列格式导出完整数据,并自行验证“数字加起来” ——尤其是在链条重新组织、分叉和网络升级之后——并且不要将验证的重点放在相应的节点客户端( Infura 或 Etherscan)上。
然而,这需要大量的计算和硬件资源,并且对于使用一般笔记本电脑的普通用户来说变得越来越具有挑战性。考虑到活跃的以太坊节点在快速下降(自 2018 年初以来下降约 66%),对于普通活跃网络参与者而言,最小化信任的成本可能变得过高。
(星球日报注:以太坊的目标是创建一个“无需信任”或“信任最小化”的系统,但是仍然需要有人保证交易的安全。全节点就是这类网络守护者的角色。全节点越多,账本越多,对账本的验证就越多,普通用户就越能相信该账本。此时用户为信任付出的成本很低。
如果 用户对信息可信的要求更高,或者由于节点数量下降或变更导致用户不信任现有全节点,而选择自行验证交易与获取历史数据,这需要一定的计算和硬件资源,则为信任付出了更多成本。
再者对于全节点来说,如果一个节点一直与你交互,一直没有出问题,那么它对你而言,是一个比较可以信任的节点,若类似可信节点退出了网络,你需要寻找新的信任节点;同时找到之前需要自行验证大量历史数据。)
如果用户的最终目标是将信任降到最低,那么可以尝试连接到更多样化的节点客户端,使节点跨地理位置、客户端实现以及节点提供者变得更加多样化。
这种利用不同全节点和从归档节点提取、验证数据的组合,尽管成本要高得多,但它允许信任分散在不同的向量上。
对于许多 Dapp、矿商和基础设施提供商来说,目前一个完整的节点(大约130 GB)就足够了。