refactor: Replace boost::bind with std::bind #13743

pull ken2812221 wants to merge 2 commits into bitcoin:master from ken2812221:std-bind changing 17 files +83 −96
  1. ken2812221 commented at 3:19 pm on July 22, 2018: contributor

    Replace boost::bind with std::bind

    • In src/rpc/server.cpp, replace std::transform with simple loop.
    • In src/validation.cpp, store the boost::signals2::connection object and use it to disconnect.
    • In src/validationinterface.cpp, use 2 map to store the boost::signals2::scoped_connection object.
  2. laanwj added the label Refactoring on Jul 22, 2018
  3. fanquake added this to the "In progress" column in a project

  4. fanquake renamed this:
    [Refactor] Replace some boost::bind to std::bind
    refactor: Replace some boost::bind to std::bind
    on Jul 23, 2018
  5. fanquake commented at 7:31 am on July 23, 2018: member

    Concept ACK

    After this boost::bind will still be used by server, scheduler and validation (and associated tests). @ken2812221 Is there a particular reason you haven’t removed that usage?

  6. practicalswift commented at 7:53 am on July 23, 2018: contributor

    Concept ACK, but please remove using namespace std::placeholders;. Reference _N using the fully specified std::placeholders::_N.

    See developer notes:

    • Don’t import anything into the global namespace (using namespace ...). Use fully specified types such as std::string.
  7. ken2812221 commented at 10:35 am on July 23, 2018: contributor

    After this boost::bind will still be used by server, scheduler and validation (and associated tests). Is there a particular reason you haven’t removed that usage?

    Those instances cannot be replaced simply boost -> std. I’ll try to get rid of those.

    please remove using namespace std::placeholders;

    Will do

  8. ken2812221 force-pushed on Jul 23, 2018
  9. ken2812221 force-pushed on Jul 23, 2018
  10. ken2812221 force-pushed on Jul 23, 2018
  11. in src/qt/bitcoingui.cpp:62 in 164b76e031 outdated
    58@@ -57,6 +59,8 @@
    59 #include <QUrlQuery>
    60 #include <QVBoxLayout>
    61 
    62+using namespace std::placeholders;
    


    practicalswift commented at 11:24 am on July 23, 2018:
    Please remove :-)
  12. in src/qt/clientmodel.cpp:33 in 164b76e031 outdated
    29@@ -28,6 +30,8 @@
    30 #include <QDebug>
    31 #include <QTimer>
    32 
    33+using namespace std::placeholders;
    


    practicalswift commented at 11:25 am on July 23, 2018:
    Please remove :-)
  13. in src/qt/splashscreen.cpp:29 in 164b76e031 outdated
    25@@ -24,6 +26,8 @@
    26 #include <QPainter>
    27 #include <QRadialGradient>
    28 
    29+using namespace std::placeholders;
    


    practicalswift commented at 11:25 am on July 23, 2018:
    Please remove :-)
  14. in src/qt/transactiontablemodel.cpp:32 in 164b76e031 outdated
    28@@ -27,6 +29,8 @@
    29 #include <QIcon>
    30 #include <QList>
    31 
    32+using namespace std::placeholders;
    


    practicalswift commented at 11:25 am on July 23, 2018:
    Please remove :-)
  15. in src/qt/walletmodel.cpp:32 in 164b76e031 outdated
    28@@ -27,6 +29,7 @@
    29 #include <QSet>
    30 #include <QTimer>
    31 
    32+using namespace std::placeholders;
    


    practicalswift commented at 11:25 am on July 23, 2018:
    Please remove :-)
  16. in src/torcontrol.cpp:31 in 164b76e031 outdated
    27@@ -27,6 +28,8 @@
    28 #include <event2/event.h>
    29 #include <event2/thread.h>
    30 
    31+using namespace std::placeholders;
    


    practicalswift commented at 11:25 am on July 23, 2018:
    Please remove :-)
  17. ken2812221 force-pushed on Jul 23, 2018
  18. MarcoFalke commented at 11:34 am on July 23, 2018: member
    I believe it is acceptable to be using using namespace std::placeholders here, since the alternative would be extremely verbose.
  19. practicalswift commented at 11:56 am on July 23, 2018: contributor
    @MarcoFalke I’m not sure I agree. The verbosity could help remind us that we really should use lambdas where we’re currently using std::bind (modulo the few places where that is not technically possible in C++11), no? :-)
  20. ken2812221 commented at 12:17 pm on July 23, 2018: contributor
    @practicalswift Since @MarcoFalke think that using namespace std::placeholders; is acceptable, I will wait for more comments from other people and decide what to do.
  21. ken2812221 force-pushed on Jul 23, 2018
  22. ken2812221 renamed this:
    refactor: Replace some boost::bind to std::bind
    refactor: Replace all boost::bind to std::bind
    on Jul 23, 2018
  23. practicalswift commented at 1:26 pm on July 23, 2018: contributor
    @ken2812221 OK! :-) Could you try rewriting them as lambdas where appropriate? That would get rid of std::bind too :-)
  24. ken2812221 commented at 1:49 pm on July 23, 2018: contributor
    @practicalswift Good point! I’ll try to use lambda to replace bind
  25. ken2812221 force-pushed on Jul 23, 2018
  26. ken2812221 force-pushed on Jul 23, 2018
  27. ken2812221 force-pushed on Jul 23, 2018
  28. in src/rpc/server.cpp:502 in d5322d3be0 outdated
    506@@ -508,9 +507,10 @@ std::vector<std::string> CRPCTable::listCommands() const
    507     std::vector<std::string> commandList;
    508     typedef std::map<std::string, const CRPCCommand*> commandMap;
    


    Empact commented at 5:25 pm on July 23, 2018:
    nit: can remove, this is now unreferenced
  29. Empact commented at 5:28 pm on July 23, 2018: member
    How about using place = namespace std::placeholders; as an alternative? The calls would be relatively less verbose and would read well, e.g. std::bind(ThreadSafeMessageBox, this, place::_1, place::_2, place::_3). It would avoid polluting the global namespace, and would make the connection more explicit from source to reference.
  30. in src/validationinterface.cpp:95 in d5322d3be0 outdated
     99+    connections.TransactionRemovedFromMempool = g_signals.m_internals->TransactionRemovedFromMempool.connect(std::bind(&CValidationInterface::TransactionRemovedFromMempool, pwalletIn, _1));
    100+    connections.ChainStateFlushed = g_signals.m_internals->ChainStateFlushed.connect(std::bind(&CValidationInterface::ChainStateFlushed, pwalletIn, _1));
    101+    connections.Broadcast = g_signals.m_internals->Broadcast.connect(std::bind(&CValidationInterface::ResendWalletTransactions, pwalletIn, _1, _2));
    102+    connections.BlockChecked = g_signals.m_internals->BlockChecked.connect(std::bind(&CValidationInterface::BlockChecked, pwalletIn, _1, _2));
    103+    connections.NewPoWValidBlock = g_signals.m_internals->NewPoWValidBlock.connect(std::bind(&CValidationInterface::NewPoWValidBlock, pwalletIn, _1, _2));
    104+    g_signals.m_wallet_connections.emplace(pwalletIn, connections);
    


    Empact commented at 5:31 pm on July 23, 2018:
    nit: Could std::move connections
  31. in src/validationinterface.cpp:124 in d5322d3be0 outdated
    125+    connections.BlockDisconnected.disconnect();
    126+    connections.TransactionRemovedFromMempool.disconnect();
    127+    connections.ChainStateFlushed.disconnect();
    128+    connections.Broadcast.disconnect();
    129+    connections.BlockChecked.disconnect();
    130+    connections.NewPoWValidBlock.disconnect();
    


    Empact commented at 5:40 pm on July 23, 2018:
    nit: could extract these as a method on ValidationInterfaceConnections where it would be more clear whether the method was comprehensive in its disconnecting.
  32. in src/validationinterface.cpp:94 in d5322d3be0 outdated
     98+    connections.BlockDisconnected = g_signals.m_internals->BlockDisconnected.connect(std::bind(&CValidationInterface::BlockDisconnected, pwalletIn, _1));
     99+    connections.TransactionRemovedFromMempool = g_signals.m_internals->TransactionRemovedFromMempool.connect(std::bind(&CValidationInterface::TransactionRemovedFromMempool, pwalletIn, _1));
    100+    connections.ChainStateFlushed = g_signals.m_internals->ChainStateFlushed.connect(std::bind(&CValidationInterface::ChainStateFlushed, pwalletIn, _1));
    101+    connections.Broadcast = g_signals.m_internals->Broadcast.connect(std::bind(&CValidationInterface::ResendWalletTransactions, pwalletIn, _1, _2));
    102+    connections.BlockChecked = g_signals.m_internals->BlockChecked.connect(std::bind(&CValidationInterface::BlockChecked, pwalletIn, _1, _2));
    103+    connections.NewPoWValidBlock = g_signals.m_internals->NewPoWValidBlock.connect(std::bind(&CValidationInterface::NewPoWValidBlock, pwalletIn, _1, _2));
    


    Empact commented at 5:42 pm on July 23, 2018:
    nit: could extract as a method on ValidationInterfaceConnections
  33. ken2812221 force-pushed on Jul 23, 2018
  34. ken2812221 renamed this:
    refactor: Replace all boost::bind to std::bind
    wip, refactor: Replace all boost::bind to std::bind
    on Jul 23, 2018
  35. ken2812221 force-pushed on Jul 23, 2018
  36. ken2812221 force-pushed on Jul 23, 2018
  37. ken2812221 force-pushed on Jul 23, 2018
  38. ken2812221 renamed this:
    wip, refactor: Replace all boost::bind to std::bind
    refactor: Replace boost::bind to lambda
    on Jul 23, 2018
  39. promag commented at 0:14 am on July 24, 2018: member
    Concept ACK.
  40. in src/validationinterface.h:10 in f65761e7a8 outdated
     5@@ -6,10 +6,13 @@
     6 #ifndef BITCOIN_VALIDATIONINTERFACE_H
     7 #define BITCOIN_VALIDATIONINTERFACE_H
     8 
     9+#include <boost/signals2/signal.hpp>
    10+
    


    MarcoFalke commented at 0:21 am on July 24, 2018:
    I believe this will slow down the build significantly. So tend to NACK here.

    ken2812221 commented at 3:20 pm on July 24, 2018:
    Fixed
  41. ken2812221 force-pushed on Jul 24, 2018
  42. ken2812221 renamed this:
    refactor: Replace boost::bind to lambda
    refactor: Replace std/boost::bind to lambda
    on Jul 24, 2018
  43. ken2812221 force-pushed on Jul 24, 2018
  44. ken2812221 force-pushed on Jul 24, 2018
  45. ken2812221 force-pushed on Jul 24, 2018
  46. ken2812221 force-pushed on Jul 24, 2018
  47. ken2812221 force-pushed on Jul 24, 2018
  48. ken2812221 force-pushed on Jul 25, 2018
  49. fanquake requested review from theuni on Jul 25, 2018
  50. DrahtBot commented at 3:01 pm on July 25, 2018: member

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

    Conflicts

    Reviewers, this pull request conflicts with the following ones:

    • #14464 (refactor: make checkqueue manage the threads by itself (also removed some boost dependencies) by ken2812221)
    • #14384 (Resolve validationinterface circular dependencies by 251Labs)
    • #14035 (Utxoscriptindex by mgrychow)
    • #13751 (Utils and libraries: Drops the boost/algorithm/string/split.hpp dependency by 251Labs)

    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.

  51. MarcoFalke commented at 3:07 pm on July 25, 2018: member
    Could you sum up the differences between std::bind and lambda in the first comment for the convenience of the reviewers? It might not be obvious to everyone why lambdas should be preferred over std::bind everywhere.
  52. ken2812221 renamed this:
    refactor: Replace std/boost::bind to lambda
    refactor: Replace std/boost::bind with lambda
    on Jul 26, 2018
  53. practicalswift commented at 10:07 am on July 26, 2018: contributor

    @MarcoFalke Stephan T. Lavavej (standard library maintainer Visual C++) sums up the std::bind issues/gotchas here: https://www.youtube.com/watch?v=zt7ThwVfap0&t=1721

    His recommendations:

    • Avoid using bind()
    • Use lambdas, especially generic lambdas
    • bind(): good idea in 2005, bad idea in 2015

    Fun quote from the video:

    “I’ve seen both Herb Sutter and Scott Meyers confused by bind. These are very very smart people, but bind is even more evil than they’re able to handle. I was confused by bind while maintaining bind …”

  54. DrahtBot added the label Needs rebase on Aug 29, 2018
  55. ken2812221 force-pushed on Aug 29, 2018
  56. ken2812221 force-pushed on Aug 29, 2018
  57. DrahtBot removed the label Needs rebase on Aug 29, 2018
  58. in src/qt/clientmodel.cpp:250 in be34eeea74 outdated
    252-    m_handler_notify_network_active_changed = m_node.handleNotifyNetworkActiveChanged(boost::bind(NotifyNetworkActiveChanged, this, _1));
    253-    m_handler_notify_alert_changed = m_node.handleNotifyAlertChanged(boost::bind(NotifyAlertChanged, this));
    254-    m_handler_banned_list_changed = m_node.handleBannedListChanged(boost::bind(BannedListChanged, this));
    255-    m_handler_notify_block_tip = m_node.handleNotifyBlockTip(boost::bind(BlockTipChanged, this, _1, _2, _3, _4, false));
    256-    m_handler_notify_header_tip = m_node.handleNotifyHeaderTip(boost::bind(BlockTipChanged, this, _1, _2, _3, _4, true));
    257+    m_handler_show_progress = m_node.handleShowProgress([this](const std::string& title, int nProgress, bool resume_possible) { ShowProgress(this, title, nProgress); });
    


    practicalswift commented at 5:23 am on September 26, 2018:
    Make resume_possible an unnamed parameter.
  59. theuni commented at 8:37 pm on September 26, 2018: member

    Please break this up into logical commits for review. boost::bind -> std::bind makes sense to me. Concept ACK there for sure.

    std::bind -> lambda seems more like a style/preference change. I prefer lambdas too, but I don’t think that justifies the churn here. Maybe when lambdas are more robust and provide a more clear win with c++14/c++17?

  60. ken2812221 force-pushed on Sep 27, 2018
  61. ken2812221 renamed this:
    refactor: Replace std/boost::bind with lambda
    refactor: Replace boost::bind with std::bind
    on Sep 27, 2018
  62. ken2812221 force-pushed on Sep 27, 2018
  63. fanquake commented at 6:53 am on September 27, 2018: member

    Travis linter is failing with:

    0Running script for: fcba334f0d21161354f168a081d95a63b82fa4c5
    1ALL_FILES=$(git ls-files -- '*.cpp' '*.h')
    2for i in 1 2 3 4 5; do
    3    sed -i "s/ _${i}/ std::placeholders::_${i}/g" ${ALL_FILES}
    4done
    5fatal: ambiguous argument '5': unknown revision or path not in the working tree.
    
  64. ken2812221 force-pushed on Sep 27, 2018
  65. ken2812221 force-pushed on Sep 27, 2018
  66. ken2812221 force-pushed on Sep 27, 2018
  67. ken2812221 force-pushed on Sep 27, 2018
  68. ken2812221 force-pushed on Sep 27, 2018
  69. ken2812221 force-pushed on Sep 27, 2018
  70. ken2812221 force-pushed on Sep 27, 2018
  71. ken2812221 commented at 8:59 am on September 27, 2018: contributor
    Update: In this PR, I do “replace boost::bind to std::bind” only because there are some disputes about lambda.
  72. practicalswift commented at 9:11 am on September 27, 2018: contributor
    @ken2812221 Makes sense! Getting rid of boost/bind.hpp is a very welcome first step :-)
  73. Empact commented at 11:38 am on September 27, 2018: member
    Concept ACK, the callers should include <functional>
  74. in src/validation.cpp:2379 in d4a4f5729f outdated
    2376+        m_connNotifyEntryRemoved = pool.NotifyEntryRemoved.connect(std::bind(&ConnectTrace::NotifyEntryRemoved, this, std::placeholders::_1, std::placeholders::_2));
    2377     }
    2378 
    2379     ~ConnectTrace() {
    2380-        pool.NotifyEntryRemoved.disconnect(boost::bind(&ConnectTrace::NotifyEntryRemoved, this, _1, _2));
    2381+        m_connNotifyEntryRemoved.disconnect();
    


    ryanofsky commented at 3:06 pm on September 27, 2018:
    Could drop this disconnect line (and the whole destructor) by replacing boost::signals2::connection with boost::signals2::scoped_connection above.
  75. in src/validationinterface.cpp:41 in d4a4f5729f outdated
    36@@ -37,6 +37,8 @@ struct MainSignalsInstance {
    37 };
    38 
    39 static CMainSignals g_signals;
    40+static std::unordered_map<CTxMemPool*, boost::signals2::connection> g_connNotifyEntryRemoved;
    41+static std::unordered_map<CValidationInterface*, std::array<boost::signals2::connection, 9>> g_connMainSignals;
    


    ryanofsky commented at 3:14 pm on September 27, 2018:
    It seems like these two maps would most naturally be MainSignalsInstance members. I don’t think it is good to arbitrary divide the validationinterface state up between g_signals->m_internals and these new global variables (unless there’s a specific reason for doing this that I’m not seeing).

    ken2812221 commented at 11:11 am on October 14, 2018:
    I was trying to do this however MainSignalsInstance is not created when RegisterWithMempoolSignals() called. So I only move g_connMainSignals into a member of MainSignalsInstance. Keeping g_connNotifyEntryRemoved as a static global variable.
  76. in src/validationinterface.cpp:96 in d4a4f5729f outdated
    109-    g_signals.m_internals->TransactionRemovedFromMempool.disconnect(boost::bind(&CValidationInterface::TransactionRemovedFromMempool, pwalletIn, _1));
    110-    g_signals.m_internals->UpdatedBlockTip.disconnect(boost::bind(&CValidationInterface::UpdatedBlockTip, pwalletIn, _1, _2, _3));
    111-    g_signals.m_internals->NewPoWValidBlock.disconnect(boost::bind(&CValidationInterface::NewPoWValidBlock, pwalletIn, _1, _2));
    112+    const auto iter = g_connMainSignals.find(pwalletIn);
    113+    if (iter == g_connMainSignals.end()) return;
    114+    for (const boost::signals2::connection& conn : iter->second) {
    


    ryanofsky commented at 3:22 pm on September 27, 2018:

    I think if you used scoped_connection instead of connection types you could get rid of this for loop.

    Also, since this for loop is the only thing that appears to iterate over std::array<9> objects, it might be a good idea to replace std::array with a plain struct if you do eliminate this loop. (I noticed you used a ValidationInterfaceConnections struct in a previous version of this PR).


    ken2812221 commented at 11:12 am on October 14, 2018:
    That idea looks good to me. I’ll take it.
  77. ryanofsky approved
  78. ryanofsky commented at 3:28 pm on September 27, 2018: member
    utACK d4a4f5729f0faa3bc51c6f162a10812c9703d5a5. I also think it’d be good to switch to lambdas in the future.
  79. ken2812221 force-pushed on Sep 27, 2018
  80. ken2812221 force-pushed on Sep 27, 2018
  81. ken2812221 force-pushed on Sep 27, 2018
  82. ken2812221 force-pushed on Sep 27, 2018
  83. ken2812221 force-pushed on Sep 27, 2018
  84. ken2812221 force-pushed on Sep 30, 2018
  85. ken2812221 force-pushed on Sep 30, 2018
  86. ken2812221 force-pushed on Sep 30, 2018
  87. ken2812221 force-pushed on Oct 14, 2018
  88. ken2812221 force-pushed on Oct 14, 2018
  89. ken2812221 force-pushed on Oct 14, 2018
  90. ken2812221 renamed this:
    refactor: Replace boost::bind with std::bind
    [WIP] refactor: Replace boost::bind with std::bind
    on Oct 14, 2018
  91. ken2812221 force-pushed on Oct 14, 2018
  92. ken2812221 force-pushed on Oct 14, 2018
  93. ken2812221 renamed this:
    [WIP] refactor: Replace boost::bind with std::bind
    refactor: Replace boost::bind with std::bind
    on Oct 14, 2018
  94. ken2812221 force-pushed on Oct 14, 2018
  95. sipa commented at 7:56 am on October 17, 2018: member
    Can this be implemented as a scripted diff? It looks relatively straightforward.
  96. ken2812221 force-pushed on Oct 17, 2018
  97. ken2812221 force-pushed on Oct 17, 2018
  98. ken2812221 force-pushed on Oct 17, 2018
  99. ken2812221 force-pushed on Oct 17, 2018
  100. ken2812221 force-pushed on Oct 17, 2018
  101. ken2812221 force-pushed on Oct 17, 2018
  102. ken2812221 force-pushed on Oct 17, 2018
  103. ken2812221 force-pushed on Oct 17, 2018
  104. ken2812221 force-pushed on Oct 17, 2018
  105. ken2812221 commented at 4:02 pm on October 17, 2018: contributor
    @sipa Done. Apparently I can’t use ${i} as the script’s variable.
  106. ken2812221 force-pushed on Oct 17, 2018
  107. ken2812221 force-pushed on Oct 17, 2018
  108. ken2812221 force-pushed on Oct 17, 2018
  109. in src/validationinterface.cpp:57 in a280bcc010 outdated
    48 
    49     explicit MainSignalsInstance(CScheduler *pscheduler) : m_schedulerClient(pscheduler) {}
    50 };
    51 
    52 static CMainSignals g_signals;
    53+static std::unordered_map<CTxMemPool*, boost::signals2::scoped_connection> g_connNotifyEntryRemoved;
    


    ryanofsky commented at 5:37 pm on October 19, 2018:

    Following up on #13743 (review), I think it would be good to add a comment saying that this has to a separate global instead of a member of MainSignalsInstance, because RegisterWithMempoolSignals is currently called before RegisterBackgroundSignalScheduler, so MainSignalsInstance hasn’t been created yet.

    Init code is more messy than it needs to be and I think saying what current dependencies are will make it easier to clean up later.


    ken2812221 commented at 0:39 am on October 22, 2018:
    DoneDone
  110. ryanofsky approved
  111. ryanofsky commented at 5:54 pm on October 19, 2018: member

    utACK 52532ee43720520696d452424daad213b50aef1f. Changes since last review are adding scripted diff, removing one global, and switching to scoped signal connections.

    Apparently I can’t use ${i} as the script’s variable.

    It looks like this happens because commit-script-check.sh uses $i and calls eval "$SCRIPT" without a subshell. It would be nice to fix this to prevent confusion and ensure the diff checking is correct.

  112. refactor: Use boost::scoped_connection in signal/slot, also prefer range-based loop instead of std::transform 2196c51821
  113. scripted-diff: Replace boost::bind with std::bind
    -BEGIN VERIFY SCRIPT-
    for j in $(seq 1 5)
    do
        sed -i "s/ _${j}/ std::placeholders::_${j}/g" $(git grep --name-only " _${j}" -- '*.cpp' '*.h')
    done
    sed -i "s/boost::bind/std::bind/g" $(git grep --name-only boost::bind -- '*.cpp' '*.h')
    sed -i "s/boost::ref/std::ref/g" $(git grep --name-only boost::ref -- '*.cpp' '*.h')
    sed -i '/boost\/bind/d' $(git grep --name-only boost/bind)
    -END VERIFY SCRIPT-
    cb53b825c2
  114. ken2812221 force-pushed on Oct 19, 2018
  115. ryanofsky approved
  116. ryanofsky commented at 4:02 pm on October 22, 2018: member
    utACK cb53b825c26af6e628ba88d72b2000e75bedbbc6. Only change is last review is new comment.
  117. sipa commented at 2:10 am on October 23, 2018: member
    utACK cb53b825c26af6e628ba88d72b2000e75bedbbc6
  118. ryanofsky commented at 4:41 pm on December 4, 2018: member
    Can this be merged, or does it need more review? I see review from @theuni was requested in github, but I don’t know if it’s necessary given the other reviews since this change is pretty straightforward.
  119. fanquake commented at 4:59 am on December 29, 2018: member
    utACK cb53b82
  120. practicalswift commented at 10:30 am on December 29, 2018: contributor
    utACK cb53b825c26af6e628ba88d72b2000e75bedbbc6
  121. MarcoFalke merged this on Dec 29, 2018
  122. MarcoFalke closed this on Dec 29, 2018

  123. MarcoFalke referenced this in commit cbb91cd0ec on Dec 29, 2018
  124. fanquake removed review request from theuni on Dec 29, 2018
  125. ken2812221 deleted the branch on Dec 29, 2018
  126. fanquake moved this from the "In progress" to the "Done" column in a project

  127. fanquake referenced this in commit c4be50fea3 on Aug 31, 2020
  128. fanquake referenced this in commit 9876ab8c74 on Sep 3, 2020
  129. kittywhiskers referenced this in commit 370f8d2257 on Jul 13, 2021
  130. kittywhiskers referenced this in commit 5556ff4bd3 on Jul 13, 2021
  131. PastaPastaPasta referenced this in commit c6db9b52dc on Aug 2, 2021
  132. kittywhiskers referenced this in commit 28450f52e5 on Aug 3, 2021
  133. kittywhiskers referenced this in commit 61aeaea5c9 on Aug 8, 2021
  134. UdjinM6 referenced this in commit 28790e6d32 on Aug 11, 2021
  135. kittywhiskers referenced this in commit 0b5f7f3267 on Aug 12, 2021
  136. UdjinM6 referenced this in commit 607bd4b6b5 on Aug 13, 2021
  137. dzutto referenced this in commit 94047645f7 on Aug 16, 2021
  138. dzutto referenced this in commit afe85cb2e9 on Aug 16, 2021
  139. dzutto referenced this in commit 8ea5b389fe on Aug 16, 2021
  140. dzutto referenced this in commit 453cb7fdcd on Aug 17, 2021
  141. UdjinM6 referenced this in commit 4b603e64e4 on Aug 17, 2021
  142. MarcoFalke locked this on Sep 8, 2021

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-11-17 06:12 UTC

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