搭建自己的比特币节点1 - 环境配置 & Bitcoin Regtest 测试网

引言

本系列文章将重点讨论比特币(Bitcoin,BTC)节点的搭建过程,以及这一过程在提升个人与整个网络完整性方面的重要意义。鉴于目前中文资料的相对匮乏,此系列旨在为中文社区提供从技术视角出发的深入分析和实操指南,以支持和促进比特币生态系统的健康发展。

比特币网络的去中心化特性,需要独立运行的节点来共同维护。每个节点都是网络健全性和数据一致性的关键。独自搭建并运行节点,对于加深理解比特币的去中心化和共识机制至关重要。

本系列内容将依次包括以下几个部分:

1. 搭建 Bitcoin Regtest 测试网:本部分将讨论如何建立一个仅用于测试和开发目的的本地比特币网络(Regtest)。我们将逐步讲解在隔离环境中验证交易和区块的流程,以及应用各类网络参数以模拟不同网络状态的方法。

2. 搭建 Bitcoin 主网节点:详细介绍如何配置并部署一个连接至比特币主网的节点。文章将从选择适合的硬件、安装节点软件,到如何加密存储钱包和配置网络的全面教程。

3. 搭建 ORD & ORD-BRC20 节点:随着铭文的需求日益增长,搭建一个ORD节点将提供无可比拟的学习机会。这一部分将深入探究ORD节点的作用,解析多链协作的技术细节。

本文将完成 Bitcoin Regtest 测试网的搭建。

tmp_mqo_jh6.jpg

Bitcoin 节点的四种网络模式

在探讨比特币节点的构建与运维过程,我们必须首先明确各种网络模式及其适应的场景。以下将对比特币网络的四种主要模式——MainNet、TestNet、SimNet、和RegTest——进行详细阐述,以便于理解各自的技术特点和用例。

1. MainNet(主网):主网是比特币实际运作的主体网络,承载着所有关键的比特币交易和资金流动。该网络具备高度的经济活动价值,用户在此进行的任何交易都具有现实世界的财经影响力。主网持有完整的区块链历史数据,并实时记录所有新的交易活动。

2. TestNet(测试网络):此网络为比特币主网的镜像环境,旨在为开发者和测试专家提供一个无风险的实验场所。测试网络利用特定的比特币——其无实际价值——模拟主网的交易状况,实现开发和测试功能。为了便于测试与迭代,测试网络会定期重置,并模拟主网的交易特性,但常设有利于测试工作的差别化条件。

3. SimNet(模拟测试网络):SimNet为一个完全独立的网络,不与外界其他节点交换信息,是为开发者提供的一种纯净的本地测试网络。SimNet不需要与其他节点同步区块数据,它创建了一个全新的、从不通信的区块链。这种网络模式专门为应用开发与测试而生,使得开发者能够在一个受限的、完全可控的环境中进行操作。

4. RegTest(回归测试网络):作为一种专用的本地网络环境,RegTest与SimNet类似,主要服务于应用开发与测试工作。通过启用 --regtest 参数,开发者可以在本地初始化一个全面自主控制的比特币节点,该节点不会与外部网络通讯。此外,RegTest网络支持按需生成区块,无需遵守MainNet或TestNet所规定的实时时间间隔,为开发者提供了进行快速且可预测测试的理想条件。

设置服务器

在部署比特币节点时,选择一个稳定且兼容性良好的服务器操作系统至关重要。Ubuntu和Debian因其高度的用户友好性和广泛的支持而成为了领先的选择,尽管某些用户可能会考虑使用CentOS,但通常会面临更复杂的配置过程。在本教程中,我选用了Ubuntu 22.04.3 LTS作为服务器操作系统。

1. 更新系统到最新状态,并安装必要的构建环境及依赖项

sudo apt update
sudo apt upgrade
sudo apt install build-essential libtool autotools-dev automake pkg-config bsdmainutils python3

2. 安装比特币节点所需的库和依赖项

sudo apt install libssl-dev libevent-dev libboost-system-dev libboost-filesystem-dev libboost-chrono-dev libboost-test-dev libboost-thread-dev

对于Ubuntu 18.04及以后版本,也需要安装以下软件库来编译钱包: sudo apt install libdb-dev libdb++-dev

