白话区块链 之6 - 比特币核心程序

【编者Peter Ye按】

可以打开如下链接,详细阅读前几篇:

白话区块链 之1: 为什么账本要这么记?

白话区块链 之2: 区块链技术理念

白话区块链 之3: 区块链技术栈

白话区块链 之4: 区块链分类与架构

白话区块链 之5 -  创世元灵:一切源自比特币


下面的段落是:第1章第6节 《比特币核心程序:中本聪客户端》,对应原书的第1章的1.4.2节。


客户端程序介绍

我们知道,比特币其实就是一个软件,既然是软件,那还是百闻不如一见,看看到底长什么样。大家可以到这个地址去下载客户端程序https://bitcoin.org/en/download,可以看到,网站提供了多种操作系统的运行版本,选择自己需要的版本下载安装即可运行了,就能看到庐山真面目啦。

在具体介绍之前,咱们先说明一下,为什么这个程序叫比特币核心程序,难道还有非核心程序?我们在上述提供的下载页面上,可以看到比特币程序的名字叫Bitcoin core,这个翻译过来就是比特币核心的意思,这是最经典,也是中本聪一开始发布的那一支程序版本,这个版本也是使用人数最多的。可问题是,比特币程序是开源的,任何一个人或者一个组织都可以根据需要去修改源码发布出一个新的版本,事实上经过多年的发展,比特币程序已经出现了多个版本,比如Bitcoin ClassicBitcoin XT以及Bitcoin Unlimited,这些不同的版本实际上都是比特币核心程序的分叉版本,本节我们使用的是比特币核心程序的客户端。

现在我们先给自己的电脑安装一个比特币核心客户端吧,按照下载地址进入页面后,可以在这个页面看到有列出不同操作系统之上的下载版本,读者朋友可以自行选择,无论哪个系统环境下,其功能都是一样的,见下图:


白话区块链 之6 - 比特币核心程序

        我们以windows版本为例来说明,我们下载图中所示的0.14.1版,大家注意到没有,比特币发展了这么多年,到现在程序都还没进化到1.0版(通常一个软件的1.0版是首个正式版本),某种程度上,也是因为比特币是一种实验性的软件吧,因此大家研究学习比特币可以带着一种玩的姿态,不要搞那么严肃,任何的思路想法,任何的可能性都是有的,我们学习了解比特币是为了更好的应用它的设计思想,而不是去迷信它的神秘和权威,咱们继续。下载完成后,打开软件目录,可以看到有一个bin文件夹,其中有5个文件,如图所示:

白话区块链 之6 - 比特币核心程序

我们一一来说明一下:

1bitcoin-qt.exe

包含了比特币的核心节点以及一个钱包的前端功能,这是一个带有图形界面的客户端程序,运行后可以看到有如下提示:

白话区块链 之6 - 比特币核心程序


图中所示,需要选择一个比特币的区块链副本数据存储目录,目前整个区块链账本数据已经很大了,选择一个空间足够大的目录然后点击”OK”即可进入到主界面了,我们看下主界面的样子:

白话区块链 之6 - 比特币核心程序

