当资金被发送到本地 regtest 网络上的特定比特币地址时,我如何收到通知?

DP_*_*DP_ 10 java bitcoinj bitcoin-testnet

我想以编程方式检测何时有人将比特币发送到某个地址。这发生在我开始使用这个docker-compose.yml文件的本地测试网上。

\n

本地测试网运行后,我使用以下命令创建一个新地址

\n
docker exec -it minimal-crypto-exchange_node_1 bitcoin-cli getnewaddress\n
Run Code Online (Sandbox Code Playgroud)\n

假设它返回2N23tWAFEtBtTgxNjBNmnwzsiPdLcNek181

\n

我把这个地址放入下面的Java代码中:

\n
import 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}\n
Run Code Online (Sandbox Code Playgroud)\n

然后我用这个类启动 Java 应用程序。

\n

然后我将一些测试比特币发送到有问题的地址:

\n
% docker exec -it minimal-crypto-exchange_node_1 bitcoin-cli sendtoaddress 2N23tWAFEtBtTgxNjBNmnwzsiPdLcNek181 0.5\n068c377bab961356ad9a3919229a764aa929711c68aefd5dbd4c7c348eef3406\n
Run Code Online (Sandbox Code Playgroud)\n

如果我转到http://localhost:3002/tx/068c377bab961356ad9a3919229a764aa929711c68aefd5dbd4c7c348eef3406,我会看到交易详细信息。

\n

交易页面截图

\n

但是,侦听器(方法)中的断点onCoinsReceived永远不会激活。

\n

我需要如何修改我的代码和/或用于发送测试 BTC 的命令,以便每当该帐户收到资金时onCoinsReceived都会调用方法?有没有一个地方可以告诉我Wallet或者NetworkParameters我想连接到本地主机?

\n

我使用的是 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"\n
Run Code Online (Sandbox Code Playgroud)\n

然后我重写了该init方法,以便可以连接到本地主机并指定端口:

\n
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    }\n
Run Code Online (Sandbox Code Playgroud)\n

LocalTestNetParams允许指定端口:

\n
package 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}\n
Run Code Online (Sandbox Code Playgroud)\n

我尝试了所有上述端口netParams.setPort(50001);

\n

在所有情况下,我都会收到以下消息kit.awaitRunning();

\n
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\n
Run Code Online (Sandbox Code Playgroud)\n

10.10.1.218似乎是由InetAddress.getLocalHost()in生成的org.bitcoinj.kits.WalletAppKit#connectToLocalHost

\n
    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\n
Run Code Online (Sandbox Code Playgroud)\n

更新1:

\n

我尝试使用network_mode: "host".

\n

如果我将其添加node

\n
  node:\n    image: ulamlabs/bitcoind-custom-regtest:latest\n    network_mode: "host"\n
Run Code Online (Sandbox Code Playgroud)\n

当我运行时出现以下错误docker-compose up -d

\n
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.\n
Run Code Online (Sandbox Code Playgroud)\n

如果我将它添加到electrumx部分中

\n
  electrumx:\n    image: lukechilds/electrumx:latest\n    network_mode: "host"\n
Run Code Online (Sandbox Code Playgroud)\n

我收到另一个错误:

\n
minimal-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\n
Run 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"\n
Run Code Online (Sandbox Code Playgroud)\n

并运行docker-compose up -d我得到

\n
 % 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.\n
Run Code Online (Sandbox Code Playgroud)\n

更新 3:我认为错误的根源是在我的 Java 代码中我尝试连接到 ElectrumX 服务器而不是实际的比特币节点(node在 中docker-compose.yml)。

\n

更新4:

\n

我改变docker-compose.yml如下:

\n
  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"\n
Run Code Online (Sandbox Code Playgroud)\n

现在我遇到了不同的错误(完整日志可在此处找到):

\n
11: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)\n
Run Code Online (Sandbox Code Playgroud)\n

更新5:

\n

有人建议(在现已删除的评论中)在应用程序的输出中存在以下Peer does not support bloom filtering消息:

\n
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.\n
Run Code Online (Sandbox Code Playgroud)\n

所以我尝试分叉原始图像并更改bitcoin.conf文件以启用布隆过滤:

\n
peerbloomfilters=1\n
Run Code Online (Sandbox Code Playgroud)\n

当我运行时docker build -t mentiflectax/bitcoind-custom-regtest:latest .,我收到以下错误消息(剩余输出的一部分可以在此处找到):

\n
#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\n
Run Code Online (Sandbox Code Playgroud)\n

更新 6:正确的端口似乎是 19000。

\n

如果我使用端口 19001,则会出现以下错误kit.awaitRunning()

\n
INFO  org.bitcoinj.core.PeerSocketHandler - [127.0.0.1]:19001: Timed out\n
Run Code Online (Sandbox Code Playgroud)\n

完整的日志输出可在此处获得。

\n

jcc*_*ero 2

我还没有测试您的完整设置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, 的默认端口RegTestParams18444从我们客户的角度来看,通过这种设置,基本上看起来就像我们在主机中运行比特币守护进程一样。使用您的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也会引发该问题。我也会尝试深入研究这个问题。