如何运行比特币完整节点和本地区块资源管理器

本指南的目标是建立一个比特币节点,这对于作为开发人员很有用。如果你成功完成本指南,你将拥有一个与网络同步的节点,包含比特币区块链的完整历史记录,并且完全验证所有交易。

你还可以通过简单的JSON-RPC调用与你的节点进行通信。这意味着你可以在不依赖任何受信任的第三方的情况下与比特币网络进行交互。作为可以做到这一点的简单示例,我们将运行一个开源区块资源管理器,为你提供一个trustless的界面来查看网络上的活动。

先决条件

因为本指南适用于开发人员,所以它假设你可以轻松地进行开发,例如运行Linux,使用bash和执行Python脚本。我们不会使用比特币QT GUI来设置我们的钱包:事实上,本指南中的任何步骤都不会假设使用GUI。

如果更深入地使用某些其他技术是超出范围的先决条件,我将提供适用于这些部分的有用指南的链接。如果你希望以标准用户身份运行完整节点,请查看bitcoin.org上的指南。

有一些硬件和软件要求,如下所列:

  • 具有至少2GB RAM(建议4+)的规格适中的计算机。
  • 至少150 GB的可用磁盘空间。
  • 网络连接速度相当快,没有严格的带宽要求。
  • 安装Ubuntu 18.04。
    • 如果你在已安装macOS或Windows的开发计算机上运行此操作,则可以在VM中执行此操作。
    • 较旧版本的Ubuntu可能也可以正常工作,但未经过测试。
    • Linux的其他变种也应该可以正常工作,但是你必须安装bitcoind并处理适用于你的发行版的依赖项(更多信息如下)

我在一台6岁的台式电脑上使用快速家用宽带运行我的节点。它有一个Athlon FX处理器,4GB RAM和250GB慢速旋转磁盘。它运行的很好!比特币核心团队专注于让任何人都可以运行节点并真正获得回报。

安装bitcoind

比特币网络遵循通信协议和共识。虽然存在该协议的几个客户端,但“规范”和最广泛使用的版本被称为比特币核心Bitcoin Core

要在Ubuntu上安装Bitcoin Core,你有以下几种选择:

每种方法都有其权衡。在本指南中,我们将选择使用apt和PPA,因为它是最简单的方法,并且还可以轻松升级到新版本的软件。一个缺点是它需要信任来自PPA的软件,例如,它可能会被攻击者攻陷。请自行评估这些权衡,并选择最适合你的方法。

如果你只是使用节点进行开发和修改并希望继续选项#3,只需运行以下命令并按照相关提示操作:

1
2
3
sudo apt-add-repository ppa:bitcoin/bitcoin
sudo apt-get update
sudo apt-get install bitcoind

成功完成这些命令后,运行bitcoind -version。你应该看到一些输出显示你正在使用的bitcoind软件的版本。

初始块下载

你现在已经获得了运行节点所需的最新软件,但你错过了10年以上的网络历史。请记住,这是一个完整的节点!这意味着它存储并验证区块链的完整历史,从Satoshi自己开采的第一个区块开始。你需要下载该历史记录。

不幸的是,这个过程需要一段时间,到目前为止需要大约150GB的磁盘空间。在我快速的互联网上,我能够在大约4天内下载完整的区块链。你的时间可能因你的连接和地理位置而不同。

运行以下命令:

1
bitcoind -daemon -txindex=1

这将在后台运行bitcoind进程并启用交易索引。你可能还希望在每次重新启动时自动启动此过程。你可以通过运行:crontab -e并添加以下行来执行此操作:

1
@reboot bitcoind -daemon

请注意,我们没有将txindex选项添加到crontab。在本指南的后面部分,我们将此选项放在配置文件中,这是为节点设置选项的更好方法。

当节点软件第一次启动时,它会创建~/.bitcoin/。让我们现在看看去:

1
2
cd ~/.bitcoin/
ls

你会注意到已创建了许多文件和目录。我们现在只研究其中的几个。首先,运行tail -f debug.log。你会注意到一系列日志消息,如下所示:

1
2
3
2018-08-10 17:22:15 UpdateTip: new best=00000000000000000011b735b8fde14db39704c446dd2b1ae4b8db198c255e0d
height=536128 version=0x20000000 log2_work=89.424049 tx=333938835
date='2018-08-10 17:22:26' progress=1.000000 cache=71.6MiB(529075txo)

(当节点首次开始同步时,这些可能会非常快地飞行。按Ctrl-C退出尾随文件并检查消息)。

这些消息表示从网络下载的块。这里显示的是我编写本教程时挖掘的最新块,但你将远远在此之后。你将注意到每条消息都显示了许多参数,包括块的hash(best= X),块高度(height=X)以及此块被挖掘的时间戳(date=X)。

要监控初始下载的进度,你可以拖动此文件并查看你已捕获的历史日期。请注意,由于网络历史早期的大多数块大多是空的,因此早期块将快速下载。随着你的进一步发展,下载时间将会增加。我的节点大部分时间花在2017年以后下载块。

