# 第 09 讲：比特币核心节点

![status](https://img.shields.io/badge/状态-已完成-success)
![author](https://img.shields.io/badge/作者-beihaili-blue)
![date](https://img.shields.io/badge/日期-2025--06-orange)
![difficulty](https://img.shields.io/badge/难度-中级-yellow)

> 💡 自学入门 `Web3` 不是一件容易的事，作为一个刚刚入门 Web3 的新人，梳理一下最简单直观的 `Web3` 小白入门教程。整合开源社区优质资源，为大家从入门到精通 Web3 指路。每周更新 1-3 讲。
> 
> 欢迎关注我的推特：[@bhbtc1337](https://twitter.com/bhbtc1337)
> 
> 进入微信交流群请填表：[表格链接](https://forms.gle/QMBwL6LwZyQew1tX8)
> 
> 文章开源在 GitHub：[Get-Started-with-Web3](https://github.com/beihaili/Get-Started-with-Web3)
> 
> 购买 BTC / ETH / USDT 等加密货币推荐 [币安](https://www.binance.com/zh-CN)[注册链接](https://www.bsmkweb.cc/register?ref=39797374)

## 目录

- [前言](# 前言)
- [比特币节点是什么](# 比特币节点是什么)
- [运行比特币节点的意义](# 运行比特币节点的意义)
- [如何搭建比特币节点](# 如何搭建比特币节点)
- [常见问题](# 常见问题)
- [结语](# 结语)

## 前言

2009 年 1 月 3 日，一个平凡到不能再平凡的周六，芬兰赫尔辛基的一个小型服务器上，匿名开发者中本聪运行了一个名为比特币节点的程序，挖出了比特币的创世区块。当时的人们并不知道，一个全新的时代已经缓缓拉开帷幕。

我们无从得知中本聪是谁，但是我们能够清楚地看到比特币节点的源码，从而清晰地看到中本聪的想法。在比特币节点的源码中，中本聪规定区块大小为 1 MB，这意味着在大约 10 分钟的出块间隔时间里，比特币网络只能处理 1 MB 的数据。看起来这是对比特币发展的一个限制，那么中本聪的目的是什么呢？是保证去中心化！

小区块保证了一般用户可以在自家电脑上简单地运行比特币客户端，这个策略被证明是有效的，截至目前比特币网络运行 15 年，比特币节点的大小仅为 663 GB，可以在一台家用电脑上运行。我们可以想像，中本聪在确立小区块时脑海中在想什么：一个全新的资产，不靠政府或任何中心化的信用，靠的是遍布全球甚至全宇宙的节点互相连接，自发组织合作，最终编织出璀璨网络！

## 什么是比特币全节点

比特币全节点，就是指那些在具有最多工作量证明的有效区块链上，独立验证每一个区块中每一笔交易的节点。它通过自主下载、存储并校验自比特币诞生以来的全部交易历史，来独立判断所有交易和区块的有效性，从而确保用户无需信任任何第三方即可安全地使用比特币。

## 使用全节点的优缺点

### 优点

- ** 去中心化 **：全节点可以独立验证交易，确保网络的去中心化和可靠性。
- ** 隐私性 **：全节点不会依赖第三方服务器，提升隐私性。
- ** 支持网络安全 **：全节点通过验证交易和区块，帮助维护比特币网络的安全。
- ** 数据完整性 **：全节点可以验证区块链的完整性，确保数据不被篡改。
- ** 数据可信 **：全节点可以验证区块链的完整性，确保数据不被篡改。

### 缺点

- ** 资源消耗 **：全节点需要大量的硬盘空间和计算资源。
- ** 网络带宽消耗 **：全节点需要稳定的网络带宽，以处理和同步区块链数据。

## 如何运行一个比特币全节点

废话不多说，让我们来直接开始运行一个比特币全节点。

### 1. 准备条件

确保你要运行全节点的主机或服务器满足以下条件：
- 至少 1 TB 容量的硬盘空间（截止 2025 年，比特币区块链大小约为 660 GB，预计 2026 年达到 1 TB）。
- 稳定访问国际互联网。

### 2. 下载比特币核心客户端

- 访问 [比特币核心网站](https://bitcoin.org/en/download)，下载适合你操作系统的版本。

- 验证下载的文件是否完整，可以通过计算文件的哈希值，并与网站上提供的哈希值进行对比：
    - 下载网站提供的 `SHA256SUMS.asc` 文件，和 `SHA256SUMS`。
    - 安装 gpg：
    `sudo apt-get install gnupg` / `brew install gpg`
    - 导入公钥：
    `gpg --keyserver hkp://keyserver.ubuntu.com --recv-keys 01EA5486DE18A882D4C2684590C8019E36C2E964`
    - 使用命令验证：
    `gpg --verify SHA256SUMS.asc SHA256SUMS`
    `shasum -a 256 [你下载的文件名]`
    - 对比两个文件的哈希值，如果一致，则说明文件完整。

- 下载完成后，解压文件，进入文件夹，运行 `bitcoind`。

### 3. 启动比特币核心客户端

- 配置比特币核心客户端：
    - Bitcoin Core 的配置文件通常位于以下位置：
    `Linux /macOS：~/.bitcoin/bitcoin.conf`
    `Windows： C:\Users\<YourUsername>\AppData\Roaming\Bitcoin\bitcoin.conf`
    - 如果该文件不存在，可以手动创建。你可以在终端（macOS 或 Linux）中使用以下命令：
    `mkdir -p ~/.bitcoin`
    `touch ~/.bitcoin/bitcoin.conf` 
    - 配置文件内容：在 `bitcoin.conf` 文件中，添加以下基础配置：
    ```
    # 启用测试网络（可选）
    # testnet=1
    # 设置 RPC 用户名和密码（用于与客户端交互）
    rpcuser=yourusername
    rpcpassword=yourpassword
    # 设置 RPC 监听地址和端口
    rpcallowip=127.0.0.1         # 允许本地连接
    rpcport=8332                 # 默认的 RPC 端口
    # 启用 P2P 网络端口（与其他节点通信）
    port=8333                    # 默认的 P2P 端口
    listen=1                     # 允许监听入站连接
    # 节点连接设置
    maxconnections=40            # 最大连接数，默认 125，可根据网络情况调整
    addnode=seed.bitcoin.sipa.be # 手动添加节点
    ```
    - `testnet`：设置为 1 时启用测试网络。
    - `rpcuser` 和 `rpcpassword`：用于 RPC 访问的用户名和密码，请自行设置。
    - `rpcallowip`：限制 RPC 的访问 IP。
    - `addnode`：可以添加一些已知的节点，以便快速同步。

- 用命令行运行：
`bitcoind -daemon`

- 查看比特币核心客户端是否运行：
`bitcoin-cli getblockchaininfo`
    - 如果出现以下信息，则说明比特币核心客户端正在运行：
```json
{
  "chain": "main",
  "blocks": 864960,
  "headers": 864960,
  "bestblockhash": "00000000000000000000af903762b90d4523ff7395ebdbf34ba18f17cd4e9cee",
  "difficulty": 92049594548485.47,
  "time": 1728520811,
  "mediantime": 1728517565,
  "verificationprogress": 0.9999992558144524,
  "initialblockdownload": false,
  "chainwork": "0000000000000000000000000000000000000000930dc84827142da2656fb2ff",
  "size_on_disk": 689537999029,
  "pruned": false,
  "warnings": ""
}
```

### 4. 同步数据

- 启动 Bitcoin Core 客户端后，它会自动开始下载和验证区块链数据。这是一个非常耗时的过程，可能需要几小时甚至几天时间。
- 数据目录（可选）：如果你的磁盘空间有限，可以将数据目录更改到其他驱动器或位置：
    `datadir=/path/to/your/data_directory`
    `datadir=/mnt/data/bitcoin`

### 5. 常用配置项

- 根据具体需求，还可以添加以下配置：
    - 禁用图形界面（适用于服务端）
    `daemon=1`
    - 限制硬盘空间使用（以 MB 为单位），超出时删除旧区块
    `prune=550`
    - 设置交易费率（按需调整）
    `txconfirmtarget=6`           # 目标确认时间（以区块数计算）
    - 优化带宽使用
    `maxuploadtarget=500`         # 最大上传流量 (MB / 天)

### 6. 使用比特币核心客户端

- GUI 启动：
    `bitcoin-qt`
- 使用命令行启动 (Linux /macOS)：
    `bitcoind -daemon`

### 7. 停止比特币核心客户端

- GUI 停止：
    `bitcoin-qt`
- 使用命令行停止 (Linux /macOS)：
    `bitcoin-cli stop`

### 8. 其他常用操作

- 查看当前节点同步状态
    `bitcoin-cli getblockchaininfo`
- 查看当前区块高度
    `bitcoin-cli getblockcount`
- 查看当前余额
    `bitcoin-cli getbalance`
- 查看当前未确认的交易
    `bitcoin-cli getrawmempool`
- 查看当前未确认的交易数量
    `bitcoin-cli getmempoolinfo`

## 比特币节点运行实战经验与避坑指南

在实际运行比特币节点的过程中，我们可能会遇到各种技术挑战和问题。以下是基于实战经验总结的关键注意事项和解决方案，帮助你避开常见陷阱，确保节点稳定运行。

### 存储介质选择与文件系统

#### 文件系统选择

** 问题 **：不同文件系统对比特币数据库的稳定性影响巨大。 ExFAT 等非日志式文件系统在断电或非正常关机时容易导致数据损坏。

** 解决方案 **：
- **macOS 用户 **：优先使用 APFS 文件系统。
- **Windows 用户 **：优先使用 NTFS 文件系统。
- **Linux 用户 **：优先使用 ext4 或 XFS 文件系统。
- ** 避免使用 **： ExFAT, FAT32 等非日志式文件系统。

** 实战经验 **：
```
在使用 ExFAT 格式的外置 SSD 运行比特币节点时，频繁出现数据库损坏情况。
将同一 SSD 重新格式化为 APFS 后，节点稳定性显著提高，不再出现数据损坏。
```

#### 外置存储设备注意事项

** 问题 **：外置存储设备断开连接会导致比特币数据库损坏。

** 解决方案 **：
- 使用高质量的 USB 连接线和接口。
- 避免在节点运行时拔插存储设备。
- 考虑使用 UPS 防止突然断电。
- 定期备份 `wallet.dat` 和其他重要配置文件。

### 节点资源管理

#### 磁盘空间管理

** 问题 **：完整的比特币区块链 (2025 年) 已达 660 GB+，并持续增长。

** 解决方案 **：
1. ** 修剪模式 (Pruned Mode)**：
   ```
   # 在 bitcoin.conf 中设置，限制区块链存储大小为 2 GB
   prune=2000
   ```
   
   ** 优点 **：
   - 大幅减少磁盘使用（可低至 2 - 10 GB）。
   - 仍然是完整验证节点，安全性不受影响。
   - 可以发送 / 接收交易，使用钱包功能。
   
   ** 缺点 **：
   - 初始同步时间不会减少（仍需下载整个区块链进行验证）。
   - 无法提供旧区块的数据（已被修剪）。
   - 无法使用 `txindex` 等完整索引功能。
   
2. ** 理解修剪模式的工作原理 **：
   - 节点仍会下载并验证完整区块链。
   - 验证后会删除最早的区块数据，仅保留最新区块。
   - 始终保留完整的 UTXO 集（未花费交易输出）。

#### 内存和 CPU 优化

** 问题 **：默认配置可能导致内存占用过高，影响系统稳定性。

** 解决方案 **：
```
# 优化的 bitcoin.conf 参数
dbcache=450           # 数据库缓存大小 (MB)，根据系统内存调整
maxmempool=300        # 内存池大小限制 (MB)
par=2                 # 脚本验证线程数，根据 CPU 核心数调整
maxorphantx=10        # 限制孤立交易数量，提高稳定性
blocksonly=1          # 仅下载区块，不中继交易，大幅减少带宽
```

### 监控与自动恢复

#### 节点监控脚本

为了确保节点稳定运行，可以使用自动监控脚本定期检查节点状态并在必要时重启：

```bash
#!/bin/bash

# Bitcoin 节点监控脚本
# 功能：每次运行时检查节点状态，记录同步进度，必要时重启节点
# 使用方法：设置为 cron 任务，每 30 分钟运行一次

# 配置变量
BITCOIN_CONF="/path/to/bitcoin.conf"
BITCOIN_DATA="/path/to/bitcoin/data"
LOG_FILE="/path/to/bitcoin_monitor.log"
MAX_LOG_SIZE=10000000  # 10 MB，超过此大小将清空日志

# 检查配置文件是否存在
check_config_exists () {
    if [ ! -f "$BITCOIN_CONF" ]; then
        echo "$(date): 错误 - 配置文件不存在: $BITCOIN_CONF" >> "$LOG_FILE"
        return 1
    fi
    return 0
}

# 检查比特币节点是否运行
check_node_running () {
    if pgrep -x "bitcoind" > /dev/null; then
        return 0
    else
        echo "$(date): 警告 - 比特币节点未运行" >> "$LOG_FILE"
        return 1
    fi
}

# 检查是否存在数据损坏
check_data_corruption () {
    local log_file="$(dirname"$BITCOIN_CONF")/debug.log"
    if [ -f "$log_file" ]; then
        if tail -n 100 "$log_file" | grep -q -E "(corruption|corrupted|checksum|error.*block|fatal|Corrupted)"; then
            echo "$(date): 警告 - 检测到可能的数据损坏" >> "$LOG_FILE"
            return 0
        fi
    fi
    return 1
}

# 启动比特币节点
start_node () {
    local reindex_needed=false
    
    # 检查是否需要重建索引
    if check_data_corruption; then
        reindex_needed=true
    fi
    
    if [ "$reindex_needed" = true ]; then
        echo "$(date): 信息 - 正在使用 -reindex 参数启动比特币节点..." >> "$LOG_FILE"
        bitcoind -datadir="$BITCOIN_DATA" -daemon -reindex
    else
        echo "$(date): 信息 - 正在启动比特币节点 (无 reindex)..." >> "$LOG_FILE"
        bitcoind -datadir="$BITCOIN_DATA" -daemon
    fi
}

# 主函数
main () {
    # 检查配置
    if ! check_config_exists; then
        return 1
    fi
    
    # 检查节点是否运行
    if ! check_node_running; then
        echo "$(date): 信息 - 尝试启动节点..." >> "$LOG_FILE"
        start_node
    else
        echo "$(date): 信息 - 比特币节点正在运行" >> "$LOG_FILE"
    fi
    
    return 0
}

# 执行主函数
main
```

### 轻量级替代方案

如果运行完整节点的资源需求过高，可以考虑以下轻量级替代方案：

#### SPV 钱包

** 特点 **：
- 只下载区块头（约 50 MB）而非完整区块。
- 几分钟内即可设置完成。
- 资源需求极低。

** 推荐选择 **：
- **Electrum**：功能全面的轻量级钱包 (https://electrum.org/)
- **BlueWallet**：移动端友好的 SPV 钱包 (https://bluewallet.io/)
- **Wasabi Wallet**：注重隐私的 SPV 钱包 (https://wasabiwallet.io/)

** 安全性对比 **：
- SPV 钱包通过 Merkle 证明验证交易，而不是验证所有交易。
- 安全性略低于全节点，但对个人用户通常足够。
- 需要信任远程服务器提供正确信息。

### 常见问题排查

#### 节点无法同步

** 检查步骤 **：
1. 检查网络连接（特别是防火墙设置）。
2. 检查磁盘空间是否充足。
3. 查看 `debug.log` 文件中的错误信息。
4. 尝试添加已知的节点：
   ```
   addnode=seed.bitcoin.sipa.be add
   ```

#### 数据库损坏

** 症状 **：
- 日志中出现「database corruption」或「checksum mismatch」等错误。
- 节点崩溃或无法启动。

** 解决方法 **：
1. 使用 `-reindex` 参数重启：
   ```
   bitcoind -reindex
   ```
2. 如果仍然失败，可能需要删除 `blocks` 和 `chainstate` 目录，重新同步。

## 常见问题

#### ❓ 运行比特币节点需要好的电脑吗？

不需要特别高端的电脑，但有一些最低要求：

1. ** 存储空间 **：至少需要 700 GB 的可用空间，最好是 1 TB（比特币区块链持续增长）。
2. ** 内存 **：至少 2 GB RAM，建议 4 GB 或更多。
3. ** 网络 **：稳定的宽带连接，每月数据传输量约 200 GB。
4. ** 处理器 **：一般的多核处理器即可。

如果资源受限，可以考虑使用修剪模式 (prune mode)，可以将存储需求减少到 10 GB 左右。

#### ❓ 运行比特币节点有问题，数据同步非常慢，怎么办？

数据同步慢是常见问题，这里有几个解决方案：

1. ** 手动添加节点 **：在配置文件中添加可靠的节点地址。
2. ** 检查防火墙 **：确保端口 8333 开放。
3. ** 升级硬件 **：如果可能，使用 SSD 而不是机械硬盘。
4. ** 使用快速同步 **：可以从可信来源下载区块链快照以快速启动。

#### ❓ 比特币节点和挖矿有什么不同？

这是一个常见的混淆点：

1. ** 比特币节点 **：验证和中继交易，维护区块链的完整副本，不会获得挖矿奖励。
2. ** 挖矿 **：是尝试解决数学难题以创建新区块并获得比特币奖励。

运行节点不会直接为你带来比特币奖励，但它对于维护比特币的去中心化和安全性至关重要。

#### ❓ 我的节点需要 24 / 7 运行吗？

不需要。虽然持续运行对比特币网络最有利，但你可以根据需要关闭和启动你的节点。当你再次启动时，节点会自动同步自上次关闭后的新区块。

## 参考

- [比特币核心文档](https://bitcoin.org/en/developer-reference#bitcoin-core)
- [比特币核心源码](https://github.com/bitcoin/bitcoin)
- [比特币白皮书](https://bitcoin.org/bitcoin.pdf)
- [比特币开发者指南](https://bitcoin.org/en/developer-guide)
- [运行比特币全节点](https://yishi.io/how-to-run-bitcoin-full-node/)

## 结语

运行比特币节点不仅是一种技术实践，更是一种参与金融革命的方式。当你搭建自己的节点时，你不仅仅是在使用比特币，而是在为其去中心化网络的安全性和韧性贡献一份力量。

每一个运行的节点都是比特币网络的守护者 —— 你的参与使这个庞大的金融体系更加长青。不论是使用完整节点还是修剪模式，你都在为一个更开放、更公平、更自由的金融未来做出贡献。

距离从前《泰晤士报》头版的 15 年后的今天，我们有理由相信中本聪的这句话：「我很有信心，区块链技术将成为一种新的经济模式，有年轻人会找到各种利用区块链技术来创造价值的办法。」

---

<div align="center">
<a href="https://github.com/beihaili/Get-Started-with-Web3">🏠 返回主页 </a> | 
<a href="https://twitter.com/bhbtc1337">🐦 关注作者 </a> | 
<a href="https://forms.gle/QMBwL6LwZyQew1tX8">📝 加入交流群 </a>
</div>
