---
# System prepended metadata

title: Ch05 运行一个闪电网络节点（译者完成）

---

# Ch05 运行一个闪电网络节点（译者完成）

| 所涉及的技术名词   | 翻译   |
| -- | -- |
| invoice | 发票 |
| initial block download | 初始化区块下载 |
| outbound liquidity | 出账容量 |
| inbound liquidity | 入账容量 |
| outbound connection | 出站连接 |
| inbound connection | 入站连接|
| submarine swap | 潜水艇互换 |
| dual-funded channels | 双向注资通道 |
| mutual close | 合作式关闭 |
| force close | 强制式关闭 |
| channel partner | 通道对手 |
| circular route | 环状路径 |


读到这里，你应该已经安装好了一个闪电钱包。在本章中，我们会迈进一步，安装一个闪电网络全节点。除了安装事宜，我们还会了解它的后续运营维护事宜。

下面这些因素可能会吸引你建立自己的闪电网络节点：

- 可以成为闪电网络的完整的、主动的参与者，而不仅仅是个终端用户
- 为了运行一家电子商务商店，或通过闪电支付接收你的收入
- 可以从闪电网络路由费或出借通道流动性中赚取收入
- 为闪电网络开发新的服务、应用或插件
- 可以提升你在使用闪电网络的时候的金融隐私性
- 可以使用基于闪电网络的一些应用，例如基于闪电网络的即时通讯应用
- 为了金融自由、独立和自治

运行一个闪电网络节点需要承担一些代价。你需要一台计算机、不间断的互联网连接、很大的硬盘空间以及许多时间！

但你从中学到的技巧是有价值的，可以应用在许多别的事情上！

开始吧！

|    |    |
| -- | -- |
| 注意 | 你应该让自己的预期建立在准确的事实上。如果你希望 *完全* 依靠闪电网络的路由手续费维生，请自己做好功课。将闪电网络节点变成一项能够盈利的业务 *并不* 容易。请使用表格计算你所有的初始投入和运营成本；仔细地学习闪电网络统计学。当前的支付额有多大？每个节点的交易额有多大？平均手续费率是多少？请浏览论坛并跟有真实经验的人请教。只有做过这些尽职调查，你才能形成有根据的意见。大部分人将发现，从运行节点中获得金融收入是难以实现的，但可以获得别的东西。|

## 选择你的操作系统

运行自己的闪电网络节点有许多方法，从放在家里的小型个人电脑，到专门的服务器，再到云计算平台上的托管服务器，都可以做到。要选择哪一种，取决于你的拥有的资源以及你愿意花费多少金钱。

### 为什么可靠性对闪电节点如此重要？

在比特币中，运行节点的硬件并不是特别重要，除非你要用自己的节点挖矿。Bitcoin Core 节点软件可以运行在任何符合最低要求的机器上，而且在接收单向支付时并不需要在线。即使一个比特币节点宕机了一段时间，用户只需重启节点；一旦节点连入了比特币网络，它就会重新同步比特币区块链。

但是，在闪电网络中，用户不论是发送 *还是* 接收支付，都必须在线。如果一个闪电节点下线了，它就无法接收来自任何人的支付，因此其公开的发票（invoices）也无法得到支付。此外，一个节点如果离线，其公开通道也将无法用于路由支付。你的通道对手会注意到你下线了、无法联系到你因此无法路由支付。如果你离线过于频繁，对方可能会觉得放在跟你的通道中的比特币没有得到有效利用，因此会考虑关闭通道。我们已经介绍过了一种协议攻击：你的通道对手会尝试向区块链提交较旧的承诺交易，以欺诈你。要是你离线了，而且没有监控你的通道，那么这种盗窃尝试就有可能成功；在时间锁超时之后，你就无力回天了。因此，可靠性对一个闪电节点来说是极为重要的。

上述差异在硬件故障和数据损失上同样成立。在比特币上，只要用户拥有自己的助记词（或者私钥）的备份，硬件故障就可能不是什么大问题。相关的比特币钱包以及其中的资金可以在新电脑上使用私钥轻松找回。绝大部分信息都可以从区块链上重新下载过来。

相反，在闪电网络中，关于用户的通道的信息，包括其中交换过的承诺交易和撤销秘密值，都是没有公开的，仅存储在用户自己的硬件上。因此，软件和硬件的故障可能会导致用户损失资金。

  
### 闪电节点的硬件类型

闪电节点的硬件主要有三种类型：

- 通用的计算机

  闪电节点可以运行在家用计算机或笔记本电脑上，Windows、macOS 和 Linux 操作系统都可以运行。一般来说会跟比特币节点一起运行。
  
- 专用硬件

  闪电节点可以运行在专门的硬件上，比如树莓派（Raspberry Pi）、Rock64 和 mini PC。这种方案一般会运行一套软件包，其中包含了比特币节点和其它应用。这种方案很流行，因为硬件可以仅用来运行和维护闪电节点，而且通常会有一个安装 “助手”。
  
- 预先配置的硬件

  闪电节点也可以运行在专门为之打造和配置的定制化硬件中。这种硬件会包含 “开箱即用” 的闪电节点解决方案，这种解决方案也可以作为一个工具或者包办式系统买到。


### 在 “云上” 运行

*虚拟的私人服务器（VPS）* 和云计算服务（比如微软 Azure、Google Cloud、Amazon Web Services、DigitalOcean）都非常便宜，而且可以快速搭建好。只需每月 20 美元到 40 美元之间的服务就可以承载闪电节点。

但是，有句名言说得好，“ ‘云服务器’ 不过就是别人的电脑。” 使用这样的服务意味着你让自己的节点运行在别人的电脑上。它既有好处也有坏处。关键的好处包括便利性、效率、运行时间甚至成本。云服务商可以提供很棒的在线时间和可用性，通常都会好于个人使用家用电脑所能达到的。如果你考虑到在许多西方国家，光是运行一台服务器的电费支出就要每个月 10 美元左右，再加上网络带宽的成本和硬件自身的成本，VPS 在经济上会显得很有竞争力。最后，使用 VPS，你不需要把电脑放在家里，因此也没有电脑的噪音、散热等等问题。另一方面，VPS 也有几样显著的缺点。运行在 “云上” 的闪电节点，总是不如运行在你自己电脑上的那么安全和隐私。此外，这些云计算服务都是非常中心化的。绝大部分这样的服务的硬件都座落在弗吉尼亚、森尼维尔、西雅图、伦敦和法兰克福。当网络说这些服务商的数据中心遇到问题的时候，它会影响所谓 “去中心化的” 网络上的几千个节点。

如果你有机会和能力在自己家里或者办公室里的电脑上运行节点，这应该比在云上运行要好。此外，要是没法运行在你自己的服务器上，请务必考虑在 VPS 上运行一个。

### 在家里运行闪电节点

如果你家里或者办公室有合适带宽的互联网连接，那么你肯定可以运行一个闪电节点。任何 “宽屏” 的连接都足以运行轻量级的节点（lightweight node）；如果网速很快，那么你可以运行一个比特币完全验证节点（Bitcoin full node）。

虽然你可以在你自己的笔记本电脑上运行一个闪电节点（甚至比特币节点），但它很快就会变得非常烦人。这些程序会消耗你的电脑的资源，而且需要 7 * 24 小时在线。你的应用（比如浏览器和表格应用）将会跟后台的闪电节点竞争你的计算机资源。换句话说，你的浏览器和其它前台应用会慢下来。而且，当你的文字处理应用让你的笔记本卡住的时候，后台的闪电节点也会慢下来，让你没法接收交易，甚至可能被攻击。此外，你还不应该关闭自己的笔记本电脑。所有这些，都让这种方案显得并不理想。这道理对你的日常使用的个人电脑也是一样的。

那么，大多数用户都会选择在一台专用的电脑上运行节点。好在你并不需要一台 “服务器” 级别的电脑。你可以在一个单主板的计算机上运行闪电节点，比如树莓派和 mini PC（市场上通常归类为 “家庭影院 PC”）。它们都是简单的计算机，常常用作家庭的自动化中心或者媒体服务器，比起 PC 和笔记本电脑也相对没有那么贵。为闪电节点和比特币节点专机专用的好处是它可以持续、安静地运行，在你的家庭网络中也不显眼，设备还可以藏在路由器和电视的后面。没人知道这么个小盒子参与了一个全球的簿记系统。

|      |                                                              |
| ---- | ------------------------------------------------------------ |
| 警告 | 不推荐在 32 位的操作系统 以及/或者 32 位的 CPU 上运行节点，因为节点软件会耗尽资源，导致宕机甚至财产损失。 |

### 运行闪电节点需要什么样的硬件？

运行闪电节点的设备至少需要满足下列要求：

- CPU

  充足的处理能力是运行比特币节点的前提，它会持续地下载和验证新区快。用户还需要考虑到，建立一个新的比特币节点需要运行初始化区块下载（IBD），这个过程可能会花费几个小时乃至几天。建议使用双核乃至四核的 CPU 。
  
- 内存

  2 GB 的内存将 *差不多* 能运行比特币节点和闪电节点。使用至少 4 GB 的内存会好很多。小于 4 GB 的内存运行 IBD 会非常吃力。但超过 8 GB 的内存是不必要的，因为对这些软件来说，CPU 是更大的瓶颈：它要运行诸如签名验证的密码学操作。
  
- 存储设备

  机械硬盘（HDD）和固态硬盘（SSD）皆可。运行节点的时候，SSD 会快很多（但是昂贵得多）。大部分的空间都会用来存储比特币区块链，大概在几百 GB。一种很好的取舍（只是复杂一些）是买一个小容量的 SSD 作为系统盘，大容量的 HDD 存储大体积的数据对象（主要是数据库）

|    |    |
| -- | -- |
| 注意 | 树莓派是运行节点的常见选择，因为它便宜而且较为容易获得。运行在这种设备上的操作系统是从一个安全电子卡（SD 卡）启动的。对于大部分应用场景，这都不是问题，但 Bitcoin Core（一种比特币节点软件）是出了名的吃硬盘读写（I/0 heavy）。所以你要确保把比特币区块链和闪电节点的数据目录放在额外的存储设备中，因为密集的 I/O 会导致 SD 卡出错。

