. #32407
pull AlnetharyT wants to merge 1 commits into bitcoin:master from AlnetharyT:master changing 213 files +2459 −6610-
AlnetharyT commented at 6:10 pm on May 2, 2025: none.
-
النظاري (#1)
* versionbits: Use std::array instead of C-style arrays * versionbits: Remove params from AbstractThresholdConditionChecker For an abstract class, specifying parameters in detail serves no point; and for the concrete implementation, changing the consensus parameters between invocations doesn't make sense. So simplify the class by removing the consensus params from the method arguments, and just make it a member variable in the concrete object where needed. This also allows dropping dummy parameters from the unit/fuzz tests. * test: chainstate write test for periodic chainstate flush * consensus/params: Move version bits period/threshold to bip9 param Rather than having the rule change period/threshold be constant for all potential deployments on a chain, have it be specific to the deployment itself. This both matches history (BIP 9 specified a 2016 block period and 1916 block threshold; BIP 91 specified a 336 block period and 269 block threshold; and BIP 341 specified a 2016 block period and 1815 block threshold), and allows the code to be simplified, as only the BIP9Deployment structure is needed, not the full Consensus::Params structure. * versionbits: Change BIP9Stats to uint32_t types * versionbits: Move WarningBits logic from validation to versionbits * versionbits: Move getdeploymentinfo logic to versionbits Rather than having the RPC code have knowledge about how BIP9 is implemented, create a reporting function in the versionbits code, and limit the RPC code to coverting the result of that into Univalue/JSON. * versionbits: Move BIP9 status logic for getblocktemplate to versionbits Rather than having the RPC code have knowledge about how BIP9 is implemented, create a reporting function in the versionbits code, and limit the RPC code to coverting the result of that into the appropriate output for getblocktemplate. * versionbits: Simplify VersionBitsCache API Replaces State() (which returned ACTIVE/STARTED/etc) with IsActiveAfter() which just returns a bool, as this was all State was actually used for. Drops Mask(), which was only used in tests and can be replaced with `1<<bit`, and also drops StateSinceHeight() and Statistics(), which are now only used internally for Info(). * versionbits: Split out internal details into impl header * versionbits: Expose StateName function Rather than essentially duplicating StateName in the unit tests, expose it via the impl header. * versionbits: Expose VersionBitsConditionChecker via impl header * tests: refactor versionbits unit test Base the unit test directly on `VersionBitsConditionChecker`, slightly improving coverage, in particular adding coverage for the the logic regarding setting the TOP_BITS. * tests: refactor versionbits fuzz test Test `VersionBitsConditionChecker` behaviour directly, rather than reimplementing it, thus slightly improving fuzz test coverage of the real code. * wallet: doc: remove mentions of unavailable scrypt derivation method These comments are there since wallet encryption was first introduced (see commit 4e87d341f75f13bbd7d108c31c03886fbc4df56f, PR #352), but scrypt was actually never implemented as a derivation method. * wallet: refactor: introduce `CMasterKey::DEFAULT_DERIVE_ITERATIONS` constant This gets rid of the magic number used in both the `CMasterKey` ctor and the wallet encryption / passphrase change methods. * wallet: refactor: dedup master key encryption / derivation rounds setting * wallet: refactor: dedup master key decryption * scripted-diff: wallet: rename plain and encrypted master key variables -BEGIN VERIFY SCRIPT- sed -i s/_vMasterKey/plain_master_key/g ./src/wallet/wallet.cpp sed -i s/kMasterKey/master_key/g ./src/wallet/wallet.cpp sed -i "s/const MasterKeyMap::value_type& pMasterKey/const auto\& \[_, master_key\]/g" ./src/wallet/wallet.cpp sed -i s/pMasterKey\.second/master_key/g ./src/wallet/wallet.cpp sed -i "s/MasterKeyMap::value_type& pMasterKey/auto\& \[master_key_id, master_key\]/g" ./src/wallet/wallet.cpp sed -i s/pMasterKey\.first/master_key_id/g ./src/wallet/wallet.cpp -END VERIFY SCRIPT- * net: Use GetAdaptersAddresses to get local addresses on Windows Instead of a `gethostname` hack, use the official way of calling `GetAdaptersAddresses` to get local network addresses on Windows. As additional cleanup, move out `FromSockAddr` from MacOS and use it everywhere appropriate. Suggested by Ava Chow. * versionbits: docstrings for BIP9Info * test: add IsActiveAfter tests for versionbits * removed duplicate calling of GetDescriptorScriptPubKeyMan Removed duplicate call to GetDescriptorScriptPubKeyMan and Instead of checking linearly I have used find method so time complexity reduced significantly for GetDescriptorScriptPubKeyMan after this fix improved performance of importdescriptor part refs #32013. * build: Use `-z noseparate-code` on NetBSD < 11.0 This can be dropped once Bitcoin Core no longer supports NetBSD 10.0 or if upstream fix is backported. NetBSD's dynamic linker ld.elf_so < 11.0 supports exactly 2 `PT_LOAD` segments and binaries linked with `-z separate-code` have 4 `PT_LOAD` segments. https://github.com/bitcoin/bitcoin/pull/28724#issuecomment-2589347934 https://mail-index.netbsd.org/tech-userlevel/2023/01/05/msg013666.html * build: Drop option for disabling hardening Building unhardened executables is not a supported use case that should be maintained and those that want unhardened executables can still override them by appending disable flags. For example: cmake -B build -DAPPEND_CPPFLAGS='-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0 -fno-stack-protector -fcf-protection=none -fno-stack-clash-protection' -DAPPEND_LDFLAGS='-Wl,-z,lazy -Wl,-z,norelro -Wl,-z,noseparate-code' * build: refactor: hardening flags -> core_interface * test: Ensures test fails if witness is not hex This commit ensures that we do not fail silently when the test script encounters a witness string in the JSON test data that can not be parsed as hex. * validation: fix traversal condition to mark BLOCK_FAILED_CHILD this block of code is not reached on master since other than initialisation, all other iterations have invalid_walk_tip and to_mark_failed pointers in some form of this layout where 1, 2, 3 and 4 are block heights. invalid_walk_tip ↓ 1 <- 2 <- 3 <- 4 ↑ to_mark_failed fix it so that blocks are correctly marked as BLOCK_FAILED_CHILD if it's a descendant of BLOCK_FAILED_VALID block. * test: check BlockStatus when InvalidateBlock is used when a block is invalidated using InvalidateBlock, check that: 1. it's status is BLOCK_FAILED_VALID 2. it's children's status is BLOCK_FAILED_CHILD and not BLOCK_FAILED_VALID 3. it's ancestors are valid * validation: correctly update BlockStatus for invalid block descendants invalid_block ----------> block_index - before this commit, only if block_index is not invalid, it will mark block_index as BLOCK_FAILED_CHILD - it's possible that block_index encountered is invalid and was marked as BLOCK_FAILED_VALID previously - in this case, correctly update BlockStatus of block_index by clearing BLOCK_FAILED_VALID and then setting it to BLOCK_FAILED_CHILD * validation: clarify final |= BLOCK_FAILED_VALID in InvalidateBlock This has no functional affect, as the any CBlockIndex*s which to_mark_failed is set to will already have been marked failed. Also prevents a situation where block already marked as BLOCK_FAILED_CHILD is again unconditionally marked as BLOCK_FAILED_VALID in the final |= BLOCK_FAILED_VALID. * build, msvc: Update vcpkg manifest baseline This change updates the vcpkg manifest baseline from the "2024.09.30 Release" to the "2025.03.19 Release", with the following package changes: - boost: 1.85.0#1,2 --> 1.87.0 - qtbase: 6.7.2#3 -> 6.8.2#1 - qttools: 6.7.2#1 -> 6.8.2 - sqlite3: 3.46.1 --> 3.49.1 * build, msvc: Build only required `qtbase` features This change makes vcpkg skip unused features such as `dnslookup`, `openssl`, etc. * depends: Specify Objective C/C++ compilers for `native_qt` package This change fixes cross-compilation from macOS to macOS with another architecture. * depends: Fix `mv` command compatibility with macOS * wallet, rpc: Only allow keypool import from single key descriptors Legacy wallets should only import keys to the keypool if they came in a single key descriptor. Instead of relying on assumptions about the descriptor based on how many pubkeys show up after expanding the descriptor, explicitly mark descriptors as being single key type and use that for the check. * descriptor: Remove unused parent_info from BIP32PUbKeyProvider::GetPubKey * descriptors: Have GetPubKey fill origins directly Instead of having ExpandHelper fill in the origins in the FlatSigningProvider output, have GetPubKey do it by itself. This reduces the extra variables needed in order to track and set origins in ExpandHelper. Also changes GetPubKey to return a std::optional<CPubKey> rather than using a bool and output parameters. * descriptors: Move FlatSigningProvider pubkey filling to GetPubKey Instead of MakeScripts inconsistently filling the output FlatSigningProvider with the pubkeys involved, just do it in GetPubKey. * descriptors: Have GetPrivKey fill keys directly Instead of GetPrivKey returning a key and having the caller fill the FlatSigningProvider, have GetPrivKey take the FlatSigningProvider and fill it by itself. This will be necessary for descriptors such as musig() where there are private keys that need to be added to the FlatSigningProvider but do not directly appear in any resulting scripts. GetPrivKey is now changed to void as the caller no longer cares whether it succeeds or fails. * Log block header in net_processing Previously ChainstateManager::AcceptBlockHeader would log when it saw a new header. This commit moves logging to the call site(s) in net_processing. The next commits will then log which peer sent it and whether it was part of a compact block. This commit changes behavior: - when multiple headers are received in a single message, only the last one is logged - if any of the headers are invalid, the valid ones are not logged This happens because net_processing calls ProcessNewBlockHeaders with multiple headers, which then calls AcceptBlockHeader one header at a time. Additionally: - when the header is received via a compact block, there's no more duplicate log (a later commit also unifies logging code paths) * Log which peer sent us a header This also supports -logips. * Use LogBlockHeader for compact blocks The only behavior change is that the block height is now added to the log message. * doc: release note for #27826 * torcontrol: Fix addrOnion outdate comment Signed-off-by: Eval EXEC <execvy@gmail.com> * guix: Remove unused `file` package The `file` utility has not been required since Guix builds were introduced. * rpc: Allow fullrbf fee bump Also, fix the incorrect documention of the 'replaceable' RPC argument with respect to sequence number handling. The docs were incorrect before, so the fix could be extracted, but it seems fine to include here as well. * doc: Add deps install notes for multiprocess These just mirror the content in src/ipc/libmultiprocess/doc/install.md * feefrac: avoid integer overflow in temporary * psbt: Implement un/ser of musig2 fields * rpc: Include MuSig2 fields in decodepsbt * tests: Add BIP 373 test vectors * ci: Temporarily disable `WalletMigration` benchmark * ci: Drop no longer necessary `-Wno-error=array-bounds` * test: improves tapscript unit tests This commit creates new test utilities for future Taproot script tests within script_tests.json. The key features of this commit are the addition of three new tags: `#SCRIPT#`, `#CONTROLBLOCK#`, and `#TAPROOTOUTPUT#`. These tags streamline the test creation process by eliminating the need to manually generate these components outside the test suite. * `#SCRIPT#`: Parses Tapscript and outputs a byte string of opcodes. * `#CONTROLBLOCK#`: Automatically generates the control block for a given Taproot output. * `#TAPROOTOUTPUT#`: Generates the final Taproot scriptPubKey. Update src/test/script_tests.cpp Co-authored-by: Jan B <608446+janb84@users.noreply.github.com> * fuzz: enable running fuzz test cases in Debug mode When building with BUILD_FOR_FUZZING=OFF BUILD_FUZZ_BINARY=ON CMAKE_BUILD_TYPE=Debug allow the fuzz binary to execute given test cases (without actual fuzzing) to make it easier to reproduce fuzz test failures in a more normal debug build. In Debug builds, deterministic fuzz behaviour is controlled via a runtime variable, which is normally false, but set to true automatically in the fuzz binary, unless the FUZZ_NONDETERMINISM environment variable is set. * doc: Document fuzz build options Co-Authored-By: Ryan Ofsky <ryan@ofsky.org> * bench: clean up migrated descriptor wallets via loader teardown `MigrateLegacyToDescriptor` returns both a spendable descriptor wallet and a watch‑only wallet. If these remain attached, their files stay open and on Windows this can hang CI when removing the test directory. By constructing them via `MakeWalletLoader` (which owns the `WalletContext`), both wallets are automatically unloaded when the loader is destroyed at the end. This ensures no lingering handles or resource leaks when running the benchmark on CI with `-sanity-check`. Co-authored-by: furszy <matiasfurszyfer@protonmail.com> * ci: re-enable all benchmark runs Drop the temporary `-filter` that excluded the `WalletMigration` benchmark. * bench: ensure wallet migration benchmark runs exactly once The migration benchmark crashes if run more than once, because of `std::move(wallet)` and leaves subsequent iterations in an undefined state - avoiding `UndefinedBehaviorSanitizer` null‑dereference error. * refactor: starts/ends_with changes for clang-tidy 20 * ci: clang-tidy 20 * ci: Add missing -Wno-error=array-bounds to valgrind fuzz * test: Add missing check for empty stderr in util tester * test: Run all benchmarks in the sanity check * tests, gui: Use descriptors watchonly wallet for watchonly test * test: Remove legacy wallet unit tests * test: wallet_signer.py bdb will be removed * test: Remove legacy wallet tests from wallet_backwards_compatibility.py * test: Remove legacy wallet tests from wallet_reindex.py * test: remove legacy wallet functional tests Removes all legacy wallet specific functional tests. Also removes the --descriptor and --legacy-wallet options as these are no longer necessary with the legacy wallet removed. * wallet: Remove -format and bdb from wallet tool's createfromdump * wallet: Remove wallettool salvage Salvage is bdb only which is about to be removed. * bench: Remove WalletLoadingLegacy benchmark * wallet: Disallow legacy wallet creation from the wallet tool * wallet: Disallow creating legacy wallets Remove the option to set descriptors=False when creating a wallet, and enforce this in RPC and in CreateWallet * wallet: Disallow loading legacy wallets Legacy wallets do not have the descriptors flag set. Don't load wallets without the descriptors flag. At the same time, we will no longer load BDB databases since they are only used for legacy wallets. * test: Add imports for util bpf_cflags This is required for the next commit. * scripted-diff: Use bpf_cflags -BEGIN VERIFY SCRIPT- ren() { sed --regexp-extended -i "s/$1/$2/g" $( git grep --extended-regexp -l "$1" ) ; } ren 'cflags=\["-Wno-error=implicit-function-declaration"\]' 'cflags=bpf_cflags()' -END VERIFY SCRIPT- * qt: Replace stray tfm::format to cerr with qWarning GUI warnings should go to the log, not to the console (which may not be connected at all). * Fix failing util_time_GetTime test on Windows Remove unreliable steady clock time checking from the test that was causing CI failures primarily on Windows. The test previously tried to verify that steady_clock time increases after a 1ms sleep, but this approach is not reliable on all platforms where such a short sleep interval may not consistently result in observable clock changes. This addresses issue #32197 where the test was reporting failures in the cross-built Windows CI environment. As noted in the discussion, the test is not critical to the functionality of Bitcoin Core, and removing the unreliable part is the most straightforward solution. Rename and refocus util_time_GetTime test to util_mocktime Co-Authored-By: maflcko <6399679+maflcko@users.noreply.github.com> * gui: crash fix, disconnect numBlocksChanged() signal during shutdown The crash stems from the order of the shutdown procedure: We first unset the client model, then destroy the wallet controller—but we leave the internal wallet models ('m_wallets') untouched for a brief period. As a result, there’s a point in time where views still have connected signals and access to wallet models that are not connected to any wallet controller. Now.. since the clientModel is only replaced with nullptr locally and not destroyed yet, signals like numBlocksChanged can still emit. Thus, when wallet views receive them, they see a non-null wallet model ptr, and proceed to call backend functions from a model that is being torn down. As the shutdown procedure begins by unsetting clientModel from all views. It’s safe to ignore events when clientModel is nullptr. * net: remove unnecessary check from AlreadyConnectedToAddress() `CConnman::AlreadyConnectedToAddress()` searches the existent nodes by address or by address-and-port: ```cpp FindNode(static_cast<CNetAddr>(addr)) || FindNode(addr.ToStringAddrPort()) ``` but: * if there is a match by just the address, then the address-and-port search will not be evaluated and the whole condition will be `true` * if the there is no node with the same address, then the second search by address-and-port will not find a match either. The search by address-and-port is comparing against `CNode::m_addr_name` which could be a hostname, e.g. `"node.foobar.com:8333"`, but `addr.ToStringAddrPort()` is always going to be numeric. * test: Same addr, diff port is already connected * test: Slim down previous releases bdb check * tests: Test migration cleans up bad inactive chain derivation path A bug in 0.21.x and 22.x resulted in some wallets having invalid derivation paths that are the concatenation of two derivation paths. These appear only when inactive hd chains are topped up. Since key metadata is a legacy wallet only record, migrating legacy wallets to descriptor wallets will fix this issue as all key metadata records are deleted. The derivation path information is derived on-the-fly from the descriptor that is produced for the inactive hd chain. Thus we only need a test to verify that the derivation paths are good, and that all key metadata records are deleted from the migrated wallet. * doc: Fix fuzz test_runner.py path This commit fixes the path listed in the documentation for the fuzz testing test_runner.py. Previously the --help option worked but running fuzz tests from the documented path did not. * Bugfix: Miner: Don't reuse block_reserved_weight for "block is full enough to give up" weight delta PR #30356 incorrectly changed a constant of `4000` to `m_options.coinbase_max_additional_weight` in the check for when to give up finding another transaction to fill the block: ```diff if (nConsecutiveFailed > MAX_CONSECUTIVE_FAILURES && nBlockWeight > - m_options.nBlockMaxWeight - 4000) { + m_options.nBlockMaxWeight - m_options.block_reserved_weight) { // Give up if we're close to full and haven't succeeded in a while break; } ``` But this constant did not deal with the reserved weight at all. It was in fact simply checking if the block was close to full, and if so, giving up finding another transaction to pad it with after `MAX_CONSECUTIVE_FAILURES` failed attempts. It doesn't seem very logical to reuse the reserve weight for this purpose, and it would be overcomplicated to add yet another setting, so this PR changes it to a new constexpr. * depends: Fix cross-compiling `qt` package from macOS to Windows * test: Remove unused RPCOverloadWrapper is_cli field * test: Remove unused createwallet_passthrough * test: Force named args for RPCOverloadWrapper optional args This can avoid bugs and makes the test code easier to read, because the order of positional args does not have to be known or assumed. * test: avoid stack overflow in `FindChallenges` via manual iteration The original recursive `FindChallenges` explores the Miniscript node tree using depth-first search. Specifically, it performs a pre-order traversal (processing the node's data, then recursively visiting children from left-to-right). This recursion uses the call stack, which can lead to stack overflows on platforms with limited stack space, particularly noticeable in Windows debug builds. This change replaces the recursive implementation with an iterative version using an explicit stack. The iterative version also performs a depth-first search and processes the node's data before exploring children (preserving pre-order characteristics), although the children are explored in right-to-left order due to the LIFO nature of the explicit stack. Critically, both versions collect challenges into a `std::set`, which automatically deduplicates and sorts elements. This ensures that not only the final result, but the actual state of the set at any equivalent point in traversal remains identical, despite the difference in insertion order. This iterative approach is an alternative to increasing the default stack size (as proposed in #32349) and directly addresses the stack overflow issue reported in #32341 by avoiding deep recursion. The change is done in two commits: * add a new iterative `FindChallenges` method and rename the old method to `*_recursive` (to simplify removal in the next commit), asserting that its result matches the original; * Remove the original recursive implementation. This approach avoids needing to suppress `misc-no-recursion` warnings and provides a portable, low-risk fix. Using a `std::set` is necessary for deduplication, matching the original function's behavior. An experiment using an `std::vector` showed duplicate challenges being added, confirming the need for the set: Example failure with vector: Recursive (set): (6, 9070746) (6, 19532513) (6, 3343376967) Iterative (vector attempt): (6, 19532513) (6, 9070746) (6, 3343376967) (6, 9070746) // Duplicate Co-authored-by: Hennadii Stepanov <32963518+hebasto@users.noreply.github.com> * test: remove old recursive `FindChallenges_recursive` implementation The performance of the test is the same as before, with the recursive method. * refactor: simplify repeated comparisons in `FindChallenges` This obviates that the LHS of the comparison is always the same * refactor: Fix Sonar rule `cpp:S4998` - avoid unique_ptr const& as parameter Changed `FindChallenges()` parameter from `const std::unique_ptr<const Node<Key>>&` to const `Node*`. Sonar rule `cpp:S4998` - https://sonarcloud.io/project/issues?issueStatuses=OPEN%2CCONFIRMED&branch=32351-8c0e673c4ac31c1c04750756de749fb813b2c33f&id=aureleoules_bitcoin&open=AZZ2q88IvFhp-eMuMy96: > Replace this use of "unique_ptr" by a raw pointer or a reference (possibly const). > Function parameters should not be of type "std::unique_ptr<T> const &" cpp:S4998 > Software qualities impacted: Maintainability * descriptors: Reject + sign in ParseKeyPathNum * descriptors: Reject + sign when parsing multi threshold * test: [refactor] Use ToIntegral in CheckInferDescriptor * test: Use the correct node for doubled keypath test * util: Remove `fsbridge::get_filesystem_error_message()` The `fsbridge::get_filesystem_error_message()` function exhibits several drawbacks: 1. It was introduced in https://github.com/bitcoin/bitcoin/pull/14192 to account for platform-specific variations in `boost::filesystem::filesystem_error::what()`. Since migrating to `std::filesystem`, those discrepancies no longer exist. 2. It fails to display UTF-8 paths correctly on Windows. 3. It relies on `std::wstring_convert`, which was deprecated in C++17 and removed in C++26. This change removes the `fsbridge::get_filesystem_error_message()` function, thereby resolving all of the above issues. Additionally, filesystem error messages now use the "Warning" log level. * validation: write chainstate to disk every hour Remove the 24 hour periodic flush interval and write the chainstate along with blocks and block index every hour * refactor: rename fDoFullFlush to should_write * refactor: replace m_last_write with m_next_write Co-Authored-By: l0rinc <pap.lorinc@gmail.com> * validation: add randomness to periodic write interval Co-Authored-By: Pieter Wuille <pieter@wuille.net> Co-Authored-By: l0rinc <pap.lorinc@gmail.com> * doc: Fix test_bitcoin path This commit fixes a couple command paths for interacting with the test_bitcoin binary within the Unit Test documentation. --------- Signed-off-by: Eval EXEC <execvy@gmail.com> Co-authored-by: Anthony Towns <aj@erisian.com.au> Co-authored-by: Andrew Toth <andrewstoth@gmail.com> Co-authored-by: Sebastian Falbesoner <sebastian.falbesoner@gmail.com> Co-authored-by: laanwj <126646+laanwj@users.noreply.github.com> Co-authored-by: Saikiran <saikirannadipilli@gmail.com> Co-authored-by: David Gumberg <davidzgumberg@gmail.com> Co-authored-by: Ethan Heilman <ethan.r.heilman@gmail.com> Co-authored-by: stratospher <44024636+stratospher@users.noreply.github.com> Co-authored-by: Matt Corallo <git@bluematt.me> Co-authored-by: Hennadii Stepanov <32963518+hebasto@users.noreply.github.com> Co-authored-by: Ava Chow <github@achow101.com> Co-authored-by: Sjors Provoost <sjors@sprovoost.nl> Co-authored-by: Eval EXEC <execvy@gmail.com> Co-authored-by: MarcoFalke <*~=`'#}+{/-|&$^_@721217.xyz> Co-authored-by: TheCharlatan <seb.kung@gmail.com> Co-authored-by: Pieter Wuille <pieter@wuille.net> Co-authored-by: merge-script <gloriajzhao@gmail.com> Co-authored-by: Jan B <608446+janb84@users.noreply.github.com> Co-authored-by: Ryan Ofsky <ryan@ofsky.org> Co-authored-by: Lőrinc <pap.lorinc@gmail.com> Co-authored-by: furszy <matiasfurszyfer@protonmail.com> Co-authored-by: merge-script <fanquake@gmail.com> Co-authored-by: VolodymyrBg <aqdrgg19@gmail.com> Co-authored-by: maflcko <6399679+maflcko@users.noreply.github.com> Co-authored-by: Vasil Dimov <vd@FreeBSD.org> Co-authored-by: monlovesmango <monlovesmango@users.noreply.github.com> Co-authored-by: Luke Dashjr <luke-jr+git@utopios.org>
-
DrahtBot commented at 6:10 pm on May 2, 2025: contributor
The following sections might be updated with supplementary metadata relevant to reviewers and maintainers.
Code Coverage & Benchmarks
For details see: https://corecheck.dev/bitcoin/bitcoin/pulls/32407.
Reviews
See the guideline for information on the review process. A summary of reviews will appear here.
-
fanquake closed this on May 2, 2025
-
achow101 renamed this:
النظاري (#1)
.
on May 2, 2025 -
bitcoin locked this on May 2, 2025
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: 2025-05-05 12:12 UTC
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: 2025-05-05 12:12 UTC
This site is hosted by @0xB10C
More mirrored repositories can be found on mirror.b10c.me
More mirrored repositories can be found on mirror.b10c.me