Beancounter 是一个命令行实用程序,用于审核给定时间点(或块高度)的分层确定性(HD)钱包的余额。该工具旨在扩展并适用于具有大量地址或大量交易的钱包,支持范围从简单的手表钱包到更复杂的多重签名 + segwit。如果您好奇,这就是我们首先决定编写 Beancounter 的原因。
Beancounter目前支持两种类型的后端来查询区块链:
电子公共服务器。使用这些服务器时,Beancounter 的行为方式与 Electrum 客户端钱包类似。查询服务器以获取特定地址的交易历史记录。使用 Electrum 服务器是最简单的,但需要信任公共服务器才能返回准确的信息。还有潜在的隐私暴露。
私有Btcd节点。 Btcd是一个实现交易索引的比特币全节点。设置 Btcd 节点可能需要一些时间(初始同步大约需要 7 天),并且需要保持节点最新。然而,这样做的好处是可以更好地保证交易历史记录的准确性。
入门
安装中
需要 Go 1.11 或更高版本。
$ git clone https://github.com/square/beancounter/
$ cd beancounter
$ go build -mod=vendor
派生子公钥
假设我们想要跟踪 的平衡tpubD8L6UhrL8ML9...
,并且所使用的推导是m/1'/1234/change/index
。
我们需要手动进行1234
推导:
$ ./beancounter keytree 1234
Enter pubkey #1 out of #1:
tpubD8L6UhrL8ML9Ao47k4pmdvUoiA6QUJVzrJ9BXLgU9idRKnvdRFGgjcxmVxojWGvCcjMi6QWCp8uMpCwWdSFRDNJ7utizxLy27sVWXQT4Jz7
Child pubkey #1: tpubDBrCAXucLxvjC9n9nZGGcYS8pk4X1N97YJmUgdDSwG2p36gbSqeRuytHYCHe2dHxLsV2EchX9ePaFdRwp7cNLrSpnr3PsoPLUQqbvLBDWvh
然后我们可以用来tpubDBrCAXucLxvj...
计算余额。
计算 HD 钱包的余额(使用 Electrum)
$ ./beancounter compute-balance --type multisig --block-height 1438791
Enter pubkey #1 out of #1:
tpubDBrCAXucLxvjC9n9nZGGcYS8pk4X1N97YJmUgdDSwG2p36gbSqeRuytHYCHe2dHxLsV2EchX9ePaFdRwp7cNLrSpnr3PsoPLUQqbvLBDWvh
...
Balance: 267893477
计算单个地址的余额(使用 Electrum)
$ ./beancounter compute-balance --type single-address --lookahead 1 --block-height 1438791
Enter single address:
mzoeuyGqMudyvKbkNx5dtNBNN59oKEAsPn
...
Balance: 111168038
计算HD钱包的余额(使用Btcd)
Beancounter 需要addrindex=1
、txindex=1
、 和notls=1
。如果您的节点位于远程服务器上,我们建议通过 ssh 或其他安全隧道传输 RPC 流量。
rpcuser=mia
rpcpass=ilovebrownies
rpclisten=127.0.0.1:8334
notls=1
blocksonly=1
addrindex=1
txindex=1
一旦 Btcd 启动并运行,您可以执行以下操作:
$ ./beancounter compute-balance --type multisig --block-height 1438791 --backend btcd --addr localhost:8334 --rpcuser mia --rpcpass ilovebrownies
Enter pubkey #1 out of #1:
tpubDBrCAXucLxvjC9n9nZGGcYS8pk4X1N97YJmUgdDSwG2p36gbSqeRuytHYCHe2dHxLsV2EchX9ePaFdRwp7cNLrSpnr3PsoPLUQqbvLBDWvh
...
Balance: 267893477
细节
Beancounter 是用 Go 实现的。我们选择 Go 是因为我们想要一个简单的构建和分发过程。我们赞赏交叉编译和分发没有外部依赖项的静态二进制文件的能力。
我们使用以下过程来确定给定区块高度下确定性钱包的余额:
- 派生外部(接收)和内部(更改)地址。
- 对于每个地址,查询后端以获取交易列表。我们不断派生额外的地址,直到找到大量未使用的地址。
- 修剪交易列表以删除比块高度更新的交易。
- 对于每笔交易,查询后端以获取原始交易。
- 对于每笔交易,跟踪输出是否属于钱包以及是否被花费。
- 迭代交易并计算最终余额。
贡献
我们感谢任何修复错误或添加功能的拉取请求!
如果您需要有关如何贡献的想法,我们将享受第三个后端(基于比特币核心,通过流式传输整个区块链来处理每个块)以及其他钱包类型(例如多重签名非隔离验证)。
额外的单元测试和对评论/文档的改进也总是受欢迎的。
执照
Copyright 2018 Square, Inc.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.