- 网络连接

  可靠的网络连接是下载新的比特币区块的必需，也是跟其它闪电网络对等节点通信的必需。预计其数据用量会在每个月 10 到 100 GB 不等，取决于你的节点的配置。在启动的时候，比特币全节点要下载完整的区块链。
  
- 电源

  可靠的电源也是必需的，因为闪电节点需要全天候在线。电源故障可能导致处理中的支付出错。对于任务繁重的路由节点，备用电源（也叫无间断电源，UPS）也是有用的，可以应对电力故障。理想情况下，你的互联网路由器也应该连接 UPS。

- 备份
  
  备份非常关键，因为故障可能导致数据丢失，进而导致资金丢失。你应该考虑一些数据备份节点方案。可以是基于云服务的自动化备份，备份到某个服务器或者你控制的互联网服务。此外，也可以是自动化的本地硬件备份，例如第二块硬盘。最好是本地备份和远程备份都用。

### 切换云服务器的配置

在租赁云服务器的时候，在节点运行的两个阶段采用不同的配置往往能节约费用。在初始化区块下载阶段（比如第一天），需要更快的 CPU 和更快的存储媒介。但在区块链同步完成之后，CPU 和存储媒介的速度要求就小得多了，所以你可以将云服务器的性能降级到更经济的水平。

举个例子，在亚马逊云上，你可以在初始化区块下载期间使用 8 ~ 16 GB 的内存（RAM），8 核的 CPU（例如 t3-large 或者 m3.large），以及更快的 400 GB SSD（每秒的预分配 输入/输出 操作数 [TOPS] 可达 1000 以上）。一旦完成同步，你就可以将服务器实例切换成 2 GB 内存和双核 CPU（例如 t3.small），存储媒介也可以切换成通用的 1TB 机械硬盘。这跟你全程使用较慢的服务器的费用几乎相同，但它可以让你的节点更快跑起来（也许不到 1 天就行），无需等待大约一周的时间来完成初始化区块同步。

#### 永久数据存储（硬盘）

不论你使用迷你个人电脑还是租借一个服务器，存储空间可能都是最贵的部分，成本可能相当于电脑本身和连接性（数据）的总和。

我们来看另一种选择。首先，硬盘有两种，机械硬盘（HDD）和固态硬盘（SSD）。HDD 更便宜，SSD 运行起来更快；但它们在功能上都是完整的。

当前，最快的 SSD 使用 “非易失性内存主机控制器（NVMe）” 接口。NVMe SSD 在高端机器上运行速度更快，当然也更贵。传统的基于 “SATA（串行 ATA）” 的 SSD 更便宜，但就没那么快。SATA SSD  的性能对你的节点来说已经很够了。小体积的电脑可能无法使用 NVMe SSD。例如，树莓派 4 就无法从 NVMe SSD 中获益，因为其 USB 接口的带宽比较有限。

要选择存储媒介的大小，我们再看看比特币区块链本身。截至 2021 年 8 月，比特币区块链的体积是 360 GB，这里面包含了交易索引系统的体积；大概每年会增长 60 GB。如果要为未来的区块链增长留一些余量，或者你想在节点里安装别的数据，请购买至少 512 GB 大小的硬盘，1 TB 的硬盘更好。

## 使用安装助手

如果你不熟悉命令行运行环境，安装闪电节点和比特币节点的指南可能令你望而生畏。幸运的是，许多项目都制作了 “助手”，即帮助你安装和配置多种模块的软件。为了跟你的节点交互，你依然需要学习一些命令行指令，但大部分的起步工作都将由助手为你完成。

### RaspiBlitz

