multiprocess: Add bitcoin-wallet -ipcconnect option #19460

pull ryanofsky wants to merge 19 commits into bitcoin:master from ryanofsky:pr/ipc-connect changing 82 files +2703 −127
  1. ryanofsky commented at 6:53 pm on July 7, 2020: contributor

    This is a draft PR because it is based on #10102. The non-base commits are:


    Building on #10102, this adds an -ipcconnect option to bitcoin-wallet and an -ipcbind option to bitcoin-node (both enabled by default in multiprocess builds) so bitcoin node will listen on a <datadir>/sockets/node.sock unix socket, and bitcoin-wallet will connect to it.

    The idea is that bitcoin-wallet can be extended in the future to have some online functionality. For example, there could be a bitcoin-wallet sync command that will update balances and sync latest transactions to an unloaded wallet, or a bitcoin-wallet serve subcommand that loads a wallet and serves RPC requests, or a bitcoin-wallet shell subcommand that allows running RPC methods interactively like the GUI console, or just general support for bitcoin-wallet <rpc method> <rpc params> invocations suggested #13926 (comment).

    This PR is small and doesn’t do much. The only visible change is that bitcoin-wallet now checks whether a node socket exists on startup and prints “Connected to IPC address” if it can connect it it.

    The default bitcoin-wallet connect option is -ipcconnect=auto, which connects if possible as described above, and proceeds offline if not possible. Other supported options are -noipcconnect to disable ipc, -ipcconnect to require a connection and fail if it can’t be established, and -ipcconnect=unix:<socket> to require a connection and use a custom socket path.

    These changes require multiprocess support and this PR has no effect unless bitcoin is configured with --enable-multiprocess as described in doc/multiprocess.md


    This PR is part of the process separation project.

  2. DrahtBot added the label Build system on Jul 7, 2020
  3. DrahtBot added the label Docs on Jul 7, 2020
  4. DrahtBot added the label GUI on Jul 7, 2020
  5. DrahtBot added the label P2P on Jul 7, 2020
  6. DrahtBot added the label RPC/REST/ZMQ on Jul 7, 2020
  7. DrahtBot added the label Tests on Jul 7, 2020
  8. DrahtBot added the label Utils/log/libs on Jul 7, 2020
  9. DrahtBot added the label Wallet on Jul 7, 2020
  10. DrahtBot commented at 9:07 pm on July 7, 2020: contributor

    The following sections might be updated with supplementary metadata relevant to reviewers and maintainers.

    Code Coverage

    For detailed information about the code coverage, see the test coverage report.

    Reviews

    See the guideline for information on the review process. A summary of reviews will appear here.

    Conflicts

    Reviewers, this pull request conflicts with the following ones:

    • #27711 (kernel: Remove shutdown from kernel library by TheCharlatan)
    • #27636 (kernel: Remove util/system from kernel library, interface_ui from validation. by TheCharlatan)
    • #27632 (Raise on invalid -debug and -loglevel config options by jonatack)
    • #27576 (kernel: Remove args, chainparams, chainparamsbase from kernel library by TheCharlatan)
    • #27375 (net: support unix domain sockets for -proxy and -onion by pinheadmz)
    • #26606 (wallet: Implement independent BDB parser by achow101)
    • #26596 (wallet: Migrate legacy wallets to descriptor wallets without requiring BDB by achow101)
    • #25273 (wallet: Pass through transaction locktime and preset input sequences and scripts to CreateTransaction by achow101)

    If you consider this pull request important, please also help to review the conflicting pull requests. Ideally, start with the one that should be merged first.

  11. DrahtBot added the label Needs rebase on Jul 11, 2020
  12. ryanofsky force-pushed on Jul 14, 2020
  13. ryanofsky commented at 1:55 pm on July 14, 2020: contributor
    Rebased 96c4cd092ed354858dfc457fafaec766b85c6e0d -> ff67a5d4c7a4899179f43fcfec4c61ef4bd7a1eb (pr/ipc-connect.2 -> pr/ipc-connect.3, compare) on top of #10102 pr/ipc.118 fixing tool_wallet.py test https://travis-ci.org/github/bitcoin/bitcoin/jobs/705900546 https://cirrus-ci.com/build/5236734818516992 and -ipcconnect suggestion #19461 (review) Rebased ff67a5d4c7a4899179f43fcfec4c61ef4bd7a1eb -> 01618ced5266687d44c4c1608ee4b0cd16246f24 (pr/ipc-connect.3 -> pr/ipc-connect.4, compare) on top of #10102 pr/ipc.119 Rebased 01618ced5266687d44c4c1608ee4b0cd16246f24 -> 9848b221b9d506b00292b3e42f5eb2e63be184a1 (pr/ipc-connect.4 -> pr/ipc-connect.5, compare) due to conflicts with #19561 on top of #10102 pr/ipc.123 Rebased 9848b221b9d506b00292b3e42f5eb2e63be184a1 -> 46a1080bf12a5eab477d5d7d217d4e91039ec308 (pr/ipc-connect.5 -> pr/ipc-connect.6, compare) due to conflict with bitcoin-core/gui#35 on top of #10102 pr/ipc.125 Rebased 46a1080bf12a5eab477d5d7d217d4e91039ec308 -> 9d1735d3a09be71913476685d52164aac3971f28 (pr/ipc-connect.6 -> pr/ipc-connect.7, compare) due to conflict with #19099, #19619, #15454, #19725, #19993 on top of #10102 pr/ipc.131 Rebased 9d1735d3a09be71913476685d52164aac3971f28 -> 37cdd7961d35e5bb6565c18fefbcc21d0c148cf1 (pr/ipc-connect.7 -> pr/ipc-connect.8, compare) on top of #10102 pr/ipc.133 Rebased 37cdd7961d35e5bb6565c18fefbcc21d0c148cf1 -> ecbc82571a38fde2ce2bb521a029c1c3b3f21a86 (pr/ipc-connect.8 -> pr/ipc-connect.9, compare) on top of #10102 pr/ipc.134 Rebased ecbc82571a38fde2ce2bb521a029c1c3b3f21a86 -> f7f1579cac06d88803ca4735e969bca0c5c60e35 (pr/ipc-connect.9 -> pr/ipc-connect.10, compare) on top of #10102 pr/ipc.137 Rebased f7f1579cac06d88803ca4735e969bca0c5c60e35 -> 891dd70a865684fa1110104a31208f37905b81d2 (pr/ipc-connect.10 -> pr/ipc-connect.11, compare) on top of #10102 pr/ipc.138 due to conflict with #20365
  14. ryanofsky force-pushed on Jul 14, 2020
  15. DrahtBot removed the label Needs rebase on Jul 14, 2020
  16. DrahtBot added the label Needs rebase on Jul 30, 2020
  17. ryanofsky force-pushed on Aug 12, 2020
  18. DrahtBot removed the label Needs rebase on Aug 12, 2020
  19. DrahtBot added the label Needs rebase on Aug 13, 2020
  20. ryanofsky force-pushed on Aug 28, 2020
  21. DrahtBot removed the label Needs rebase on Aug 28, 2020
  22. DrahtBot added the label Needs rebase on Aug 31, 2020
  23. ajtowns removed the label Docs on Sep 17, 2020
  24. ajtowns removed the label GUI on Sep 17, 2020
  25. ajtowns removed the label P2P on Sep 17, 2020
  26. ajtowns removed the label RPC/REST/ZMQ on Sep 17, 2020
  27. ajtowns removed the label Tests on Sep 17, 2020
  28. ryanofsky force-pushed on Sep 28, 2020
  29. DrahtBot removed the label Needs rebase on Sep 28, 2020
  30. ryanofsky force-pushed on Oct 2, 2020
  31. DrahtBot added the label Needs rebase on Oct 27, 2020
  32. ryanofsky force-pushed on Nov 25, 2020
  33. DrahtBot removed the label Needs rebase on Nov 25, 2020
  34. DrahtBot added the label Needs rebase on Dec 2, 2020
  35. ryanofsky force-pushed on Dec 11, 2020
  36. DrahtBot removed the label Needs rebase on Dec 11, 2020
  37. DrahtBot added the label Needs rebase on Dec 16, 2020
  38. ryanofsky force-pushed on Dec 18, 2020
  39. DrahtBot removed the label Needs rebase on Dec 18, 2020
  40. jonasschnelli commented at 8:02 am on December 18, 2020: contributor

    Impressive change. Again!

    Conceptual I’m not yet convinced. My understanding is/was that bitcoin-wallet is an offline wallet exploring and manipulation tool without the requirement of a node or online connectivity. Things that require a node, should IMO go into wallet RPC calls. But my conceptual understanding might be old and rusty (happy to get convinced).

    Things like bitcoin-wallet shell would be nice though. I guess we would just need to make sure the IPC/node option is completely optional and thus the offline functionality (for things that can work offline) is still guaranteed.

    Or is this also an attempt to decouple the wallet from the node (in the long run)?

  41. DrahtBot added the label Needs rebase on Dec 18, 2020
  42. ryanofsky commented at 11:34 am on December 18, 2020: contributor

    My understanding is/was that bitcoin-wallet is an offline wallet exploring and manipulation tool without the requirement of a node or online connectivity.

    To address any concern here, there’s no thought of changing this. This PR gives bitcoin-wallet tool ability to do online things as well as offline things. It doesn’t require a node or take away the ability to do offline things. Even if you require separate bitcoin-wallet-online-stuff and bitcoin-wallet-offline-only binaries, it only needs build changes not code changes (a new automake entry and src/init/bitcoin-wallet-offline-only.cpp stub)


    Rebased 891dd70a865684fa1110104a31208f37905b81d2 -> a87cdf40e41b568ba71516558c915d084b878917 (pr/ipc-connect.11 -> pr/ipc-connect.12, compare) due to conflict with #20687 Rebased a87cdf40e41b568ba71516558c915d084b878917 -> bae198be312b96c6ad7b681d60139577c17e4435 (pr/ipc-connect.12 -> pr/ipc-connect.13, compare) on top of #10102 pr/ipc.140 due to #19160 updates Rebased bae198be312b96c6ad7b681d60139577c17e4435 -> e45f05658f8a37aa1cf5a3a2add638dac50f6ee1 (pr/ipc-connect.13 -> pr/ipc-connect.14, compare) on top of #10102 pr/ipc.142 due to silent conflict with #20464 (https://cirrus-ci.com/task/6558387276087296) Rebased e45f05658f8a37aa1cf5a3a2add638dac50f6ee1 -> 49b5450388c956b3d3b7cb5d484e9672da048aa4 (pr/ipc-connect.14 -> pr/ipc-connect.15, compare) on top of #10102 pr/ipc.143 due to conflict with #20715 Rebased 49b5450388c956b3d3b7cb5d484e9672da048aa4 -> 991e75e27386649f44c83da48ff0b58fefad2d3e (pr/ipc-connect.15 -> pr/ipc-connect.16, compare) on top of #10102 pr/ipc.145 with can connect / can listen cleanup Rebased 991e75e27386649f44c83da48ff0b58fefad2d3e -> b126a68bd974a57bd80eb5cc776ae5015c09392d (pr/ipc-connect.16 -> pr/ipc-connect.17, compare) on top of #10102 pr/ipc.146 Rebased b126a68bd974a57bd80eb5cc776ae5015c09392d -> 73520db5d73e53a5cf2fd52cc1223986dd4691e7 (pr/ipc-connect.17 -> pr/ipc-connect.18, compare) after #21541 to fix APK cirrus caching errors https://cirrus-ci.com/task/5270118180585472 Rebased 73520db5d73e53a5cf2fd52cc1223986dd4691e7 -> 16a0cb494c78d058a73c0775d94951d8c0dd8386 (pr/ipc-connect.18 -> pr/ipc-connect.19, compare) on top of #10102 pr/ipc.148 Rebased 16a0cb494c78d058a73c0775d94951d8c0dd8386 -> 87e231f5c01d0c542ba26a648fc3b229f8fb2c13 (pr/ipc-connect.19 -> pr/ipc-connect.20, compare) due to silent conflict with #21850 on top of #10102 pr/ipc.149 Rebased 87e231f5c01d0c542ba26a648fc3b229f8fb2c13 -> 602d47bef1f345f5ec72b2c8c2cda81c435a15dd (pr/ipc-connect.20 -> pr/ipc-connect.21, compare) on top of #10102 pr/ipc.149 after #22061 to fix #22059 Rebased 602d47bef1f345f5ec72b2c8c2cda81c435a15dd -> d3b976ba02ee7330ba615305889a9b0ebf220437 (pr/ipc-connect.21 -> pr/ipc-connect.22, compare) on top of #10102 pr/ipc.153 Rebased d3b976ba02ee7330ba615305889a9b0ebf220437 -> 69942db6341f1586ace576bb568212703ed69cee (pr/ipc-connect.22 -> pr/ipc-connect.23, compare) on top of #10102 pr/ipc.154 Rebased 69942db6341f1586ace576bb568212703ed69cee -> 977f384064f88bf56a4b6241abeb6bab0175816e (pr/ipc-connect.23 -> pr/ipc-connect.24, compare) on top of #10102 pr/ipc.158 Rebased 977f384064f88bf56a4b6241abeb6bab0175816e -> 6efe30f4583bb8cf438430be6a891c7b40d5c212 (pr/ipc-connect.24 -> pr/ipc-connect.25, compare) on top of #10102 pr/ipc.161 Rebased 6efe30f4583bb8cf438430be6a891c7b40d5c212 -> dd5bbe8cdcf79b9ea0e1262f07d50f4de1e94424 (pr/ipc-connect.25 -> pr/ipc-connect.26, compare) on top of #10102 pr/ipc.163 Rebased dd5bbe8cdcf79b9ea0e1262f07d50f4de1e94424 -> 40c88d90c0b6e78f796a715136a3a2a7dd9bd19d (pr/ipc-connect.26 -> pr/ipc-connect.27, compare) on top of #10102 pr/ipc.172 Rebased 40c88d90c0b6e78f796a715136a3a2a7dd9bd19d -> e36c0f18eaefe03e0a8de3e124c743fb3b5e59db (pr/ipc-connect.27 -> pr/ipc-connect.28, compare) on top of #10102 pr/ipc.173 Rebased e36c0f18eaefe03e0a8de3e124c743fb3b5e59db -> 78edb2eeb7afb5556f2ead1c2007b20eef08dd20 (pr/ipc-connect.28 -> pr/ipc-connect.29, compare) on top of #10102 pr/ipc.180 Rebased 78edb2eeb7afb5556f2ead1c2007b20eef08dd20 -> ca3bcd067b087c01664fb649c31e380c47e246dc (pr/ipc-connect.29 -> pr/ipc-connect.30, compare) due to conflict with #26067 Updated ca3bcd067b087c01664fb649c31e380c47e246dc -> 9195716053b919f28a5e94d9a3b5d314762f464d (pr/ipc-connect.30 -> pr/ipc-connect.31, compare) to fix strerror locale-dependent lint error Rebased 9195716053b919f28a5e94d9a3b5d314762f464d -> 940c516653297888d72e010b6cf087b3ff067795 (pr/ipc-connect.31 -> pr/ipc-connect.32, compare) on top of #10102 pr/ipc.182 to fix conflict with #25737 Rebased 940c516653297888d72e010b6cf087b3ff067795 -> 31bad7d8f6c5145b162ccf9236f39897c4fd53ce (pr/ipc-connect.32 -> pr/ipc-connect.33, compare) on top of #10102 pr to fix conflict with #26298 Rebased 31bad7d8f6c5145b162ccf9236f39897c4fd53ce -> 44c62070aa2826a65f60606cfb3370820124664b (pr/ipc-connect.33 -> pr/ipc-connect.34, compare) on top of rebased pr/ipc.185 to fix abstract virtual class silent merge conflict cirrus failure

  43. ryanofsky force-pushed on Dec 18, 2020
  44. DrahtBot removed the label Needs rebase on Dec 18, 2020
  45. DrahtBot added the label Needs rebase on Jan 7, 2021
  46. ryanofsky force-pushed on Feb 1, 2021
  47. DrahtBot removed the label Needs rebase on Feb 1, 2021
  48. ryanofsky force-pushed on Feb 4, 2021
  49. DrahtBot added the label Needs rebase on Feb 4, 2021
  50. ryanofsky force-pushed on Feb 21, 2021
  51. DrahtBot removed the label Needs rebase on Feb 21, 2021
  52. DrahtBot added the label Needs rebase on Mar 2, 2021
  53. ryanofsky force-pushed on Mar 9, 2021
  54. DrahtBot removed the label Needs rebase on Mar 9, 2021
  55. DrahtBot added the label Needs rebase on Mar 11, 2021
  56. ryanofsky force-pushed on Mar 24, 2021
  57. DrahtBot removed the label Needs rebase on Mar 25, 2021
  58. ryanofsky force-pushed on Mar 29, 2021
  59. DrahtBot added the label Needs rebase on Mar 30, 2021
  60. ryanofsky force-pushed on Apr 10, 2021
  61. DrahtBot removed the label Needs rebase on Apr 10, 2021
  62. RonSherfey changes_requested
  63. RonSherfey commented at 3:24 pm on April 11, 2021: none
    Requested changes
  64. laanwj referenced this in commit ac219dcbcc on Apr 27, 2021
  65. DrahtBot added the label Needs rebase on Apr 27, 2021
  66. ryanofsky force-pushed on May 24, 2021
  67. DrahtBot removed the label Needs rebase on May 24, 2021
  68. RonSherfey approved
  69. RonSherfey commented at 8:40 am on May 31, 2021: none
    approved changes
  70. ryanofsky force-pushed on Jun 2, 2021
  71. DrahtBot added the label Needs rebase on Jun 9, 2021
  72. ryanofsky force-pushed on Jun 17, 2021
  73. DrahtBot removed the label Needs rebase on Jun 18, 2021
  74. DrahtBot added the label Needs rebase on Jun 23, 2021
  75. ryanofsky force-pushed on Jun 23, 2021
  76. DrahtBot removed the label Needs rebase on Jun 23, 2021
  77. DrahtBot added the label Needs rebase on Jun 24, 2021
  78. ryanofsky force-pushed on Aug 18, 2021
  79. DrahtBot removed the label Needs rebase on Aug 18, 2021
  80. RonSherfey approved
  81. RonSherfey commented at 3:53 pm on August 22, 2021: none
    Approved changes
  82. DrahtBot added the label Needs rebase on Sep 24, 2021
  83. ryanofsky force-pushed on Oct 6, 2021
  84. DrahtBot removed the label Needs rebase on Oct 6, 2021
  85. DrahtBot added the label Needs rebase on Oct 15, 2021
  86. ryanofsky force-pushed on Nov 1, 2021
  87. DrahtBot removed the label Needs rebase on Nov 1, 2021
  88. DrahtBot added the label Needs rebase on Nov 10, 2021
  89. ryanofsky force-pushed on Jan 11, 2022
  90. DrahtBot removed the label Needs rebase on Jan 11, 2022
  91. DrahtBot added the label Needs rebase on Jan 11, 2022
  92. ryanofsky force-pushed on Jan 13, 2022
  93. DrahtBot removed the label Needs rebase on Jan 13, 2022
  94. DrahtBot added the label Needs rebase on Jan 31, 2022
  95. uvhw referenced this in commit 47d44ccc3e on Feb 14, 2022
  96. ryanofsky force-pushed on Sep 21, 2022
  97. ryanofsky force-pushed on Sep 21, 2022
  98. DrahtBot removed the label Needs rebase on Sep 21, 2022
  99. ryanofsky force-pushed on Sep 21, 2022
  100. DrahtBot added the label Needs rebase on Sep 25, 2022
  101. ryanofsky force-pushed on Sep 26, 2022
  102. DrahtBot removed the label Needs rebase on Sep 26, 2022
  103. DrahtBot added the label Needs rebase on Dec 6, 2022
  104. ryanofsky force-pushed on Feb 10, 2023
  105. DrahtBot removed the label Needs rebase on Feb 10, 2023
  106. ryanofsky force-pushed on Feb 10, 2023
  107. DrahtBot added the label Needs rebase on Feb 17, 2023
  108. ryanofsky force-pushed on Feb 28, 2023
  109. DrahtBot removed the label Needs rebase on Feb 28, 2023
  110. DrahtBot added the label Needs rebase on Mar 11, 2023
  111. ryanofsky force-pushed on May 2, 2023
  112. DrahtBot removed the label Needs rebase on May 2, 2023
  113. doc: fix broken doc/design/multiprocess.md links after #24352 25a94f30a5
  114. Add SpanReader ignore method
    Needed to deserialize some types from spans like CScripts
    8e245d1b15
  115. Fix const virtual method that breaks multiprocess support 13274fca38
  116. Change getUnspentOutput return type to avoid multiprocess segfault
    Coin serialize method segfaults if IsSpent condition is true. This caused
    multiprocess code to segfault when serializing the Coin& output argument to of
    the Node::getUnspentOutput method if the coin was not found. Segfault could be
    triggered by double clicking and viewing transaction details in the GUI
    transaction list.
    
    Fix this by replacing Coin& output argument with optional<Coin> return value to
    avoid trying to serializing spent coins.
    3a10f7130a
  117. node: Add schedulerMockForward method so mockscheduler RPC can work across processes
    Needed to fix new wallet_groups.py and wallet_resendwallettransactions.py tests
    with multiprocess bitcoin-node executable.
    291875605d
  118. Increase feature_block.py and feature_taproot.py timeouts
    Needed because BlockConnected notifications are a lot slower with the wallet
    running in separate process.
    52b407bcf1
  119. Add util::Result workaround to be compatible with libmultiprocess 2a31d3555a
  120. Add capnp serialization code for bitcoin types f942c69780
  121. Add capnp wrapper for Handler interface d314829582
  122. Add capnp wrapper for Chain interface 21fd995bd9
  123. Add capnp wrapper for Wallet interface 5fd4f202e6
  124. Add capnp wrapper for Node interface 2623d083ba
  125. Make bitcoin-gui spawn a bitcoin-node process
    Spawn node subprocess instead of running node code internally
    6b3e636294
  126. Make bitcoin-node spawn a bitcoin-wallet process
    Spawn wallet subprocess instead of running wallet code internally
    8ce9a36c58
  127. multiprocess: Add debug.log .wallet/.gui suffixes
    Add .wallet/.gui suffixes to log files created by bitcoin-gui and
    bitcoin-wallet processes so they don't clash with bitcoin-node log file.
    06380b771a
  128. doc: Multiprocess misc doc and comment updates cebfd371ed
  129. combine_logs: Handle multiprocess wallet log files 1e5d7da989
  130. Merge remote-tracking branch 'origin/pull/10102/head' a47e36e966
  131. multiprocess: Add -ipcconnect and -ipcbind options
    Add `-ipcbind` option to `bitcoin-node`, and an `-ipcconnect` option to
    `bitcoin-wallet` to allow running a node that listens on an IPC socket and
    accepts connections from wallet processes.
    
    Example usage:
    
        src/bitcoin-node -regtest -debug -ipcbind=unix
        src/bitcoin-wallet -regtest -ipcconnect=unix info
    
    `bitcoin-wallet` tool doesn't really do anything with its connection to the
    node yet, but it could potentially run or serve RPCs that require being online.
    bbefbd3c19
  132. ryanofsky force-pushed on May 4, 2023
  133. DrahtBot added the label Needs rebase on May 30, 2023
  134. DrahtBot commented at 4:04 pm on May 30, 2023: contributor

    🐙 This pull request conflicts with the target branch and needs rebase.

  135. DrahtBot commented at 1:45 am on August 28, 2023: contributor

    There hasn’t been much activity lately and the patch still needs rebase. What is the status here?

    • Is it still relevant? ➡️ Please solve the conflicts to make it ready for review and to ensure the CI passes.
    • Is it no longer relevant? ➡️ Please close.
    • Did the author lose interest or time to work on this? ➡️ Please close it and mark it ‘Up for grabs’ with the label, so that it can be picked up in the future.
  136. achow101 marked this as a draft on Sep 20, 2023
  137. DrahtBot commented at 0:52 am on January 22, 2024: contributor

    ⌛ There hasn’t been much activity lately and the patch still needs rebase. What is the status here?

    • Is it still relevant? ➡️ Please solve the conflicts to make it ready for review and to ensure the CI passes.
    • Is it no longer relevant? ➡️ Please close.
    • Did the author lose interest or time to work on this? ➡️ Please close it and mark it ‘Up for grabs’ with the label, so that it can be picked up in the future.
  138. DrahtBot commented at 1:06 am on April 20, 2024: contributor

    ⌛ There hasn’t been much activity lately and the patch still needs rebase. What is the status here?

    • Is it still relevant? ➡️ Please solve the conflicts to make it ready for review and to ensure the CI passes.
    • Is it no longer relevant? ➡️ Please close.
    • Did the author lose interest or time to work on this? ➡️ Please close it and mark it ‘Up for grabs’ with the label, so that it can be picked up in the future.
  139. Korosiua1206 approved

github-metadata-mirror

This is a metadata mirror of the GitHub repository bitcoin/bitcoin. This site is not affiliated with GitHub. Content is generated from a GitHub metadata backup.
generated: 2024-07-01 13:12 UTC

This site is hosted by @0xB10C
More mirrored repositories can be found on mirror.b10c.me