sudo apt install libdb-dev libdb++-dev

下载和配置比特币核心

1. 获取Bitcoin Core归档文件

wget https://bitcoincore.org/bin/bitcoin-core-26.0/bitcoin-26.0-x86_64-linux-gnu.tar.gz

2. 归档文件的安全验证 (可选但推荐)

出于安全考量,强烈建议验证下载文件的完整性和真实性。此过程包括:

• 下载SHA256SUMS文件及其数字签名SHA256SUMS.asc

• 使用sha256sum命令和GPG软件确保SHA256散列值与开发者提供的匹配,同时验证文件签名的有效性。这要求一定的技术背景,确保执行这些步骤的准确性对保障系统安全至关重要

3. 解压及安装Bitcoin Core

tar -zxvf bitcoin-26.0-x86_64-linux-gnu.tar.gz
cd bitcoin-26.0/bin/
sudo install -m 0755 -o root -g root -t /usr/local/bin *

4. 配置bitcoin.conf

比特币节点的行为和特性也可通过其配置文件 bitcoin.conf 进行详细设定。bitcoind —— 比特币的全节点守护进程,以及其命令行界面 bitcoin-cli 均依据此文件初始化用户定义的设定。bitcoin.conf 位于节点操作系统的比特币数据文件夹内,其默认位置因操作系统而异:

  • Linux: ~/.bitcoin/bitcoin.conf

  • macOS: ~/Library/Application Support/Bitcoin/bitcoin.conf

  • Windows: %APPDATA%\Bitcoin\bitcoin.conf

在 bitcoin.conf 文件中,可以配置一系列节点选项:

  • 网络选项:指定节点应连接的网络类型。

    • testnet=1:连接至测试网络。

    • regtest=1:启用回归测试网设置。

  • RPC设置:对于需通过RPC接口与节点通信的用户来说,此处可以设定RPC服务参数。

    • rpcuser=<username>:设定RPC访问的用户名。

    • rpcpassword=<password>:设定RPC访问的密码。

    • rpcport=<port>:指定RPC服务的监听端口。

    • rpcbind=<ip>:定义RPC服务的监听IP地址。

    • rpcallowip=<ip>:列出允许执行RPC调用的IP地址。

  • 钱包配置:若使用比特币核心钱包功能,则在此进行相关设置。

    • disablewallet=1:若不必运行内置钱包功能,则用此选项进行禁用。

  • 网络连接:规定节点如何与比特币网络中的其他节点建立联系。

    • maxconnections=<n>:限定可建立的最大网络连接数。

    • addnode=<ip>:手动添加节点进行连接。

  • 数据存储与优化:关于区块链数据存储的配置。

    • txindex=1:构建完整交易索引,适用于区块链浏览器等服务。

    • prune=<n>:通过减少节点的存档数据量来节省磁盘空间,<n> 表示以MiB计的保留数据量。

  • 挖矿配置:若计划使用 bitcoind 实施挖矿操作。

    • gen=1:启用挖矿功能。

    • genproclimit=<n>:指定挖矿过程中所使用的处理器核心或线程数。

  • 其他配置:包括日志记录和调试等额外设置。

    • debug=<category>:启用特定类别的详细调试信息。

    • server=1:激活节点作为RPC服务器功能。

本次要启动的是RegTest,配置如下:

[regtest]
dbcache=10240
txindex=1
upnp=1
rpcuser=web3koala
rpcauth=web3koala:a305be7b297910f76q60c4f2z493425e$6d0ee94252d954b52ec0585c52d9c9b9725e4a60d387e6e71e0cf11685d6efa9
rpcpassword=-dkUgXa8fubAysz218a-79Zr-pmElY3Kq4HslpCQoE0
daemon=1
server=1
rest=1
rpcallowip=0.0.0.0/0
#local testnet
fallbackfee=0.0001
datadir=/opt/data

其中rpcuser对应的可以自己指定,我这里是web3koala,rpcpasswordrpcauth则需要运行rpcauth.py 来生成,命令如下

python3 ./share/rpcauth/rpcauth.py web3koala

需要把web3koala替换成你自己的rpcuser

5. 启动Regtest测试网

