本地regtest比特币网络如何实现指定地址入账通知监听
问题解决方案
1 修复Bitcoin Core节点配置(无需重新编译镜像)
你之前修改配置后编译镜像属于不必要操作,直接使用官方镜像挂载本地配置文件即可:
1.1 准备本地bitcoin.conf配置文件
regtest=1 server=1 # 开启bitcoinj所需的布隆过滤支持 peerbloomfilters=1 rpcallowip=0.0.0.0/0 rpcuser=test rpcpassword=test123 txindex=1
1.2 调整docker-compose.yml配置
不用设置host网络,直接做端口映射即可避免端口冲突与配置不兼容问题:
version: '3' services: node: # 直接用官方维护的稳定镜像,无需自行编译 image: ruimarinho/bitcoin-core:24.0.1 volumes: # 挂载本地配置文件到容器内,修改配置直接改本地文件重启容器即可 - ./bitcoin.conf:/home/bitcoin/.bitcoin/bitcoin.conf - ./bitcoin-data:/home/bitcoin/.bitcoin ports: - "18443:18443" # RPC端口 - "18444:18444" # P2P端口,bitcoinj连接的是该端口而非RPC端口 command: -regtest
执行docker-compose up -d启动节点即可。
2 修复bitcoinj 0.15.10监听代码
不要手动创建Wallet实例,使用WalletAppKit自动处理区块同步、节点连接、布隆过滤器更新逻辑,避免配置遗漏导致监听不到交易:
2.1 依赖配置(Maven示例)
<dependency> <groupId>org.bitcoinj</groupId> <artifactId>bitcoinj-core</artifactId> <version>0.15.10</version> </dependency>
2.2 监听代码示例
import org.bitcoinj.core.*; import org.bitcoinj.kits.WalletAppKit; import org.bitcoinj.params.RegTestParams; import org.bitcoinj.wallet.Wallet; import java.io.File; public class AddressListener { public static void main(String[] args) throws InterruptedException { NetworkParameters params = RegTestParams.get(); // 你要监听的目标地址 Address watchAddress = Address.fromBase58(params, "2N23tWAFEtBtTgxNjBNmnwzsiPdLcNek181"); WalletAppKit kit = new WalletAppKit(params, new File("./bitcoinj-cache"), "regtest-watch") { @Override protected void onSetupCompleted() { // 添加监听地址(watch-only模式,无需私钥) wallet().addWatchedAddress(watchAddress); // 注册到账监听器 wallet().addCoinsReceivedEventListener((wallet, tx, prevBalance, newBalance) -> { // 你的回调逻辑写在这里 System.out.println("收到入账交易,交易哈希:" + tx.getHashAsString()); System.out.println("入账金额:" + tx.getValueSentToMe(wallet).toFriendlyString()); }); } }; // 连接本地节点的P2P端口18444 kit.connectToLocalHost(); // 启动同步 kit.startAsync(); kit.awaitRunning(); System.out.println("监听启动完成,等待地址入账..."); // 阻塞进程避免退出 Thread.currentThread().join(); } }
3 测试验证
regtest网络中交易需要打包进区块才会触发确认通知,转账后需要手动生成区块:
- 先给节点生成初始余额:
docker exec -it minimal-crypto-exchange_node_1 bitcoin-cli -regtest generatetoaddress 101 $(docker exec -it minimal-crypto-exchange_node_1 bitcoin-cli -regtest getnewaddress) - 向监听地址转账:
docker exec -it minimal-crypto-exchange_node_1 bitcoin-cli -regtest sendtoaddress 2N23tWAFEtBtTgxNjBNmnwzsiPdLcNek181 0.1 - 生成1个区块打包交易:
docker exec -it minimal-crypto-exchange_node_1 bitcoin-cli -regtest generatetoaddress 1 $(docker exec -it minimal-crypto-exchange_node_1 bitcoin-cli -regtest getnewaddress)
此时监听器会正常触发回调。
内容的提问来源于stack exchange,提问作者Glory to Russia
相关产品推荐
相关产品推荐