你还可以使用bitcoin-cli命令行界面与区块链进行交互。例如,可以运行bitcoin-cli stop以安全地关闭你的节点,或运行bitcoin-cli -getinfo以获取节点状态的摘要:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
"version": 160000,
"protocolversion": 70015,
"walletversion": 159900,
"balance": 0.00000000,
"blocks": 536128,
"timeoffset": 0,
"connections": 33,
"proxy": "",
"difficulty": 5949437371609.53,
"testnet": false,
"keypoololdest": 1531965982,
"keypoolsize": 1000,
"paytxfee": 0.00000000,
"relayfee": 0.00001000,
"warnings": ""
}

还有一个小插曲。节点下载的块数据存储在~/.bitcoin/blocks/目录中的二进制文件中。你通常不会直接与此数据交互,但请尝试运行此命令:

1
head -c 210 ~/.bitcoin/blocks/blk00000.dat && echo '\n'`.

你会看到:

1
The Times 03/Jan/2009 Chancellor on brink of second bailout for banks

你认出那句话吗?如果你知道的话,它可能会让你的脊椎发冷!如果你不知道怎么回事,那就去Google了解一下为什么要这样做。

如上所述,初始块下载至少需要几天时间。在此阶段,守护程序可能会使用大量资源。我的处理器固定在一致的20-30%,使用超过2gigs的RAM,并且通常使我老旧的机器变慢。一旦你的机器合适,运行节点软件对性能的影响可以忽略不计。

如果你已经做到这一点,请将页面加入书签,并在节点同步后的几天内返回!

服务器配置

欢迎回来!是时候将节点配置为充当JSON-RPC服务器,这样我们就可以用我们喜欢的语言运行和编写代码来与之交互。

回比特币目录并创建一个名为bitcoin.conf的文本文件。

1
2
cd ~/.bitcoin/
touch bitcoin.conf

此后,当bitcoind启动时将读取此文件,并将用于配置节点的选项。可以设置许多选项,并且每个选项也可以在命令行中设置。要了解可用的选项,请运行:

1
bitcoind --help

在你喜欢的文本编辑器中打开bitcoin.conf文件并添加以下行:

1
2
3
4
## Configuration for the Bitcoin Core Daemon

# Accept command line and JSON-RPC commands
server=1

这是一个良好的开端,但不足以启用与我们的节点的RPC交互。为此,我们还必须为将要登录的用户创建身份验证凭据。

以前可以在配置文件中以文本形式指定用户名和密码,但这种方法显然不安全且已被弃用。相反,我们必须提供用户名以及密码的hash值:与hash期间使用的salt一起提供。

要生成此命令,请使用以下命令下载比特币核心团队提供的规范Python脚本,并使用自己的用户名和密码运行它。

1
2
wget https://raw.githubusercontent.com/bitcoin/bitcoin/master/share/rpcauth/rpcauth.py
python3 rpcauth.py myusername mysecretpassword

一定要用理智的东西替换用户名和密码值!该脚本应该产生如下结果:

1
2
3
4
String to be appended to bitcoin.conf:
rpcauth=myusername:d2a45f8bd56a2014461e2f70f6783b56$636211cdbf3f943a887df72d9944be13ae61c03ef43c6d06dd5044debd4fcbd7
Your password:
mysecretpassword

按照说明,将此行添加到你的bitcoin.conf文件中,该文件现在应如下所示:

1
2
3
4
5
6
7
8
9
10
## Configuration for the Bitcoin Core Daemon

# Accept command line and JSON-RPC commands
server=1

# Index all transactions
txindex=1

# Auth Credentials For JSON-RPC server
rpcauth=myusername:d2a45f8bd56a2014461e2f70f6783b56$636211cdbf3f943a887df72d9944be13ae61c03ef43c6d06dd5044debd4fcbd7

接下来,重新启动节点以确保配置更改生效:

1
2
bitcoin-cli stop
bitcoind -daemon

此时,你已准备好向节点发出JSON-RPC请求,只要它们来自节点本身即可。要测试这一点,请尝试运行以下命令(注意:你可能必须先通过apt安装curl)。

1
curl --user myusername --data-binary '{"jsonrpc": "1.0", "id":"curltest", "method": "getinfo", "params": [] }' -H 'content-type: text/plain;' http://127.0.0.1:8332

请务必使用你实际创建的用户名替换myusername。系统将提示你输入相关密码,如果一切正常,你应该看到以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
{
"result": {
"chain": "main",
"blocks": 536148,
"headers": 536148,
"bestblockhash": "00000000000000000028fab7a6b5035e2745fe06ef58d817bb32f35924198f97",
"difficulty": 5949437371609.53,
"mediantime": 1533926692,
"verificationprogress": 0.9999864596463776,
"initialblockdownload": false,
"chainwork": "000000000000000000000000000000000000000002af5dee686cd058c3ec064d",
"size_on_disk": 203955272825,
"pruned": false,
"softforks": ["..."],
"bip9_softforks": { "..." : "" },
"warnings": ""
},
"error": null,
"id": "curltest"
}

如果这样做,你就可以开始使用完整节点来构建/运行与其交互的应用程序。要了解有关可用的全套API调用以及包含API的各种库的更多信息,请在bitcoin.org上查看此参考

IP白名单

默认情况下,你的节点配置为仅接受来自localhost的JSON-RPC请求,即运行它的计算机。如果你要在节点所在的同一个设备上进行开发,这很好,你可以跳过本节。

如果你使用其他计算机(如Windows或macOS计算机)进行开发,则必须使用rpcallowip选项将允许调用的IP地址列入白名单,并确保端口8332可访问。(请注意,虽然VM在同一硬件上运行,但实际上确实具有唯一的IP)。

我的本地开发机器运行macOS,所以我可以使用ifconfig来确定我的本地ip,然后通过在我的配置文件中添加类似rpcallowip=192.168.0.101的内容将其列入白名单。请注意,你可以多次包含此选项以将多个IP地址列入白名单。

查找开发机器的IP并在节点上提供端口8332的细节取决于你的平台和网络。这些留给读者作为练习。这是你的最终bitcoin.conf可能是什么样子的一个例子。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#### Configuration for the Bitcoin Core Daemon

# Keep my daily upload bandwith around 1 GB

maxuploadtarget=1024 # Note that if your node isn't exposed to the internet on
# Port 8333, you're not feeding data to other nodes and this
# setting won't matter.
# While not required, if you'd like to support the network
# by servering data, make sure your router is configured to
# forward port 8333 to the machine with your.

# Accept command line and JSON-RPC commands
server=1

# Index all transactions
txindex=1

# Auth Credentials For JSON-RPC
rpcauth=myusername:d2a45f8bd56a2014461e2f70f6783b56$636211cdbf3f943a887df72d9944be13ae61c03ef43c6d06dd5044debd4fcbd7

# Whitelist only my Mac's local IP for JSON-RPC calls
rpcallowip=192.168.0.101

运行块资源管理器

在你的完整节点启动并运行,同步到网络并配置为用作JSON-RPC服务器之后,是时候运行你自己的本地区块链资源管理器了!我们将使用由Dan Janosik创建的开源btc-rpc-explorer

这个资源管理器非常棒,因为它不使用数据库:它只需要访问你的节点,它通过我们刚刚配置的RPC接口与之交互。

btc-rpc-explorer是使用Node.js用JavaScript编写的,因此你需要安装最新的稳定版本的node和npm。如果你还没有这些,请查看所选开发平台的说明。

一旦Node和npm准备就绪,从GitHub复制repo并使用以下命令构建它(假设Unix dev环境):

1
2
3
4
git clone https://github.com/janoside/btc-rpc-explorer.git
cd btc-rpc-explorer
npm install
npm run

接下来,在你选择的文本编辑器中打开app/credentials.js文件,并将用户名和密码更新为你在RPC配置期间使用的值。

如果你的开发框与节点不同,则还必须将主机参数更新为节点的IP地址。这可能是局域网IP,除非你的节点托管在LAN之外。(另请注意,你的路由器将来可能会为你的开发箱或你的节点分配一个新IP。请查看在路由器配置面板中根据MAC地址配置静态本地IP以解决此问题)。

更新凭据后,你就可以运行资源管理器了。执行以下命令,然后在你选择的浏览器中访问http://127.0.0.1:3002/。

1
npm start

如果一切顺利,你应该看到这样的事情:

恭喜,你现在拥有自己的比特币全节点,以及本地采购的有机块浏览器。快乐的黑客!

======================================================================

分享一些以太坊、EOS、比特币等区块链相关的交互式在线编程实战教程:

  • java以太坊开发教程,主要是针对java和android程序员进行区块链以太坊开发的web3j详解。
  • python以太坊,主要是针对python工程师使用web3.py进行区块链以太坊开发的详解。
  • php以太坊,主要是介绍使用php进行智能合约开发交互,进行账号创建、交易、转账、代币开发以及过滤器和交易等内容。
  • 以太坊入门教程,主要介绍智能合约与dapp应用开发,适合入门。
  • 以太坊开发进阶教程,主要是介绍使用node.js、mongodb、区块链、ipfs实现去中心化电商DApp实战,适合进阶。
  • C#以太坊,主要讲解如何使用C#开发基于.Net的以太坊应用,包括账户管理、状态与交易、智能合约开发与交互、过滤器和交易等。
  • EOS教程,本课程帮助你快速入门EOS区块链去中心化应用的开发,内容涵盖EOS工具链、账户与钱包、发行代币、智能合约开发与部署、使用代码与智能合约交互等核心知识点,最后综合运用各知识点完成一个便签DApp的开发。
  • java比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Java代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Java工程师不可多得的比特币开发学习课程。
  • php比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Php代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Php工程师不可多得的比特币开发学习课程。
  • tendermint区块链开发详解,本课程适合希望使用tendermint进行区块链开发的工程师,课程内容即包括tendermint应用开发模型中的核心概念,例如ABCI接口、默克尔树、多版本状态库等,也包括代币发行等丰富的实操代码,是go语言工程师快速入门区块链开发的最佳选择。

汇智网原创翻译,转载请标明出处。这里是原文如何运行比特币完整节点和本地区块资源管理器