From 958efa3ffa48cffb0f411b6b20041fc60f7dc6ec Mon Sep 17 00:00:00 2001 From: tianmingyun Date: Wed, 16 Oct 2019 21:08:30 +0800 Subject: [PATCH] Update ch03.md --- ch03.md | 150 ++++++++++++++++++++++++++++++-------------------------- 1 file changed, 81 insertions(+), 69 deletions(-) diff --git a/ch03.md b/ch03.md index 6ddaebb..f06018e 100644 --- a/ch03.md +++ b/ch03.md @@ -236,7 +236,7 @@ Using config file /home/ubuntu/.bitcoin/bitcoin.conf [a lot more debug output] ... ``` -找到配置文件的位置后,可以使用Ctrl-C退出程序。一般来说,配置文件位于当前用户的主目录的.bitcoin数据目录下。系统不会自动创建这个文件的,需要手动从下面示例的这个链接地址(https://github.com/bitcoinbook/bitcoinbook/blob/develop/ch03.asciidoc#full_index_node )复制粘贴过来。也可以使用自己的默认编辑器手动创建进行修改。 +找到配置文件的位置后,可以使用Ctrl-C退出程序。一般来说,配置文件位于当前用户的主目录的.bitcoin数据目录下。系统不会自动创建这个文件的,需要手动从下面例3的内容复制粘贴过来。也可以使用自己的默认编辑器手动创建进行修改。 Bitcoin Core还提供了100多个配置选项,可以修改网络节点的行为,区块链的存储以以及操作的其他方面。 @@ -312,9 +312,9 @@ minrelaytxfee **交易数据库索引和txindex选项** -默认情况下,Bitcoin Core构建一个仅包含与用户钱包有关的交易的数据库。 如果您想要使用诸如getrawtransaction(参见[探索和解码交易](https://github.com/bitcoinbook/bitcoinbook/blob/second_edition/ch03.asciidoc#exploring_and_decoding_transanctions)\)之类的命令访问任何交易,则需要配置Bitcoin Core以构建完整的交易索引,这可以通过txindex选项来实现。 在Bitcoin Core配置文件中设置txindex = 1。 如果不想一开始设置此选项,后期再想设置为完全索引,则需要使用-reindex选项重新启动bitcoind,并等待它重建索引。 +默认情况下,Bitcoin Core会创建一个数据库,这个数据库只包含与用户钱包有关的交易。 如果您想要使用诸如getrawtransaction(参见3.4.2)之类的命令解读任何交易,则需要修改配置文件中的txindex选项设置txindex = 1来构建完整的交易索引。 如果不是一开始设置此选项,后期再想开启完全索引,需要使用-reindex选项重新启动bitcoind,并等待它重建索引。 -下面的完整索引节点的例子配置显示了如何将上述选项与完全索引节点组合起来,作为比特币应用程序的API后端运行。 +下面的配置文件显示了前面提到的选项与完全索引节点组合起来的示例,可以作为比特币应用程序的API后端运行。 例3-1完整索引节点的例子 @@ -322,80 +322,85 @@ minrelaytxfee alertnotify=myemailscript.sh "Alert: %s" datadir=/lotsofspace/bitcoin txindex=1 -rpcuser=bitcoinrpc -rpcpassword=CHANGE_THIS ``` -例3-2是小型服务器资源不足的配置示例。 +例3-2是小型服务器资源不足的配置示例。 -例3-2小型服务器资源不足配置示例 ``` alertnotify=myemailscript.sh "Alert: %s" maxconnections=15 prune=5000 -minrelaytxfee=0.0001 -maxmempool=200 +dbcache=150 +maxmempool=150 maxreceivebuffer=2500 maxsendbuffer=500 -rpcuser=bitcoinrpc -rpcpassword=CHANGE_THIS ``` -编辑配置文件并设置最符合您需求的选项后,可以使用此配置测试 bitcoind。 运行Bitcoin Core,使用选项printtoconsole在前台运行输出到控制台: +配置文件修改完成之后,可以使用printtoconsole选项测试 bitcoind,查看输出的结果: ``` $ bitcoind -printtoconsole -Bitcoin version v0.11.20.0 -Using OpenSSL version OpenSSL 1.0.2e 3 Dec 2015 -Startup time: 2015-01-02 19:56:17 -Using data directory /tmp/bitcoin -Using config file /tmp/bitcoin/bitcoin.conf -Using at most 125 connections (275 file descriptors available) +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 -scheduler thread start HTTP: creating work queue of depth 16 No rpcpassword set - using random cookie authentication -Generated RPC authentication cookie /tmp/bitcoin/.cookie +Generated RPC authentication cookie /lotsofspace/.bitcoin/.cookie HTTP: starting 4 worker threads -Bound to [::]:8333 -Bound to 0.0.0.0:8333 +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 2.0MiB for block index database -* Using 32.5MiB for chain state database -* Using 65.5MiB for in-memory UTXO set +* 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 /tmp/bitcoin/blocks/index +Opening LevelDB in /lotsofspace/.bitcoin/blocks/index Opened LevelDB successfully [... more startup messages ...] ``` -一旦您确信正在加载正确的设置并按预期运行,您可以按Ctrl-C中断进程。要在后台运行Bitcoin Core作为进程,请使用守护程序选项启动它,如bitcoind -daemon。要监视比特币节点的进度和运行状态,请使用命令bitcoin-cli getinfo: +一确认配置显示正常,可以按Ctrl-C中断进程。 + +如果不想在前台运行Bitcoin Core,可以使用守护进程选项启动:bitcoind -daemon,在后台运行。 + +要监视比特币节点的进度和运行状态,使用命令bitcoin-cli getblockchaininfo: ``` -$ bitcoin-cli getinfo +$ bitcoin-cli getblockchaininfo { - "version" : 110200, - "protocolversion" : 70002, - "blocks" : 396328, - "timeoffset" : 0, - "connections" : 15, - "proxy" : "", - "difficulty" : 120033340651.23696899, - "testnet" : false, - "relayfee" : 0.00010000, - "errors" : "" + "chain": "main", + "blocks": 0, + "headers": 83999, + "bestblockhash": "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f", + "difficulty": 1, + "mediantime": 1231006505, + "verificationprogress": 3.783041623201835e-09, + "chainwork": "0000000000000000000000000000000000000000000000000000000100010001", + "pruned": false, + [...] } ``` -这显示运行Bitcoin Core版本0.11.2的节点,块链接高度为396328个块和15个活动网络连接。 +上面输出内容显示了这个节点当前更新的数据是区块高度为0,区块头为83999,意思是只获取到了最佳链的区块头,完整的区块数据之后才会开始下载。 -一旦您对所选择的配置选项感到满意,您应该将bitcoin添加到操作系统中的启动脚本中,以使其连续运行,并在操作系统重新启动时自动启动。 您可以在contrib / init下的bitcoin的源目录中的各种操作系统和README.md文件中找到一些示例启动脚本,显示哪个系统使用哪个脚本。 +配置选项确定好之后,应该将bitcoin命令添加到操作系统中的启动脚本中,让它随系统重启自动启动。 可以在contrib / init下的bitcoin目录查看README.md文件,找到不同操作系统对应的示例启动脚本。 -# 3.3 通过命令行使用比特币核心的JSON-RPC API接口 +# 3.4 通过命令行使用Bitcoin Core的JSON-RPC API接口 -比特币核心客户端实现了JSON-RPC接口,这个接口也可以通过命令行帮助程序bitcoin-cli访问。命令行可以使用API进行编程,让我们有能力进行交互实验。开始前,调用help命令查看可用的比特币RPC命令列表: +Bitcoin Core客户端实现了JSON-RPC接口,这个接口也可以通过命令行工具bitcoin-cli访问。命令行可以使用API进行编程,方便进行交互方式测试。开始前,使用help命令查看可用的比特币RPC命令列表: ``` $ bitcoin-cli help @@ -413,16 +418,16 @@ walletpassphrase "passphrase" timeout walletpassphrasechange "oldpassphrase" "newpassphrase" ``` -这些命令中的每一个可能需要多个参数。 要获得更多帮助,详细说明和参数信息,请在帮助后添加命令名称。 例如,要查看getblockhash RPC命令的帮助: +这些命令中的每一个可能都有多个参数。 要获得更多帮助,查看详细说明和参数信息,可以在help之后添加命令名称。 例如,要查看getblockhash RPC命令使用详情: ``` $ bitcoin-cli help getblockhash -getblockhash index +getblockhash height -Returns hash of block in best-block-chain at index provided. +Returns hash of block in best-block-chain at height provided. Arguments: -1. index (numeric, required) The block index +1. height (numeric, required) The height index Result: "hash" (string) The block hash @@ -432,48 +437,55 @@ Examples: > curl --user myusername --data-binary '{"jsonrpc": "1.0", "id":"curltest", "method": "getblockhash", "params": [1000] }' -H 'content-type: text/plain;' http://127.0.0.1:8332/ ``` -在帮助信息的最后,您将看到RPC命令的两个示例,使用bitcoin-cli helper或HTTP客户端的curl。 这些例子演示如何调用命令。 复制第一个示例并查看结果: +在帮助信息的最后,可以看到RPC命令的两个示例,使用bitcoin-cli或HTTP客户端的curl。 这些例子演示如何调用命令。 复制第一个示例并查看结果: ``` $ bitcoin-cli getblockhash 1000 00000000c937983704a73af28acdec37b049d214adbda81d7e2a3dd146f6ed09 ``` -结果是一个区块哈希,这在下面的章节中有更详细的描述。 但是现在,该命令应该在您的系统上返回相同的结果,表明您的Bitcoin Core节点正在运行,正在接受命令,并且有关于块1000的信息返回给您。 +输出结果是一个区块哈希值,下面的章节中对此有更详细的描述。 这个命令的输出应该与你的输出一致,这才表明你自己的Bitcoin Core节点运行正常,可以接受命令,能够正确返回关于区块1000的信息。 -在下一节中,我们将演示一些非常有用的RPC命令及其预期输出。 +在下一节中,将演示一些非常有用的RPC命令及其预期输出。 -## 3.3.1 获得比特币核心客户端状态的信息 +## 3.4.1 获得Bitcoin Core客户端状态的信息 -命令: getinfo +Bitcoin Core通过JSON-RPC提供了不同模块的状态信息。其中最重要的命令有getblockchaininfo, getmempoolinfo, getnetworkinfo and getwalletinfo。 -比特币 getinfo RPC命令显示关于比特币网络节点、钱包、区块链数据库状态的基础信息。使用 bitcoin-cli 运行它: +getblockchaininfo RPC命令之前介绍过了。getnetworkinfo显示比特币网络节点状态的基本信息。bitcoin-cli示例如下: ``` -$ bitcoin-cli getinfo -{ - "version" : 110200, - "protocolversion" : 70002, - "blocks" : 396367, - "timeoffset" : 0, - "connections" : 15, - "proxy" : "", - "difficulty" : 120033340651.23696899, - "testnet" : false, - "relayfee" : 0.00010000, - "errors" : "" +$ bitcoin-cli getnetworkinfo + "version": 150000, + "subversion": "/Satoshi:0.15.0/", + "protocolversion": 70015, + "localservices": "000000000000000d", + "localrelay": true, + "timeoffset": 0, + "networkactive": true, + "connections": 8, + "networks": [ + ... + detailed information about all networks (ipv4, ipv6 or onion) + ... + ], + "relayfee": 0.00001000, + "incrementalfee": 0.00001000, + "localaddresses": [ + ], + "warnings": "" } ``` -数据以JavaScript对象表示法(JSON)返回,这是一种格式,可以轻松地被所有编程语言“消费”,但也是非常人性化的。 在这些数据中,我们看到比特币软件客户端(110200)和比特币协议(70002)的版本号。 我们看到当前的块高度,显示了这个客户端知道了多少块(396367)。 我们还会看到有关比特币网络和与此客户端相关的设置的各种统计信息。 +数据返回的是JavaScript Object Notation (JSON)格式,这种格式很容易被所有编程语言“识别”,同时也方便人阅读。在上面数据中,我们看到比特币软件客户端版本号(150000)和比特币协议版本号(70015)。 还看到当前的连接数(8)。 后面还看到比特币网络和客户端设置的相关信息。 -**提示 **比特币特客户端“赶上”当前的blockchain高度需要一些时间,因为它从其他bitcoin客户端下载块。 您可以使用getinfo检查其进度,以查看已知块的数量。 +**提示** 比特币特客户端“赶上”当前的blockchain高度需要一些时间,因为它要从其他比特币客户端下载区块。 可以使用getblockchaininfo检查进度,查看已已同步的区块的数量。 -### 3.3.1 .1探索和解码交易 +## 3.4.2 查看和解码交易 命令:getrawtransaction,decodeawtransaction -在买咖啡的故事中,Alice从Bob咖啡厅买了一杯咖啡。 她的交易记录在交易ID(txid)0627052b6f28912f2703066a912ea577f2ce4da4caa5a5fbd8a57286c345c2f2的封锁上。 我们使用API通过传递交易ID作为参数来检索和检查该交易: +在买咖啡的故事中,Alice从Bob咖啡厅买了一杯咖啡。 她的交易ID(txid)0627052b6f28912f2703066a912ea577f2ce4da4caa5a5fbd8a57286c345c2f2,已经被记录在区块链上。 使用API把交易ID作为参数可以进行检索和检查该交易: ``` $ bitcoin-cli getrawtransaction 0627052b6f28912f2703066a912ea577f2ce4da4caa5a↵ @@ -488,7 +500,7 @@ ae24cb02204b9f039ff08df09cbe9f6addac960298cad530a863ea8f53982c09db8f6e3813014↵ 147f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a888ac00000000 ``` -**提示**交易ID在交易被确认之前不具有权威性。 在区块链中缺少交易哈希并不意味着交易未被处理。 这被称为“交易可扩展性”,因为在块中确认之前可以修改交易哈希。 确认后,txid是不可改变的和权威的。 +**提示** 交易ID在交易被确认之前是没有意义的。 在区块链中缺少交易哈希并不意味着交易未被处理。 这被称为“交易延展性”,因为区块中的交易被确认之前是可以修改交易哈希的。 交易被确认后,txid是就是不可改变的和权威的。 命令getrawtransaction以十六进制返回顺序交易。 为了解码,我们使用decodeawtransaction命令,将十六进制数据作为参数传递。 您可以复制getrawtransaction返回的十六进制,并将其作为参数粘贴到decodeawtransaction中: