---
title: "保护节点安全：从 Parity 迁移到 Geth"
description: "两大 Ethereum 节点软件提供商之一已停止支持其客户端。本指南通过 8 个步骤分享了将节点迁移到 Geth 的最佳实践。n"
---

# 保护节点安全：从 Parity 迁移到 Geth

‍

<ImageBlock
  src="https://media.alchemy.com/1703673175-post-parity-geth.jpg"
  alt="Ethereum 节点软件从 Parity 迁移到 Geth"
  width={2000}
  height={1005}
  caption="Alchemy 将把其 Ethereum 节点软件从 Parity 更新为 Geth。"
  priority
/>

[Ethereum 生态系统](https://www.alchemy.com/dapps/ecosystem/ethereum)目前主要依赖两家提供商来提供基础设施中最基本的单元：节点。其中一家机构 Parity Technologies 宣布将专注于其他项目，[停止开发](https://www.parity.io/parity-ethereum-openethereum-dao/)其 Ethereum 节点软件。我们 Alchemy 最近决定从 Parity 切换到另一个主要方案 [Geth](https://geth.ethereum.org/)，并建议你也这样做，因为它正由一个专职团队持续开发。迁移核心基础设施是一项关键且复杂的工作。凭借我们在 [Alchemy](https://dashboard.alchemy.com/signup?referral=affiliate:548fed5d-60b9-4530-89ef-28fa57ea280f) 多年来为全球顶尖公司提供基础设施的经验，我们编写了这份从 Parity 迁移到 [Geth](https://www.alchemy.com/overviews/what-is-a-geth-node-and-how-to-run-one) 的指南，分享最佳实践，帮助你顺利完成迁移。将这份指南分享给你的工程团队，可以帮助他们理清区块链节点的各种细节，确保你的核心基础设施平稳运行。

‍

# 背景

先快速回顾一下基础知识。区块链应用需要运行被称为“节点”的服务器，用于读写区块链数据。你可以把它们理解为存储区块链数据的数据库。

目前节点软件主要有两种选择：[Parity](https://www.parity.io/) 和 [Geth](https://geth.ethereum.org/)。构建和维护这两款开源节点客户端软件的团队都为整个区块链生态系统做出了巨大贡献，没有他们就没有今天的 Ethereum。我们 Alchemy 团队对两者都深表感激。

近期，从 Ethereum 区块链开发早期就持续做出巨大贡献的 Parity 团队，现在[转向专注于自己的链](https://decrypt.co/14857/parity-steps-back-from-ethereum-moving-client-codebase-to-dao)。

[Peter](https://twitter.com/peter_szilagyi) 和整个 [Geth 团队](https://github.com/ethereum/go-ethereum/graphs/contributors)出色地构建了一款卓越的 Ethereum 客户端，并仍在积极持续开发。

<ImageBlock
  src="https://media.alchemy.com/1704548121-chart-describing-the-distribution-between-the-ethereum-node-client-softwares.png"
  alt="描述 Ethereum 客户端软件分布情况的图表。"
  width={1159}
  height={688}
  caption="Eth 节点客户端分布(ethernodes.org/)"
/>

Eth 节点客户端分布情况 \([ethernodes.org/](https://ethernodes.org/)\)

‍

# 为什么应该迁移？

节点是每家区块链公司的核心基础设施。每当你的系统需要读取或写入区块链信息时，都要用到你的节点。

与传统的 Web 基础设施相比，区块链节点的管理要复杂得多，也更耗时。此外，由于同步时间的原因，搭建一个新节点可能需要数天甚至数周。这意味着一旦节点基础设施出现问题，你的产品可能会瘫痪数周。

为了确保你拥有稳定、健壮且可扩展的基础设施，运行一个持续维护的节点客户端至关重要。

Parity Technologies 已将 Parity Ethereum 代码库慷慨移交给他们新成立的 [OpenEthereum DAO](https://www.parity.io/parity-ethereum-openethereum-dao/)，我们期待在这个真正去中心化的组织形式下看到节点软件不断进步。相比之下，Ethereum 基金会有一支全职团队，将在可预见的未来持续构建和改进该软件。

使用一个持续开发的项目意味着 bug、稳定性问题、分叉以及其他未知挑战都能得到及时修复，软件也会不断改进。我们的建议是：强烈考虑将你的节点基础设施切换到 Geth。

这是一项相当复杂的工作，建议预留 2-4 周的工程时间来完成完整迁移。

最后，如果你更希望专注于打造核心产品，而完全不想处理底层节点基础设施，欢迎[联系我们](http://alchemy.com)。Alchemy 区块链开发平台从底层开始设计，旨在让每个人都能轻松构建出色的区块链产品。

好了，了解了背景知识之后，我们开始迁移吧！
‍

# 如何从 parity 迁移到 Geth

## 8 个步骤

1. 移除对 Parity 特有命名空间方法的依赖
1. 移除对 Parity **特有**响应字段的依赖
1. 移除对 API 针对错误请求的特定响应的依赖
1. 移除对 Parity 特有错误码的依赖
1. 搭建 Geth 硬件环境
1. 搭建 Geth 软件环境
1. 在节点上运行针对具体应用的流量模拟
1. 切换流量并监控服务

‍

### 1. 移除对 parity 特有命名空间方法的依赖

Parity 和 Geth 都实现了 Ethereum 基金会制定的通用 JSON-RPC Ethereum 协议集，并在此基础上各自实现了补充性的 API 方法。有一些 parity 命名空间方法，比如 _parity_allTransactions_，会返回 Parity 节点视角下所有待处理的交易。就功能而言，Geth 中不同的模块应该有对应的实现。就发往 Alchemy 的流量而言，Geth 中最大的缺失是 trace 模块，其方法已经被移到了[ debug](https://geth.ethereum.org/docs/rpc/ns-debug) 包中，你可以用类似的 _debug_traceTransaction_ 来替代常用的 trace 方法，例如 _trace_replayTransaction_。

‍

### 2. 移除对 parity 特有响应字段的依赖

尽管双方都尽力保持实现的一致性，但仍存在一些细微差异。请检查你是否依赖了某个在[ Geth 响应](https://gist.github.com/kunal365roy/b43ace0b0644bfd8df64ea9f6995bb00)中被省略的字段。我们曾在实际案例中见过有人依赖某些字段，例如 _eth_getLogs_ 返回的 logs 对象中的 transactionLogIndex 字段。

总体而言，我们观察到 Geth 为了维护节点健康，往往会对运行时间较长的调用进行截断并使其失败。

‍

### 3. 错误请求的响应差异

由于各种原因在 EVM（[Ethereum 虚拟机](https://www.alchemy.com/overviews/what-is-the-ethereum-virtual-machine-evm)）中执行失败的、格式正确的请求，在两者中的行为可能不同。请检查你是否依赖了 Parity 在错误请求中返回的 VM 执行错误，因为在 Geth 中这类请求通常会返回 0x 结果。以下是一些错误请求的示例：

- 提供的 _eth_call_ 区块号参数为 pending。
- _eth_getLogs_ 指定区块范围在节点中找不到
- 运行超过 5 秒的 _eth_call_ 会被 EVM 自动中断。

‍

### 4. Parity 特有错误码

一些客户端的重试机制依赖 Parity 特有的错误码来判断具体逻辑。请检查你是否依赖了在[ Geth 中可能发生变化](https://gist.github.com/kunal365roy/3c37ac9d1c3aaf31140f7c5faa083932)的错误码。更完整的 Parity JSON-RPC 错误码列表可在[此处](https://github.com/openethereum/openethereum/blob/master/rpc/src/v1/helpers/errors.rs#L39)查看。总体来说，这些错误在 Geth 中会损失一定的精确度，因此你需要一些客户端逻辑来处理这些情况。

‍

### 5. 搭建 Geth 硬件环境

Geth 节点应该可以在你此前用于 Parity 的同一套硬件上运行。根据我们的观察以及与 Geth 团队的讨论，有几个关键指标能帮助保持你新搭建的 Geth 节点的性能。需要密切关注两个系统指标：**_CPU 使用率_** 和 **_iowaits_**（系统写入磁盘的速率）。在实践中我们发现，这些指标与节点开始出现调用错误、无响应或整体进入降级状态之间存在很强的相关性。CPU 使用率和 iowait 的具体数值取决于你所使用的硬件。以[ EC2 m5.2x l](https://aws.amazon.com/ec2/instance-types/)arge 实例为例，对于归档节点，我们通常在 CPU 使用率约 65%、iowaits 约 1 次/秒时观察到性能开始下降。

‍

<ImageBlock
  src="https://media.alchemy.com/1704548307-graph-depicting-alchemy-internal-node-iowaits.png"
  alt="展示 Alchemy 内部 Geth 节点 iowait 情况的图表。"
  width={1243}
  height={259}
  caption="Alchemy 内部 Geth 节点 Iowait。"
/>

Alchemy 内部 Geth 节点 Iowaits 情况
‍

### 6. 搭建 Geth 软件环境

虽然比较少见，但我们确实见过 Geth 节点在随机的区块号上卡住同步的情况（未知区块号）。在这种情况下，最重要的是耐心等待，节点通常会在几小时内重新开始同步。

启动 Geth 进程有一些需要注意的细节，我们接下来会讨论。Geth 提供了大量的标志（flag）选项。**--pprof** 标志可以提供许多有用的指标，让你了解节点的健康状况，比如 peer 数量、_tx_pool_，以及默认在 9090 端口上暴露的其他大量有用信息。另一个需要注意的重点是：将终止信号指定为 KillSignal=SIGINT。我们发现 Geth 在重启时会出现问题，即 Geth 会回退到上一个区块，这是因为 Geth 在关闭时没有正确地将内存中的区块或状态刷新到持久化磁盘。

‍

### 7. 在节点上运行针对具体应用的流量模拟

我们观察到 Geth 中有一些方法的请求/响应格式与 Parity 版本相同，但行为略有不同。我们见过的一个真实案例如下：_eth_gasPrice_ 以及其他依赖 gasPrice 估算的方法，例如 Geth 中的 _eth_estimateGas_，使用的估算模型往往给出比 Parity 更低的 gasPrice 预测值。这会导致意外的交易失败，例如：Transaction gas price supplied is too low. There is another transaction with the same nonce in the queue. Try increasing the gas price or incrementing the nonce.（提供的交易 gas price 过低，队列中存在具有相同 nonce 的另一笔交易，请尝试提高 gas price 或递增 nonce。）你可以通过适当提高 gas price，或使用其他第三方数据源，比如[ ](https://ethgasstation.info/)[Eth Gas Station](https://ethgasstation.info/)来获取价格估算，从而缓解这一问题。

‍

### 8. 切换流量并监控服务

终于到了切换的时候！将你的流量切换到 Geth，并在接下来的几天里仔细监控。如果遇到任何其他意外问题，欢迎联系 Geth 团队，或者来找我们聊聊。

‍

## 想要更轻松的迁移方式？

希望这份指南能帮助你顺利完成从 Parity 到 Geth 的迁移过程！如果你有任何问题或遇到困难，欢迎随时联系我们——我们随时为你提供帮助。

此外，如果你想借助一个能大幅简化区块链应用构建和发布流程、无需处理节点管理等底层工作的平台来加速开发，欢迎来找我们聊聊！

在 Alchemy，我们从底层开始打造了[区块链开发平台](http://alchemy.com)，旨在让开发者的工作更轻松。现在，借助强大的开发者工具套件、7x24 小时支持，以及可全球扩展的全新区块链基础设施平台，你可以[节省数千小时](https://www.alchemy.com/case-studies)的开发时间，让你的应用[可靠性提升 107 倍](https://www.alchemy.com/case-studies/kyber-network)，并为用户打造[更好的产品](https://alchemy.com/case-studies/augur)[体验](https://alchemy.com/case-studies/zeroex)。欢迎[联系我们](https://www.alchemy.com/contact-sales)了解更多信息！

祝你迁移到 Geth 顺利。

现在是 2020 年，保持健康，也让你的节点保持健康！

‍

---

*点击[此处](https://dashboard.alchemy.com/signup?referral=affiliate:548fed5d-60b9-4530-89ef-28fa57ea280f)免费注册 Alchemy 账户。*

‍

#### 关于 Alchemy

[Alchemy](https://dashboard.alchemy.com/signup?referral=affiliate:548fed5d-60b9-4530-89ef-28fa57ea280f) 提供领先的区块链开发平台，为 197 个国家数百万用户使用的产品提供支持。Alchemy 平台凭借其全新的基础设施引擎以及无与伦比的开发者工具套件，让创作者能够以极短的时间轻松构建出色的区块链产品。该团队得到了斯坦福大学、[Coinbase](https://www.alchemy.com/dapps/coinbase)、Google 董事长、Charles Schwab，以及众多顶级科技和金融高管的支持，并凭借在 Google、Microsoft 和 Facebook 等科技巨头数十年的从业经验，在区块链开发和大规模可扩展基础设施方面拥有深厚的专业积累。
