11 个版本
0.2.4 | 2021 年 3 月 24 日 |
---|---|
0.2.3 | 2021 年 3 月 17 日 |
0.2.2 | 2021 年 1 月 29 日 |
0.2.0 | 2020 年 11 月 24 日 |
0.0.2 |
|
#2687 in 魔法豆
250KB
6K SLoC
比特币钱包跟踪器
bwt
是一个使用 Rust 编写的轻量级钱包描述符/xpub 跟踪器和查询引擎,用于比特币。
🔸 个人钱包索引器(类似 EPS)
🔸 基于描述符的跟踪
🔸 Electrum RPC 服务器(也可作为插件使用!)
🔸 开发者友好的现代 HTTP REST API
🔸 使用服务器发送事件或 Web 钩子提供实时更新
支持开发: ⛓️ 通过 BTCPay 在链上或 ⚡ 通过闪电
- 简介
- bwt 设置
- Electrum 插件 💥
- 手动 Electrum 设置
- HTTP API
- Web 钩子
- 开发 👩💻
- 可重复构建
- 感谢
简介
bwt
是一个轻量级且高性能的基于描述符的钱包索引器,由比特币完整节点支持,使用与 Electrum Personal Server 类似的模型。它可以作为公共 Electrum 服务器的个人替代品,也可以作为钱包后端、支付处理器等比特币应用程序的强大动力。
它使用bitcoind跟踪您的钱包地址(由您的xpub(s)派生)并构建一个历史索引,可以使用Electrum RPC协议或使用bwt自定义设计的HTTP API进行查询。
通过服务器发送的事件(一个流式长连接HTTP连接)或使用Web Hooks推送更新(一个发送到您URL的事件HTTP请求)提供实时更新。
索引目前是内存管理的,不会持久化(预计将更改),但构建它非常快:bwt可以在一秒内索引数千笔交易。
TL;DR: EPS + Rust + 现代HTTP API
bwt 设置
获取一个同步的比特币核心节点(推荐使用v0.19,v0.17足够。不需要txindex
,支持剪枝)并使用以下方法之一安装bwt。
安装
💥 Electrum桌面用户还可以将bwt作为Electrum插件安装,它提供了一个GUI,不需要安装下面描述的独立服务器。
签名预构建的二进制文件
可在发行页面上下载(Linux、Mac、Windows和ARMv7/v8)。
发行版由Nadav Ivgi (@shesek)签名。公钥可以在PGP WoT、github、twitter、keybase、hacker news和此视频演示(幻灯片底部)上验证。
# Download (change x86_64-linux to your platform)
$ wget https://github.com/bwt-dev/bwt/releases/download/v0.2.4/bwt-0.2.4-x86_64-linux.tar.gz
# Fetch public key
$ gpg --keyserver keyserver.ubuntu.com --recv-keys FCF19B67866562F08A43AAD681F6104CD0F150FC
# Verify signature
$ wget -qO - https://github.com/bwt-dev/bwt/releases/download/v0.2.4/SHA256SUMS.asc \
| gpg --decrypt - | grep ' bwt-0.2.4-x86_64-linux.tar.gz$' | sha256sum -c -
$ tar zxvf bwt-0.2.4-x86_64-linux.tar.gz
$ ./bwt-0.1.5-x86_64-linux/bwt --xpub <xpub> ...
签名验证应显示Good signature from "Nadav Ivgi <[email protected]>" ... Primary key fingerprint: FCF1 9B67 ... 和
bwt-0.2.4-x86_64-linux.tar.gz: OK
。
构建是可重复的,并且可以与Travis CI进行验证。有关详细信息,请参见此处。
从源代码
$ sudo apt install build-essential
$ git clone https://github.com/bwt-dev/bwt && cd bwt
$ cargo build --release
$ ./target/release/bwt --xpub <xpub> ...
或使用crates.io软件包
$ cargo install bwt
$ bwt --xpub <xpub>
(确保~/.cargo/bin
在您的PATH
中)
使用Docker
假设您的比特币数据目录位于~/.bitcoin
,
$ docker run -it --net host -v ~/.bitcoin:/bitcoin:ro shesek/bwt --xpub <xpub> ...
(如果未使用cookie文件,则不需要挂载比特币数据目录。)
运行bwt
bwt --xpub <xpub>
应该足以让您开始。
您可以配置--network
(默认为bitcoin
)、您的--bitcoind-url
(默认为http://127.0.0.1:<default-rpc-port>
)、--bitcoind-dir
(默认为~/.bitcoin
)和--bitcoind-auth <user:pass>
(默认使用来自bitcoind-dir
的cookie文件)。
您可以设置多个用于追踪的 --xpub
。这同样支持 ypubs 和 zpubs。要设置显式的脚本类型,请使用 --xpub <xpub>:<type>
,其中类型可以是 wpkh
、shwpkh
或 pkh
之一。
您还可以使用 --descriptor
追踪输出脚本描述符。例如,--descriptor 'wpkh(<xpub>/0/*)'
。
可以使用 --address <address>
或 --addresses-file <path>
追踪独立地址。
为了加快历史交易的重新扫描,您可以提供钱包创建日期,使用 --rescan-since <timestmap>
。时间戳可以是格式为 YYYY-MM-DD
的字符串,或 'now' 来禁用重新扫描并仅监视新交易(适用于新创建的钱包)。设置此选项强烈推荐。
默认情况下,Electrum 服务器将在端口 50001
/60001
/60401
(根据网络)上绑定,而 HTTP 服务器将在端口 3060
上绑定。这可以通过 --electrum-addr
和 --http-addr
来控制。
⚠️ 默认情况下,HTTP API 服务器和 Electrum 服务器都是 未认证且未加密 的。如果您要将它们暴露在互联网上,它们应该放在安全的传输后面,如 SSH 隧道、VPN 或 Tor 隐藏服务。
可以通过遵循这里的说明来启用认证(但不是加密)。
您可以将 -v
设置为增加详细程度或 -vv
来增加更多详细程度。
有关完整选项列表,请参阅 --help
。
配置文件
配置选项可以在 ~/bwt.env
中设置为 dotenv 格式的环境变量。
接受多个值的选项(DESCRIPTORS
、XPUBS
、ADDRESSES
和 WEBHOOKS_URLs
)可以作为用 ;
分隔的列表提供,或使用通配符 XPUB_*
/DESC_*
/ADDRESS_*
变量。
例如
NETWORK=regtest
GAP_LIMIT=20
RESCAN_SINCE=2020-01-01
XPUBS='<xpub1>;<xpub2>'
DESCRIPTORS=pkh(<xpub>/0/*)
XPUB_BOB=<xpub3>
XPUB_ALICE=<xpub4>
直接设置环境变量也受到支持。
仅 Electrum 服务器
如果您只对独立的 Electrum 服务器感兴趣,您可以禁用 HTTP API 服务器,通过下载 electrum_only
预构建的二进制文件,使用 shesek/bwt:electrum
Docker 镜像或使用 --no-default-features --features cli,electrum
构建 bwt。
这删除了几个大型依赖项并禁用了 track-spends
数据库索引(对于 Electrum 服务器不需要)。
(另请参阅 Electrum 插件。)
修剪
您可以使用带修剪的bwt,但修剪后的节点只能扫描到仍然可用于与您的钱包相关的交易的最近区块。这意味着--rescan-since
日期必须在非修剪区块的范围内,或者设置为'now'。这使得修剪节点主要适用于跟踪新创建的钱包。
然而,在您的节点初始同步期间,有机会扫描钱包的完整历史记录,因为区块在被修剪之前会被扫描。您需要设置--no-wait-sync
以在不等待bitcoind完成同步的情况下导入地址,并确保在处理包含钱包交易的最早区块之前运行bwt。
您可以使用--prune-until <target>
自动修剪链到指定的目标(高度、Unix时间戳或YYYY-MM-DD格式的日期)。这需要通过配置bitcoind的prune=1
允许通过RPC手动修剪。
要连接Electrum,您需要使用--skipmerklecheck
进行配置,以容忍缺少SPV证明(在修剪的区块中,它们将不可用)。
如果您使用
--skipmerklecheck
运行Electrum,您还可以使用--electrum-skip-merkle
配置bwt,通过不生成SPV证明(即使可能)来节省一些资源。这两个设置在使用Electrum插件时都会自动启用。
Bitcoin Core多钱包
如果您使用多钱包,您可以使用--bitcoind-wallet <name>
(或-w <name>
)指定要使用哪个钱包。
为bwt使用单独的钱包是推荐的。您可以使用-w bwt --create-wallet-if-missing
来让bwt为您创建一个。
请注意,EPS和bwt不应在具有相同xpub的同一位bitcoind钱包上运行,它们将发生冲突。
高级选项
实时索引
默认情况下,bwt将每5秒查询一次bitcoind的新区块/交易。这可以通过--poll-interval <seconds>
进行调整。
要获取真正的实时更新,您可以将您的bitcoind节点配置为在找到新的区块或钱包交易时向bwt http服务器发送POST /sync
请求,使用walletnotify
和blocknotify
选项。
示例bitcoind配置
walletnotify=curl -X POST http://localhost:3060/sync
blocknotify=curl -X POST http://localhost:3060/sync
验证这可行后,您可以将您的--interval-poll
增加以避免不必要的索引并减少CPU使用。
如果您使用的是不带http服务器的electrum-only模式,您可以配置bwt在Unix套接字上绑定,使用--unix-listener-path <path>
,并打开一个连接以启动索引器同步。
例如,从--unix-listener-path /home/satoshi/bwt-sync-socket
开始,并配置您的bitcoind。
walletnotify=nc -U /home/satoshi/bwt-sync-socket
blocknotify=nc -U /home/satoshi/bwt-sync-socket
如果nc
不可用,您还可以使用socat - UNIX-CONNECT:/home/satoshi/bwt-sync-socket
。
如果您正在使用Docker,您可以将来自主机的目录挂载的套接字绑定到容器外部。例如,--unix-listener-path /bitcoin/bwt-socket
。
间隔限制
您可以使用--gap--limit <N>
(默认为20)配置间隔限制。间隔限制设置在假定没有更多已使用地址可被发现之前,可以导入的最大连续未使用地址数。
您可以在初始同步期间使用--initial-import-size <N>
(默认为350)导入更大的批次。更高的值意味着更少的重新扫描。对于大型钱包应增加。
可脚本化的交易广播
您可以通过--tx-broadcast-cmd <cmd>
设置用于通过广播交易的定制命令。字符串{tx_hex}
将被十六进制编码的交易替换。
该命令将用于替代使用完整节点广播交易,这可能在某些情况下提供更好的隐私。
例如,要使用blockstream.info洋葱服务通过Tor广播交易,可以使用
--tx-broadcast-cmd '[ $(curl -s -x socks5h://localhost:9050 http://explorerzydxu5ecjrkwceayqybizmpjjznk5izmitf2modhcusuqlid.onion/api/tx -d {tx_hex} -o /dev/stderr -w "%{http_code}" -H "User-Agent: curl/7.$(shuf -n1 -e 47 58 64 68).0") -eq 200 ]'
(如果您正在使用Tor浏览器捆绑包,请将端口号9050
替换为9150
。)
Electrum插件
您可以将bwt配置为Electrum插件,这允许通过在Electrum钱包内部运行嵌入的Electrum服务器来将Electrum连接到Bitcoin Core完整节点后端。
有关更多详细信息安装说明,请参阅https://github.com/bwt-dev/bwt-electrum-plugin。
手动Electrum设置(不带插件)
设置bwt服务器,然后使用以下命令启动Electrum
$ electrum --skipmerklecheck --oneserver --server 127.0.0.1:50001:t
或者,您也可以使用服务器选择GUI设置服务器127.0.0.1:50001:t
(注意:t
,这将禁用TLS)。请注意,使用GUI无法配置oneserver
和skipmerklecheck
。
请注意,设置
--skipmerklecheck
仅在您的节点被修剪时才是必要的,但它也可以与--electrum-skip-merkle
结合使用以节省一些资源。有关详细信息,请参阅此处。
HTTP API
所有端点都返回JSON。所有比特币金额都是以satoshis计算的。
钱包
每个钱包代表一个输出脚本描述符。
请注意,通过--xpub
指定的xpub将表示为两个描述符钱包条目,一个用于外部链(用于接收地址),一个用于内部链(用于更改地址)。您可以使用bip32_origins
字段将钱包与其父xpub关联。
钱包格式
desc
- 此钱包跟踪的输出脚本描述符network
- 此钱包所属的网络(bitcoin
、testnet
、signet
或regtest
)is_wildcard
- 一个布尔值,表示描述符是否包含通配符键(xpub../*
)bip32_origins
- 描述符中包含的密钥的bip32起源信息gap_limit
- 为此钱包配置的间隙限制initial_import_size
- 初始导入期间使用的间隙限制rescan_policy
- 重扫应回溯多远max_funded_index
- 已知具有历史的最大派生索引max_imported_index
- 导入到bitcoind的最大派生索引satisfaction_weight
- 满足交易见证的权重上限(也可参见此处)
请参阅GET /wallet/:checksum
以获取示例。
GET /wallets
获取所有跟踪描述符钱包的映射,作为以描述符校验和为索引的json对象。
展开...
示例
$ curl localhost:3060/wallets
{
"xjm8w0el": {
"desc": "wpkh(xpub661MyMwAqRbcEhsxS9g2qyYKSGA3seqWVNhmVhU27ddQx952PaZ6G4V26msGKrqYBjoBRwFyzaucPUkhw7DNaeMVUYJV1bqosxzVxToJdcy/0/*)#xjm8w0el",
"network": "bitcoin",
"is_wildcard": true,
"bip32_origins": [ "80e042a9/0" ],
...
},
"k38panl4": {
"desc": "wsh(multi(2,xpub661MyMwAqRbcEuy9nKLTbGCi2NhqTWeQPT3gd2QdfmeaieDHLHiwTnSnw1GrP2xdaJwEDQJLasfw6LNK7hVADcCN9d1M1RtxitrR3CwvtjV/0/*,[16eabcf7/2]xpub684GUXwH4bY8Pf3fgSunTGz3hwJZhJzaNwgT55aWGWQM7KsiUFEXWLYPy1Q19gAEvc9LG5TN5PdmGPoyocmkkpKCCMV27ugL7XqHeHRwJzH/1/*))#k38panl4",
"network": "bitcoin",
"is_wildcard": true,
"bip32_origins": [ "367e5b47/0", "16eabcf7/2/1" ],
...
},
"cletf5fc": {
"desc": "pkh(xpub661MyMwAqRbcEoHAdGB6AaGRhLmHVemxe6acQikhJgfV3sr1SmapjQv8ZfBwWa1YKmFbyR6ta96TKiCNTctvZix58hAR7mDtjdWK2E18PjR/0/*)#cletf5fc",
"network": "bitcoin",
"is_wildcard": true,
"bip32_origins": [ "7a32efaa/0" ],
...
},
"ftu25peq": {
"desc": "pkh(xpub661MyMwAqRbcEoHAdGB6AaGRhLmHVemxe6acQikhJgfV3sr1SmapjQv8ZfBwWa1YKmFbyR6ta96TKiCNTctvZix58hAR7mDtjdWK2E18PjR/1/*)#ftu25peq",
"network": "bitcoin",
"is_wildcard": true,
"bip32_origins": [ "7a32efaa/1" ],
...
}
}
这些钱包是使用以下命令启动bwt的结果:
--descriptor 'wpkh(xpub...xToJdcy/0/*)'
(xjm8w0el
钱包)--descriptor 'wsh(multi(2,xpub...3CwvtjV/0/*,[16eabcf7/2]xpub...eHRwJzH/1/*))'
(k38panl4
钱包)--xpub 'xpub...2E18PjR'
(cletf5fc
和ftu25peq
钱包)
GET /wallet/:checksum
获取由其checksum
标识的描述符钱包的信息。
展开...
示例
$ curl localhost:3060/wallet/xjm8w0el
{
"desc": "wpkh(xpub661MyMwAqRbcEhsxS9g2qyYKSGA3seqWVNhmVhU27ddQx952PaZ6G4V26msGKrqYBjoBRwFyzaucPUkhw7DNaeMVUYJV1bqosxzVxToJdcy/0/*)#xjm8w0el",
"network": "bitcoin",
"is_wildcard": true,
"bip32_origins": [ "80e042a9/0" ],
"rescan_policy": "now",
"max_funded_index": null,
"max_imported_index": 19,
"gap_limit": 20,
"initial_import_size": 20
}
GET /wallet/:checksum/:index
获取派生索引index
的钱包子地址的基本信息。
展开...
返回字段
address
scripthash
origin
- 以<checksum>/<index>
格式表示的描述符钱包起源信息desc
- 此地址的描述符bip32_origins
- 包含在此索引派生密钥的bip32起源数组
示例
$ curl localhost:3060/wallet/xjm8w0el/8
{
"address": "bc1qlwdpe3a0ulss57tqxxkpepylazpy9f07f2jufa",
"scripthash": "5e643e168a629406504ee2651f76efc3510a79d0aaa1fda9893b2a98c73440dc",
"origin": "xjm8w0el/8",
"desc": "wpkh(xpub661MyMwAqRbcEhsxS9g2qyYKSGA3seqWVNhmVhU27ddQx952PaZ6G4V26msGKrqYBjoBRwFyzaucPUkhw7DNaeMVUYJV1bqosxzVxToJdcy/0/8)#dtxjzdej",
"bip32_origins": [ "80e042a9/0/8" ]
}
$ curl localhost:3060/wallet/k38panl4/5
{
"address": "bc1q9r669mzwaal8cj0hplp7qsqd6kl4xu76w6nuprqd75zrll8s5lsqgeka5t",
"scripthash": "2eb2e9b8b0ee5b6e2aea7a8ee5897d448ab089c7d360a287b27e767320d5902a",
"origin": "k38panl4/5",
"desc": "wsh(multi(2,xpub661MyMwAqRbcEuy9nKLTbGCi2NhqTWeQPT3gd2QdfmeaieDHLHiwTnSnw1GrP2xdaJwEDQJLasfw6LNK7hVADcCN9d1M1RtxitrR3CwvtjV/0/5,[16eabcf7/2]xpub684GUXwH4bY8Pf3fgSunTGz3hwJZhJzaNwgT55aWGWQM7KsiUFEXWLYPy1Q19gAEvc9LG5TN5PdmGPoyocmkkpKCCMV27ugL7XqHeHRwJzH/1/5))#5sd0njd0",
"bip32_origins": [ "367e5b47/0/5", "16eabcf7/2/1/5" ]
}
GET /wallet/:checksum/next
获取指定钱包中下一个未使用的地址。
展开...
发出307重定向到下一个派生索引的url(/wallet/:checksum/:index
)并且在响应体中响应派生索引。
请注意,返回的地址在收到资金之前不会被标记为已使用;如果您想跳过它并生成一个不同的地址(不向其接收资金),您可以指定一个显式的派生索引。
非通配符描述符总是返回0
作为它们的下一个索引。
示例
$ curl localhost:3060/wallet/xjm8w0el/next
< HTTP/1.1 307 Temporary Redirect
< Location: /wallet/xjm8w0el/104
104
# Follow the redirect to get the full address json
$ curl --location localhost:3060/wallet/xjm8w0el/next
{
"address": "bc1qu8k2dv6s8kjaywvdrrk3mvju6utyx537puaeal",
"origin": "xjm8w0el/104",
...
}
GET /wallet/:checksum/gap
获取指定钱包中当前最大连续未使用地址的数量。
展开...
示例
$ curl localhost:3060/wallet/xjm8w0el/gap
7
交易
钱包交易格式
此格式仅适用于钱包交易,并包含有关资助输出和已花费输入的上下文钱包信息。它不包括与钱包无关的输入/输出。
交易字段
txid
block_height
- 确认的交易块高度或null
表示未确认的交易funding
- 包含由该交易创建并由钱包拥有的每个输出的条目vout
- 输出索引amount
- 输出金额,以satoshis为单位- scriptPubKey字段
address
- 由该输出资助的地址scripthash
- 由该输出资助的scripthashorigin
- 以<checksum>/<index>
格式表示的描述符钱包起源信息desc
- 该脚本的描述符bip32_origins
- 该脚本密钥的bip32起源数组
spent_by
- 以txid:vin
格式表示的消耗此输出的交易输入,或对于未使用的输出为null
(仅在有track-spends
时可用)
spending
- 包含消耗钱包输出的每个输入的条目vin
- 输入索引amount
- 该输入所消耗的前一个输出的satoshis金额prevout
- 正在被消耗的<txid>:<vout>
- scriptPubKey字段
address
、scripthash
、origin
、desc
、bip32_origins
*(与上面相同格式,针对funding
)*
balance_change
- 该交易对钱包余额造成的净变化
未确认内存池交易的附加字段
own_feerate
- 交易直接支付的费率,单位为sat/vB
effective_feerate
- 有效交易费率,考虑未确认祖先交易bip125_replacelable
- 由于BIP 125替换费用(因为该交易或其未确认的祖先之一正在发出rbf信号),此交易是否可以被替换has_unconfirmed_parents
- 此交易是否具有作为其输入的未确认父交易
有效费率按以下公式计算:MIN(own_fee/own_vsize, (own_fee+ancestor_fee)/(own_vsize+ancestor_vsize))
。
如果同步内存池条目时遇到错误,内存池字段可能暂时不可用。这应该是一个罕见的事件,例如如果Bitcoin Core崩溃,但API客户端应准备好这种情况。
GET /tx/:txid
以钱包交易格式获取交易。
展开...
仅适用于钱包交易。
示例
$ curl localhost:3060/tx/e700187477d262f370b4f1dfd17c496d108524ee2d440a0b7e476f66da872dda
{
"txid": "e700187477d262f370b4f1dfd17c496d108524ee2d440a0b7e476f66da872dda",
"block_height": 113,
"fee": 141,
"funding": [
{
"vout": 1,
"amount": 949373,
"address": "bcrt1qu04qqzwkjvya65g2agwx5gnqvgzwpjkr6q5jvf",
"scripthash": "6bf2d435bc4e020d839900d708f02c721728ca6793024919c2c5bc029c00f033",
"origin": "xjm8w0el/16",
"desc": "wpkh(xpub661MyMwAqRbcEhsxS9g2qyYKSGA3seqWVNhmVhU27ddQx952PaZ6G4V26msGKrqYBjoBRwFyzaucPUkhw7DNaeMVUYJV1bqosxzVxToJdcy/0/16)#dtxjzdej",
"bip32_origins": [ "80e042a9/0/16" ],
"spent_by": "950cc16e572062fa16956c4244738b35ea7b05e16c8efbd6b9812d561d68be3a:0"
}
],
"spending": [
{
"vin": 0,
"amount": 1049514,
"prevout": "70650243572b90705f7fe95c9f30a85a0cc55e4ea3159a8ada5f4d62d9841d7b:1",
"address": "bcrt1qxsvdm3jmwr79u67d82s08uykw6a82agzy42c6y",
"scripthash": "a55c30f4f7d79600d568bdfa0b4f48cdce4e59b6ffbf286e99856c3e8699740d",
"origin": "xjm8w0el/19",
"desc": "wpkh(xpub661MyMwAqRbcEhsxS9g2qyYKSGA3seqWVNhmVhU27ddQx952PaZ6G4V26msGKrqYBjoBRwFyzaucPUkhw7DNaeMVUYJV1bqosxzVxToJdcy/0/19)#wjtzksqe",
"bip32_origins": [ "80e042a9/0/19" ]
}
],
"balance_change": -100141
}
GET /tx/:txid/verbose
以bitcoind的getrawtransaction
格式获取JSON格式的交易,其中包含verbose=true
。
展开...
适用于bitcoind所知的所有交易(即未修剪)。对于非钱包交易,需要txindex
才能工作。
示例
$ curl localhost:3060/tx/1f2e3c4cee8ea127a79c5dbc951f1e005671a1e8bf385e791ff95b780deda68f/verbose
{
"blockhash": "7a9b99f78066f22a26c56b2035445285a5a992fc19719c9c27f2255f20f1f2f8",
"blocktime": 1589376781,
"confirmations": 1,
"hash": "0ed38dcfe3de4e96852631d9c1f692db581513aa51845976a7097e618a1002a7",
"hex": "0200000000010132d8a06f451ca6e8487a25343586f4186faecbbd185c324f5c3cfe674d1385460100000000feffffff0200e1f505000000001600143e730c6086a8417e2532356bd43e34b86c0f6055d6df0a1e010000001600146873ceae00e9140ea09b71963ee0e493b678a0ec02473044022025500722fd65172f8f7fe448ee484e5659aa9ff23d055546480588840b8eef40022023509d517614fa0c51d55511826250ead7d44ada9d9d6671837f44e8088d678b012102b3ce722e57fa6b66985154305e3d06831976499cf9f1db0c4e30450c1d5d7724af000000",
"in_active_chain": true,
"locktime": 175,
"size": 222,
"time": 1589376781,
"txid": "1f2e3c4cee8ea127a79c5dbc951f1e005671a1e8bf385e791ff95b780deda68f",
"version": 2,
"vin": [ ... ],
"vout": [ ... ],
"vsize": 141,
"weight": 561
}
GET /tx/:txid/hex
以十六进制字符串格式获取原始交易。
展开...
示例
$ curl localhost:3060/tx/1f2e3c4cee8ea127a79c5dbc951f1e005671a1e8bf385e791ff95b780deda68f/hex
0200000000010132d8a06f451ca6e8487a25343586f4186faecbbd185c324f5c3cfe674d1385460100000000feffffff0200e1f505000000001600143e730c6086a8417e2532356bd43e34b86c0f6055d6df0a1e010000001600146873ceae00e9140ea09b71963ee0e493b678a0ec02473044022025500722fd65172f8f7fe448ee484e5659aa9ff23d055546480588840b8eef40022023509d517614fa0c51d55511826250ead7d44ada9d9d6671837f44e8088d678b012102b3ce722e57fa6b66985154305e3d06831976499cf9f1db0c4e30450c1d5d7724af000000
GET /tx/:txid/proof
获取交易的梅克尔包含证明。
展开...
以bitcoind的merkleblock
格式返回。
示例
$ curl localhost:3060/tx/1f2e3c4cee8ea127a79c5dbc951f1e005671a1e8bf385e791ff95b780deda68f/proof
010000302d2659e4f39beb46eeef8579841250550a78d2a4fc2d53022a3ac0c069dbe865a987be21bcaae85f1423967b22c09b61ab00fd2c5aeccc247ef8ab421a960f950df7bb5effff7f20030000000400000003e7e777f5557142e8725218ae37547e1834a0466d5bb63952a7915d9cdc7adf392bb0a723f73dc23b52b7bd2641fb22d283b7c8a863b6dd012c64243b5da66b418fa6ed0d785bf91f795e38bfe8a17156001e1f95bc5d9ca727a18eee4c3c2e1f0115
GET /txs
GET /txs/since/:block-height
获取在或之后block-height
确认的所有钱包交易,以及所有未确认的交易,对于所有跟踪的地址。
GET /txs
是 GET /txs/since/0
的别名。
展开...
以钱包交易格式返回,按时间顺序排列。
示例
$ curl localhost:3060/txs
[
{
"txid": "e700187477d262f370b4f1dfd17c496d108524ee2d440a0b7e476f66da872dda",
"funding": [ .. ],
"spending": [ .. ],
...
},
...
]
GET /txs/since/:block-height/紧凑型
获取自 block-height
以来所有钱包交易的紧凑最小表示。
展开...
返回一个简单的 JSON 数组,包含 [txid, block_height]
元组,其中 block_height
对于未确认的交易为 null。按时间顺序排列。
示例
$ curl localhost:3060/txs/since/105/compcat
[
["859d5c41661426ab13a7816b9e845a3353b66f00a3c14bc412d20f87dcf19caa", 105],
["3c3c8722b493bcf43adab323581ea1da9f9a9e79628c0d4c89793f7fe21b68cf", 107],
["e51414f57bdee681d48a6ade696049c4d7569a062278803fb7968d9a022c6a96", null],
...
]
POST /tx
将原始交易广播到比特币网络。
展开...
成功时返回 txid
。
正文参数
tx_hex
- 原始交易编码为十六进制字符串
示例
$ curl -X POST localhost:3060/tx -H 'Content-Type: application/json' \
-d '{"tx_hex":"<hex-serialized-tx>"}'
33047288f0502eb3f2ad0729f6cfa24a8db87842f9c9a8eba7c0dbfaf7ea75b4
地址、脚本哈希和密钥
GET /address/:address
GET /scripthash/:scripthash
GET /wallet/:checksum/:index
获取提供的地址、脚本哈希或描述符索引的基本信息。
展开...
返回字段
address
scripthash
origin
- 以<checksum>/<index>
格式表示的描述符钱包起源信息desc
- 此地址的描述符bip32_origins
- 包含在此索引派生密钥的bip32起源数组
示例
$ curl localhost:3060/address/bc1qaxlg48awxth5k72ltgrjp6qyegzdmfkfupyhhg
{
"address": "bc1qaxlg48awxth5k72ltgrjp6qyegzdmfkfupyhhg",
"scripthash": "4c1af417b86da82af887678c36c93d3d8de15a5930f326600e533bf3ab9d0339",
"origin": "xjm8w0el/10",
"desc": "wpkh(xpub661MyMwAqRbcEhsxS9g2qyYKSGA3seqWVNhmVhU27ddQx952PaZ6G4V26msGKrqYBjoBRwFyzaucPUkhw7DNaeMVUYJV1bqosxzVxToJdcy/0/10)#v9use49n",
"bip32_origins": [ "80e042a9/0/10" ]
}
GET /address/:address/统计信息
GET /scripthash/:scripthash/统计信息
GET /wallet/:checksum/:index/统计信息
获取提供的地址、脚本哈希或描述符索引的基本信息和统计信息。
展开...
返回字段
- scriptPubKey字段
address
scripthash
来源
描述
bip32_origins
tx_count
已确认余额
未确认余额
示例
$ curl localhost:3060/address/bc1qaxlg48awxth5k72ltgrjp6qyegzdmfkfupyhhg/stats
{
"address": "bc1qaxlg48awxth5k72ltgrjp6qyegzdmfkfupyhhg",
"origin": "xjm8w0el/10",
...,
"tx_count": 2,
"confirmed_balance": 120050000,
"unconfirmed_balance": 0
}
GET /address/:address/utxos
GET /scripthash/:scripthash/utxos
GET /wallet/:checksum/:index/utxos
获取提供的地址、脚本哈希或描述符索引拥有的未花费交易输出的列表。
展开...
查询字符串参数
min_conf
- 最小确认数,默认为 0include_unsafe
- 是否包含不安全支出的输出(来自外部密钥或带有 RBF 的未确认交易),默认为 true
示例
$ curl localhost:3060/address/bc1qaxlg48awxth5k72ltgrjp6qyegzdmfkfupyhhg/utxos
[
{
"txid": "664fba0bcc745b05fda0fbf1f6fb6fc003afd82e64caad2c9fea0e3d566f6a58",
"vout": 1,
"amount": 1500000,
"address": "bc1qaxlg48awxth5k72ltgrjp6qyegzdmfkfupyhhg",
"scripthash": "4c1af417b86da82af887678c36c93d3d8de15a5930f326600e533bf3ab9d0339",
"origin": "xjm8w0el/10",
"desc": "wpkh(xpub661MyMwAqRbcEhsxS9g2qyYKSGA3seqWVNhmVhU27ddQx952PaZ6G4V26msGKrqYBjoBRwFyzaucPUkhw7DNaeMVUYJV1bqosxzVxToJdcy/0/10)#v9use49n",
"bip32_origins": [ "80e042a9/0/10" ],
"block_height": 114,
"spent_by": null
},
{
"txid": "3a1c4dea8d376a2762dd9be1d39f7f13376b4c9ccb961725574689183c20cb90",
"vout": 1,
"amount": 1440000,
"address": "bc1qaxlg48awxth5k72ltgrjp6qyegzdmfkfupyhhg",
"scripthash": "4c1af417b86da82af887678c36c93d3d8de15a5930f326600e533bf3ab9d0339",
"origin": "xjm8w0el/10",
"desc": "wpkh(xpub661MyMwAqRbcEhsxS9g2qyYKSGA3seqWVNhmVhU27ddQx952PaZ6G4V26msGKrqYBjoBRwFyzaucPUkhw7DNaeMVUYJV1bqosxzVxToJdcy/0/10)#v9use49n",
"bip32_origins": [ "80e042a9/0/10" ],
"block_height": 115,
"spent_by": null
},
...
]
GET /address/:address/txs
GET /scripthash/:scripthash/txs
GET /wallet/:checksum/:index/txs
获取提供的地址、脚本哈希或描述符索引历史记录中的所有交易列表。
展开...
以钱包交易格式返回。
示例
$ curl localhost:3060/address/bc1qaxlg48awxth5k72ltgrjp6qyegzdmfkfupyhhg/txs
[
{
"txid": "859d5c41661426ab13a7816b9e845a3353b66f00a3c14bc412d20f87dcf19caa",
"block_height": 654835,
"funding": [ ... ],
"spending": [ ...],
"balance_change": 11000000
},
...
]
GET /address/:address/txs/紧凑型
GET /scripthash/:scripthash/txs/紧凑型
GET /wallet/:checksum/:index/txs/紧凑型
获取提供的地址、脚本哈希或描述符索引历史记录的紧凑最小表示。
展开...
返回一个简单的 JSON 数组,包含 [txid, block_height]
元组,其中 block_height
对于未确认的交易为 null。
示例
$ curl localhost:3060/scripthash/c511375da743d7f6276db6cdaf9f03d7244c74d5569c9a862433e37c5bc84cb2/txs/minimal
[
["859d5c41661426ab13a7816b9e845a3353b66f00a3c14bc412d20f87dcf19caa", 105],
["3c3c8722b493bcf43adab323581ea1da9f9a9e79628c0d4c89793f7fe21b68cf", 107],
["e51414f57bdee681d48a6ade696049c4d7569a062278803fb7968d9a022c6a96", null],
...
]
输出
输出格式
txid
- 为此输出提供资金的交易vout
- 输出索引amount
- 输出金额,以satoshis为单位- scriptPubKey字段
address
- 由该输出资助的地址scripthash
- 由该输出资助的scripthashorigin
- 以<checksum>/<index>
格式表示的描述符钱包起源信息desc
- 为资助脚本提供的描述符bip32_origins
- 该脚本密钥的bip32起源数组
block_height
- 确认的交易块高度或null
表示未确认的交易spent_by
- 以txid:vin
格式表示的消耗此输出的交易输入,或对于未使用的输出为null
(仅在有track-spends
时可用)
GET /txo/:txid/:vout
获取有关指定交易输出的信息。
展开...
仅适用于钱包输出。
示例
$ curl localhost:3060/txo/1b1170ac5996df9255299ae47b26ec3ad57c9801bc7bae68203b1222350d52fe/0
{
"txid": "1b1170ac5996df9255299ae47b26ec3ad57c9801bc7bae68203b1222350d52fe",
"vout": 0,
"amount": 99791,
"scripthash": "d7a6ac0b7af9fe218f24019dc2fe7919bd14fb56694056528464326a44917d20",
"address": "bc1qrkud59a02lacfsa8hlp6yhg7qed30f2w7g2eh3",
"origin": "xjm8w0el/32,
"desc": "wpkh(xpub661MyMwAqRbcEhsxS9g2qyYKSGA3seqWVNhmVhU27ddQx952PaZ6G4V26msGKrqYBjoBRwFyzaucPUkhw7DNaeMVUYJV1bqosxzVxToJdcy/0/32)#v9use49n",
"bip32_origins": [ "80e042a9/0/32" ],
"block_height": 654712,
"spent_by": null
}
GET /utxos
获取所有未花费钱包输出。
展开...
查询字符串参数
min_conf
- 最小确认数,默认为 0include_unsafe
- 是否包含不安全支出的输出(来自外部密钥或带有 RBF 的未确认交易),默认为 true
示例
$ curl localhost:3060/utxos?min_conf=1
[
{
"txid": "1973551cc7670237606561ba3f7579d46d38e7145a72cf6a55ff8975e7143fee",
"vout": 0,
"amount": 99791,
...
},
...
]
区块
GET /block/tip
获取区块链当前的最顶端区块。
展开...
返回字段
height
hash
示例
$ curl localhost:3060/block/tip
{
"height": 176,
"hash": "7a9b99f78066f22a26c56b2035445285a5a992fc19719c9c27f2255f20f1f2f8"
}
GET /block/:hash
获取指定区块哈希的区块头,格式与 bitcoind 的 getblockheader
的 verbose=true
选项相同。
展开...
示例
$ curl localhost:3060/block/65e8db69c0c03a2a02532dfca4d2780a555012847985efee46eb9bf3e459262d
{
"hash": "65e8db69c0c03a2a02532dfca4d2780a555012847985efee46eb9bf3e459262d",
"confirmations": 2,
"height": 175,
"version": 805306369,
"versionHex": "30000001",
"merkleroot": "b7a646abfd377964da19837c454e9d2d30c61b9bc22246c8589f7e80fda1a3e5",
"time": 1589360866,
"mediantime": 1589269430,
"nonce": 0,
"bits": "207fffff",
"difficulty": 4.6565423739069247e-10,
"chainwork": "0000000000000000000000000000000000000000000000000000000000000160",
"nTx": 1,
"previousblockhash": "26d435bdea859667e9d396ad0f28b74e6fd98ca6c737f1bd895c3b6539b4ee76",
"nextblockhash": "7a9b99f78066f22a26c56b2035445285a5a992fc19719c9c27f2255f20f1f2f8"
}
GET /block/:hash/hex
以十六进制字符串形式获取指定区块哈希的区块头。
展开...
示例
$ curl localhost:3060/block/65e8db69c0c03a2a02532dfca4d2780a555012847985efee46eb9bf3e459262d/hex
0100003076eeb439653b5c89bdf137c7a68cd96f4eb7280fad96d3e9679685eabd35d426e5a3a1fd807e9f58c84622c29b1bc6302d9d4e457c8319da647937fdab46a6b7e2b8bb5effff7f2000000000
GET /block/:height
获取指定区块高度的区块哈希。
展开...
发出 307 重定向到区块 URL(/block/:hash
)并在响应正文中响应区块哈希。
示例
$ curl localhost:3060/block/104
< HTTP/1.1 307 Temporary Redirect
< Location: /block/117324e95584f14ba767610f4ef9c939004b02c9f3881a94f46c0772d8e9b365
117324e95584f14ba767610f4ef9c939004b02c9f3881a94f46c0772d8e9b365
# Follow the redirect to get the block header json
$ curl --location localhost:3060/block/104
{
"hash": "117324e95584f14ba767610f4ef9c939004b02c9f3881a94f46c0772d8e9b365",
"confirmations": 73,
"height": 104,
...
}
内存池 & 费用
GET /mempool/histogram
获取 mempool 手续费率分布直方图。
展开...
返回一个数组,其中包含 (feerate, vsize)
元组,其中每个条目的 vsize
是支付超过 feerate
但低于前一个条目 feerate
的交易的总 vsize(除了第一个条目,它没有上限)。这与 Electrum RPC 协议用于 mempool.get_fee_histogram
的格式相匹配。
缓存时间为 2 分钟。
示例
$ curl localhost:3060/mempool/histogram
[[53.01, 102131], [38.56, 110990], [34.12, 138976], [24.34, 112619], [3.16, 246346], [2.92, 239701], [1.1, 775272]]
例如,有总重量为 102,131 vbytes 的交易支付超过 53 sat/vB,110,990 vbytes 的交易支付在 38 到 53 sat/vB 之间,138,976 vbytes 的交易支付在 34 到 38 之间等。
GET /费用-估计/:目标
获取在 target
块内确认的费用估计。使用 bitcoind 的 smartestimatefee
。
展开...
以 sat/vB
返回,如果不可用则返回 null
。
缓存时间为 2 分钟。
示例
$ curl localhost:3060/fee-estimate/3
5.61
服务器发送事件
事件类别
ChainTip(block_height, block_hash)
- 每当新块扩展最佳链时都会发出。Reorg(block_height, prev_block_hash, curr_block_hash)
- 表示在block_height
上检测到重新组织,该高度的前一个块哈希和当前的块哈希。Transaction(txid, block_height)
- 对于新交易以及更改确认状态的交易(通常是未确认到已确认,也可能是重新组织的情况)都会发出。TransactionReplaced(txid)
- 表示交易与另一交易冲突,无法再被确认(即双重花费)。TxoFunded(funding_txid:vout, scripthash, amount, block_height)
- 当创建未花费的钱包输出时发出(对于新交易以及确认状态的变化)。TxoSpent(spending_txid:vin, scripthash, prevout, block_height)
- 当钱包输出被花费时发出(对于新交易以及确认状态的变化)。
对于未确认的交易,block_height
将为 null
。
GET /流
订阅一个实时服务器发送事件流,用于索引器更新通知。
展开...
用于过滤事件流的查询字符串参数
类别
scripthash
出块点
示例
$ curl localhost:3060/stream
< HTTP/1.1 200 OK
< content-type: text/event-stream
data:{"category":"ChainTip","params":[114,"0a1a199aed012b280b36370e393867e03b46eb39b7130bb017a6757b6d4014ec"]}
data:{"category":"Transaction","params":["ac42d918b45351835bf9448bbd0c2f8e9ddad56a8bd118fe93919cc74bd0c487",114]}
data:{"category":"TxoFunded","params":["ac42d918b45351835bf9448bbd0c2f8e9ddad56a8bd118fe93919cc74bd0c487:0","db576ad85b0f09680dfe3f3f7160be50c1a36db8b4949ffe21fe5b4564c1d42b",10000000,114]}
data:{"category":"TxoFunded","params":["ac42d918b45351835bf9448bbd0c2f8e9ddad56a8bd118fe93919cc74bd0c487:1","48138c88b8cb17544ac2450c4bd147106a9f773d6cf2b7f31a5a9dde75a8387a",399999856,114]}
data:{"category":"TxoSpent","params":["ac42d918b45351835bf9448bbd0c2f8e9ddad56a8bd118fe93919cc74bd0c487:0","5f26eb39e19b0bef205bb451082f941cef0707d38949d3ffe51f5614fab70f5d","aa5b889f6cf1c314bc02c5187f31d0d5ff56f568c85a384027cb155fdc377069:1",114]}
$ curl localhost:3060/stream?category=ChainTip
data:{"category":"ChainTip","params":[114,"0a1a199aed012b280b36370e393867e03b46eb39b7130bb017a6757b6d4014ec"]}
data:{"category":"ChainTip","params":[115,"1c293df0c95d94a345e7578868ee679c9f73b905ac74da51e692af18e0425387"]}
$ curl localhost:3060/stream?outpoint=aa5b889f6cf1c314bc02c5187f31d0d5ff56f568c85a384027cb155fdc377069:1
data:{"category":"TxoFunded","params":["43916225aeadc3d6f17ffd5cdcc72fe81508eab4de66532507bc032b50c89732:0","97e9cc06a9a9d95a7ff26a9e5fdf9e1836792a3337c0ff718c88e012feb217bd",99900000,null]}
data:{"category":"TxoSpent","params":["0ac67648be03f7fd547a828b78b920cb73f8c883320f30d770fb14d59655b125:0","97e9cc06a9a9d95a7ff26a9e5fdf9e1836792a3337c0ff718c88e012feb217bd","43916225aeadc3d6f17ffd5cdcc72fe81508eab4de66532507bc032b50c89732:0",null]}
GET /address/:address/流
GET /scripthash/:scripthash/流
GET /wallet/:checksum/:index/流
订阅一个实时通知流,该流提供地址、scripthash 或描述符索引的 TxoFunded
/TxoSpent
事件。
展开...
这相当于 GET /stream?scripthash=<scripthash>
。
示例
$ curl localhost:3060/address/bcrt1qxs3mrrre37rphadyg4wu0zk4t33qklv0u0gmps/stream
data:{"category":"TxoFunded","params":["bb94b1547397cd89441edd74d0581913d8bb3005d070fa6f9744af44f654c25a:0","97e9cc06a9a9d95a7ff26a9e5fdf9e1836792a3337c0ff718c88e012feb217bd",77700000,115]}
data:{"category":"TxoFunded","params":["a0fe8a8fc855a9deaed533cf5f2053c77d640ff5f50a7c44d1cca314d4e00e5d:0","97e9cc06a9a9d95a7ff26a9e5fdf9e1836792a3337c0ff718c88e012feb217bd",100000,116]}
data:{"category":"TxoSpent","params":["a3bc61a974b113223c336c866bc656cd23481d1466e063e46930a5983e70c20d:0","97e9cc06a9a9d95a7ff26a9e5fdf9e1836792a3337c0ff718c88e012feb217bd","a0fe8a8fc855a9deaed533cf5f2053c77d640ff5f50a7c44d1cca314d4e00e5d:0",117]}
data:{"category":"TxoSpent","params":["a3bc61a974b113223c336c866bc656cd23481d1466e063e46930a5983e70c20d:1","97e9cc06a9a9d95a7ff26a9e5fdf9e1836792a3337c0ff718c88e012feb217bd","bb94b1547397cd89441edd74d0581913d8bb3005d070fa6f9744af44f654c25a:0",117]}
赶上错过的事件 & 重新组织检测
为了赶上您的应用程序在关闭期间错过的事件,您可以指定带有最新已处理块的 synced-tip
查询字符串参数,格式为 <block-height>:<block-hash>
。
如果 synced-tip
仍然是最佳链的一部分,这将返回自 block-height
(不包括,按最早顺序排列,包括未确认的)之后发生的所有历史 Transaction
、TxoFunded
和 TxoSpent
事件,之后是一个 单个 的 ChainTip
事件,表示当前同步的提示,之后是实时事件流。
如果 synced-tip
已不再是最佳链的一部分,将返回 410 Gone
错误,表示发生了重组。从重组中恢复的一种方法是从被孤立的 synced-tip
前的 N
个块重新同步,并考虑不再显示为双花(其中 N
足够大,以至于深度重组的可能性很小)的任何条目。
您可以通过仅指定高度来指定 synced-tip
以跳过重组检测(例如,0
以获取自创世块以来所有事件)。
展开...
示例# Start by syncing everything from the beginning
$ curl localhost:3060/stream?synced-tip=0
data:{"category":"TxoFunded","params":["ac42d918b45351835bf9448bbd0c2f8e9ddad56a8bd118fe93919cc74bd0c487:1","48138c88b8cb17544ac2450c4bd147106a9f773d6cf2b7f31a5a9dde75a8387a",399999856,114]}
data:{"category":"ChainTip","params":[120,"5cc1fb1153f8eb12d445d0db06e96bbb39c45b8ed22d4f0de718aa6b0ef00cd1"]}
# Oops, we got disconnected! Let's try again with the last `ChainTip` we heard of
$ curl localhost:3060/stream?synced-tip=120:5cc1fb1153f8eb12d445d0db06e96bbb39c45b8ed22d4f0de718aa6b0ef00cd1
data:{"category":"TxoSpent","params":["a3bc61a974b113223c336c866bc656cd23481d1466e063e46930a5983e70c20d:1","97e9cc06a9a9d95a7ff26a9e5fdf9e1836792a3337c0ff718c88e012feb217bd","bb94b1547397cd89441edd74d0581913d8bb3005d070fa6f9744af44f654c25a:0",122]}
data:{"category":"ChainTip","params":[130,"57d17db78d5017c89e86e863a7397c02027f09327222feb72cdfe8372644c589"]}
# Disconnected again, this time while a reorg happened
$ curl localhost:3060/stream?synced-tip=130:57d17db78d5017c89e86e863a7397c02027f09327222feb72cdfe8372644c589
< HTTP/1.1 410 Gone
Reorg detected at height 130 (previous=57d17db78d5017c89e86e863a7397c02027f09327222feb72cdfe8372644c589 current=43b482862ba3fc883187f534be1971186b11c534494129397e8a2b4faf4bf2f4)
# Re-sync events from height 110 (N=20 blocks before the reported reorg)
$ curl localhost:3060/stream?synced-tip=110
synced-tip
功能还支持 SSE Last-Event-ID
标头。这使得它与内置的自动重新连接机制无缝工作。如果您的应用程序重新启动,您仍然需要手动持久化和指定 synced-tip
。
其他
POST /sync
触发索引器同步。请参阅实时更新。
GET /dump
将索引存储的内容以 JSON 格式输出。
GET /debug
将索引存储的内容以调试字符串格式输出。
GET /banner.txt
Web 钩子
您可以将 --webhook-url <url>
设置为让 bwt 将推送通知作为 POST
请求发送到提供的 <url>
。请求将以 JSON 序列化的 数组 作为正文发送,其中包含一个或多个索引更新。
建议在 URL 中包含一个密钥以验证请求的真实性。
您可以指定多个 --webhook-url
以通知所有这些。
请注意,bwt 目前尝试发送一次 webhook 请求,并在失败的情况下不会重试。建议偶尔使用 GET /txs/since/:block-height
或 GET /stream
端点(请参阅 "赶上错过的事件")来刷新。
提示:像webhook.site或requestbin这样的服务对于调试webhooks非常有用。(无需多言,仅适用于非隐私敏感的regtest/testnet使用。)
如果您是从源代码构建bwt,需要设置
--features webhooks
以启用webhooks支持。这还需要安装apt install libssl-dev pkg-config
。预构建的二进制文件(除了ARM)和
shesek/bwt
Docker镜像默认已启用webhooks支持。
开发
开发者资源
要将bwt集成到非Rust软件中,请查看libbwt和libbwt-jni。
公共Rust API的文档可在docs.rs上找到。
展示大块如何相互交互的yuml图在此处可用。
从Rust初始化bwt并对其实例数据库进行查询的示例代码在examples/use-from-rust.rs
中提供。(注意,与HTTP API相比,Rust API提供的向后兼容性保证较弱。)
一个利用HTTP API进行钱包跟踪的JavaScript客户端示例在examples/wallet-tracker.js
中提供。
开发环境
要快速设置开发环境,可以使用scripts/dev-env.sh
创建一个bitcoind regtest网络和两个Electrum钱包,为钱包充值,启动bwt以跟踪两个钱包的xpubs,并启动Electrum GUI。
要使用它,只需从根目录运行$ ./scripts/dev-env.sh
,前提是bitcoind
、bitcoin-cli
和electrum
已安装在您的PATH
中。
您可以设置FEATURES
以指定要启用哪些功能(见下文)或设置NO_GUI=1
以在守护程序模式下运行Electrum钱包而不启动GUI。
如果您已安装cargo watch
,它将用于监视更改并自动重启bwt。
功能
bwt有7个可选功能:cli
、http
、electrum
、webhooks
、track-spends
、ffi
和extra
。
默认情况下,所有功能都启用,除了webhooks
和ffi
。
如果您正在编写与HTTP API无关的代码,不启用http
功能会更快。
您可以使用scripts/check.sh
运行cargo check
来测试某些功能组合。这对于确保未引入您未使用的功能组合的错误很重要。
测试
端到端集成测试可以通过以下命令运行:./test/tests.sh
。这些测试部署一个regtest网络、一个bwt实例以及连接到它的Electrum钱包(无头模式),然后使用Electrum客户端和HTTP REST API运行一些基本测试。
使用以下命令运行以获取更详细的输出:bash -x test/tests.sh -
。
贡献
总是受欢迎的!
唯一的指导原则是使用cargo fmt
。
您可以查看增强问题列表。
可重复构建
构建可以在以下Docker容器环境中重现
$ git clone https://github.com/bwt-dev/bwt && cd bwt
$ git checkout <tag>
$ git verify-commit HEAD
# Linux, Windows & ARMv7/v8
$ docker build -t bwt-builder - < scripts/builder.Dockerfile
$ docker run -it -u `id -u` -v `pwd`:/usr/src/bwt bwt-builder
# Mac OSX (cross-compiled via osxcross)
$ docker build -t bwt-builder-osx - < scripts/builder-osx.Dockerfile
$ docker run -it -u `id -u` -v `pwd`:/usr/src/bwt bwt-builder-osx
$ sha256sum dist/*
构建在Travis CI上使用GitHub中的代码重现。SHA256校验和可在“可重现构建”阶段找到。
感谢
-
@chris-belcher的electrum-personal-server为该项目和个人跟踪器模型提供了灵感。
-
rust-bitcoin,rust-bitcoincore-rpc和其他来自rust-bitcoin家族的令人难以置信的模块。
许可证
MIT
依赖关系
~17–33MB
~428K SLoC