如图所示,这便是比特币核心客户端了(等等,标题上不是说是钱包么,怎么又是核心客户端,到底运行的这个程序是什么?),是的,这个客户端也叫中本聪客户端satoshi client),它实现了比特币系统的所有方面,包括钱包功能,对整个交易数据也就是区块链账本完整副本的交易确认功能,以及点对点比特币对等网络中的一个完整网络节点。换句话说,这个客户端软件包含除了挖矿以外的其他所有比特币的功能模块,我们当然也可以分别去自己实现一个个的独立功能客户端,比如仅仅实现一个钱包功能,仅仅实现一个核心节点功能,只不过这个官方的客户端都集成在一起了。


      通过这个界面,我们也能看到在底部有显示正在连接到节点以及落后8年和16的字样,这是指运行中的核心客户端通过发现与连接网络中其他的节点,进行区块链账本数据的一致同[计算机同步。如果是首次开始同步,需要花费不少时间,一百几十G的数据下载真够喝一壶的,需要注意的是,所有的操作都要等到同步完成后才能进行。点击那个落后8年和16的区域可以看到具体的同步进度信息:

白话区块链 之6 - 比特币核心程序


图中可以看到有剩余的区块数、进度以及剩余时间等信息,耐心等待就是了。如果想查看一下当前客户端的版本以及网络连接等信息,可以点击帮助调试窗口调出如下界面:

白话区块链 之6 - 比特币核心程序

      在信息标签页下可以看到软件版本、当前的网络连接数、数据目录等摘要信息,注意这里的“客户端版本“,比特币是一个分布式的点对点系统,不存在一个中心服务器来统一管理软件的版本升级,因此不同的节点是有可能运行着不同版本的客户端的,不同版本的客户端在一些功能支持上可能会有些差异,大家在操作时,一定要注意自己的版本。在信息标签页旁边有个“控制台”,这可是个很有用的功能,在控制台可以通过命令来访问核心客户端,调取一些信息,进行一些操作,我们来看下控制台:

白话区块链 之6 - 比特币核心程序


我们在控制台底部的输入框中输入了一个getinfo命令,回车确认后可以发现返回了一段信息,是关于当前运行的核心客户端节点的一些摘要信息,比如version表示核心客户端版本,protocolversion表示协议版本,walletversion表示钱包版本,balance表示当前钱包中的比特币余额等。通过这个我们发现,比特币的核心客户端其实是充当了一个服务器的角色,通过控制台可以连接访问,通过界面也能看到有提示:欢迎使用BitcoinCoreRPC控制台。实际上比特币核心客户端就是在启动时同时启动了一个本地的RPC服务以方便外部程序进行相应的数据操作和访问。


      有朋友问,比特币一下子要同步这么多的数据,我只是想看一看,了解了解的,有没有试用的版本呢?还真有,不过不叫试用版,而是测试网络,为了方便大家测试使用,比特币有提供测试网络,那么如何连接到测试网络呢?可以通过配置文件来进行配置,比特币的配置文件名为bitcoin.conf,可以在数据目录也就是钱包数据文件wallet.dat所在目录下,创建一个文本文件,命名为bitcoin.conf即可,这就是bitcoin-qt默认读取的配置文件了,接下来我们就来配置一下如何进入测试网络,只需在bitcoin.conf中写入如下配置项:


testnet=1


保存即可,然后重新启动bitcoin-qt.exe,我们可见如下画面:

白话区块链 之6 - 比特币核心程序


我们发现颜色都变了,变成了淡绿色,标题上也有测试网络的字样,进入到主界面后,界面样式基本还是那样:

白话区块链 之6 - 比特币核心程序


进入到测试网络后的比特币客户端,其区块链数据会小一些,在功能操作上基本还是一样的。需要注意的是,在配置文件中的配置项,也是可以直接通过参数来传递的,假设只是想临时进入测试网络看看,那么就不需要去设置配置文件了,通过如下指令来运行即可:


bitcoin-qt -testnet


在控制台中执行后,同样会进入测试网络中,有朋友会问,我一开始在运行bitcoin-qt时指定了一个数据目录,现在我想更换可以吗?当然是可以的,如下:


bitcoin-qt -datadir="D:\mybitcoin_data"


这样在启动bitcoin-qt的时候重新指定了一个自己创建的数据目录,当然了,不但可以重新指定数据目录,也可以重新指定配置文件,如下:


bitcoin-qt -conf="c:\mybitcoin.conf"


可以发现,另外指定的配置文件,其文件名可以是自定义的。需要注意的是,bitcoin-qt支持的所有参数中,除了-datadir-conf只能是通过命令参数指定外,其他参数都是既可以在命令参数中直接传递,也可以通过在配置文件中指定的。


2bitcoind.exe

这个其实就可以看做是不带界面的bitcoin-qt.exe,其中同样包含了比特币的核心节点,并且提供了一个RPC服务,比特币使用的是JSON-RPC协议,以便通过命令行交互的方式访问比特币系统的数据,比如访问区块链账本数据,进行钱包操作和系统管理等。

bitcoin-qtbitcoind是互相兼容的,有同样的命令行参数,读取相同格式的配置文件,也读写相同的数据文件,使用的时候,这两个程序,根据需要启动一个即可,同时启动也不会出错,但是同时启动两个bitcoin-qt或者两个bitcoind会出错,如下:

白话区块链 之6 - 比特币核心程序


图中所示,大致的意思就是对数据文件的访问冲突了。

bitcoind默认读取的配置文件,在不同操作系统下路径也不尽相同,如下所示:


q  Windows:%APPDATA%\Bitcoin\

q  OSX:$HOME/Library/Application Support/Bitcoin/

q  Linux: $HOME/.bitcoin/


除了上述的默认配置路径外,与bitcoin-qt一样,也是可以在启动的时候通过传递参数来重新指定其他路径下的配置文件或者数据目录的,我们来看下:

bitcoind -datadir="c:\bitcoin_data"-conf="C:\mybitcoin.conf"

如上所示,启动时,使用-datadir指定了数据文件需要存储的目录,使用-conf指定了C盘目录下的一个配置文件,此时这个配置文件的名称是自定义命名的。bitcoind启动后可以通过bitcoin-cli来进行访问,bitcoin-cli的使用在下一节介绍。

看到这里,有些朋友可能会有些疑问,比特币核心客户端运行后可以与其他节点进行互相的连接通信,那就得开放一个服务端口,而访问比特币节点信息又是通过RPC的方式,那相当于开启了一个RPC服务,这么说来,比特币网络中的每个节点其实就相当于是一个个的服务器,确实如此,这些开启的服务端口说明如下。

q 8333,用于与其他节点进行通信的监听端口,节点之间的通信是通过bitcoinprotocol进行的,通过这个端口才能进入比特币的P2P网络。

q 8332 ,这是提供JSON-RPC通信的端口,通过这个端口可以访问节点的数据。

q 如果是测试网络,分别是1833318332

以上端口是可以另外指定的,通过参数-port-rpcport参数可以分别重新指定。

3bitcoin-cli.exe

bitcoin-cli允许你通过命令行发送RPC命令到bitcoind进行操作,比如bitcoin-cli help,因此这是一个命令行客户端,用来通过RPC方式访问bitcoindRPC服务。我们可以通过命令行来查看一下当前的bitcoin-cli的版本:

bitcoin-cli -version

运行后会返回如下这般的描述信息:“Bitcoin Core RPC client version v0.14.2”。通过返回的信息也能看到,bitcoin-cli就是一个RPC客户端工具,那么如何去连接核心客户端呢,首先bitcoin-clibitcoind是使用同样路径下的配置文件(当然这里是指默认情况下,如果各自都使用参数-conf重新指定了配置文件那就另当别论了),因此在使用bitcoin-cli之前,我们需要先运行bitcoind,然后来执行bitcoin-cli命令:

bitcoin-cli getinfo

可以看到有如下格式的信息输出:

{

  "version": 140100,

  "protocolversion":70015,

  "walletversion": 130000,

  "balance": 0.00000000,

  "blocks": 48,

  "timeoffset": 0,

  "connections": 0,

  "proxy": "",

  "difficulty": 1,

  "testnet": false,

  "keypoololdest": 1503043764,

  "keypoolsize": 100,

  "paytxfee": 0.00000000,

  "relayfee": 0.00001000,

  "errors": ""

}

看到信息的返回,表明已经正常连接且可以访问了,如果想要停止掉bitcoind,则可以发送如下指令:

bitcoin-cli stop

bitcoind会接收到停止的命令,执行后就退出了运行服务。

我们再来看一个例子,在这个例子中,通过参数重新指定了数据目录和配置文件:

bitcoind -datadir="c:\bitcoin_data"-conf="C:\bitcoin.conf"

此时,如果仍然要通过bitcoin-cli来访问这个运行的bitcoind,则需要如下:

bitcoin-cli -datadir="c:\bitcoin_data"-conf="c:\bitcoin.conf" getinfo

运行后则正常返回了运行的bitcoind中的信息。

至此,我们可以发现,bitcoin-qtbitcoind以及bitcoin-cli都能读取相同格式的配置文件,也拥有一样的命令参数,具体支持的各种参数很多,大家可以自行去查阅,这里不再赘述了。再一个就是,比特币中的很多功能调用都是通过RPC命令提供的,比如区块信息查询、交易事务查询、多重签名使用等等,因此要了解完整功能调用的朋友可以去具体了解一下这些RPC命令的使用,笔者这里也推荐一些不错的网站方便大家学习使用,如下:

q https://blockchain.info:方便检索各项比特币网络的数据

q https://chainquery.com/bitcoin-api:基于网页的比特币RPC命令使用

4bticoin-tx.exe

这是一个独立的工具程序,可以用来创建、解析以及编辑比特币中的交易事务,我们在通常使用比特币系统的时候,使用上述介绍的钱包功能也就足够了,但是如果需要单独来查看或者创建一份交易事务数据,就可以使用这个工具了。那么,既然是用于操作交易事务的,我们就来试一试,比特币的交易事务在本质上就是一段二进制数据,我们就任意找一段过来,看看bitcoin-tx能解析成什么样子,为了方便,将二进制的交易事务数据转成十六进制的格式来显示,如下:

0100000001e0772cd81114d0993922a280e2b29209d6c6c5d2f22d807018d1ef0d55cfe4041c0000006a473044022008650b496ea573a2d42efbcbfb49288ab3c7f9968a1fa6072155a028a4deb39e02201b2dd03307fcd1fbb2f9928a8904d50a84ae9d600986a3a8a125fe248b4faf1001210354eb6c85025f3abecde8236e86aabf6b819a72154e69d39f7ae591a92436c166ffffffff01d938890c000000001976a914fe5d8413d80c3d3f9b975f45990cf432455b13ef88ac00000000

这就是一段交易事务的数据,接下来我们就来解析一下,将这段数据转换成容易阅读的格式,为了方便阅读,我们就转换为JSON格式,命令如下

bitcoin-tx -json

 0100000001e0772cd81114d0993922a280e2b29209d6c6c5d2f22d807018d1ef0d55cfe4041c0000006a473044022008650b496ea573a2d42efbcbfb49288ab3c7f9968a1fa6072155a028a4deb39e02201b2dd03307fcd1fbb2f9928a8904d50a84ae9d600986a3a8a125fe248b4faf1001210354eb6c85025f3abecde8236e86aabf6b819a72154e69d39f7ae591a92436c166ffffffff01d938890c000000001976a914fe5d8413d80c3d3f9b975f45990cf432455b13ef88ac00000000

执行后,可以得到如下的输出:

{

    "txid":"2aff308e3e1a9b251ecb701762f6f2c1d28952fe6d0d94efc78880e8a62d2cbb",

    "hash":"2aff308e3e1a9b251ecb701762f6f2c1d28952fe6d0d94efc78880e8a62d2cbb",

    "version": 1,

    "locktime": 0,

    "vin": [

        {

            "txid":"04e4cf550defd11870802df2d2c5c6d60992b2e280a2223999d01411d82c77e0",

            "vout": 28,

           "scriptSig": {

               "asm":"3044022008650b496ea573a2d42efbcbfb49288ab3c7f9968a1fa6072155a028a4deb39e02201b2dd03307fcd1fbb2f9928a8904d50a84ae9d600986a3a8a125fe248b4faf10[ALL]0354eb6c85025f3abecde8236e86aabf6b819a72154e69d39f7ae591a92436c166",

               "hex":"473044022008650b496ea573a2d42efbcbfb49288ab3c7f9968a1fa6072155a028a4deb39e02201b2dd03307fcd1fbb2f9928a8904d50a84ae9d600986a3a8a125fe248b4faf1001210354eb6c85025f3abecde8236e86aabf6b819a72154e69d39f7ae591a92436c166"

            },

           "sequence": 4294967295

        }

    ],

    "vout": [

        {

            "value":2.10319577,

            "n": 0,

           "scriptPubKey": {

               "asm": "OP_DUP OP_HASH160 fe5d8413d80c3d3f9b975f45990cf432455b13efOP_EQUALVERIFY OP_CHECKSIG",

               "hex":"76a914fe5d8413d80c3d3f9b975f45990cf432455b13ef88ac",

               "reqSigs": 1,

               "type": "pubkeyhash",

               "addresses": [

                   "1QBxfKsz2F7xwd66TwMj5wEoLxCQghy54c"

                ]

            }

        }

    ],

    "hex":"0100000001e0772cd81114d0993922a280e2b29209d6c6c5d2f22d807018d1ef0d55cfe4041c0000006a473044022008650b496ea573a2d42efbcbfb49288ab3c7f9968a1fa6072155a028a4deb39e02201b2dd03307fcd1fbb2f9928a8904d50a84ae9d600986a3a8a125fe248b4faf1001210354eb6c85025f3abecde8236e86aabf6b819a72154e69d39f7ae591a92436c166ffffffff01d938890c000000001976a914fe5d8413d80c3d3f9b975f45990cf432455b13ef88ac00000000"

}

通过输出信息,我们可以很方便的看到,其中包含的各个数据组成项,比如txid是指交易事务的哈希值,这个值与hash数据项一样;vin是指交易事务中的输入部分;vout是指交易事务中的输出部分具体每一项的含义这里暂且不多解释,在第八章我们通过模拟比特币来构建一个最简易的区块链系统,其中具体的介绍。通过使用这个工具,除了能解析交易事务数据外,也能创建交易事务,读者朋友们可以去具体尝试使用一下。

5test_bitcoin.exe

这是用于比特币程序bitcoind的单元测试工具,与程序开发相关,除了这个,实际上还有一个用于bitcoin-qt的单元测试工具test_bitcoin-qt,这些工具普通用户一般用不到,这里不再展开详述。


---End---


未完待续,下一节将介绍《创世元灵:一切源自比特币》。欢迎持续关注“乐生活与爱IT”。在这个公众号平台上,之前也分享过和区块链相关的如下文章:


Gartner:2018年十大战略科技发展趋势

雄文:知耻而后勇,数字代币和区块链技术的未来 (修改版-20180213)

谁将会是AWS的颠覆者? (完整版)

比特币到底是货币资产,还是骗局?

比特币能成为人类未来的货币吗?

赠书 | 金融区块链的挑战

白话区块链 之1: 为什么账本要这么记?

白话区块链 之2: 区块链技术理念

白话区块链 之3: 区块链技术栈

白话区块链 之4: 区块链分类与架构

白话区块链 之5 -  创世元灵:一切源自比特币

当软件定义存储(SDS)遇见区块链(BlockChain)

掘未来,容天下 - 九存区块链战略及产品发布会摘要

钱要花在刀刃上 & 兼聊存储发展的最近十二年

诺贝尔物理奖候选人张首晟:区块链技术是互联网世界新的分合转折点

当SDS遇见BlockChain 之二:区块链存储为什么势在必行?(SDS的新赛道 - 暗流涌动的区块链存储)



对《白话区块链》这本书感兴趣的朋友,可以直接在京东等网店购买:

http://item.jd.com/12236097.html#comment


---


微信公众号平台"乐生活与爱IT"在目前阶段,主要是分享软件定义存储(SDS),及VMware vSAN相关的文章,偶尔也会分享虚拟化、云计算、大数据、人工智能、IoT、区块链等IT类文章,甚至生活类的好文章。欢迎投稿,特别是原创文章。如果原创文章属于首次发布,根据质量和阅读量的不同,能获得20~500元的稿费。我的QQ号:9269216另外,如果还有赞赏收入,作者可获得60%


欢迎对SDS感兴趣的朋友,加入软件定义存储讨论 QQ群:122295009,可下载原创的一些文章,及其他有参考价值的文档。可直接搜索群号,或者扫描如下二维码:

白话区块链 之6 - 比特币核心程序


欢迎您通过扫描关注微信公众号:“乐生活与爱IT”。

白话区块链 之6 - 比特币核心程序

关注后,可以通过点击左下角的文章目录,通过输入三位数(记住!是三位数,目前第一位是0或者1)详细了解如何查看历史文章。


对软件定义存储与区块链感兴趣的朋友,可以添加如下管理员:

xiaoganggang10101

eric0424

liushuan2008

sdg8848

dts0103


加入到微信群“当SDS遇见BlockChain"。希望大家一起学习和讨论,共同进步。添加时,请自我介绍姓名、公司名、所在城市等信息。


点击左下角“读原文”,可以跳转到《当SDS遇见BlockChain 之二:区块链存储为什么势在必行?(SDS的新赛道 - 暗流涌动的区块链存储)