Bitcoin Core 从其他节点接收区块和交易,并按照所运行软件的规则检查它们。这样,核验数据就不必只依赖第三方服务的说法。运行节点不是挖矿,也不会因此获得 BTC 奖励。
帕维尔卖书,也接受比特币付款。一位顾客向他展示手机上的付款凭证,但他想确认款项是否真的到账、交易是否已经进入有效区块。他可以查询公共区块浏览器,也可以使用连接自己节点的钱包。Bitcoin Core 就是运行这种节点的软件。这里的节点,是运行软件、独立检查 Bitcoin 规则的电脑;区块则是加入共同历史的一组交易。它从别人那里取得数据,却自己判断数据是否有效。帕维尔是一个示例人物:这里的意义,是用自己的核验代替单纯相信别人的显示结果。安装软件不会让他成为矿工,不会自动送给他 BTC,也不会赋予他撤销他人付款的能力。项目以 MIT 许可证公开源代码,允许人们在许可条件下研究、修改和分发。 [1] [16]
这两项工作很容易混淆,因为 Bitcoin Core 可以同时承担它们。节点检查历史和新区块;钱包追踪相关资金、生成地址并准备交易。如果钱包管理私钥,还能用私钥签名。私钥是一项秘密数据,钱包用它生成数字签名,授权花费对应的比特币。私钥本身不会发送给其他节点。不过,Core 完全可以不启用钱包。帕维尔可以用另一款兼容应用付款,让自己的节点提供经过核验的数据;某些连接方式还需要其他软件。仅仅运行 Core,并不会让所有其他钱包自动改用他的节点。几个程序名称有助于理解分工:bitcoin-qt 提供图形界面,bitcoind 在后台运行,bitcoin-cli 则向程序发送命令。 [12] [17]
新节点首先要追上历史进度,这叫 Initial Block Download,简称 IBD,即初始区块下载。在通常的同步过程中,它下载区块,检查区块之间的连接、矿工完成的工作以及交易规则。处理历史后,它建立自己的 chainstate,也就是尚未花费的交易输出 UTXO 的本地状态记录。交易输出规定一笔金额及其花费条件,例如需要提供的签名。在另一笔交易花费它之前,它会留在这份记录中。这不是姓名和银行账户的清单。速度取决于电脑、存储设备和网络,因此开始时较慢不一定是故障。帕维尔会先确认同步完成,再用节点核验当前付款。
这里需要一个准确的补充:在规定条件下,assumevalid 可以跳过很久以前的脚本检查,也就是对花费条件的检查;-assumevalid=0 会关闭这条捷径。另一项功能 AssumeUTXO 可以从经过检查的状态快照开始运行,同时在后台处理更早的历史。快照保存的是某个区块时点的 UTXO 状态。程序先把它的 hash,也就是数字指纹,与代码中的预期值比较;这并不意味着此前的全部历史已经完成独立核验。两者的假设不同,不能因此声称每次安装从一开始就完成了完全相同的检查。 [9] [10] [12] [17]
同步后,Core 继续从相连节点接收数据,这些连接对象称为 peers。它把接受的未确认交易保存在自己的 Mempool 中,可以把它理解为临时等候区。进入这里不等于获得区块确认,不同节点的等候区也可能不同。新区块到达后,Core 会检查它。在有效的候选链之间,它选择累计工作量最大的链,而不是按电脑投票数或仅按区块数量决定。因此,帕维尔会区分“我看到了付款”和“付款已经确认”。个人节点也不能保证交易立即被纳入区块,更不能消除链重组:另一条有效分支仍可能替换它此前跟踪的部分历史。 [16]
假设帕维尔的节点不把某笔未确认交易收入 Mempool。这并不自动意味着它永远不能出现在有效区块里。共识规则决定节点认可什么样的区块和花费;本地 relay policy,也就是转发策略,则进一步规定接受和转发哪些未确认交易,例如保护节点资源免受过载。这套策略不会以同样方式应用于收到的区块内部的交易;在那里,关键是符合共识规则。于是,Mempool 设置不同本身并不会把网络分裂开。理解这条界线,才能在阅读 Core 的争论时,不把每个设置变化都当成货币规则的改变。 [13]
Core 保存区块数据、节点状态,以及可能启用的钱包。Pruning 会在处理后删除较旧的区块文件及撤销其变化所需的数据,以节省空间。节点仍然核验新区块,只是不再随时拥有整个历史档案。因此,历史查询或重新扫描旧付款可能需要再次下载数据。索引是用来加快查询的辅助记录;例如 txindex 与 pruning 不兼容,应按节点实际用途选择。更重要的区别是:公共区块可以重新下载,丢失的私钥却不能从中恢复。Core 钱包需要单独、安全的备份。程序运行时,应使用备份功能,例如 backupwallet,而不是随手复制正在写入的数据库。 [11] [12]
帕维尔先访问官方网站,阅读所选版本的说明。SHA-256 校验和像是下载文件的指纹,可以发现文件与预期内容不一致。但它本身不会告诉你是谁公布了那个预期指纹,因此还要核验数字签名以及签名密钥的身份。如果攻击者同时提供恶意程序和自己的校验和,两者相符并不能阻止攻击。为了进一步核验,项目采用可复现构建:不同的人可以从相同源代码构建出相同文件,再比较结果。Guix 帮助统一构建环境。这加强了对软件来源的核验,但并不能证明代码不存在缺陷。 [8] [7]
Core 提供 JSON-RPC 接口,其他程序可以通过它控制 Core。它能查询节点状态、连接服务,但也可能根据钱包和权限允许操作资金。所以,不要把登录凭据交给自称来帮忙的人。这个接口本身不加密网络传输,也不是为暴露在公共互联网上设计的。连接其他 Bitcoin 节点,与向外开放这些控制功能,是两回事。对于本地访问,Core 还会使用 .cookie 文件中的临时凭据。远程管理应遵循文档,使用受保护的连接并限制访问。只是尝试运行节点,没有必要先把管理接口向全世界开放。 [14]
任何人都可以提出代码修改。其他贡献者会阅读、测试和讨论;仓库维护者,即 maintainers,可以合并被接受的修改。但这并没有给他们远程控制帕维尔节点的能力。运行什么软件,由节点运营者决定。不过,这个决定也不是一张能让个人改写所有人规则的选票:不兼容的修改可能让自己的节点与其他节点分离。Bitcoin Core 是规则的重要实现,而不是拥有整个网络的公司。因此,阅读公告时应区分提案、纳入源代码、发布版本和实际采用。这些步骤之间可能还有很长的路。 [15]
可以先运行节点,不在上面保存自己的私钥。帕维尔先核验文件和签名,等待 IBD 完成,再检查所用钱包确实从自己的节点取得数据。之后,他关注连接情况、区块进度和剩余空间。升级前阅读 release notes,也就是版本说明,了解变化和迁移要求;如果使用钱包,还要检查备份及恢复。排查问题时,诊断文件 debug.log 很有帮助,但不应未经考虑就公开。Pruning、索引和 RPC 设置应符合自己的用途,而不是照抄不理解的教程。个人节点应该是能理解的核验工具。第一次小额购买并不强制需要它,但当你想明白为何认可一笔付款时,它就很有意义。 [12] [14]
要获得更完整的理解,请将本词条与以下词条结合阅读: Full Node, 共识规则, BIP (Bitcoin Improvement Proposal), Bitcoin, Soft Fork, Mempool. 反向关联还来自: Soft Fork, Hard Fork, BIP (Bitcoin Improvement Proposal), 共识规则.