最流行也最完善的 “助手” 之一是 *RaspiBlitz* （[A RaspiBlitz node](https://github.com/lnbook/lnbook/blob/develop/05_node_operations.asciidoc#RaspiBlitz)），是由 Christian Rotzoll 开发的一个项目。它的初衷是安装在树莓派 4 上。RaspiBlitz 还推荐了一套硬件工具包，你只需几个小时就能把节点搭起来，最多不超过一个星期。如果你加入所在城市的闪电网络 “黑客松”，你很有可能看到许多人都在自己的 RaspiBlitz 机器上开发、交换意见以及互相帮助。你可以在[这个 GitHub 库](https://github.com/rootzoll/raspiblitz)里找到 RaspiBlitz 项目。

除了比特币节点和闪电节点，RaspiBlitz 还可以安装许多的附加服务，例如：

- Tor （作为隐藏节点运行）
- ElectRS （用 Rust 语言编写的 Electrum 服务端）
- BTCPay Server （密码货币的支付处理器）
- BTC RPC Explorer （比特币区块链浏览器）
- Ride The Lightning （管理闪电节点的图形界面）
- LNbits （闪电钱包/记账系统）
- Specter Desktop （Trezor、Ledger、Coldcard 和 Specter-DIY 等硬件钱包的多签名支持）
- lndmanage （高级的闪电通道管理功能的命令行接口）
- Loop （闪电通道资金的潜水艇互换服务）
- JoinMarket （CoinJoin 服务）

[![mtln 0501](https://github.com/lnbook/lnbook/raw/develop/images/mtln_0501.png)](https://github.com/lnbook/lnbook/blob/develop/images/mtln_0501.png)

图 1. 一个 RaspiBlitz 设备

### Mynode

[*myNode*](https://mynodebtc.com/) 是另一种流行的开源 “助手” 软件，支持许多比特币相关的软件。它很容易安装，你只需要把安装器 “刷入” 一个 SD 卡，然后用这个 SD 卡来启动你的迷你 PC 就可以了。使用 myNode 不需要显示器，因为管理工具可以通过浏览器远程访问。就算你的迷你 PC 没有显示器、也没有鼠标和键盘，你也可以通过另一台电脑、甚至你的智能手机来访问它。安装好了之后，访问 [http://mynode.local](http://mynode.local/) ，只需点两下鼠标，就可以创建闪电钱包和节点。

除了比特币节点和闪电节点，myNode 还可以安装许多额外的服务，例如：

- Ride The Lightning （管理闪电节点的图形界面）
- OpenVPN （虚拟的个人网络 [VPN] 支持，用于远程控制和钱包）
- lndmanage （高级闪电通道管理的命令行接口）
- BTC RPC Explorer （一种比特币区块链浏览器）

### Umbrel

*Umbrel* 因为其 用户体验/用户界面 而知名（可在 [Umbrel](https://github.com/lnbook/lnbook/blob/develop/05_node_operations.asciidoc#umbrel) 处看到），它提供了非常简单易行的办法，让你的比特币节点和闪电节点可以迅速启动，特别适合于初学者。它有一种非常独特的特性：在初始化区块同步期间，Umbrel 利用了 Neutrino/SPV 轻客户端特性，所以你可以立即开始使用你的节点。等到 Bitcoin Core 在后台完全同步了整条区块链时，它会自动切换过来，然后禁用 SPV 模式。Umbrel 操作系统可以运行在树莓派 4 上，也可以在所有基于 Linux 的操作系统、macOS 和 Windows 上的虚拟机中安装。你可以使用任意支持 Bitcoin Core P2P、Bitcoin Core PRB、Electrum 协议或者 lndconnect 协议的钱包连接自己的节点。

不必等待雨天过去，拿上 “[雨伞](https://getumbrel.com/)” 就可以出门。

[![The Umbrel web interface](https://github.com/lnbook/lnbook/raw/develop/images/mtln_0502.png)](https://github.com/lnbook/lnbook/blob/develop/images/mtln_0502.png)

图 2. Umbrel 网页接口

除了比特币节点和闪电节点，Umbrel 还会安装 Umbrel 应用商店，可用来安装额外的服务，例如：

- Lightning Terminal （用来管理通道流动性、Loop in 和 Loop out 的界面）
- Ride The Lightning （管理闪电节点的图形界面）
- Specter Desktop （搭配多签名和单签名比特币钱包使用的、仅可观察资金的协调器）
- BTCPay Server （密码货币支付处理器）
- BTC RPC Explorer （比特币区块链浏览器）
- ThunderHub （箭扣和管理你的节点）
- Sphinx Relay （处理 Sphinx Chat 的连接性和存储）
- mempool.space （可视化节点交易池及区块浏览器）
- LNbits （闪电钱包/记账系统）

Umbrel 当前还是 beta 版本，所以不能认为是安全的。

### BTCPay Server

虽然 *BTCPay Server* 的初衷不是成为安装 “助手”，而是一个电子商务和支付平台，但它也有一套非常简单的安装系统，使用 Docker 容器和 docker-compose 来安装比特币节点、闪电节点以及支付网关和其它服务。可以安装在许多硬件平台上，从树莓派 4（建议使用 4 GB 的版本）到迷你 PC，到旧的笔记本电脑、桌面电脑还是服务器电脑，都不在话下。

[BTCPay Server](https://btcpayserver.org/) 是一种功能完整、自主运行和保管的电子商务程序，可以集成许多电子商务平台，比如 WordPress、WooCommerce，等等。安装全节点只是安装这种电子商务程序的一个步骤。虽然开发的初衷是成为 *BitPay* 商业支付服务和 API 的 1：1 替代品，它一直在成长，现在变成了一种跟电子商务相关的比特币和闪电服务的完整平台。对大部分卖家和商店来说，它是一种一站包办式的电子商务解决方案。

除了比特币节点和闪电节点，BTCPay Server 当可以安装许多服务，包括：

- 自选为闪电节点使用 `c-lightning` 软件或是 LND 软件
- 支持莱特币（Litecoin）
- 支持门罗币（Monero）
- Spark server （搭配 `c-lightning` 的网页端钱包）
- Charge server （搭配 `c-lightning` 的电子商务 API）
- Ride The Lightning （管理闪电节点的网页端 GUI）
- 许多 BTC 分叉
- BTCTransmuter （支持货币兑换的 事件-动作 型自动化服务）

附加服务和特性的数量还在迅速增长，所以上面的列表只是 BTCPay Server 平台功能的一小部分。

### 使用比特币节点，还是轻量级闪电节点？

一项关键的选择是你的比特币节点软件及其运行模式。*Bitcoin Core* 是一种模范实现，是最广泛使用的比特币节点软件，但不是唯一的选择。另一种选择是 *btcd*，是一种 Go 语言的比特币节点实现。btcd 支持一些对闪电节点的运行很有帮助、但 Bitcoin Core 不提供的特性。

然后你要考虑的是，要运行一个 *归档* 的比特币节点（带有完整的比特币区块链拷贝的节点，这部分数据在 2021 年中的大小是 350 GB），还是一个 *剪枝* 比特币节点（仅保留最近一些区块的节点）。剪枝的比特币节点可以节省一些存储空间，但你依然要下载完整的区块链至少一次（也即依然要运行初始化区块下载）。因此它也无法节约很多网络流量。使用剪枝节点来搭配闪电节点依然是一种实验性的做法，也许不能支持所有的功能。不过，许多人都这样做，而且也成功了。

最后，你也可以完全不运行比特币节点。你可以使用 LND 软件的 “轻量级” 模式，使用 Neutrino 协议，从其他人运行的公开的比特币节点上检索区块链信息。使用这种模式意味着你在从比特币网络中索取资源，而且不提供任何回报。反过来，（如果你运行了比特币全节点）你也可以为闪电网络提供资源、作出贡献。跟运行比特币全节点相比，使用这种轻量级的闪电节点将显著节约网络带宽。

请记住，运行比特币节点使你可以支持其他服务，不仅仅是闪电节点。有些服务可能需要一个归档节点（剪枝节点不行），而且没有比特币节点就无法运行。请预先考虑你现在和未来会不会想要这些服务，以作出明智的选择。

这个选择的底线是：如果你可以负担得起一个大于 500 GB 的硬盘，请运行一个归档全节点。你将想比特币网络贡献资源，并帮到那些负担不起的人。如果你负担不起，那就运行剪枝节点。如果你的硬盘和带宽甚至无法支持一个剪枝节点，那么请运行使用 Neutrino 协议的 LND 轻量模式。

### 选择操作系统

下一步是为你的节点选择一个操作系统。绝大部分的互联网服务都运行在 Linux 操作系统的一些变种上。Linux 是互联网服务的好选择，因为它是一种强大的开源操作系统。但是，Linux 也有一条陡峭的学习曲线，而且要求使用者属性命令行运行环境。这些对新手来说会让人望而却步。

最终来说，绝大部分的服务都可以运行在任何新式的 POSIX（可移植操作系统接口）操作系统上，包括 macOS、Windows，当然也包括 Linux。你应该更多从你自己对操作系统的熟悉程度以及你的学习目标触发。如果你想拓展自己的知识面、学习如何操作一个 Linux 系统，这是一个很好的机会，因为你有具体的计划和清晰的目标。如果你只是想要让你的节点跑起来，那从你所知的开始就可以了。

也有许多服务以容器的形式交付，通常来说基于 Docker 系统。这些容器可以部署在许多操作系统上，从而抽象掉底层的操作系统。不过你可能还是需要学习一些 Linux 命令行指令，因为大部分容器都会在内部运行 Linux 的一些变种。

## 选择闪电节点软件

就像操作系统，选择闪电节点软件也应基于你对这些软件所用的编程语言和开发工具的了解。虽然这些节点软件彼此之前有一些特性上的差别，但这些差别是很小的，大部分的软件都收敛在由 “闪电网络技术基础（BOLT）” 所定义的公开标准上。

另一方面，熟悉编程语言和软件搭建系统（build system），也是选择节点的好基础。这是因为，软件的安装、配置、后续的维护乃至排查故障，都需要用到搭建系统所用的许多工具，包括：

- `c-lightning` 用到的 Make、Autotools 和 GNU 工具
- LND 用到的 Go 工具
- Eclair 用到的 Java/Maven

编程语言不仅会影响搭建系统，也会影响程序的其它方面。每一种编程语言都有自己的设计哲学，这些哲学会影响其它许多东西，例如：

- 配置文件的格式和语法
- 文件（在文件系统种）的存储位置
- 命令行指令的参数和语法
- 报错消息的格式
- 依赖库
- 远程调用程序的接口

在选择闪电节点软件时，你也是在选择所有这些特质。所以，如果你熟悉这些工具和它们的设计哲学，运行节点会更加容易。如果你进入了一个你不熟悉的领域，那就会更难。

另一方面，如果这是你第一次尝试使用使用命令行和 服务器/服务 环境，你会发现自己完全不熟悉任何东西，可能是在学习全新的东西。这时候，你可能要根据一些其它因素来做决定，例如：

- 支持者论坛和聊天室的数量
- 说明书的质量
- 跟其它你希望使用的工具的集成度

最后，你可能希望测试不同节点实现的性能和可靠性。这是非常重要的，因为你会在生产环境中使用它们，而且预计会有很高的带宽要求和可靠性要求。如果你想在节点上运行一家商店的支付系统的话，就更是如此了。

## 安装比特币节点和闪电节点

你还是决定不使用某一款 “安装助手”、自己深入了解 Linux 操作形同的命令行吗？有勇气！我们会帮助你。如果你不想手动搞定这一切，请考虑使用一款可以帮助你安装节点软件的应用，或者基于容器的解决方案，详见上文 “[使用安装助手](https://github.com/lnbook/lnbook/blob/develop/05_node_operations.asciidoc#helpers)” 一节。

|  | |
| -- | -- |
| 注意 | 本章会从命令行开始讨论系统管理的高级课题。Linux 系统管理有自己的一套技能树，完整介绍它们超出了本书的范围。这是一个复杂的课题，而且有很多陷阱。请小心！|

在接下来的章节中，我们会简要解释如何在 Linux 操作系统上安装和配置比特币节点和闪电节点。你需要为你自己所选的比特币节点应用和闪电节点应用查看安装说明。这些说明一般可以在各项目的名为 “INSTALL（安装） ” 的文件中找到，或者在 “docs（文档）” 次级库中找到。我们只会介绍一些对所有这些服务都有用的常见步骤，而我们提供的说明也必然是不完整的。

### 后台服务

对那些希望在自己的笔记本电脑或者智能手机上运行应用的人来说，应用总是有一个图形化的用户节点，哪怕它有时候是在后台运行的。但是，比特币节点应用和闪电节点应用非常不同，它们往往没有自带的图形化用户界面。相反，它们作为 “无头的” 后台服务运行，意思是它们总是在后台运行，而且不跟用户直接交互。

对不常运行后台服务的用户来说，这可能会产生一些困扰。你怎么知道这些服务有没有在运行呢？怎么启动它们，怎么关闭它们？怎么跟它们交互？这些问题的答案取决于你所用的操作系统。现在，我们会假设你用的是 Linux 操作系统的变种，并在此前提下回答这些问题。

### 进程隔离

后台服务通常在一个具体的用户账户下运行，以将它们与操作系统隔离、与彼此隔离。举个例子，Bitcoin Core 将被配置为在用户 “bitcoin” 下运行。你需要使用命令行，为你运行的每一种服务创建一个用户账户。

此外，如果你连接到了一个外置的硬盘，你需要告诉操作系统重新分配用户的主目录（home directory）到这个硬盘中。这是因为像 Bitcoin Core 这样的服务，会在用户的主目录下创建文件。如果你要下载完整的比特币区块链，这些文件将占用几百 GB 的空间。这里，我们假设你使用外置硬盘，而且它位于你的操作系统的 “/external_drive/” 路径下。

在绝大部分 Linux 系统中，你都可以用 useradd 命令来创建一个新的用户，就像这样：

```
$ sudo useradd -m -d /external_drive/bitcoin -s /dev/null bitcoin
```

这里的 “m” 和 “d”，会将这条命令所创建的用户的主地址指定为 “/external_drive/bitcoin”。这里的 “s” 则分配了这个用户的交互式 shell。这里，我们将它设为 “/dev/null”，以禁止交互式 shell 的使用。最后一个参数就是新用户的名字：“bitcoin”。


### 节点启动

不论是比特币节点还是闪电节点，“安装” 都包括要创建一个所谓的 “启动脚本”，以保证计算机一启动，节点就会跟着启动。后台服务的启动和停止都是通过一个操作系统线程来了处理的，在 Linux 叫做 “init” 或是 “systemd”。你可以在各项目的 “contrib” 次级库中找到这样的系统启动脚本。举个例子，如果你在使用新式的 Linux 操作系统，它会使用 systemd，你可以找到一个叫做 “bitcoin.service” 脚本，它可以启动和关闭 Bitcoin Core 节点服务。

这里是一个比特币节点的启动脚本的例子，是从 Bitcoin Core 的代码库中找出来的：

来自 bitcoin/contrib/init/bitcoind.service

```
[Unit]
Description=Bitcoin daemon
After=network.target

[Service]
ExecStart=/usr/bin/bitcoind -daemon \
                            -pid=/run/bitcoind/bitcoind.pid \
                            -conf=/etc/bitcoin/bitcoin.conf \
                            -datadir=/var/lib/bitcoind

# Make sure the config directory is readable by the service user
# 请确保配置的目录可以被服务用户读取
PermissionsStartOnly=true
ExecStartPre=/bin/chgrp bitcoin /etc/bitcoin

# Process management
####################

Type=forking
PIDFile=/run/bitcoind/bitcoind.pid
Restart=on-failure
TimeoutStopSec=600

# Directory creation and permissions
####################################

# Run as bitcoin:bitcoin
User=bitcoin
Group=bitcoin

# /run/bitcoind
RuntimeDirectory=bitcoind
RuntimeDirectoryMode=0710

# /etc/bitcoin
ConfigurationDirectory=bitcoin
ConfigurationDirectoryMode=0710

# /var/lib/bitcoind
StateDirectory=bitcoind
StateDirectoryMode=0710

[...]

[Install]
WantedBy=multi-user.target
```

作为根用户（root user），你可以通过将它复制到 systemd 服务文件夹 “/lib/systemd/system/”，然后重新加载 systemd，来安装这个脚本：

```
$ sudo systemctl daemon-reload
```

下一步，启用这个服务：

```
$ sudo systemctl enable bitcoind
```

现在，你可以启动和关闭这个服务了。先别急着启动，因为我们还没有配置好比特币节点呢。

```
$ sudo systemctl start bitcoind
$ sudo systemctl stop bitcoind
```

###  节点配置

为了配置你的节点，你需要创建和引用一个配置文件。按照惯例，这个文件一般放在 “/etc” 目录下的一个以程序的名称为名的目录下。例如，Bitcoin Core 和 LND 的配置文件一般会分别存放在 “/etc/bitcoin/bitcoin.conf” 和 “/etc/lnd/lnd.conf”。

这些配置文件是文本文件，每一行都表示一个配置选项以及它的值。没有在配置文件中写出的选项，则会采用默认值。你可以用两种办法了解各选项可以设置什么值。其一，在命令行界面使用 “help” 参数运行节点应用，它会列出所有可以设置的选项。这些选项都可以在配置文件中设定。其次，你通常可以找到一个配置文件模板，它记录了所有的默认选项；就在软件的代码目录下。

你可以在[\[set_up_a_lightning_node]](https://github.com/lnbook/lnbook/blob/develop/05_node_operations.asciidoc#set_up_a_lightning_node) 中找到我们所用的每一个 Docker 镜像的配置文件模板。例如，文件 *code/docker/bitcoind/bitcoind/bitcoin.conf* ：

为 deocker bitcoind 编写的配置文件（code/docker/bitcoind/bitcoind/bitcoin.conf）

```
link:code/docker/bitcoind/bitcoind/bitcoin.conf[]
```

这个文件将 Bitcoin Core 配置为一个 regtest 网络节点，并提供了一个较弱的用户名和口令用于远程访问，所以你不应该使用它作为你的节点的配置文件。但是，它可以展示一个配置文件的语法，而且你可以在 Docker 容器中调整它们以使用不同的选项。使用 “bitcoin -help” 命令，看看你是否能理解我们放在 [[set_up_a_lightning_node\]](https://github.com/lnbook/lnbook/blob/develop/05_node_operations.asciidoc#set_up_a_lightning_node) 中的各个配置选项，在 Docker 网络语境下的作用。

一般来说，默认值就共有了，只需要少许修改，你的节点软件就可以快速配置起来。想要一个只有最小量定制化的节点，你只需要在配置文件里写入下面四行：

```
server=1
daemon=1
txindex=1
rpcuser=USERNAME
rpcpassword=PASSWORD
```

甚至 “txindex” 这一行也不是严格必要的，虽然它将保证你的比特币节点会给所有的交易创建一个索引号，这对一些应用来说是必需的。txindex 选项对闪电节点来说并不是必需的。

运行在同一台设备上的 `c-lightning` 闪电节点，同样只要求少数几行配置：

```
network=mainnet
bitcoin-rpcuser=USERNAME
bitcoin-rpcpassword=PASSWORD
```

一般来说，还是尽量少在这些系统上作定制化。默认配置是为了支持最常用的部署而精心配置的。如果你修改了默认值，它可能会在日后导致问题，或者降低你的节点的性能。一句话，如无必要，少作改动！

### 网络配置

在配置一个新应用时，网络配置通常来说不是问题。但是，像比特币和闪电网络这样的点对对面网络，就对应用的网络配置形成了独特的挑战。

在中心化服务中，你的计算机会连接到某一些企业的 “大服务器”，反之不能成立。你的家用互联网连接实际上是在 “你仅是一个由其他人提供的服务的消费者” 的假设上配置的。但在一个点对点系统中，每个节点都既是服务的消费者，又是服务的供应者。如果你在家里运行了一个比特币节点（或者一个闪电节点），你也是在给互联网上的其它计算机提供服务。但你的计算机的互联往服务的默认配置不允许你运行服务端，可能需要额外的配置才能让他人触达你的节点。

如果你想运行一个比特币节点或是闪电节点，你需要让互联网上的其他节点可以连接你的节点。这意味着要给比特币端口（默认是 8333）或闪电端口（默认是 9735）启用入站的 TCP 连接。虽然你不需要入站连接性就可以运行一个比特币节点，但运行闪电节点就不行了。闪电节点必需能够被你的网络之外的人访问。

默认情况下，你的家用网络路由器不会预期有外来的连接进入，而且在事实上，入站连接是被禁止的。你的互联网路由器 IP 地址为一个可从外部访问的 IP 地址，而在你的家用网络中运行的计算机都共享同一个 IP 地址。这是通过一种叫做 “互联网地址翻译（NAT）” 的机制来实现的，它让你的路由器可以作为所有出站连接的中介。如果你希望允许入站连接，你必需设置 “端口转发”，告诉你的路由器，对特定端口的入站连接，应该被转发到网络中的特定计算机上。你可以手动更改你的路由器配置，或者，如果你的路由器支持的话，可以通过一种自动化的端口转发机制 “通用的即插即用（UPnP）” 来实现。

另一种实现端口转发的机制是启用 “洋葱路由（Tor）”，它可以提供一种虚拟的私人网络覆盖层，让入站连接可以访问一个 “洋葱地址”。如果你运行了 Tor，你就不需要为比特币和闪电网络端口启用入站连接了。如果你使用 Tor 来运行你的节点，那么所有的网络流量都会通过 Tor，不会使用别的端口。

我们来看看这些让别人可以连接到你的节点的方法。我们会从易到难按顺序讲解。

#### 直接能用！

有一种可能是，你的互联网服务供应或者路由器默认支持 UPnP，所以一切都能自动化运行。我们先试试这种方法，看看我们够不够幸运。

假设你已经让比特币节点和闪电网络启动了，我们将检查是否能从外部访问它们。

| | |
| -- | -- |
| 注意 | 为了让测试正常进行，你必须让你的比特币节点或闪电节点之一（或两者同时）运行在你的家庭网络中。如果你的路由器支持 UPnP，入站流量会自动被转发到运行节点的计算机的相应端口上。|

你可以使用一些非常流行而且有用的网站，来发现你的外部 IP 地址是什么、是否允许入站连接、会将入站连接转发到哪个已知端口。这里有两个可靠的网站：

- [https://canyouseeme.org](https://canyouseeme.org/)
- https://www.whatismyip.com/port-scanner

默认情况下，这些服务只是允许你检查你访问这些服务时所用的 IP 地址的入站连通性。这是为了防止你使用这些服务来扫描其他人的网络和计算机。你将使用路由器的外部 IP 地址，然后有一个区域让你输入一个端口号。如果你没有在配置文件中改变过端口号，那么尝试 8333 （比特币节点）以及/或者 9735（闪电节点）。

在 “[检查 9735 端口的入站连通性](https://github.com/lnbook/lnbook/blob/develop/05_node_operations.asciidoc#ln_port_check)” 一图中，你可以看到使用 *whatismyip.com* 端口扫描工具检查某个运行闪电节点的服务器的 9735 端口的结果。它显示，这个服务器接受连入闪电端口的入站连接。如果你看到了类似的结果，说明你也一样。

[![mtln 0503](https://github.com/lnbook/lnbook/raw/develop/images/mtln_0503.png)](https://github.com/lnbook/lnbook/blob/develop/images/mtln_0503.png)

图 3. 检查 9735 端口的入站连通性

#### 使用 UPnP 的原子化端口转发

有可能，虽然你的互联网路由器支持 UPnP，但这个功能是默认关闭的。这种情况下你需要从路由器的管理员界面改变它的配置：

1. 连接到你的路由器的管理员界面。通常来说，只需在你的电脑的互联网浏览器中输入你的家庭网络的 “网关地址” 即可。你可以在你的家庭网络的任意一台计算机中检查 IP 配置从而发现这个网关地址；通常来说就是某一个不可路由的网络的第一个地址，比如 192.168.0.1 或者 10.0.0.1。检查你的路由器上的贴纸，看看有没有 *网关地址*。发现之后，打开浏览器软件，并在浏览器的 地址栏/搜索框 里输入这个 IP 地址，例如 “192.168.0.1” 或者 “[http://192.168.0.1](http://192.168.0.1/)”。
2. 找出路由器管理界面的管理员用户名和口令。通常会写在路由器的贴纸上，可能很简单，直接就分别是 “admin” 和 “password”。在网上快速搜索你的互联网服务提供商和路由器模式，可以帮助你找出这部分信息。
3. 找出 UPnP 的设置页面并开启这个功能。

重启你的比特币节点 以及/或者 闪电节点，再一次使用上一个章节介绍的网站测试端口连通性。

#### 为入站连接启用 Tor

“洋葱路由器（Tor）” 是一种具有特殊功能的虚拟私人网络，它会加密每一跳网络通信的内容，使得传递数据包的中间节点无法判断消息的起源和目的地。比特币节点和闪电节点都支持在 Tor 上运行，这使你不需要公开你的 IP 地址和地理位置，就可以运行一个节点。因此，它为你的网络流量提供了很高的隐私性。运行 Tor 的另外一个好处在于，因为它是所以一个虚拟私人网络来运行的，所以它解决了路由器的端口转发问题。入站的连接是通过 Tor 隧道收到的，你的节点可以通过一个临时生成的 “洋葱地址” 被发现，而无需通过 IP 地址。

启用 Tor 需要两步。首先，你必须在电脑上安装 Tor 路由器和代理软件。然后，你必须在你的比特币和闪电节点配置中使用这个 Tor 代理。

在 Ubuntu Linux 系统中安装 Tor 可以使用 apt 包管理器：

```
sudo apt install tor
```

然后，我们配置闪电节点，让它的外部连接使用 Tor。这里是 LND 软件的配置案例：

```
[Tor]
tor.active=true
tor.v3=true
tor.streamisolation=true
listen=localhost
```

这几行文字将启用 Tor（tor.active），建立一个 v3 洋葱服务（tor.v3=true），为每一个连接使用不同的洋葱流（tor.streamisolation），然后限制对连接的监听到仅限于本机（`l⁠i⁠s⁠t⁠e⁠n=⁠l⁠o⁠c⁠a⁠l⁠h⁠o⁠s⁠t`），已避免泄露你的 IP 地址。

你可以通过运行一个简单的命令，来检查 Tor 是否已经正确安装、正在运行。这个命令最大部分 Linux 变种上都有用：

```
curl --socks5 localhost:9050 --socks5-hostname localhost:9050 -s https://check.torproject.org/ | cat | grep -m 1 Congratulations | xargs
```

如果一切都能正常工作，这行命令的结果应该是 “Congratulations. This browser is configured to use Tor.（恭喜！这个浏览器已配置为使用 Tor。）”

因为 Tor 的本质，你将难以使用外部的服务来检查你的节点是否可以通过某个洋葱地址触达。此外，你还应该看看你的洋葱地址是否在你的闪电节点的日志中出现了。它是一串很长的字符（有字母和数字），以 “.onion” 结尾。就这样，你的节点应该可以从互联网触达了，而且你还有额外的隐私性！

#### 手动端口转发

这种办法是最复杂的，需要很多的计算机技巧。细节取决于你所用的路由器的类型、你的服务供应商的设定和用户套餐，以及其它许多因素。在你尝试这种难得多的办法之前，应该先尝试 UPnP 和 Tor。

基本步骤如下：

1. 找出你的节点所在的计算机的 IP 地址。通常是由 “动态主机配置协议（DHCP）” 动态分配的，一般来说范围是 192.168.x.x 或者 10.x.x.x 。
2. 找出你的节点的网络接口的 “媒体访问控制（MAC）” 地址。可以从电脑的互联网设置中找到。
3. 为你的节点分配一个静态的 IP 地址，这样它的 IP 将一直不变。你可以就使用它现在的这个 IP 地址。在你的路由器管理界面的 DHCP 配置中寻找 “静态租赁（Static Leases）”，将 MAC 地址与你指定的 IP 地址配置上去。这样，你的节点将一直使用相同的 IP 地址（就是你分配给它的这个）。不然的化，你可以找到你的路由器的 DHCP 配置，找出其 DHCP 地址范围，在这个地址范围 *之外* 选择一个尚未被使用的地址。然后，在节点电脑上，配置网络停止使用 DHCP，并将选定的非 DHCP 的 IP 地址写入操作系统的网络配置。
4. 最后，在路由器上设置 “端口转发”，将对特定端口的入站容量转发到你的节点的专属 IP 地址上。

搞定配置之后，再次使用上一个章节所述的网站检查你的端口连通性。

## 保护你的节点

闪电节点，按其定义，就是一种 *热钱包（hot wallet）*。这意味着，由一个闪电节点控制的资金（不论是链上的还是链下的），都是由加载到节点的内存中、或者存储在节点的硬盘中的私钥控制的。如果一个闪电节点被劫持了，那么创建链上或者链下的交易将资金转走，就如探囊取物。因此，保护你的节点不被未获得授权的渠道访问，是极为重要的。

安全性是一个整体概念，意思是你必须保护系统的每一个层级。俗话说得好：木桶能装多少水，由最短的一块板决定。这在信息安全中是一个重要的概念，我们要运用到我们的节点上。

除了我们将采取的所有安全措施，记住，闪电网络还是一个初出茅庐的实验性技术，因此，你使用的软件中可能存在可以被利用的漏洞。*只应在闪电网络中存放你弄丢了也不心疼的钱。*

### 操作系统安全性

保护操作系统是一个很大的主题，超出了这本书的范围。但是，我们可以建立一些基本的概念。

为了保护你的操作系统，最重要的考量隐私包括：

- 来源

  保证你下载了正确的操作系统镜像，并在安装之前检查签名及校验和（检查它有无被篡改过）。将这个原则延伸到所有你安装的软件。重复检查你下载软件的来源和 URL。通过签名和校验和验证，确保你所下载的内容的完整性和正确性。

- 维护

  确保你的操作系统与时俱进。启用每日或每周的自动化安全更新。最小权限原则：为每一个进程建立一个用户，并给它们服务运行服务所需的最小权限。请不要使用主权限（即 root 账户）运行进程。

- 进程隔离

  使用操作系统的特性，将进程们彼此隔离。

- 文件系统权限

  基于最小权限原则，仔细配置文件系统。不要让文件对任意人都可读可写。

- 强认证

  使用强而且随机生成的口令，或者，只有用可能，就使用公钥验证。举个例子，在使用 Secure Shell（SSH）的时候，使用密钥对将比使用口令更安全。

- 双因子认证

  只要有可能，就使用双因子认证（two-factor authentication，2FA），包括带有硬件安全密钥的通用 2 号因子（U2F）。这个原则对所有你想要使用的外部服务都使用，例如你的云服务供应商。你也可以将这个原则运用到你自己的设备中，例如你自己的 SSH 配置。间接服务也应该使用双因子认证。例如，假设你在使用一个云服务，你交出了一个电子邮件地址，那么你的电子邮箱也应该使用 2FA 来保护。
  
- 备份

  备份你的系统，并确保你的备份是加密的。定期备份。至少要完整测试一次，看看能否从备份中恢复，以及备份是完整、可用的。如果可以的话，将其中一个备份保存到另一个硬盘上，以避免单个硬盘的故障将你的服役节点和备份副本 *同时* 摧毁。

- 漏洞管理

  使用远程扫面，来保证你的系统的攻击界面已经尽可能少。关闭任何不必要的服务和端口。仅安装你真正需要和使用的软件和工具包。建议 *不要* 在你的节点计算机上使用节点以外的服务，只要那些服务能够在另一台电脑上运行。尤其是，只要你能做到，就 *不要* 使用你的节点计算机来浏览互联网内容、阅读你的邮件。

这是最基本的安全措施的清单。还远远说不上全面。

### 节点访问控制

你的闪电接通会暴露一个远程过程调用（RPC）应用程序接口。这意味着，你的节点可被发送到某一个 TCP 端口的命令控制。对这个 RPC 应用程序接口的访问控制，是通过某些形式的用户身份认证来实现的。具体取决于你建立的闪电节点的类型，可能是 用户名/口令 认证，也可能一种叫做 “macaroon” 的认证机制。马卡龙（macaroon）是一种复杂的饼干（cookie）。顾名思义，它跟 cookie 不一样，它经过密码学签名，可以表达一系列的访问权。

举个例子，LND 使用 macaroon 来授予对 RPC 应用程序接口的权限。默认情况下，LND 软件会创建三种权限不同的 macaroon，分别叫 “admin”、“invoice” 和 “readonly”。根据你导入 PRC 客户端中的 macaroon，你可以获得 *只读*  权限、*发票*  权限（包含了只读权限）以及 *主人* 权限；主人权限代表着完全的控制权。LND 中还有一个马卡龙烘培函数，可以按非常细的粒度构造任意功能组合的 macaroon。

如果你使用 用户名/口令 认证模式，请确保你使用了一个足够长且随随机的口令。你不需要经常输入这个口令，因为它会存储在配置文件中。因此，你应该选择一个猜不出来的口令。你可以看到很多这样的例子，因为口令过于简单，导致自己的系统被人随便访问。别这样！使用口令管理器，生成一个又长、又随机、有字母也有数字的口令。因为特殊符号比如 $?/!*\&%`"' 可能会跟命令行指令冲突，所以最好不要在可能会在 shell 环境中使用的口令中使用这些字符。为了避免问题，请坚持使用长而随机的字母数字口令。

```
```

通常来说，使用长于 12 个字符的、既有字母又有数字的随机序列，就足够了。如果你计划在你的闪电节点中存储大量资金，而且担心暴力破解，请选择长度超过 20 个字符的口令，可以让这样的攻击几乎无法成功。

## 节点和通道备份

运行闪电节点时，一个非常重要的考量是备份问题。不像比特币钱包，BIP-39 助记词可以恢复出钱包所有的状态，在闪电网络中这 *行不通*。

闪电钱包也使用 BIP-39 助记词备份，但仅对链上资金有用。但是，因为通道的构造方式，助记词 *不足以* 复原出一个闪电节点。必须要有额外的备份方法，叫做 “静态通道备份（SCB）”。没有 SCB ，如果一个闪电节点的运营者弄丢了 TA 的闪电节点数据，TA 可能丢失 *所有* 放在通道中的资金。

| | |
| -- | -- |
| 注意 | 请 *不要* 在建立一个能够持续备份你的通道状态的系统之前，向通道充入资金。你的备份应该转移到节点之外的另一个系统和另一个地方，这样你才能在多种系统故障（断电、数据损坏，等等）以及自然灾害（洪水、火灾，等等）中幸存。|

SCB 也不是万灵丹。首先，每个通道的状态在每次更新（出现新的承诺交易）时都需要备份/其次，从一个通道备份中恢复有其危险性。如果你没有 *最新的* 承诺交易，而你意外地广播了一笔旧的（已经过时的）承诺交易，你的通道对手会假设你在尝试欺诈，然后使用一笔承诺交易，将通道中的所有资金全部拿走。为了确保你在关闭通道，你需要发起 “合作式关闭”。但恶意的通道对手可能会误导你的节点，让你广播一笔旧的、已经过时的承诺交易，让你的节点看起来像在欺诈，然后使用惩罚交易骗走你的钱。

此外，你的通道备份还需要加密，以保护你的隐私性和通道安全性。否则。任何发现了备份的人，都不仅可以看到你所有的通道，还可以使用该备份来关闭你所有的通道、将你所有的余额送给你的各个通道对手。换句话说，可以获得你的通道备份的恶意人可以让你损失所有的通道资金。

你可以看出，SCB 不是一种零错误的安全装置。它只是一种软弱的折中办法，因为它只是用一种类型的风险（恶意对等节点）来替代另一种风险（数据损坏或丢失）。为了从一份 SCB 中恢复，你需要跟你的通道对手交互，祈祷他们不会尝试欺诈你，不论是给你一份旧的承诺交易，还是愚弄你的节点、让它广播已经过时的交易从而没收你的余额。虽然 SCB 有这些缺点，它也是有用的，你还是应该这么做。如果你不形成备份，又弄丢了你的节点数据，你会永远损失通道中的资金。无可挽回！但是，如果你 *真的* 做了 SCB，再弄丢你的节点数据时，你有不小的机率会遇上诚实的对等节点，然后从中恢复一些通道资金。如果你很幸运，你也许能恢复所有的资金。结论是，你最好在节点的主硬盘之外的存储空间里持续生成 SCB。

通道备份机制是一个尚待开发的领域，也是大部分闪电节点实现的弱点。

截至本书撰写之时，只有 LND 提供了内置的 SCB 机制。Eclair 为服务端版本提供了类似的机制， Eclair 移动版还提供了可选的备份到 Google Drive 的机制。`c-lightning` 最近为实现通道备份的插件合并了一个必要的接口。不幸的是，不同的闪电节点实现之间没有一致的、共同认可的备份机制。

闪电节点数据的基于文件的备份，勉勉强强算是一种解决方案，因为你的风险是备份了一个不一致的数据库状态。此外，你也不能可靠地捕捉到最新的状态承诺。最好是使用一种每次发生通道更新都触发的备份机制，从而保证数据的一致性。

要在 LND 中建立 SCB，请在命令行或者配置文件中设置 `backupfilepath` 参数。然后，LND 就会在那个目录位置存储一个 SCB 文件。当然，这只是解决方案的第一步。现在，你必须建立一种监控这个文件的变更的机制。每次该文件发生变更的时候，备份机制旧要把这份文件复制到另一个地方，最好是别处的硬盘上。这样的备份机制超出了本书的范围。尽管如此，任何复杂的备份，都应该能够处理这种情况。再次提醒，备份文件应该加密。

### 热钱包风险

如我们之前讨论的，闪电网络是一个由 *热钱包* 组成的网络。你存放在闪电钱包里的资金是全时段联网的。所以它们易受攻击。这是为什么你不应该在闪电钱包里放太多的钱。大额资金应该保存在 *冷钱包* —— 也就是 *不联网* 而且只能在链上转账的钱包 —— 里面。

即使一开始你只投入了少量资金，随着时间推移，可能有一天你会发现自己在一个闪电钱包里存了好大一笔钱。对于商家来说这很常见。如果你为自己的电子商务使用闪电节点，你的钱包可能会经常接收资金，但很少发送资金。最终你会发现自己同时面临两个问题：第一，你的通道不平衡了，你有大量的本地余额，但只有少量的远端余额（你发送支付的能力很足，但接收支付的能力不足了）。其次，你在闪电钱包里存了太多钱。不过，你也能同时解决这两个问题。

我们来看一些让你可以减少热钱包中的资金的解决方案。


### 清扫资金

如果你的闪电钱包余额太多，超出了你的风险容忍度，你就需要将资金 “扫出” 这个钱包。你有三种办法：链上清扫、链下清扫、Loop Out。我们在接下来的章节中逐个了解每一种方案。

#### 链上清扫

链上清扫的意思是将资金从闪电钱包转出到比特币钱包，是用关闭通道来实现的。在你关闭一条通道的时候，该通道内你所有的本地余额，都会 “清扫” 到一个比特币地址上。这个保管链上资金的比特币地址通常是由你的闪电钱包软件生成的，所以依然是一个热钱包。你需要发送额外的链上交易，才能把这些资金转移到更安全的地址，例如你的硬件钱包所生成的地址。

关闭通道将需要支付链上手续费，而且会导致你的闪电节点的容量和连接性下降。不过，如果你运作着一个热门的电子商务节点，你不会缺乏出账容量，所以你可以策略性地关闭具有大量本地余额的通道，本质上就是为你的链上活动 “绑定” 资金。在关闭通道以前，你可能需要使用一些通道再平衡技术（见 “[Rebalancing Channels](https://github.com/lnbook/lnbook/blob/develop/05_node_operations.asciidoc#channel_rebalancing)”），以最大限度地获得这种策略的好处。

#### 链下清扫

你可以使用的另一种技术就是运行另一个不对外公开的闪电节点。你可以在你的公开节点（例如你经营商铺的节点）和未公开（隐藏）节点之间建立大容量的通道。然后，定期将你的公开节点的余额 “清扫” 到你的隐藏节点。

这种技术的好处基于一个事实：为你的店铺收取支付的闪电节点是公开的，可能会成为黑客的目标，因为任何跟商店关联的闪电钱包都可能拥有大量余额。而跟你的商店不相关的节点不那么容易被看成值得下手的目标。

作为额外的安全措施，你还可以让你的第二节点使用隐藏的 Tor 服务，这样其 IP 地址就不会为人所知。这可以进一步降低被攻击的概率，并提高你的隐私性。

你将需要安装一个定期运行的脚本。这个脚本的目标是在你的隐藏节点上创建一张闪电发票、要求你的商店节点支付，从而将资金转移到你的隐藏节点。

请注意，这种办法无法将资金转移到冷钱包。所有的闪电节点都是热钱包。这种清扫的目的只是将资金从众人皆知的热钱包转移到一个无人知晓的热钱包。

#### 潜水艇互换清扫

另一种减少你的闪电热钱包余额的办法是使用一种叫做 “潜水艇互换” 的技术。潜水艇互换的概念是由 Olaoluwa Osuntokun 和 Alex Bosworth 联合提出的，允许链上比特币与闪电支付相交换，反之也可以。本质上来说，潜水艇互换就是闪电（链下）资金与比特币（链上）资金的原子化互换。

一个节点运营者可以初始号一次原子化互换、将所有可用的通道余额都发送给另一个人，只要 TA 能在链上发回足够数量的比特币。

在未来，这会成为闪电网络的节点提供的一项有偿服务，他们会把资金转换的汇率和手续费率广告出来。

使用潜水艇互换来清扫资金的优势在于不需要关闭通道，这意味着我们可以保持现有的通道，只是通过这种操作来平衡我们的通道。就像我们要发送闪电支付一样，我们在一条乃至多条通道中，将我们的资金从本地移到远端。这不仅减少了暴露在热钱包中的余额，还提高了我们未来接收支付的能力。

实际操作的时候，你可以信任一个作为网关的中介，但这会让你的资金承担被盗的风险。不过，在潜水艇互换这个情景中，相关操作是不需要信任的。潜水艇互换是非托管的 *原子化* 操作。意思是互换的对手无法盗取你的资金，因为链上支付取决于链下支付的完成，反之亦成立。

#### 使用 Loop 执行潜水艇互换

潜水艇互换服务的一个例子是 Linghtning Labs 所开发的 *Loop*（没错，就是 LND 背后的公司）。Loop 有两个变种：Loop In 和 Loop Out。*Loop In* 收取一笔比特币支付、转换成一笔闪电支付。*Loop Out* 则将一笔闪电支付转化成一笔比特币支付。

| | |
| ---- | ------------------------------------------------------------ |
| 提醒 | 为了使用 Loop 服务，你必须使用 LND 闪电节点。 |

出于减少你的闪电热钱包的余额的目的，你需要使用 Loop Out 服务。为了使用 Loop 服务，你需要在 LND 节点上安装额外的一些软件。Loop 软件会跟你的 LND 节点协同运行，并提供一些命令行工具来执行潜水艇互换。你可以在这个 [GitHub](https://github.com/lightninglabs/loop) 库找到 Loop 软件和安装说明。

安装号软件并运行起来后，只需要一行命令就能运行一次 Loop Out：

```
loop out --amt 501000 --conf_target 400
Max swap fees for 501000 sat Loop Out: 25716 sat
Regular swap speed requested, it might take up to 30m0s for the swap to be executed.
CONTINUE SWAP? (y/n), expand fee detail (x): x

Estimated on-chain sweep fee:        149 sat
Max on-chain sweep fee:              14900 sat
Max off-chain swap routing fee:      10030 sat
Max no show penalty (prepay):        1337 sat
Max off-chain prepay routing fee:    36 sat
Max swap fee:                        750 sat
CONTINUE SWAP? (y/n): y
Swap initiated

Run `loop monitor` to monitor progress.
```

注意 “maximun fee（最大手续费）” 的数值，它意味着你在最差的情况下需要支付的手续费，它由你选定的区块确认速度决定。

## 闪电节点运行时间与可用性

不像比特币节点，闪电节点需要几乎全时段在线。你的节点需要在线，以接收支付、开启通道、（合作）关闭通道、监控通道对手违反协议的情况。节点的可用性是如此重要，以至于它是许多原子化的通道管理工具（例如 autopilot）决定要跟哪个节点开启通道的指标。你也可以在流行的节点浏览器（见 [[ln_explorer\]](https://github.com/lnbook/lnbook/blob/develop/05_node_operations.asciidoc#ln_explorer) ）比如 [1ML](https://1ml.com/) 上看到各个节点的 “可用性” 分数。

节点可用性对于缓解和解决潜在的违反协议的行为（即，发送已过时的承诺交易）尤为重要。虽然您可以让节点暂时离线一小时到一两天，但长时间离线会让你的资金有丢失的风险。

保证节点持续在线并不容易，因为许多 bug 和资源限制，都可能也必定会导致意外的离线。尤其是在你运行一个繁忙的节点的时候，你可能会用尽内存资源、交换空间、同时开启的文件的数量、硬盘空间，等等。许许多多的问题可能导致你的节点（你的服务器）宕机。

### 容错与自动化

如果你有时间和机枪，你应该在闪电测试网上测试一些基本的故障情形。在测试网上，你会学到有价值的技巧，又不会有损失资金的风险。你为自动化你的系统而采取的每一笔，都会提高你的节点可用性：

- 自动重启计算机服务器

  如果你的服务器或者说操作系统宕机了，会怎么样？断电了呢？通过按动电脑的 “重启” 键或者拔掉电源，来模拟这些故障场景。在宕机、重启以及电源故障之后，计算机应该会自动化重启。一些计算机在 BIOS 界面可以设置如何应对电源故障。测试这些设置，以确保计算机真的会在电源故障之后自动重启，不需要人力的介入。
  
- 自动重启节点

  如果你的节点们或者其中一个节点宕机了呢？通过杀死相应的节点进程来模拟这种故障。如果一个节点宕机了，它应该会自动重启。测试它，以确保节点们会自动重启，无需人力介入。如果它没有重启，很有可能你的节点没有被正确设置成一项操作系统服务。
  
- 自动重启网络
  
  网络断连了，会怎么样？你的互联网服务供应商可能会临时宕机，或者给你的路由器（你的电脑）分配一个新的 IP 地址，这会导致什么后果？当网络恢复的时候，你所运行的节点会自动重新连入网络码？通过拔掉节点设备上的网线然后重新接入，来模拟这种错误。节点应该自动重连并继续运行，无需人力干预。

- 配置你的日志文件

  上述所有错误，都应该在对应的日志文件中留下文字记录。如有需要，可以调高日志文件的允许行数。在日志文件中找出错误记录，并使用日志文件来监控电脑。

### 监控节点的可用心

监控是保证你的节点持续运行的重要步骤。你需要监控的不仅是计算机的可用性，还有闪电节点软件的可用性和正确运行。

有许多办法可以做到这一点，但大部分办法都需要一些定制化。你可以使用通用的基础设施监视器，或者应用监视工具，但你必须专门定制这些工具、通过查询闪电节点 API 来确保节点正在运行、同步到了区块链以及连接到了通道对手。

[Lightning.watch](https://lightning.watch/) 提供了一种定制化的服务，提供了闪电节点监视功能。它使用一个 Telegram 机器人，来提醒你节点服务的中断。这是一项免费的服务，但你可以付费来获得更快的警报（当然是通过闪电网络）。

我们预计未来会出现更多第三方的服务，提供定制化的闪电节点监控工具，并且可以通过微支付来付费。也许这样的服务和它们的 API 会变成标准化的，甚至有一天直接集成到闪电节点软件里面。

### 瞭望塔

“瞭望塔（Watchtowers）” 是一种机制，将监控和惩罚违反协议的行为外包出去。

如我们在之前的章节提到的，闪电协议是通过一种惩罚机制来维持安全性的。仍你的通道对手广播了一笔旧的承诺交易，你的节点将需要使用撤销条款、广播一笔惩罚交易以避免资金损失。但如果你的节点这时候下线了，你就无法响应了，可能会损失资金。

为解决这个问题，我们可以使用一个乃至多个瞭望塔，将监控违反协议行为和发布惩罚交易的工作外包出去。一个瞭望塔装置由两部分组成：一是瞭望塔服务端（简称 “瞭望塔”），它会监控区块链；二是瞭望塔客户端，请求瞭望塔服务器的监控服务。

瞭望塔技术还在开发的初期，也没有得到广泛支持。不过，在下面的章节中，我们列出了一些实验性的实现，你可以试一试。

LND 软件既包含了瞭望塔服务端，也包含了瞭望塔客户端。你可以通过在配置文件中写入下列信息来激活瞭望塔服务端：

```
[watchtower]
watchtower.active=1
watchtower.towerdir=/path_to_watchtower_data_directory
```

你可以通过在配置文件中写入下列信息来激活 LND 的瞭望塔客户端，然后使用命令行连接到某一个瞭望塔服务端：

```
[wtclient]
wtclient.active=1
```

LND 的命令行客户端 lncli 将显示下列选项，用于管理瞭望塔客户端：

```
$ lncli wtclient

NAME:
   lncli wtclient - Interact with the watchtower client.

USAGE:
   lncli wtclient command [command options] [arguments...]

COMMANDS:
     add     Register a watchtower to use for future sessions/backups.
     remove  Remove a watchtower to prevent its use for future sessions/backups.
     towers  Display information about all registered watchtowers.
     tower   Display information about a specific registered watchtower.
     stats   Display the session stats of the watchtower client.
     policy  Display the active watchtower client policy configuration.

OPTIONS:
   --help, -h  show help
```

`c-lightning` 提供了瞭望塔客户端插件所需的 API 钩子，但还没有这样的插件出现。

最后，一个热门的标准瞭望塔服务是 *The Eye of Satoshi* (TEOS)。你可以在这个 [GitHub](https://github.com/talaia-labs/python-teos) 网页找到。

## 通道管理

作为一个闪电节点运营者，一项你需要反复执行的工作就是管理你的通道。这意味着你需要从你的节点开启出站通道、连入其它节点，还有让别的节点连入你的节点、开设（对你来说）入站通道。未来应该能实现合作式的通道开启结构，这样你就能开设一开始在通道两端都有余额的对称通道。但目前物质，新的通道都只在一端有余额，就是通道发起者那一端。因此，为了让你的节点的入账流动性和出账流动性 *保持平衡*，你需要跟别人开启通道，同时吸引其他人跟你开设通道。

### 开启出站通道

只要你的闪电节点上线了、运行起来了，你就可以向其比特币钱包打入资金，然后用这些资金跟其他人开设通道。

你必须谨慎选择通道对手，因为你的节点发送支付的能力，将取决于你的通道对手是谁、他们是否充分连接到了网络的其余部分。你可能还希望开设不止一条通道，以避免受困于单点故障。因为闪电网络现在支持多路径支付，你可以将你的初始资金分成几部分、分别开设通道，它们结合在一起就可以路由比单个通道的余额更大的数额。此外，你还应该避免开设容量太小的通道。因为你需要为开启和关闭通道支付比特币交易手续非常，如果通道的容量太小，那就有点不值当了。都是钱呀！

总结一下：

- 连接到几个拥有充分连接的节点
- 开启多条通道
- 不要开启太多通道
- 不让开启太小的通道

找到充分连接的节点的一种办法是寻找在闪电网络上售卖产品的热门商家。这些节点本身力求资金充裕和充分连接。所以，如果你准备通过闪电网络在网上购买一些东西的话，你可以直接跟商家的节点开启通道。在你想买些什么东西的时候，商家的节点 ID 将出现在你收到的闪电网络发票中。所以找出他们并不难。

另一种办法是使用 [1ML](https://1ml.com/) 这样的闪电网络浏览器（见 [[ln_explorer\]](https://github.com/lnbook/lnbook/blob/develop/05_node_operations.asciidoc#ln_explorer)），然后浏览使用通道容量和通道数量排序的节点清单。请不要选择最大的节点，因为人人都这样做就会加剧中心化。请选择清单中段的节点，这样你可以帮助他们成长。另一个需要考虑的因素是节点运行的时间跨度。已建立超过一年的节点可能有更好的声誉，可能比才运行一周的节点更少风险。

#### Autopilot

开启通道的工作一定程度上可以使用 “导航仪（autopilot）” 自动化，这类软件可以根据一些启发式规则自动开启通道。导航仪软件还比较新，并不总能为你选出最优的通道对手。尤其在一开始的时候，可能你手动开启通道会好一点。现在有三种形式的导航仪。

- lnd 集成了一种导航仪，开启之后可以在后台跟 lnd 协同运行。
- lib_autopilot.py 可以为任意节点实现提供导航仪计算，根据是 gossip 和通道数据。
- 一种基于 lib_autopilot.py 的 c-lightning 插件，可以为 c-lightning 用户提供易于使用的界面。

注意，lnd 导航仪会在通过配置文件开启之后立即从后台开始运行。因此，如果你的 lnd 钱包中有链上输出（比特币资金），它会立即开始开启通道。如果你希望完全控制你的比特币交易以及通道，请确保在为你的 lnd 钱包打入比特币资金 *之前* 关闭导航仪。如果导航仪已经开启，你可以需要在为钱包充值资金以及关闭通道之前重启你的 lnd（它们都会给你的钱包提供链上资金）。如果你想运行导航仪，设置关键配置的值是至关重要的。看看这个案例：

```
[lnd-autopilot]
autopilot.active=1
autopilot.maxchannels=40
autopilot.allocation=0.70
autopilot.minchansize=500000
autopilot.maxchansize=5000000
autopilot.heuristic=top_centrality:1.0
```

这个配置文件将激活导航仪。只要下面两个条件得到满足，它就会开启通道：

1. 你的节点正开设的通道小于 40 条。
2. 你放在支付通道中的资金，所占钱包所有资金的比重小于 70%。

这里的 “40” 和 “70” 是完全任意的，因为关于你应该开启多少通道、应该把多大比例的资金留在链上，我们无法得出对每一个人都有效的建议。lnd 中的导航仪不会考虑链上手续费。换句话说，它不会在链上手续费高涨的时候推迟开启通道、等待手续费较低的时期。为节约手续费，你可以在链上手续费率较低的时期（比如周末）手动开启通道。只要条件满足，导航仪就会提出开启通道的建议，然后立即使用当前合适的手续费率尝试开启通道。根据上面这个配置文件，通道的容量将在 5 mBTC（`minchansize` = 500,000 satoshi）和 50 mBTC（`maxchansize` = 5,000,000 satoshi）之间。跟惯例一样，配置文件中的数量是以 “聪（satoshi）” 为单位的。当前，小于 1 mBTC 的通道都不是很实用，我们不建议您开启过小的、低于这个数额的通道。随着多路径支付的普及，更小的通道也将不再是负担。但目前来说，我们的建议保持不变。

c-lightning 的插件最初是由 René Pickhardt（本书联合作者之一）编写的，它的工作模式跟 lnd 导航仪大相径庭。首先，它所用的提出通道建议的算法不同。我们不会在这里展开。其次，它的用户界面也不同。你需要从 c-lightning 的插件[仓库](https://github.com/lightningd/plugins/tree/master/autopilot)中下载这个 *导航仪插件*，然后激活它。

| | |
| -- | --|
| 注意 | 要在 c-lightning 中激活插件，请将插件放入 *~/.lightning/plugins* 目录，并确保插件文件是可以执行的（例如，运行 `chmod +x ~/.lightning/plugins/autopilot.py`）然后重启 lightningd。此外，如果你不希望插件在你启动 lightningd 的时候自动激活，你可以把它放在另一个目录中，然后使用 lightningd 的插件参数手动激活：`   lightningd --plugin=~/lightning-plugins/autopilot.py` 。|

c-lightning 中的导航仪可通过配置文件中的三个值来控制，也可以再你启动 lightningd 的时候以命令行参数的形式输入：

```
[c-lightning-autopilot]
autopilot-percent=75
autopilot-num-channels=10
autopilot-min-channel-size-msat=100000000msat
```

实际上，这些值是默认的，如果你采取同样的设定，那么不设也行。

这种导航仪不会像 lnd 导航仪一样自动在后台运行。相反，你需要在你希望导航仪为你开启一条建议通道的时候，通过命令行 `lightning-cli autopilot-run-once` 启动一次运行。但如果你只想让它给你提供一个建议，让你可以从中挑选，你可以加入一个可选的 `dryrun` 参数。

lnd 和 c-lightning 导航仪的一个关键区别在于，c-lightning 导航仪会自动提出通道大小的建议。例如，如果导航仪建议你跟一个仅有小通道的节点开设通道，它就不会建议你开设大通道。但是，如果它要跟一个拥有许多大通道的大节点开启通道，它可能会建议你使用较大容量的通道。

如你所见，c-lightning 的导航仪不像 lnd 的那么自动化，但它给了你多一点点的控制权。这些差异反映的是个人的偏好，也有可能会成为你选择这两种实现的决定 因素。

请注意，当前的导航仪实现主要使用的都是来自 gossip 协议的信息，也就是闪电网络当前的拓扑图。显然，你个人对通道的需求只会得到有限程度的考虑。更高级的导航仪将使用你的节点在过去运行中积累的历史和用法信息，包括路由成功率、你曾经的支付对象、曾经给你支付的对象。未来，这样优化过的导航仪可能也会使用这些收集起来的数据，为你提供关闭通道和重新分配资金的参考。

总的来说，从撰写本书的这个时间点来说，请小心不要过于依赖导航仪。

### 获得入账容量

在当前的闪电网络设计中，通常来说用户会先获得出账容量，*然后* 再获得入账容量。这是因为他们通常会先跟另一个节点开启通道（从而获得出账容量），然后，在他们实际之后，才会获得入账容量。一般来说，有三种办法可以获得入账容量：

- 开启一条通道，然后花费其中的一些资金。这样一来，余额就会转到通道的另一端，也就意味着你可以接收支付了（接受支付的限额就取决于另一端的余额）。
- 请求某人跟你开设通道。提供一些报酬，这样你们俩的节点都会变得更多连接，收发支付的能力也更平衡。
- 使用潜水艇互换（例如 Loop In），把链上的 BTC 换成对你的节点的入账容量。（译者注：疑正好写反了。Loop In 会将链上 BTC 换成闪电通道中的余额，也就是你的出账容量。应该使用 Loop Out，将闪电通道内的余额换成链上 BTC，也即支付出去，从而获得入账容量。）
- 购买第三方服务，要求他们跟你开设通道。这样的服务已经有了。有一些会收取费用，有一些是免费的。

这里是一份当前可用的流动性供应商的清单，他们可以跟你开启通道，但要收取费用：

- [Bitrefill 的 Thor 服务](https://www.bitrefill.com/thor-lightning-network-channels)
- [Lightning To Me](https://lightningto.me/)
- [LNBig](https://lnbig.com/)
- [Lightning Conductor](https://lightningconductor.net/channels)

获得入账容量，从实践和用户体验的角度，都不是一件容易的事。入账流动性无法自动获得，所以你必须为你的节点找到办法。支付通道的这种不对称性也有些反直觉。在大部分别的支付系统中，你是先获得支付（入账），然后才能给别人支付（出账）。

如果你是一个商家，或者使用闪电支付为你的服务收费，这个入账流动性问题会尤为明显。你需要时刻保持警惕，以保证你有足够多的流动性可以继续接收支付。想想看，你的店里顾客如云，但他们却没法为你支付，因为你的入账容量不够，这会怎么样？

以后，这些挑战会因为双向注资通道（dual-funded channels）的实现而得到部分缓解，因为双方都会投入资金，所以在一开始，双方都拥有平衡的入账和出账容量。这种负担也可以由更复杂的导航仪软件来缓解，它会在有需要的时候请求入账容量并为之支付。

最终来说，闪电用户需要在通道管理上学会策略和主动，以保证入账流动性可以满足自己的需要。

### 关闭通道

如本书前面提到的，“合作式关闭（mutual close）” 的效果更好，但也有 一些使用，用户需要 “强制式关闭（force close）”。

比如说：

- 你的通道对手离线了，联系不上因此无法发起合作式关闭。
- 你的通道对手在线，但不响应你的合作式关闭请求。
- 你的通道对手在线，跟你的节点正在协商合作式关闭，但他们卡住了，无法解决。

### 再平衡通道

在闪电网络上交易和路由支付一段时间之后，入账容量和出账容量可能变得不平衡。

举个例子，你的通道对手之一经常通过你的节点路由支付，那么在这条通道上你会用尽入账容量，同时在另一条通道上用尽出站容量。一旦如此，你就不能再用这条路径路由支付了。

有许多办法可以再平衡通道，每一种都有自己的优点和缺点。一种办法是使用潜水艇互换（例如 Loop Out），如本章前文所述。另一种再平衡的办法是等待反方向的路由支付发生。如果你的节点是充分连接的，当某一条路径在某个方向上的流动性耗尽时，同一路径的相反方向的流动性就会充足起来。别的节点可能会 “发现” 相反方向的路径，然后将它们作为自己的支付路径的一部分，从而再次平衡资金。

第三种办法是有目的地创建一条 “环状路径（circular route）”，从你的节点发起支付，通过闪电网络再回到你的节点。从一条具有大量本地余额的通道发起支付、安排支付路径、使之通过一条（对你来说）具有大量远端余额的通道回到你的节点，那么两条通道都会变得更加平衡。 环状路径再平衡策略的一个例子见 [Circular route rebalancing](https://github.com/lnbook/lnbook/blob/develop/05_node_operations.asciidoc#circular_rebalancing)。

[![mtln 0504](https://github.com/lnbook/lnbook/raw/develop/images/mtln_0504.png)](https://github.com/lnbook/lnbook/blob/develop/images/mtln_0504.png)

图 4. 环状路径再平衡

环状再平衡已经被大多数闪电节点支持，可以通过命令行或者一种网页管理界面操作，例如 Ride The Lightning（见 “[Ride The Lightning](https://github.com/lnbook/lnbook/blob/develop/05_node_operations.asciidoc#rtl)” 一节）。

通道再平衡是一门复杂的学问，也是热门的研究问题，在 “[通道再平衡]((https://github.com/lnbook/lnbook/blob/develop/05_node_operations.asciidoc#channel_rebalancing))” 一节中有更详细的介绍。


## 路由费

运行闪电节点，你就可以从经过你的通道的路由支付赚钱手续费。路由费一般来说不会是很大的收入来源，而且跟运营节点的成本相形见绌。举个例子，一个相对繁忙的节点可能一天路由十几笔支付，可得的手续费不会超过 2000 聪。

节点可以通过在每一条通道中设置想要的手续费率来争取路由费。费率有两个参数：一个 “base fee”，对每一笔支付都定额收取；另一个变量 “fee rate”，按支付数额成比例收取。

在发送闪电支付时，支付节点会选择路径，以尽可能少付路由费，或尽可能减少经过的节点数量，或兼而有之。因此，路由费市场会在这些因素的相互作用之下成长起来。现在有许多节点收取非常低的路由费或不收路由费，给路由费市场创造了下行的压力。

如果你不作设置，你的闪电节点会为每一条新通道使用一个默认的 base fee 数值以及 fee rate 数值。这个默认数值取决于你所用的软件时间。base fee 是以 “微聪（millisatoshi）” —— 千分之一聪 —— 为单位设置的；而比例性质的 fee rate 则以 *百万分之一* 为量级，按支付的数额收取。“百万分之一” 的单位通常被缩写成 “ppm”。举例来说，一个 base fee 为 1000（微聪）以及 fee rate 为 1000 ppm 的节点，会对一笔 10 0000 聪的支付收取如下数额：

\[\begin{equation} \begin{aligned} P &= 100,000 \text{ satoshi} \\ F_{base} &= 1,000 \text{ millisatoshi} = 1 \text{ satoshi} \\ F_{rate} &= 1,000 \text{ ppm} = 1,000/1,000,000 = 1/1,000 = \text{0.001} = 0.1\% \\ F_{total} &= F_{base} + ( P * F_{rate} ) \\ \Rightarrow F_{total} &= 1 \text{ satoshi} + ( 100,000/1,000 ) \text{ satoshi} \\ \Rightarrow F_{total} &= 1 \text{ satoshi} + 100 \text{ satoshi} = 101 \text{ satoshi} \\ \end{aligned} \end{equation}\]

广义来说，你可以通过两种方法之一获得路由费。你可以用较低的费率路由大量支付，也就是以价换量。或者，你可以收取较高的手续费率。如果你设置了较高的路由费率，你的节点只会在其它更便宜的节点无法路由时才会被选用。因此，你会更少参与路由，但可以从每一笔成功的路由中收获更多。

对于大部分节点来说，通常最好的办法就是使用默认的路由费数值。这样一来，你的节点就会跟其它同样使用默认数值的节点在基本上公平的环境中竞争。

你也可以使用路由费设定来引导通道的平衡。如果你的大部分通道都使用默认的手续费数值，但你希望再平衡某一条通道，那么只需将该通道的手续费调低，调到零或者一个非常低的水平。然后，你就等着别人通过你这条 “更便宜” 的路径路由支付，顺带平衡你的通道。

## 节点管理

使用命令行来管理你的闪电节点显然不容易。命令行通过节点的 API 为你提供了充分的灵活性，让你可以编写定制化的脚本来满足你的个人需求。但如果你不想处理命令行的复杂性，而且只需要一些基础的节点管理功能，你应该考虑安装一个基于网页的用户界面，简化节点的管理。

许多相互竞争的项目提供了这样基于网页的闪电节点管理工具。其中最流行的一些会在下文中介绍。

### Ride The Lightning

Ride The Lightning（RTL）是一种图形的网页用户界面，帮助用户完成三种主要的闪电节点实现（LND、`c-lightning` 和 Eclair）的节点操作。RTL 是一个开源的项目，由 Shahana Farooqui 和众多贡献者开发。你可以在这个 [GitHub 页面](https://github.com/Ride-The-Lightning/RTL)找到 RTL 软件。

[RTL 网页界面案例](https://github.com/lnbook/lnbook/blob/develop/05_node_operations.asciidoc#rtl-web-interface) 展示了一个 RLT 网页界面案例的截图。该图来自项目代码仓储。
[![mtln 0505](https://github.com/lnbook/lnbook/raw/develop/images/mtln_0505.png)](https://github.com/lnbook/lnbook/blob/develop/images/mtln_0505.png)

图 5. RTL 网页界面案例

### lndmon

LND 的开发者 Lightning Labs 提供了一个基于网页的图形用户界面，叫做 “lndmon”，用于监控一个 LND 闪电节点的多项指标。lndmon 仅能跟 LND 节点一起工作。它是一个只能读取的节点，用于监控，所以不允许你通过它来管理节点。它没法开启通道，也无法发起支付。可在这个 [GitHub 页面](https://github.com/lightninglabs/lndmon) 找到 lndmon。

### ThunderHub

[ThunderHub](https://thunderhub.io/) 是一种非常美观的、基于网页的图形用户接口，类似于 RTL，但也只能跟 LND 一起使用。它可以发起支付、再平衡通道，还可以通过许多功能来管理节点。

## 结论

在你管理节点并获得经验的过程中，你会学到许多关于闪电网络的知识。成为节点运营者有其挑战性，但也有其回报。熟悉这些技巧，将让你可以为这项技术以及闪电网络本身的成长和开发作出贡献。你还将获得以最大限度的控制权和惬意发送、接收闪电支付的能力。你将在网络的基础设施中扮演一个角色，而不仅仅是个边缘的参与者。