比特币的点对点网络由网络中的“节点”组成,主要由志愿者和一些构建比特币应用程序的商业机构运行。 那些运行的比特币节点具有直接和权威的比特币区块链视图,并且具有所有交易的本地副本,自己可以独立验证。 自己运行节点,就不必依赖任何第三方来验证交易。 此外,自己运行比特币节点,也可以使比特币网络更加健壮,为比特币网络做出贡献。

但是,运行节点需要足够资源来处理所有比特币交易,而且不能停机断网。 如果选择索引所有交易并保留完整区块链副本,还需要足够的磁盘空间和RAM。 2018年初,全索引节点需要2 GB的RAM和160 GB的磁盘空间,才能满足空间增长需求(参考 https://blockchain.info/charts/blocks-size)。 比特币节点还传输和接收比特币交易和区块,消耗互联网带宽。 如果互联网连接有带宽上限或按流量计费,建议就不要运行比特币全节点,或者用限制其带宽的方式运行(请参阅例3-2)。

提示:
Bitcoin Core默认情况下保留区块链的完整副本,包括从2009年比特币成立以来发生的每一笔交易。此数据集的大小为几百GB,下载可能需要几天或几周,具体取决于 CPU和互联网带宽。完整区块链数据集被下载完成之前,Bitcoin Core将无法处理交易或更新帐户余额。 因此确保足够的磁盘空间,带宽和时间来完成初始同步。 也可以配置Bitcoin Core通过丢弃旧区块来减少区块链的大小(请参阅例3-2),但是在丢弃数据之前仍将下载整个数据集。

尽管有这些资源需求,但仍有成千上万的志愿者运行比特币节点。 有些节点在简单的系统上运行,就像树莓派Raspberry Pi(35美元的计算机,一副扑克牌大小)。 许多志愿者在租用的服务器类Linux系统上运行比特币节点。 虚拟专用服务器(VPS)或云计算服务器实例也可用于运行比特币节点。 这些服务器每月租金大约25至50美元。

为什么要运行节点? 以下是一些最常见的原因:

  • 如果是开发比特币软件,需要比特币节点进行可编程接口(API)访问网络和区块链。
  • 如果是开发根据比特币共识规则验证交易的应用程序。 比特币软件公司通常运行多个节点。
  • 如果只是想支持比特币。 那么运行节点可以使网络更加健壮,提供更多的钱包,更多的用户和更多的交易。
  • 如果不想依赖任何第三方来处理或验证自己的交易。
  • 如果阅读本书并对开发比特币软件感兴趣,那么也应该运行自己的节点。

3.3.1 配置Bitcoin Core节点

Bitcoin Core每次启动都会在查找数据文件目录下的配置文件(文件名一般是bitcoin.conf)。这一部分先了解配置文件的不同选项,建立配置文件。要找到配置文件的位置,在“terminal”中运行bitcoind --printtoconsole命令,命令输出的前几行就能看到。

$ bitcoind --printtoconsole
Bitcoin version v0.15.0
Using the 'standard' SHA256 implementation
Using data directory /home/ubuntu/.bitcoin/
Using config file /home/ubuntu/.bitcoin/bitcoin.conf
...
[a lot more debug output]
...

找到配置文件的位置后,可以使用Ctrl-C退出程序。一般来说,配置文件位于当前用户的主目录的.bitcoin数据目录下。系统不会自动创建这个文件的,需要手动从下面 例3 的内容复制粘贴过来。也可以使用自己的默认编辑器手动创建进行修改。

Bitcoin Core还提供了100多个配置选项,可以修改网络节点的行为,区块链的存储以及操作的其他方面。

要查看这些选项的列表,运行bitcoind --help命令:

 $ bitcoind --help
Bitcoin Core Daemon version v0.15.0
Usage:
  bitcoind [options]                     Start Bitcoin Core Daemon
Options:
  -?
       Print this help message and exit
  -version
       Print version and exit
  -alertnotify=<cmd>
       Execute command when a relevant alert is received or we see a really
       long fork (%s in cmd is replaced by message)
...
[many more options]
...
  -rpcthreads=<n>
       Set the number of threads to service RPC calls (default: 4)

以下是您可以在配置文件中设置的一些最重要的选项,也可以作为bitcoind的命令行参数:

alertnotify

运行指定的命令或脚本,通常通过电子邮件将紧急警报发送给该节点的所有者。

conf

配置文件的替代位置。 只作为bitcoind的命令行参数有意义,不能在配置文件中起作用。

datadir

选择存放区块链数据的目录和文件系统。 默认情况下,在账户主目录的.bitcoin子目录。 确保该文件系统最少有几GB的可用空间。

prune

启用修剪模式,通过删除旧区块,将磁盘空间要求降低到几百MB。 供空间有限的节点使用。

txindex

维护所有交易的索引。 这意味着可以通过ID以编程方式在区块链的完整副本中检索任何交易。

dbcache

设置UTXO cache大小。默认是300MB。配置高的系统上可以增加一些,配置低的话就减少一些,可以减少内存消耗,但是需要更多的磁盘IO开销。

maxconnections

设置最连接多少个节点。 从默认值减少该值将减少带宽消耗。 如果网络是带宽受限或者按照流量计费,可以设置这个参数。

maxmempool

将交易内存池限制在几兆字节。 使用它来减少节点的内存使用。

maxreceivebuffer/maxsendbuffer

将每个连接的内存缓冲区限制为多少个KB。 在内存受限节点上使用。

minrelaytxfee

设置发送的交易的的最低费用。 低于此值,交易被视为不规范的,会被交易池拒绝,也不会被发送。

交易数据库索引和txindex选项

默认情况下,Bitcoin Core会创建一个数据库,这个数据库只包含与用户钱包有关的交易。 如果您想要使用诸如getrawtransaction(参见3.4.2)之类的命令解读任何交易,则需要修改配置文件中的txindex选项设置 txindex=1来构建完整的交易索引。 如果不是一开始设置此选项,后期再想开启完全索引,需要使用 --reindex 选项重新启动bitcoind,并等待它重建索引。

下面的配置文件显示了前面提到的选项与完全索引节点组合起来的示例,可以作为比特币应用程序的API后端运行。

例3-1完整索引节点的例子

alertnotify=myemailscript.sh "Alert: %s"
datadir=/lotsofspace/bitcoin
txindex=1

例3-2是小型服务器资源不足的配置示例。

alertnotify=myemailscript.sh "Alert: %s"
maxconnections=15
prune=5000
dbcache=150
maxmempool=150
maxreceivebuffer=2500
maxsendbuffer=500

配置文件修改完成之后,可以使用printtoconsole选项测试 bitcoind,查看输出的结果:

$ bitcoind -printtoconsole
Bitcoin version v0.15.0
InitParameterInteraction: parameter interaction: -whitelistforcerelay=1 -> setting -whitelistrelay=1
Assuming ancestors of block 0000000000000000003b9ce759c2a087d52abc4266f8f4ebd6d768b89defa50a have valid signatures.
Using the 'standard' SHA256 implementation
Default data directory /home/ubuntu/.bitcoin
Using data directory /lotsofspace/.bitcoin
Using config file /home/ubuntu/.bitcoin/bitcoin.conf
Using at most 125 automatic connections (1048576 file descriptors available)
Using 16 MiB out of 32/2 requested for signature cache, able to store 524288 elements
Using 16 MiB out of 32/2 requested for script execution cache, able to store 524288 elements
Using 2 threads for script verification
HTTP: creating work queue of depth 16
No rpcpassword set - using random cookie authentication
Generated RPC authentication cookie /lotsofspace/.bitcoin/.cookie
HTTP: starting 4 worker threads
init message: Verifying wallet(s)...
Using BerkeleyDB version Berkeley DB 4.8.30: (April  9, 2010)
Using wallet wallet.dat
CDBEnv::Open: LogDir=/lotsofspace/.bitcoin/database ErrorFile=/lotsofspace/.bitcoin/db.log
scheduler thread start
Cache configuration:
* Using 250.0MiB for block index database
* Using 8.0MiB for chain state database
* Using 1742.0MiB for in-memory UTXO set (plus up to 286.1MiB of unused mempool space)
init message: Loading block index...
Opening LevelDB in /lotsofspace/.bitcoin/blocks/index
Opened LevelDB successfully
[... more startup messages ...]

一确认配置显示正常,可以按Ctrl-C中断进程。

如果不想在前台运行Bitcoin Core,可以使用守护进程选项启动:bitcoind --daemon,在后台运行。

要监视比特币节点的进度和运行状态,使用命令bitcoin-cli getblockchaininfo:

$ bitcoin-cli getblockchaininfo
{
  "chain": "main",
  "blocks": 0,
  "headers": 83999,
  "bestblockhash": "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f",
  "difficulty": 1,
  "mediantime": 1231006505,
  "verificationprogress": 3.783041623201835e-09,
  "chainwork": "0000000000000000000000000000000000000000000000000000000100010001",
  "pruned": false,
  [...]
}

上面输出内容显示了这个节点当前更新的数据是区块高度为0,区块头为83999,意思是只获取到了最佳链的区块头,完整的区块数据之后才会开始下载。

配置选项确定好之后,应该将bitcoin命令添加到操作系统中的启动脚本中,让它随系统重启自动启动。 可以在 contrib/init 下的bitcoin目录查看README.md文件,找到不同操作系统对应的示例启动脚本。