DP_*_*DP_ 10 java bitcoinj bitcoin-testnet
我想以编程方式检测何时有人将比特币发送到某个地址。这发生在我开始使用这个docker-compose.yml文件的本地测试网上。
\n本地测试网运行后,我使用以下命令创建一个新地址
\ndocker exec -it minimal-crypto-exchange_node_1 bitcoin-cli getnewaddress\nRun Code Online (Sandbox Code Playgroud)\n假设它返回2N23tWAFEtBtTgxNjBNmnwzsiPdLcNek181。
我把这个地址放入下面的Java代码中:
\nimport org.bitcoinj.core.Address;\nimport org.bitcoinj.core.Coin;\nimport org.bitcoinj.core.NetworkParameters;\nimport org.bitcoinj.core.Transaction;\nimport org.bitcoinj.wallet.Wallet;\nimport org.bitcoinj.wallet.listeners.WalletCoinsReceivedEventListener;\n\npublic class WalletObserver {\n public void init() {\n final NetworkParameters netParams = NetworkParameters.fromID(NetworkParameters.ID_REGTEST);\n\n try {\n final Wallet wallet = Wallet.createBasic(netParams);\n\n wallet.addWatchedAddress(Address.fromString(netParams, "2N23tWAFEtBtTgxNjBNmnwzsiPdLcNek181"));\n\n wallet.addCoinsReceivedEventListener(new WalletCoinsReceivedEventListener() {\n @Override\n public void onCoinsReceived(final Wallet wallet, final Transaction transaction, final Coin prevBalance, final Coin newBalance) {\n System.out.println("Heyo!");\n }\n });\n }\n catch (Exception exception) {\n exception.printStackTrace();\n }\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n然后我用这个类启动 Java 应用程序。
\n然后我将一些测试比特币发送到有问题的地址:
\n% docker exec -it minimal-crypto-exchange_node_1 bitcoin-cli sendtoaddress 2N23tWAFEtBtTgxNjBNmnwzsiPdLcNek181 0.5\n068c377bab961356ad9a3919229a764aa929711c68aefd5dbd4c7c348eef3406\nRun Code Online (Sandbox Code Playgroud)\n如果我转到http://localhost:3002/tx/068c377bab961356ad9a3919229a764aa929711c68aefd5dbd4c7c348eef3406,我会看到交易详细信息。
但是,侦听器(方法)中的断点onCoinsReceived永远不会激活。
我需要如何修改我的代码和/或用于发送测试 BTC 的命令,以便每当该帐户收到资金时onCoinsReceived都会调用方法?有没有一个地方可以告诉我Wallet或者NetworkParameters我想连接到本地主机?
我使用的是 bitcoinj-core 0.15.10 版本。
\n更新1:
\n我修改了docker-compose.yml并添加了以下端口映射:
\n ports:\n - "51001:50001"\n - "51002:50002"\n - "19001:19001"\n - "19000:19000"\n - "28332:28332"\nRun Code Online (Sandbox Code Playgroud)\n然后我重写了该init方法,以便可以连接到本地主机并指定端口:
public class WalletObserver {\n public void init() {\n final LocalTestNetParams netParams = new LocalTestNetParams();\n netParams.setPort(50001);\n try {\n final WalletAppKit kit = new WalletAppKit(netParams, new File("."), "_minimalCryptoExchangeBtcWallet");\n kit.setAutoSave(true);\n kit.connectToLocalHost();\n\n kit.startAsync();\n kit.awaitRunning(); // I never get past this point\n kit.peerGroup().addPeerDiscovery(new DnsDiscovery(netParams));\n kit.wallet().addWatchedAddress(Address.fromString(netParams, "2N23tWAFEtBtTgxNjBNmnwzsiPdLcNek181"));\n\n kit.wallet().addCoinsReceivedEventListener(new WalletCoinsReceivedEventListener() {\n @Override\n public void onCoinsReceived(final Wallet wallet, final Transaction transaction, final Coin prevBalance, final Coin newBalance) {\n System.out.println("Heyo!");\n }\n });\n }\n catch (Exception exception) {\n exception.printStackTrace();\n }\n }\nRun Code Online (Sandbox Code Playgroud)\nLocalTestNetParams允许指定端口:
\npackage com.dpisarenko.minimalcryptoexchange.logic.btc;\n\nimport org.bitcoinj.params.RegTestParams;\n\npublic class LocalTestNetParams extends RegTestParams {\n public void setPort(final int newPort) {\n this.port = newPort;\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n我尝试了所有上述端口netParams.setPort(50001);。
在所有情况下,我都会收到以下消息kit.awaitRunning();:
22:16:34.245 [PeerGroup Thread] INFO org.bitcoinj.core.PeerGroup - Attempting connection to [10.10.1.218]:50001 (0 connected, 1 pending, 1 max)\n22:16:34.265 [NioClientManager] WARN org.bitcoinj.net.NioClientManager - Failed to connect with exception: java.net.ConnectException: Connection refused\njava.net.ConnectException: Connection refused\n at java.base/sun.nio.ch.Net.pollConnect(Native Method)\n at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:579)\n at java.base/sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:820)\n at org.bitcoinj.net.NioClientManager.handleKey(NioClientManager.java:64)\n at org.bitcoinj.net.NioClientManager.run(NioClientManager.java:122)\n at com.google.common.util.concurrent.AbstractExecutionThreadService$1$2.run(AbstractExecutionThreadService.java:66)\n at com.google.common.util.concurrent.Callables$4.run(Callables.java:119)\n at org.bitcoinj.utils.ContextPropagatingThreadFactory$1.run(ContextPropagatingThreadFactory.java:51)\n at java.base/java.lang.Thread.run(Thread.java:830)\n22:16:34.267 [NioClientManager] INFO org.bitcoinj.core.PeerGroup - [10.10.1.218]:50001: Peer died (0 connected, 0 pending, 1 max)\n22:16:34.267 [PeerGroup Thread] INFO org.bitcoinj.core.PeerGroup - Peer discovery took 21.84 \xce\xbcs and returned 0 items from 0 discoverers\n22:16:34.269 [PeerGroup Thread] INFO org.bitcoinj.core.PeerGroup - Waiting 1502 ms before next connect attempt to [10.10.1.218]:50001\n22:16:35.776 [PeerGroup Thread] INFO org.bitcoinj.core.PeerGroup - Attempting connection to [10.10.1.218]:50001 (0 connected, 1 pending, 1 max)\n22:16:35.778 [NioClientManager] WARN org.bitcoinj.net.NioClientManager - Failed to connect with exception: java.net.ConnectException: Connection refused\njava.net.ConnectException: Connection refused\n at java.base/sun.nio.ch.Net.pollConnect(Native Method)\n at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:579)\n at java.base/sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:820)\n at org.bitcoinj.net.NioClientManager.handleKey(NioClientManager.java:64)\n at org.bitcoinj.net.NioClientManager.run(NioClientManager.java:122)\n at com.google.common.util.concurrent.AbstractExecutionThreadService$1$2.run(AbstractExecutionThreadService.java:66)\n at com.google.common.util.concurrent.Callables$4.run(Callables.java:119)\n at org.bitcoinj.utils.ContextPropagatingThreadFactory$1.run(ContextPropagatingThreadFactory.java:51)\n at java.base/java.lang.Thread.run(Thread.java:830)\n22:16:35.778 [NioClientManager] INFO org.bitcoinj.core.PeerGroup - [10.10.1.218]:50001: Peer died (0 connected, 0 pending, 1 max)\n22:16:35.779 [PeerGroup Thread] INFO org.bitcoinj.core.PeerGroup - Peer discovery took 8.752 \xce\xbcs and returned 0 items from 0 discoverers\nRun Code Online (Sandbox Code Playgroud)\n10.10.1.218似乎是由InetAddress.getLocalHost()in生成的org.bitcoinj.kits.WalletAppKit#connectToLocalHost:
public WalletAppKit connectToLocalHost() {\n try {\n InetAddress localHost = InetAddress.getLocalHost();\n return this.setPeerNodes(new PeerAddress(this.params, localHost, this.params.getPort()));\n } catch (UnknownHostException var2) {\n throw new RuntimeException(var2);\n }\n }\n\nRun Code Online (Sandbox Code Playgroud)\n更新1:
\n我尝试使用network_mode: "host".
如果我将其添加node到
node:\n image: ulamlabs/bitcoind-custom-regtest:latest\n network_mode: "host"\nRun Code Online (Sandbox Code Playgroud)\n当我运行时出现以下错误docker-compose up -d:
minimal-crypto-exchange % docker-compose up -d\nCreating network "minimal-crypto-exchange_default" with the default driver\nCreating minimal-crypto-exchange_postgres_1 ... done\nCreating minimal-crypto-exchange_geth_1 ...\nCreating minimal-crypto-exchange_node_1 ... done\nCreating minimal-crypto-exchange_electrumx_1 ...\nCreating minimal-crypto-exchange_electrumx_1 ... error\n\nERROR: for minimal-crypto-exchange_electrumx_1 Cannot start service electrumx: driver fail\nCreating minimal-crypto-exchange_geth_1 ... done\nf68d0f25a0512399877bc55434513def810649e4fcf31a5a88ca3292d34): Error starting userland proxy: listen tcp4 0.0.0.0:28332: bind: address already in use\nCreating minimal-crypto-exchange_blockscout_1 ... done\n\nERROR: for electrumx Cannot start service electrumx: driver failed programming external connectivity on endpoint minimal-crypto-exchange_electrumx_1 (8eaa4f68d0f25a0512399877bc55434513def810649e4fcf31a5a88ca3292d34): Error starting userland proxy: listen tcp4 0.0.0.0:28332: bind: address already in use\nERROR: Encountered errors while bringing up the project.\nRun Code Online (Sandbox Code Playgroud)\n如果我将它添加到electrumx部分中
electrumx:\n image: lukechilds/electrumx:latest\n network_mode: "host"\nRun Code Online (Sandbox Code Playgroud)\n我收到另一个错误:
\nminimal-crypto-exchange % docker-compose up -d\nminimal-crypto-exchange_postgres_1 is up-to-date\nminimal-crypto-exchange_geth_1 is up-to-date\nRecreating minimal-crypto-exchange_node_1 ...\nRecreating minimal-crypto-exchange_node_1 ... done\nRecreating minimal-crypto-exchange_electrumx_1 ...\n\nERROR: for minimal-crypto-exchange_electrumx_1 "host" network_mode is incompatible with port_bindings\n\nERROR: for electrumx "host" network_mode is incompatible with port_bindings\nTraceback (most recent call last):\n File "docker-compose", line 3, in <module>\n File "compose/cli/main.py", line 81, in main\n File "compose/cli/main.py", line 203, in perform_command\n File "compose/metrics/decorator.py", line 18, in wrapper\n File "compose/cli/main.py", line 1186, in up\n File "compose/cli/main.py", line 1166, in up\n File "compose/project.py", line 697, in up\n File "compose/parallel.py", line 108, in parallel_execute\n File "compose/parallel.py", line 206, in producer\n File "compose/project.py", line 679, in do\n File "compose/service.py", line 579, in execute_convergence_plan\n File "compose/service.py", line 499, in _execute_convergence_recreate\n File "compose/parallel.py", line 108, in parallel_execute\n File "compose/parallel.py", line 206, in producer\n File "compose/service.py", line 494, in recreate\n File "compose/service.py", line 612, in recreate_container\n File "compose/service.py", line 330, in create_container\n File "compose/service.py", line 939, in _get_container_create_options\n File "compose/service.py", line 1014, in _get_container_host_config\n File "docker/api/container.py", line 598, in create_host_config\n File "docker/types/containers.py", line 338, in __init__\ndocker.errors.InvalidArgument: "host" network_mode is incompatible with port_bindings\n[44262] Failed to execute script docker-compose\nRun Code Online (Sandbox Code Playgroud)\n更新2:
\n如果我注释掉端口绑定,如
\n electrumx:\n image: lukechilds/electrumx:latest\n network_mode: host\n links:\n - node\n# Port settings see https://github.com/ulamlabs/bitcoind-custom-regtest\n# ports:\n# - "51001:50001"\n# - "51002:50002"\n# - "19001:19001"\n# - "19000:19000"\n# - "28332:28332"\nRun Code Online (Sandbox Code Playgroud)\n并运行docker-compose up -d我得到
% docker-compose up -d\nCreating network "minimal-crypto-exchange_default" with the default driver\nCreating minimal-crypto-exchange_geth_1 ...\nCreating minimal-crypto-exchange_postgres_1 ... done\nCreating minimal-crypto-exchange_node_1 ... done\nCreating minimal-crypto-exchange_electrumx_1 ... error\nCreating minimal-crypto-exchange_geth_1 ... done\nERROR: for minimal-crypto-exchange_electrumx_1 Cannot create container for service electrumx: conflicting options: host type networking can\'t be used with links. This would result in undefined behavior\nCreating minimal-crypto-exchange_blockscout_1 ... done\n\nERROR: for electrumx Cannot create container for service electrumx: conflicting options: host type networking can\'t be used with links. This would result in undefined behavior\nERROR: Encountered errors while bringing up the project.\nRun Code Online (Sandbox Code Playgroud)\n更新 3:我认为错误的根源是在我的 Java 代码中我尝试连接到 ElectrumX 服务器而不是实际的比特币节点(node在 中docker-compose.yml)。
更新4:
\n我改变docker-compose.yml如下:
node:\n image: ulamlabs/bitcoind-custom-regtest:latest\n# For ports used by node see\n# https://github.com/ulamlabs/bitcoind-custom-regtest/blob/master/bitcoin.conf\n ports:\n - "19001:19001"\n - "19000:19000"\n - "28332:28332"\n electrumx:\n image: lukechilds/electrumx:latest\n links:\n - node\n# Port settings see https://github.com/ulamlabs/bitcoind-custom-regtest\n ports:\n - "51001:50001"\n - "51002:50002"\n# - "19001:19001"\n# - "19000:19000"\n# - "28332:28332"\nRun Code Online (Sandbox Code Playgroud)\n现在我遇到了不同的错误(完整日志可在此处找到):
\n11:33:51.865 [NioClientManager] INFO org.bitcoinj.core.PeerGroup - [192.168.10.208]:19000: Peer died (0 connected, 0 pending, 1 max)\n11:33:51.865 [NioClientManager] INFO org.bitcoinj.core.PeerGroup - Not yet setting download peer because there is no clear candidate.\n11:33:51.865 [NioClientManager] DEBUG org.bitcoinj.core.BitcoinSerializer - Received 168 byte \'alert\' message: 60010000000000000000000000ffffff7f00000000ffffff7ffeffff7f01ffffff7f00000000ffffff7f00ffffff7f002f555247454e543a20416c657274206b657920636f6d70726f6d697365642c2075706772616465207265717569726564004630440220653febd6410f470f6bae11cad19c48413becb1ac2c17f908fd0fd53bdc3abd5202206d0e9c96fe88d4a0f01ed9dedae2b6f9e00da94cad0fecaae66ecf689bf71b50\n11:33:51.866 [PeerGroup Thread] INFO org.bitcoinj.core.PeerGroup - Waiting 999 ms before next connect attempt to [127.0.0.1]:19000\n11:33:51.866 [NioClientManager] DEBUG org.bitcoinj.core.Peer - Received alert from peer Peer{[192.168.10.208]:19000, version=70015, subVer=/Satoshi:0.19.1(bitcore)/, services=1033 (NETWORK, WITNESS, NETWORK_LIMITED), time=2021-11-06 11:33:52, height=5}: URGENT: Alert key compromised, upgrade required\n11:33:51.867 [NioClientManager] WARN org.bitcoinj.net.ConnectionHandler - Error handling SelectionKey: java.nio.channels.CancelledKeyException \njava.nio.channels.CancelledKeyException: null\n at java.base/sun.nio.ch.SelectionKeyImpl.ensureValid(SelectionKeyImpl.java:71)\n at java.base/sun.nio.ch.SelectionKeyImpl.readyOps(SelectionKeyImpl.java:130)\n at java.base/java.nio.channels.SelectionKey.isWritable(SelectionKey.java:377)\n at org.bitcoinj.net.ConnectionHandler.handleKey(ConnectionHandler.java:244)\n at org.bitcoinj.net.NioClientManager.handleKey(NioClientManager.java:86)\n at org.bitcoinj.net.NioClientManager.run(NioClientManager.java:122)\n at com.google.common.util.concurrent.AbstractExecutionThreadService$1$2.run(AbstractExecutionThreadService.java:66)\n at com.google.common.util.concurrent.Callables$4.run(Callables.java:119)\n at org.bitcoinj.utils.ContextPropagatingThreadFactory$1.run(ContextPropagatingThreadFactory.java:51)\n at java.base/java.lang.Thread.run(Thread.java:830)\nRun Code Online (Sandbox Code Playgroud)\n更新5:
\n有人建议(在现已删除的评论中)在应用程序的输出中存在以下Peer does not support bloom filtering消息:
11:32:43.482 [NioClientManager] INFO org.bitcoinj.core.Peer - Peer{[127.0.0.1]:19000, version=70015, subVer=/Satoshi:0.19.1(bitcore)/, services=1033 (NETWORK, WITNESS, NETWORK_LIMITED), time=2021-11-06 11:32:43, height=4}: Peer does not support bloom filtering.\nRun Code Online (Sandbox Code Playgroud)\n所以我尝试分叉原始图像并更改bitcoin.conf文件以启用布隆过滤:
\npeerbloomfilters=1\nRun Code Online (Sandbox Code Playgroud)\n当我运行时docker build -t mentiflectax/bitcoind-custom-regtest:latest .,我收到以下错误消息(剩余输出的一部分可以在此处找到):
#13 922.4 g++: fatal error: Killed signal terminated program cc1plus\n#13 922.4 compilation terminated.\n#13 922.4 make[2]: *** [Makefile:8044: libbitcoin_server_a-init.o] Error 1\n#13 922.4 make[2]: *** Waiting for unfinished jobs....\n#13 965.8 make[2]: Leaving directory \'/bitcoin-0.19.1/src\'\n#13 965.8 make[1]: *** [Makefile:13765: all-recursive] Error 1\n#13 965.9 make[1]: Leaving directory \'/bitcoin-0.19.1/src\'\n#13 965.9 make: *** [Makefile:776: all-recursive] Error 1\n------\nexecutor failed running [/bin/sh -c tar -xzf *.tar.gz && cd bitcoin-${BITCOIN_VERSION} && sed -i \'s/consensus.nSubsidyHalvingInterval = 150/consensus.nSubsidyHalvingInterval = 210000/g\' src/chainparams.cpp && ./autogen.sh && ./configure LDFLAGS=-L`ls -d /opt/db`/lib/ CPPFLAGS=-I`ls -d /opt/db`/include/ --prefix=/opt/bitcoin --disable-man --disable-tests --disable-bench --disable-ccache --with-gui=no --enable-util-cli --with-daemon && make -j4 && make install && strip /opt/bitcoin/bin/bitcoin-cli && strip /opt/bitcoin/bin/bitcoind]: exit code: 2\nRun Code Online (Sandbox Code Playgroud)\n更新 6:正确的端口似乎是 19000。
\n如果我使用端口 19001,则会出现以下错误kit.awaitRunning():
INFO org.bitcoinj.core.PeerSocketHandler - [127.0.0.1]:19001: Timed out\nRun Code Online (Sandbox Code Playgroud)\n完整的日志输出可在此处获得。
\n我还没有测试您的完整设置electrumx以及文件ethereum中存在的内容docker-compose,但是关于您的问题,以下步骤可以正常工作,并且我认为它在您的完整设置中也能正常工作。
我根据您提供的图像使用 docker 运行了一个比特币节点ulamlabs/bitcoind-custom-regtest:latest:
docker run -p 18444:19000 -d ulamlabs/bitcoind-custom-regtest:latest
Run Code Online (Sandbox Code Playgroud)
如您所见,我将图像内部端口公开为19000, 的默认端口RegTestParams。18444从我们客户的角度来看,通过这种设置,基本上看起来就像我们在主机中运行比特币守护进程一样。使用您的LocalTestNetParams课程并提供您指示的端口19000也应该可以解决问题。
然后,根据您在问题中提供的反馈,我在/root/.bitcoin/bitcoin.confusingbash和中手动编辑了比特币节点的守护进程配置vi:
docker exec -it 0aa2e863cd9927 bash
Run Code Online (Sandbox Code Playgroud)
并包括以下配置:
peerbloomfilters=1
Run Code Online (Sandbox Code Playgroud)
重启容器后,我得到了一个新地址:
docker exec -it 0aa2e863cd9927 bash
Run Code Online (Sandbox Code Playgroud)
假设新地址是您在问题中提供的地址:
2N23tWAFEtBtTgxNjBNmnwzsiPdLcNek181
Run Code Online (Sandbox Code Playgroud)
然后,按照比特币文档中的建议,为了避免资金不足的错误,我生成了101到此地址的块:
docker exec -it 0aa2e863cd9927 bitcoin-cli -regtest generatetoaddress 101 2N23tWAFEtBtTgxNjBNmnwzsiPdLcNek181
Run Code Online (Sandbox Code Playgroud)
我使用了generatetoaddressand not generate,因为自比特币 0.19.0 以来,该选项不再有效。
接下来,我根据您提供的信息和Bitcoinj 库文档中的示例准备了一个简单的 Java 程序:
peerbloomfilters=1
Run Code Online (Sandbox Code Playgroud)
我使用了一个简单的 while 循环来保持问题的运行;当然,在实际设置中可能没有必要,因为您似乎正在使用 Spring Boot。
然后,如果您发送一些比特币到这个地址:
docker exec -it 0aa2e863cd9927 bitcoin-cli -regtest sendtoaddress 2N23tWAFEtBtTgxNjBNmnwzsiPdLcNek181 0.00001
0f972642713c72ae0fe03fe51818b9ea4d483720b69b90e795f35eb80a587c26
Run Code Online (Sandbox Code Playgroud)
应调用侦听器:
2021-11-09 23:51:20.537 INFO [NioClientManager][Wallet] Received a pending transaction 0f972642713c72ae0fe03fe51818b9ea4d483720b69b90e795f35eb80a587c26 that spends 0.00 BTC from our own wallet, and sends us 0.00001 BTC
2021-11-09 23:51:20.537 INFO [NioClientManager][Wallet] commitTx of 0f972642713c72ae0fe03fe51818b9ea4d483720b69b90e795f35eb80a587c26
...
2021-11-09 23:51:20.537 INFO [NioClientManager][Wallet] ->pending: 0f972642713c72ae0fe03fe51818b9ea4d483720b69b90e795f35eb80a587c26
2021-11-09 23:51:20.537 INFO [NioClientManager][Wallet] Estimated balance is now: 0.00001 BTC
-----> coins resceived: 0f972642713c72ae0fe03fe51818b9ea4d483720b69b90e795f35eb80a587c26
2021-11-09 23:51:20.538 INFO [NioClientManager][WalletFiles] Saving wallet; last seen block is height 165, date 2021-11-09T22:50:48Z, hash 23451521947bc5ff098c088ae0fc445becca8837d39ee8f6dd88f2c47ad5ac23
2021-11-09 23:51:20.543 INFO [NioClientManager][WalletFiles] Save completed in 4.736 ms
Run Code Online (Sandbox Code Playgroud)
还有一个你提到的问题我还没有机会测试,它正在创建一个新的Docker镜像,在这个镜像中peerbloomfilters配置会被正确配置,而不需要修改实际的容器状态。我认为您指出的编译问题可能与此问题有关,基本上,容器没有足够的资源来执行该过程。如果您使用的是 macOS 和 Docker for Mac,请尝试调整容器可用的内存量,这可能会有所帮助。所使用的基础图像的变化alpine也会引发该问题。我也会尝试深入研究这个问题。
| 归档时间: |
|
| 查看次数: |
1028 次 |
| 最近记录: |