- bitcoin.conf
- /blocks/
- blk00000.dat
- index/
- 000003.log
- CURRENT
- LOCK
- LOG
- MANIFEST-000002
- rev00000.dat
- /chainstate/
- 000003.log
- CURRENT
- LOCK
- LOG
- MANIFEST-000002
- db.log
- debug.log
- fee_estimates.dat
- peers.dat
- wallet.dat
比特币核心文档 file.md 内容总览。
- .cookie【v0.12.0 及之后的版本】
- 会话 RPC 验证 cookie(当首次使用 cookie 验证时写入,在关闭时删除)。
- .lock
- 比特币数据目录锁文件。
- banlist.dat
- 存储禁用节点的 IPs/子网。
- bitcoin.conf【可选】
- 包含用于 bitcoind 或 bitcoin-qt 的配置选项。
- bitcoind.pid
- 存储 bitcoind 运行时的进程号。
- blocks/blk000??.dat【v0.8.0 及之后的版本】; blkxxxx.dat【v0.8.0 之前的版本】
- 区块数据(定制,每个文件 128MiB);包含链接的原始区块。存储的是真正的比特币区块,以网络格式,转储到硬盘上。
- blocks/rev000??.dat【v0.8.0 及之后的版本】
- 区块回退数据(定制)。
- blocks/index/*【v0.8.0 及之后的版本】; blkindex.dat【v0.8.0 之前的版本】
- 区块索引(LevelDB);与 blkxxxx.dat 一起使用的索引信息。
- chainstate/*【v0.8.0 及之后的版本】
- 区块链状态数据库(LevelDB)。
- database/*【v0.8.0 及之后的版本】;【v0.16.0 及之后的版本】
- BDB(Berkeley DB)数据库环境,仅用于钱包;移动到 wallets/ 目录下。
- db.log【v0.16.0 及之后的版本】
- 钱包数据库日志文件,移动到 wallets/ 目录下。
- debug.log
- 比特币详细的日志文件,包含通过 bitcoind 或 bitcoin-qt 生成的调试信息和日志信息。不时自动修剪。
- fee_estimates.dat【v0.10.0 及之后的版本】
- 存储用于确认所必需的估算的最小交易费和优先级的统计数据。在程序关闭之前保存,并在启动时读入。
- indexes/txindex/*【v0.17.0 及之后的版本】
- 可选的交易索引数据库(LevelDB)。
- mempool.dat【v0.14.0 及之后的版本】
- 内存池交易的导出数据。
- peers.dat【v0.7.0 及之后的版本】; addr.dat【v0.7.0 之前的版本】
- 对端 IP 地址数据库(特定的格式)。存储对端信息以便更容易重连。该文件使用比特币指定的文件格式,与任何数据库系统不相关;存储 ip 地址以便更容易重新连接。
- wallets/wallet.dat【v0.16.0 及之后的版本】; wallet.dat
- 包含密钥和交易的个人钱包(BDB);存储密钥,交易,元数据和选项。请务必备份该文件。它包含花费你的比特币所必须的密钥。
- wallets/database/*【v0.16.0 及之后的版本】
- BDB 数据库环境。
- wallets/db.log【v0.16.0 及之后的版本】
- 钱包数据库日志文件。
- onion_private_key【v0.12.0 及之后的版本】
- 使用 -listenonion 选项缓存的洋葱路由隐藏服务私钥。
- guisettings.ini.bak
- 使用 -resetguisettings 选项后之前的 GUI 设置的备份。
该数据,索引和日志文件通过 Oracle Berkeley DB 使用,这是比特币使用的嵌入式键/值对数据存储。
包含区块链数据。
- blk*.dat
- 以网络格式存储真正的比特币区块到硬盘上。它们仅用于重新扫描钱包中丢失的交易,重组到链的不同部分,以及将区块数据提供给正在同步的其他节点。
- blocks/index 子目录【v0.8 及以上版本】
- LevelDB 数据库,包含关于所有已知区块的元数据,以及在硬盘上找到它们的位置。没有这个,找到一个区块将会非常慢。
LevelDB 数据库,具有所有当前未花费的交易输出的紧凑表达和关于它们来源交易的一些元数据。 此处的数据对验证新传入区块和交易是必须的。 从理论上讲,它可以从区块数据重建(参阅 -reindex 命令行选项),但这需要相当长的时间。 如果没有它,理论上你仍然可以进行验证,但这意味着对于所花费的每个输出,通过区块(截至 2017 年 11 月区块总大小为 150GB)进行全面扫描。
包含“撤销”数据。
- rev*.dat
你可以把区块当作链状态的“补丁”(它们消耗一些未花费的输出,并生成新的输出),并把撤销数据当作反向补丁。 它们是回滚链状态所必须的,在重组时是必要的。
如果你希望向朋友发送区块链,避免它们大量下载,这部分可能对你有用。
- wallet.dat
- 包含链接到它们的地址和交易。请务必备份此文件。它包含花费比特币所需的密钥。你不应将此文件传输给任何第三方,否则它们可能会光顾你的比特币。
- db.log
- 可能包含与你的钱包有关的信息。它可以安全删除。
- debug.log
- 可能包含 IP 地址和交易 ID。它可以安全删除。
- database/folder
- 这应该仅存于 bitcoin-qt 运行时。它包含你的钱包相关的信息(BDB 状态)。
- peers.dat
- 不知道是否包含个人身份识别数据。它可以安全删除。
其他的文件和目录(blocks, blocks/index, chainstate)可以安全地传输/存档,因为它们包含仅与公共区块链有关的信息。
“区块”和“链状态”目录中的数据库文件是跨平台的,可以在不同的平台间进行复制安装。 这些文件统称为节点的“区块数据库”,表示节点在同步过程中下载的所有信息。 换句话说,如果将 A 节点数据目录的区块数据库复制到 B 节点的数据目录,B 节点将具有与 A 节点一样的同步百分比。 这通常比再次进行普通初始化同步快得多。但是,当你以这种方式复制某人的数据库,你必须绝对信任他。 比特币核心将其区块数据库文件当作 100% 准确且值得信赖,而在正常初始化同步期间,它将对端提供的每个区块视为无效,直到另有证明为止。 如果攻击者能够修改你的区块数据文件,那么他们可以做各种导致你丢失比特币的邪恶事件。 因此,你应该只在你个人的控制下从别人那里复制区块数据库,并且只能通过安全连接复制。
每个节点都有一个唯一的区块数据库,并且所有文件都是高可连接的。 所以,如果你把一个数据目录中的“区块”或“链状态”目录中的几个文件复制到另一个数据目录中,这几乎肯定会导致第二个节点崩溃或在未来的某个随机点卡住。 如果你想把区块数据库从一个数据目录复制到另一个数据目录,必须删除旧数据库并一次复制全部文件。 复制时必须关闭两个节点。
只写入“区块”目录中编号最大的文件。之前的文件永远不会改变。 此外,当访问这些区块 blk.dat 文件时,通常按高度顺序访问它们。 因此,可以把“区块”目录或 blk.dat 文件的某个自己单独符号链接到磁存储驱动器上而不会造成太大的性能损失(参阅拆分数据目录), 以及如果两个节点以相同的区块数据库启动(由于前面描述的复制),后续同步运行将非常有效。
目录说明参考:https://www.cnblogs.com/x-poior/p/10913331.html
bitcoind /src/bitcoind Bitcoin简洁命令行版,也是下一步源代码分析的重点(不能与Bitcoin Core同时运行,如果不小心尝试同时运行另外一个客户端,它会提示已经有一个客户端在运行并且自动退出), [ 对编程更有用:它提供了一个完整的对等方 ,您可以通过RPC与该对等方交互到端口8332(对于testnet为18332 )。]
bitcoin-cli /src/bitcoin-cli Bitcoind的一个功能完备的RPC客户端,可以通过它在命令行查询某个区块信息,交易信息等.[ 允许您从命令行将RPC命令发送到
bitcoind
。例如,bitcoin-cli help
]bitcoin-tx /src/bitcoind 比特币交易处理模块,可以进行交易的查询和创建
我们现阶段主要学习bitcoind这个程序,这个程序的启动参数大致如下:
bitcoind -daemon 启动
bitcoin-cli stop 停止
它启动后,你会发现与你的节点基本交互有用下面的命令: getblockchaininfo, getnetworkinfo, getnettotals, getwalletinfo, stop,和help。
//bitcoind 命令通用格式 bitcoind [选项] bitcoind [选项] <命令> [参数] 将命令发送到 -server 或 bitcoind bitcoind [选项] help 列出命令 bitcoind [选项] help <命令> 获取该命令的帮助 //bitcoind常见命令 -conf=<文件名> 指定配置文件(默认:bitcoin.conf) -pid=<文件名> 指定 pid (进程 ID)文件(默认:bitcoind.pid) -gen 生成比特币 -gen=0 不生成比特币 -min 启动时最小化 -splash 启动时显示启动屏幕(默认:1) -datadir=<目录名> 指定数据目录 -dbcache=<n style="word-wrap: break-word;"> 设置数据库缓存大小,单位为兆字节(MB)(默认:25)</n> -dblogsize=<n style="word-wrap: break-word;"> 设置数据库磁盘日志大小,单位为兆字节(MB)(默认:100)</n> -timeout=<n style="word-wrap: break-word;"> 设置连接超时,单位为毫秒</n> -proxy=<ip:端口 style="word-wrap: break-word;"> 通过 Socks4 代理链接</ip:端口> -dns addnode 允许查询 DNS 并连接 -port=<端口> 监听 <端口> 上的连接(默认:8333,测试网络 testnet:18333) -maxconnections=<n style="word-wrap: break-word;"> 最多维护 <n style="word-wrap: break-word;">个节点连接(默认:125)</n></n> -addnode=<ip style="word-wrap: break-word;"> 添加一个节点以供连接,并尝试保持与该节点的连接</ip> -connect=<ip style="word-wrap: break-word;"> 仅连接到这里指定的节点</ip> -irc 使用 IRC(因特网中继聊天)查找节点(默认:0) -listen 接受来自外部的连接(默认:1) -dnsseed 使用 DNS 查找节点(默认:1) -banscore=<n style="word-wrap: break-word;"> 与行为异常节点断开连接的临界值(默认:100)</n> -bantime=<n style="word-wrap: break-word;"> 重新允许行为异常节点连接所间隔的秒数(默认:86400)</n> -maxreceivebuffer=<n style="word-wrap: break-word;"> 最大每连接接收缓存,<n style="word-wrap: break-word;">*1000 字节(默认:10000)</n></n> -maxsendbuffer=<n style="word-wrap: break-word;"> 最大每连接发送缓存,<n style="word-wrap: break-word;">*1000 字节(默认:10000)</n></n> -upnp 使用全局即插即用(UPNP)映射监听端口(默认:0) -detachdb 分离货币块和地址数据库。会增加客户端关闭时间(默认:0) -paytxfee=<amt style="word-wrap: break-word;"> 您发送的交易每 KB 字节的手续费</amt> -testnet 使用测试网络 -debug 输出额外的调试信息 -logtimestamps 调试信息前添加[时间戳](http://8btc.com/article-165-1.html) -printtoconsole 发送跟踪/调试信息到控制台而不是 debug.log 文件 -printtodebugger 发送跟踪/调试信息到调试器 -rpcuser=<用户名> JSON-RPC 连接使用的用户名 -rpcpassword=<密码> JSON-RPC 连接使用的密码 -rpcport=<port style="word-wrap: break-word;"> JSON-RPC 连接所监听的 <端口>(默认:8332)</port> -rpcallowip=<ip style="word-wrap: break-word;"> 允许来自指定 <ip style="word-wrap: break-word;">地址的 JSON-RPC 连接</ip></ip> -rpcconnect=<ip style="word-wrap: break-word;"> 发送命令到运行在 <ip style="word-wrap: break-word;">地址的节点(默认:127.0.0.1)</ip></ip> -blocknotify=<命令> 当最好的货币块改变时执行命令(命令中的 %s 会被替换为货币块哈希值) -upgradewallet 将钱包升级到最新的格式 -keypool=<n style="word-wrap: break-word;"> 将密匙池的尺寸设置为 <n style="word-wrap: break-word;">(默认:100)</n></n> -rescan 重新扫描货币块链以查找钱包丢失的交易 -checkblocks=<n style="word-wrap: break-word;"> 启动时检查多少货币块(默认:2500,0 表示全部)</n> -checklevel=<n style="word-wrap: break-word;"> 货币块验证的级别(0-6,默认:1)</n> **SSL 选项:** -rpcssl 使用 OpenSSL(https)JSON-RPC 连接 -rpcsslcertificatechainfile=<文件.cert> 服务器证书文件(默认:server.cert) -rpcsslprivatekeyfile=<文件.pem> 服务器私匙文件(默认:server.pem) -rpcsslciphers=<密码> 可接受的密码(默认:TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH)
这里面大部分参数都可以省略,转而使用配置文件进行配置,因为使用配置文件更方便些,所以这里我们使用配置文件进行配置,在linux下时,bitcoin.conf的默认路径为$HOME/.bitcoin/bitcoin.conf,我们可以从bitcoin源码的share/examples找到一份样本拷贝过去并进行修改,如下所示:
bitcoin.conf 配置文件
除了 -datadir 和 -conf 以外的所有命令行参数都可以通过一个配置文件来设置,而所有配置文件中的选项也都可以在命令行中设置。命令行参数设置的值会覆盖配置文件中的设置。
配置文件是“设置=值”格式的一个列表,每行一个。您还可以使用 # 符号来编写注释。
配置文件不会自动创建;您可以使用您喜爱的纯文本编辑器来创建它。默认情况下,Bitcoin(或 bitcoind)会在比特币数据文件夹下查找一个名为“bitcoin.conf”的文件,但是数据文件夹和配置文件的路径都可以分别通过 -datadir 和 -conf 命令行参数分别指定。
创建配置文件:
touch ~/.bitcoin/bitcoin.conf
chmod 600 ~/.bitcoin/bitcoin.conf
echo rpcuser=user >> ~/.bitcoin/bitcoin.conf
echo rpcpassword=password >> ~/.bitcoin/bitcoin.conf
bitcoin.conf位置
操作系统 默认数据文件夹 配置文件路径
Windows %APPDATA%\Bitcoin\ C:\Users\username\AppData\Roaming\Bitcoin\bitcoin.conf
Linux $HOME/.bitcoin/ /home/username/.bitcoin/bitcoin.conf
Mac OSX $HOME/Library/Application Support/Bitcoin/ /Users/username/Library/Application Support/Bitcoin/bitcoin.conf
bitcoin.conf 示例 # bitcoin.conf 配置文件。以 # 开头的行是注释。 # 网络相关的设置: # 在测试网络中运行,而不是在真正的比特币网络 #testnet=0 # 通过一个 Socks4 代理服务器连接 #proxy=127.0.0.1:9050 ############################################################## ## addnode 与 connect 的区别 ## ## ## ## 假设您使用了 addnode=4.2.2.4 参数,那么 addnode 便会与 ## ## 您的节点连接,并且告知您的节点所有与它相连接的其它节点。 ## ## 另外它还会将您的节点信息告知与其相连接的其它节点,这样它 ## ## 们也可以连接到您的节点。 ## ## ## ## connect 在您的节点“连接”到它的时候并不会做上述工作。仅 ## ## 它会与您连接,而其它节点不会。 ## ## ## ## 因此如果您位于防火墙后,或者因为其它原因无法找到节点,则 ## ## 使用“addnode”添加一些节点。 ## ## ## ## 如果您想保证隐私,使用“connect”连接到那些您可以“信任” ## ## 的节点。 ## ## ## ## 如果您在一个局域网内运行了多个节点,您不需要让它们建立许多 ## ## 连接。您只需要使用“connect”让它们统一连接到一个已端口转 ## ## 发并拥有多个连接的节点。 ## ############################################################## # 您可以在下面使用多个 addnode= 设置来连接到指定的节点 #addnode=69.164.218.197 #addnode=10.0.0.2:8333 # ... 或使用多个 connect= 设置来仅连接到指定的节点 #connect=69.164.218.197 #connect=10.0.0.1:8333 # 不使用因特网中继聊天(IRC)(irc.lfnet.org #bitcoin 频道) # 来查找其它节点 #noirc=0 # 入站+出站的最大连接数 #maxconnections= # JSON-RPC 选项(用于控制运行中的 Bitcoin/bitcoind 进程): # server=1 告知 Bitcoin-QT 接受 JSON-RPC 命令 #server=0 # 您必须设置 rpcuser 和 rpcpassword 以确保 JSON-RPC 的安全 #rpcuser=Ulysseys #rpcpassword=YourSuperGreatPasswordNumber_DO_NOT_USE_THIS_OR_YOU_WILL_GET_ROBBED_38559 # 客户端在 HTTP 连接建立后,等待多少秒以完成一个 RPC HTTP 请求 #rpctimeout=30 # 默认仅允许来自本机的 RPC 连接。在这里您可以指定多个 # rpcallowip=,来设置您想允许连接的其它主机 IP 地址。 # 您可以使用 * 作为通配符。 #rpcallowip=10.1.1.34 #rpcallowip=192.168.1.* # 在如下端口监听 RPC 连接 #rpcport=8332 # 您可以通过如下设置使用 Bitcoin 或 bitcoind 来发送命令到一个在 # 其它主机远程运行的 Bitcoin/bitcoind 客户端 #rpcconnect=127.0.0.1 # 使用安全套接层(也称为 TLS 或 HTTPS)来 # 连接到 Bitcoin -server 或 bitcoind #rpcssl=1 # 当 rpcssl=1 时使用的 OpenSSL 设置 #rpcsslciphers=TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH #rpcsslcertificatechainfile=server.cert #rpcsslprivatekeyfile=server.pem # 其它选项: # 设置 gen=1 以尝试生成比特币(采矿) #gen=0 # 预生成如下数目的公匙和私匙,这样钱包备份便可以对已有的交易以及未来 # 多笔交易有效 #keypool=100 # 每次您发送比特币的时候支付一个可选的额外的交易手续费。包含手续费的交易 # 会更快的被包含在新生成的货币块中,因此会更快生效 #paytxfee=0.00 # 允许直接连接,实现“通过 IP 地址支付”功能 #allowreceivebyip=1 # 用户界面选项: # 最小化启动比特币客户端 #min=1 # 最小化到系统托盘 #minimizetotray=1
然后我们只要调用 bitcoind -datadir = 数据目录,就可以进行bitcoind的启动了。默认rpc端口为:8332;默认同步端口为:8333