bitcoind -regtest -txindex -fallbackfee=0.0002

  • -regtest:这个选项指示 bitcoind 启动到回归测试模式(regression test mode)。

  • -txindex:启用交易索引选项。具有交易索引的节点会为区块链中的每一笔交易创建一个索引,这样可以使用 getrawtransaction RPC命令查询任何交易详细信息,即使它们不是钱包的一部分。没有这个索引,节点仅能查询那些直接涉及到钱包或内存池中的交易。

  • -fallbackfee=0.0002:这个选项设置了备用交易费率(以BTC为单位),为 0.0002 BTC/kB。在网络交易费用无法精准估计时,节点将使用这个费用作为默认值。这对于测试环境特别有帮助,因为在测试网络上可能不会有足够的交易数据来估算费用。在主网上使用时需谨慎,因为过高或过低的备用费用都可能带来问题,比如交易确认的延迟或不必要地高费用。

如果见到打印的信息中出现init message: Done loading就算成功了

2024-01-11T14:34:32Z dnsseed thread start
2024-01-11T14:34:32Z Loading addresses from DNS seed dummySeed.invalid.
2024-01-11T14:34:32Z init message: Done loading
2024-01-11T14:34:32Z addcon thread start
2024-01-11T14:34:32Z msghand thread start
2024-01-11T14:34:32Z 0 addresses found from DNS seeds
2024-01-11T14:34:32Z dnsseed thread exit

bitcoin-cli 常用命令

bitcoin-cli 是比特币核心(Bitcoin Core)的命令行界面,用于与 bitcoind 守护进程进行交互。以下是一些常用的 bitcoin-cli 命令和样例。

1. 获取区块链信息:

bitcoin-cli getblockchaininfo

此命令会显示当前区块链的状态信息。

2. 获取网络信息:

bitcoin-cli getnetworkinfo

显示节点的网络连接信息。

3. 获取挖矿信息:

bitcoin-cli getmininginfo

提供有关节点挖矿活动的信息。

4. 查看钱包信息:

bitcoin-cli getwalletinfo

显示钱包的基本信息,如余额。

5. 生成一个新的比特币接收地址:

bitcoin-cli getnewaddress "label" "address_type"

生成一个新地址,其中 label 是为新地址添加的标签(可选),address_type 是地址类型(也是可选的,如 ‘p2sh-segwit’, ‘bech32’, 等)。

6. 发送比特币到一个地址:

bitcoin-cli sendtoaddress "address" amount

发送指定数量的比特币到一个地址,其中 amount 是发送的比特币数量。

7. 获取完整的钱包交易列表:

bitcoin-cli listtransactions

列出钱包中的最近交易。

8. 创建新的钱包:

bitcoin-cli createwallet "wallet_name"

创建一个名为 wallet_name 的新钱包。

9. 加载钱包:

bitcoin-cli loadwallet "wallet_name"

加载一个名为 wallet_name 的钱包。

10. 卸载钱包:

bitcoin-cli unloadwallet "wallet_name"

卸载一个名为 wallet_name 的钱包。

11. 查看钱包中所有未花费的输出:

bitcoin-cli listunspent

显示钱包中所有未花费的交易输出。

12. 获取指定地址的余额:

bitcoin-cli getbalance "dummy" 0 true

获取某个特定地址或整个钱包的余额。第一个参数 “dummy” 通常不使用,第二个参数是确认数,第三个参数 true 表示包括看似不可用的余额(如存在锁定时间的交易)。

13. 在测试网络或回归测试模式下生成区块:

# 生成一个区块

bitcoin-cli -regtest generatetoaddress 1 "address"

# 生成多个区块(如10个)

bitcoin-cli -regtest generatetoaddress 10 "address"

使用 -regtest 标记在回归测试网络中生成指定个数的区块(在这里是10个),address 是接收挖矿奖励的地址。

14. 签名并广播交易:

bitcoin-cli signrawtransactionwithwallet "hexstring"
bitcoin-cli sendrawtransaction "hexstring"

分别用来签名原始交易并通过网络广播。hexstring 是交易的十六进制编码形式。

15. API调用次数限制:

bitcoin-cli getpeerinfo

列出所有对等节点并显示数据统计信息,可以用来检查API调用次数和其他节点相关信息。