Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

kernel: Streamline util library #29015

Open
wants to merge 13 commits into
base: master
Choose a base branch
from
Open

Conversation

ryanofsky
Copy link
Contributor

Remove fees.h, errors.h, and spanparsing.h from the util library. Specifically:

  • Move Split functions from util/spanparsing.h to util/string.h, using util namespace for clarity.
  • Move remaining spanparsing functions to script/parsing.h since they are used for descriptor and miniscript parsing.
  • Combine util/fees.h and util/errors.h into common/messages.h so there is a place for simple functions that generate user messages to live, and these functions are not part of the util library.

Motivation for this change is that the util library is a dependency of the kernel, and we should remove functionality from util that shouldn't be called by kernel code or kernel applications. These changes should also improve code organization and make functions easier to discover. Some of these same moves are (or were) part of #28690, but did not help with code organization, or made it worse, so it is better to move them and clean them up in the same PR so code only has to change one time.

@DrahtBot
Copy link
Contributor

DrahtBot commented Dec 6, 2023

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.

Type Reviewers
ACK TheCharlatan, hebasto
Concept ACK Sjors

If your review is incorrectly listed, please react with 👎 to this comment and the bot will ignore it on the next update.

Conflicts

Reviewers, this pull request conflicts with the following ones:

  • #bitcoin-core/gui/599 (Translate unit names & fix external signer error by luke-jr)
  • #29623 (Simplify network-adjusted time warning logic by stickies-v)
  • #29473 (refactor: Speed up Base58 encoding/decoding by 400%/200% via preliminary byte packing by paplorinc)
  • #29442 (wallet: Target a pre-defined utxo set composition by adjusting change outputs by remyers)
  • #29365 (Extend signetchallenge to set target block spacing by starius)
  • #29346 (Stratum v2 Noise Protocol by Sjors)
  • #29278 (Wallet: Add maxfeerate wallet startup option by ismaelsadeeq)
  • #22838 (descriptors: Be able to specify change and receiving in a single descriptor string by achow101)
  • #21283 (Implement BIP 370 PSBTv2 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.

@ajtowns
Copy link
Contributor

ajtowns commented Dec 7, 2023

Motivation for this change is that the util library is a dependency of the kernel, and we should remove functionality from util that shouldn't be called by kernel code or kernel applications.

Is the idea here that util should be for generic code, and that these bits and pieces (like fees and error) are specific bitcoin features that are only relevant to wallet/p2p, so aren't generic?

@ryanofsky
Copy link
Contributor Author

Updated 0e64745 -> 778c021 (pr/rmutil.1 -> pr/rmutil.2, compare) fixing CI errors from forgitting to add new files to git

re: #29015 (comment)

Motivation for this change is that the util library is a dependency of the kernel, and we should remove functionality from util that shouldn't be called by kernel code or kernel applications.

Is the idea here that util should be for generic code, and that these bits and pieces (like fees and error) are specific bitcoin features that are only relevant to wallet/p2p, so aren't generic?

I do think that's generally a good thing to do, but it's not really the goal of this PR. The main thing this PR is trying to do is provide a better kernel API and reduce the size of the kernel library.

Because libbitcoin_kernel depends on libbitcoin_util, any external application using the kernel will also depend on util. So we should try to avoid including functions and types in util that are not likely to be useful to external applications, or are unstable and meant for internal use. The common library is usually a better place for these things.

@ajtowns
Copy link
Contributor

ajtowns commented Dec 7, 2023

Motivation for this change is that the util library is a dependency of the kernel, and we should remove functionality from util that shouldn't be called by kernel code or kernel applications.

Is the idea here that util should be for generic code, and that these bits and pieces (like fees and error) are specific bitcoin features that are only relevant to wallet/p2p, so aren't generic?

I do think that's generally a good thing to do, but it's not really the goal of this PR. The main thing this PR is trying to do is provide a better kernel API and reduce the size of the kernel library.

Does that mean that things should only go in util if they're going to be used by the kernel library then? That would presumably mean util/bitdeque.h and util/sock.cpp should also eventually go elsewhere, for example? That seems like a bad approach to me (in that it means code has to move into and out of util based on whether it's relevant to the kernel, rather than due to any changes to the code itself, and users then potentially have to deal with it moving into/outof the util:: namespace).

@ryanofsky
Copy link
Contributor Author

ryanofsky commented Dec 8, 2023

Does that mean that things should only go in util if they're going to be used by the kernel library then?

No, I don't think so, and I don't think much else is going to move after this PR. I think only code that shouldn't be used by the kernel or kernel applications should be moved out of util, not just code that isn't used by the kernel. I agree just moving any code that isn't used by the kernel would be a bad approach, and wrote basically the same comment as you recently in #27989 (comment), so I think we are in agreement.

@ryanofsky
Copy link
Contributor Author

ryanofsky commented Dec 8, 2023

Updated 778c021 -> 8b21f41 (pr/rmutil.2 -> pr/rmutil.3, compare) to fix clang-tidy error https://cirrus-ci.com/task/4602567305461760. Also switched to using declarations more places to avoid creating conflicts and make the PR easier to review
Updated 8b21f41 -> 8748d63 (pr/rmutil.3 -> pr/rmutil.4, compare) to fix another clang-tidy error https://cirrus-ci.com/task/4950555420786688 and making other small cleanups
Updated 8748d63 -> b234094 (pr/rmutil.4 -> pr/rmutil.5, compare) to try to fix another clang-tidy error

@ryanofsky ryanofsky force-pushed the pr/rmutil branch 2 times, most recently from 8748d63 to b234094 Compare December 8, 2023 19:47
@DrahtBot DrahtBot removed the CI failed label Dec 8, 2023
@hebasto
Copy link
Member

hebasto commented Dec 10, 2023

@ryanofsky

#29015 (comment):

the util library is a dependency of the kernel, and we should remove functionality from util that shouldn't be called by kernel code or kernel applications.

#29015 (comment):

only code that shouldn't be used by the kernel or kernel applications should be moved out of util, not just code that isn't used by the kernel.

#27989 (comment):

I think util/ is a good home for general purpose code providing basic data structures and cross platform capabilities, and I think common/ is good home for project-specific code that needs to be shared between bitcoind, bitcoin-cli, and bitcoin-wallet.

Does it make sense to improve https://github.com/bitcoin/bitcoin/blob/master/doc/design/libraries.md by expressing the idea from the quotes above more clearly? As for now, it reads:

In general, if it is ever unclear whether it is better to add code to util or common, it is probably better to add it to common unless it is very generically useful or useful particularly to include in the kernel.

@TheCharlatan
Copy link
Contributor

Re #29015 (comment)

Does it make sense to improve https://github.com/bitcoin/bitcoin/blob/master/doc/design/libraries.md by expressing the idea from the quotes above more clearly? As for now, it reads:

This seems like the right place to talk about the relationship between the util and kernel library. My work on the kernel library has been focusing on reducing its essence to validation code, pruning external dependencies, and stripping out as much system related functionality as possible. I think if the goal is to have the kernel be capable of running on as many platforms as possible, potentially beyond the number of platforms that Bitcoin Core is capable of today and extending into embedded environments, this last point becomes crucial.

Looking at the content of util it provides roughly two types of functionality: Utilities for basic data structures and their serialization, and cross-platform system related utilities, like file handling, threading, process handling, etc.

In my opinion, making the util library a proper dependency of the kernel should not introduce new cross-platform system-related content into the kernel library. Besides potentially limiting use cases of the kernel, providing cross-platform utilities beyond what the kernel strictly requires seems like a potentially unreasonable future maintenance burden. This would be contrary to our incremental process of creating a minimal kernel library.

The asterisk here is that some of the utilities that are not currently used by the kernel do not introduce new dependencies, since they entirely rely on code that is already used by the kernel. I also generally think that some utilities could remain in the util library even though they are not currently used by validation code. The criteria I propose for evaluating if modules should remain in util after this PR are:

  1. The module is directly used by kernel code.
  2. The module contains basic data structure utilities for interacting with kernel code.
  3. The module does not contain system-related utilities that are not directly used by the kernel.
  4. The module does not contain project-specific code that is not relevant to the kernel.
  5. The module does not introduce new dependencies beyond the current dependencies of the kernel.

Looking at @hebasto's comment here, threadinterrupt.cpp and readwritefile.cpp would violate the 3rd criteria in my eyes, while the spanparsing and bytevectorhash modules could potentially remain in util.

Between this PR and #28690 I think it would be nice if common criteria for util would be defined and documented. All this said, I think it would be acceptable too if things were kept purposefully vague as they are now until the need for more concrete structures arises.

@ajtowns
Copy link
Contributor

ajtowns commented Dec 11, 2023

Would it make sense to just merge common into util; but have a "stripped" version of util available for the kernel, that excludes stuff that doesn't match the 5 points above? That way the difference is just at the build system level, it doesn't involve moving files around or moving code between namespaces...

Then the advice would be: (a) just put things in util, (b) but only add things to the "util-core" section of the build file when they're needed by the kernel; (c) keep things in the util:: namespace; (d) split stuff into different .h/.cpp files pretty aggressively?

That would imply a different approach for the util: move fees.h and error.h to common/messages.h commit here.

@ryanofsky
Copy link
Contributor Author

ryanofsky commented Dec 11, 2023

re: #29015 (comment)

Would it make sense to just merge common into util; but have a "stripped" version of util available for the kernel

Idea to build util and util-core (or util-lite?) libraries is interesting, because then it would be easy to add/remove things from util library depending on whether the kernel needs them, and it would never require renaming anything. I could see this being useful in the future if util library started growing a lot and accumulating more features of over time.

But for now, IMO, just sticking with the current util/common separation and using the cleanup in this PR would organize things better and be less confusing than having two util versions, and it would require moving fewer things. Even though the libraries.md document is currently ambiguous, I think it should be pretty easy to remove the ambiguity here.

re: #29015 (comment)

The criteria I propose for evaluating if modules should remain in util after this PR are:

I think these are good rules if you replace "basic data structure utilities" with "basic utilities that to do not require outside dependencies", and also drop the 3rd rule. It seems like with the 3rd rule you are trying to make a distinction between "data structure utilities" and "system-related utilities", and I don't think it helps to draw a dividing line there.

@ryanofsky
Copy link
Contributor Author

Added 1 commits b234094 -> 6d8cb4d (pr/rmutil.5 -> pr/rmutil.6, compare) updating libraries.md to describe differences between util and common libraries better.

re: #29015 (comment)

My work on the kernel library has been focusing on reducing its essence to validation code, pruning external dependencies, and stripping out as much system related functionality as possible.
[...]
In my opinion, making the util library a proper dependency of the kernel should not introduce new cross-platform system-related content into the kernel library.

Just to address these points directly, I think the goals of making the kernel portable and working on any platform, and making the kernel minimal working and in constrained environments are great goals. I just don't you need to rm src/util/sock.cpp to achieve these goals. As long as the util library is distributed as a static library, or built as a static library and linked into a dynamic library, the socket functions will not be part of resulting executables if they are not called. And if the kernel is being built for a platform which doesn't support sockets at all, src/util/sock.cpp can just be stubbed or not compiled at all and there should be no problem for portability either. I do think it's good to keep the util library small and lightweight and remove things which don't fit there. But I don't think it needs to be stripped down in a more extreme way.

@TheCharlatan
Copy link
Contributor

Re #29015 (comment)

And if the kernel is being built for a platform which doesn't support sockets at all, src/util/sock.cpp can just be stubbed or not compiled at all and there should be no problem for portability either.

One of the guiding principles for the kernel project so far has been to prohibit future re-couplings of decoupled modules. The tracking issue says "Any further coupling of our consensus engine with non-consensus modules will result in linker errors, preventing this project from becoming a Sisyphean task of battling coupling regressions.". How could this fit in with leaving unused content in the library?

@ryanofsky
Copy link
Contributor Author

One of the guiding principles for the kernel project so far has been to prohibit future re-couplings of decoupled modules.

I reread the issue you linked to, but I don't understand what it implies here. I do think you can rely on linker errors to ensure kernel code isn't calling wallet code or GUI code or P2P code or storing state in global variables. But what else do you want beyond that? And how does removing sock.cpp from the util library help, for example?

Copy link
Contributor

@ajtowns ajtowns left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Okay, I think I'm on roughly the same page:

  • keeping Split in util make sense
  • moving our string stuff into the util namespace seems fine * moving the spanparsing stuff to script mostly makes sense -- though I feel a bit like mixing consensus critical script manipulation and miniscript/descriptor parsing in the same namespace is a bit clunky?
  • moving fees.h/error.h to "common" makes sense; though if we can make "common" just be a broader part of "util" that seems better long term.
  • moving TransactionError into node rather than common doesn't make sense to me though

@@ -87,14 +88,15 @@ class bitcoin-qt,bitcoind,bitcoin-cli,bitcoin-wallet bold

- *libbitcoin_consensus* should be a standalone dependency that any library can depend on, and it should not depend on any other libraries itself.

- *libbitcoin_util* should also be a standalone dependency that any library can depend on, and it should not depend on other internal libraries.
- *libbitcoin_crypto* should be a standalone dependency that any library can depend on, and it should not depend on any other libraries itself. (It is not shown in diagram above to save space, but has the exact same connections as *libbitcoin_consensus*, which is shown.)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Doesn't libconsensus necessarily depend on libcrypto (for sha256 at least)?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

re: #29015 (comment)

Doesn't libconsensus necessarily depend on libcrypto (for sha256 at least)?

Yes that should be right. I think I just deluded myself because I didn't want to update the mermaid diagram. Updated now though.

src/node/types.h Show resolved Hide resolved
@TheCharlatan
Copy link
Contributor

Re #29015 (comment)

But what else do you want beyond that? And how does removing sock.cpp from the util library help, for example?

Maybe removing sock.cpp is a bad example, since it is already impossible to link against it. sock.cpp uses modules that are already not part of the kernel, so trying to link it in will result in errors. Then again, if sock.cpp uses common modules, why is it in util in the first place? To provide another concrete example, there is thread.cpp, which I was hoping to remove from the kernel in #28960. If it is removed, how could the kernel library be guarded from its future re-introduction if it remains in the util library?

Copy link
Contributor

@TheCharlatan TheCharlatan left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re-ACK b581567

Good improvements since my last review and having some form of external verification for the work being done is very nice. If other reviewers or maintainers are not happy with introducing a bash script, I could volunteer some time to translate it.

The includes could be cleaned up a bit, especially util/string.h and util/strencodings.h are missing in a bunch of places. It would also be nice if the newly introduced files had correct includes. Maybe this PR could also be used as a opportunity to more aggressively clean up includes in general.

@@ -0,0 +1,203 @@
#!/usr/bin/env bash
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think rather than test/ this should go into contrib/devtools, which contains functionally similar scripts like symbol-check, or security-check.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

re: #29015 (comment)

I think rather than test/ this should go into contrib/devtools, which contains functionally similar scripts like symbol-check, or security-check.

Good suggestion, it does fit in more with those tools, moved over there.

ryanofsky and others added 13 commits May 16, 2024 11:16
Move chainparamsbase from util to common, because util library should not
depend on the common library and chainparamsbase uses the ArgsManager class in
common.
Move memory_cleanse from util to crypto because the crypto library should not
depend on other libraries, and it calls memory_cleanse.
Move util/message to common/signmessage so it is named more clearly, and
because the util library is not supposed to depend on other libraries besides
the crypto library. The signmessage functions use CKey, CPubKey, PKHash, and
DecodeDestination functions in the consensus and common libraries.
Move HexStr and HexDigit functions from util to crypto. The crypto library does
not actually use these functions, but the consensus library does. The consensus
and util libraries not allowed to depend on each other, but are allowed to
depend on the cryto library, so the crypto library is a reasonable put these.

The consensus library uses HexStr and HexDigit in script.cpp, transaction.cpp,
and uint256.cpp.

The util library does not use HexStr but does use HexDigit in strencodings.cpp
to parse integers.
This will help move the miniscript / descriptor parsing functions out of the
util library in an upcoming commit, so they are not exposed to libbitcoinkernel
applications. Moving the Split functions should also make them more
discoverable since they now close to related functions like Join.

The functions are moved verbatim without any changes.
Move miniscript / descriptor script parsing functions out of util library so
they are not a dependency of the kernel.

There are no changes to code or behavior.
New node/types.h file is analagous to existing wallet/types.h and is a better
place to define simple node types that are shared externally with wallet and
gui code than the util library.

Motivation for this change is to completely remove util/error.h file currently
holding TransactionError in a followup commit.
Add separate PSBTError enum instead of reusing TransactionError enum for PSBT
operations, and drop unused error codes. The error codes returned by PSBT
operations and transaction broadcast functions mostly do not overlap, so using
an unified enum makes it harder to call any of these functions and know which
errors actually need to be handled.

Define PSBTError in the common library because PSBT functionality is
implemented in the common library and used by both the node (for rawtransaction
RPCs) and the wallet.
Move enum and message formatting functions to a common/messages header where
they should be more discoverable, and also out of the util library, so they
will not be a dependency of the kernel

The are no changes in behavior and no changes to the moved code.
Add TransactionError to node namespace and include it directly instead of
relying on indirect include through common/messages.h

This is a followup to a previous commit which moved the TransactionError enum.
These changes were done in a separate followup just to keep the previous commit
more minimal and easy to review.
There are no changes to behavior. Changes in this commit are all additions, and
are easiest to review using "git diff -U0 --word-diff-regex=." options.

Motivation for this change is to keep util functions with really generic names
like "Split" and "Join" out of the global namespace so it is easier to see
where these functions are defined, and so they don't interfere with function
overloading, especially since the util library is a dependency of the kernel
library and intended to be used with external code.
…es.md

Also describe crypto library which was previously unmentioned
Copy link
Contributor Author

@ryanofsky ryanofsky left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated b581567 -> 7689dfd (pr/rmutil.17 -> pr/rmutil.18, compare) moving check-deps script.


re: #29015 (review)

The includes could be cleaned up a bit, especially util/string.h and util/strencodings.h are missing in a bunch of places. It would also be nice if the newly introduced files had correct includes. Maybe this PR could also be used as a opportunity to more aggressively clean up includes in general.

Agree this would be nice. The only issue is I never figured out a good way to run the IWYU tool that didn't seem to add lot of unrelated changes to PRs, given that existing includes are so messy, and there are so many that could be cleaned up. If you have any advice on how to run IWYU with this PR, I'd be happy to follow. Or you already have a clear idea of how to clean up includes and just want implement changes on a branch, I'd be happy to use that.

@@ -0,0 +1,203 @@
#!/usr/bin/env bash
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

re: #29015 (comment)

I think rather than test/ this should go into contrib/devtools, which contains functionally similar scripts like symbol-check, or security-check.

Good suggestion, it does fit in more with those tools, moved over there.

@DrahtBot
Copy link
Contributor

🚧 At least one of the CI tasks failed. Make sure to run all tests locally, according to the
documentation.

Possibly this is due to a silent merge conflict (the changes in this pull request being
incompatible with the current code in the target branch). If so, make sure to rebase on the latest
commit of the target branch.

Leave a comment here, if you need help tracking down a confusing failure.

Debug: https://github.com/bitcoin/bitcoin/runs/25060059418

@hebasto
Copy link
Member

hebasto commented May 16, 2024

There seems to be a conflict with #30098. Maybe rebase?

@ryanofsky
Copy link
Contributor Author

There seems to be a conflict with #30098. Maybe rebase?

Thanks! Rebased now.

If other reviewers or maintainers are not happy with introducing a bash script, I could volunteer some time to translate it.

Yes this could be a good idea. The script started out just being a few lines of bash listing symbols exported by one library and imported by another one. But then it grew as it was extended to support multiple libraries and suppress known errors. So now it's no longer a small script, though it is pretty clean and well commented. Other possible followups besides translating the script could be:

  • Running the script as part of CI
  • Cleaning up unexpected dependencies listed as suppressions in the script.

Rebased 7689dfd -> 1c26d10 (pr/rmutil.18 -> pr/rmutil.19, compare) due to silent conflict with #30098

Copy link
Contributor

@TheCharlatan TheCharlatan left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re-ACK 1c26d10

@DrahtBot DrahtBot requested a review from hebasto May 17, 2024 08:33
Copy link
Member

@hebasto hebasto left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

re-ACK 1c26d10.

@hebasto
Copy link
Member

hebasto commented May 21, 2024

My Guix build:

07318f5568a25cf18d6ec29d8fbaba3adc9ddfa23891fbb62d63e136b5d25c7f  guix-build-1c26d10b23bb/output/aarch64-linux-gnu/SHA256SUMS.part
acbc7851322d559b96cca83764ef32f6e7df0f2449b1ca951a54127efea8eaf3  guix-build-1c26d10b23bb/output/aarch64-linux-gnu/bitcoin-1c26d10b23bb-aarch64-linux-gnu-debug.tar.gz
c94cdf25eab02a297f5b25fed2211cf0b35f2b1b6c7d48b154f2ed46720b9abb  guix-build-1c26d10b23bb/output/aarch64-linux-gnu/bitcoin-1c26d10b23bb-aarch64-linux-gnu.tar.gz
2a7aca0c44b234af3f4395591e78e41e06309c9b9a8a9f5e8f68d248b7a45162  guix-build-1c26d10b23bb/output/arm-linux-gnueabihf/SHA256SUMS.part
a741202ad3a1df852035111b20a102fa72b411245b735f330826d908490fdd64  guix-build-1c26d10b23bb/output/arm-linux-gnueabihf/bitcoin-1c26d10b23bb-arm-linux-gnueabihf-debug.tar.gz
068a9b730c1e59449e9b2d52e87df8009fdd33e210c3b02e52d4ec677b9c5f78  guix-build-1c26d10b23bb/output/arm-linux-gnueabihf/bitcoin-1c26d10b23bb-arm-linux-gnueabihf.tar.gz
1fbb2927be3f4f52c46f303f71755f3af7617cdb1ca3988a0bfe7827e743b500  guix-build-1c26d10b23bb/output/arm64-apple-darwin/SHA256SUMS.part
ab004b44ec36a2cb1cc051eed74e4f36026719a452729a0f2ffc74c52164aded  guix-build-1c26d10b23bb/output/arm64-apple-darwin/bitcoin-1c26d10b23bb-arm64-apple-darwin-unsigned.tar.gz
98eb503f1b9d97da2478b7e31b6a6ce54c1d9080cf06f45f5aa1de552ce01805  guix-build-1c26d10b23bb/output/arm64-apple-darwin/bitcoin-1c26d10b23bb-arm64-apple-darwin-unsigned.zip
b4006d722cd71fa709919e7d05f35e4970270ae8369b7e4dc6fd7ea603e73d84  guix-build-1c26d10b23bb/output/arm64-apple-darwin/bitcoin-1c26d10b23bb-arm64-apple-darwin.tar.gz
6a099c53eb043f9cf122497ccfb3822acd4d65a04d7110c1aafbc879d3c5856c  guix-build-1c26d10b23bb/output/dist-archive/bitcoin-1c26d10b23bb.tar.gz
8d9a43ca5f80a71d0c835d61d0beab25565229492fa4fee46e8ec178e00cb658  guix-build-1c26d10b23bb/output/powerpc64-linux-gnu/SHA256SUMS.part
a812d1b8de12d93cc569a89e2420ccc368c8c0ba3b715b13f6ef3fb6b1e1a535  guix-build-1c26d10b23bb/output/powerpc64-linux-gnu/bitcoin-1c26d10b23bb-powerpc64-linux-gnu-debug.tar.gz
e15e92cf6f4cceaed18546255bc362f52cd9ce35dbe676cb57ebee9c883e3180  guix-build-1c26d10b23bb/output/powerpc64-linux-gnu/bitcoin-1c26d10b23bb-powerpc64-linux-gnu.tar.gz
5f874fbe6e466e0b153b082f77b051b93856ccdf212f2ebf81229ff5668656cf  guix-build-1c26d10b23bb/output/riscv64-linux-gnu/SHA256SUMS.part
b30c16dd59a2152130c4d04a23426c77d73af4db1e68b56f61e74c23cbe0b74e  guix-build-1c26d10b23bb/output/riscv64-linux-gnu/bitcoin-1c26d10b23bb-riscv64-linux-gnu-debug.tar.gz
598c942f47a3b32062503fa0a1909eba08603c2437984f681c8948a76eedecd7  guix-build-1c26d10b23bb/output/riscv64-linux-gnu/bitcoin-1c26d10b23bb-riscv64-linux-gnu.tar.gz
f6cbd80a3170d9bfe3df6db7ad6c45a7edf5999d56faf5881917bd2046c659b2  guix-build-1c26d10b23bb/output/x86_64-apple-darwin/SHA256SUMS.part
86c261ee89e1c61a95ed3b90d6547be579ead16d93f56aba5eebeb8ce282c897  guix-build-1c26d10b23bb/output/x86_64-apple-darwin/bitcoin-1c26d10b23bb-x86_64-apple-darwin-unsigned.tar.gz
81b44a879c6982f05a02633a939fd96083f7c59cf34429b3c9d916a32ade1dd9  guix-build-1c26d10b23bb/output/x86_64-apple-darwin/bitcoin-1c26d10b23bb-x86_64-apple-darwin-unsigned.zip
8b76c441ca2fc11573785b2fae007fff2dcae65c8f2cd2fd517e8c4e9dacc086  guix-build-1c26d10b23bb/output/x86_64-apple-darwin/bitcoin-1c26d10b23bb-x86_64-apple-darwin.tar.gz
eae30d8ecc90e29913653fe41634836c36e7fea89c09c22c3b05945c2c30fbbe  guix-build-1c26d10b23bb/output/x86_64-linux-gnu/SHA256SUMS.part
30a74515f8078a81968fd97b723b56d6331f45cd9b104a35d73559ee99666940  guix-build-1c26d10b23bb/output/x86_64-linux-gnu/bitcoin-1c26d10b23bb-x86_64-linux-gnu-debug.tar.gz
bf59e96c6b5b2033a84c2bfa29b97c3972827cb6edcbc484935dd0e9a7b2c28a  guix-build-1c26d10b23bb/output/x86_64-linux-gnu/bitcoin-1c26d10b23bb-x86_64-linux-gnu.tar.gz
0241585f8314adfc7a57bd988199bf2bd0b0cdb2f1b91b0aa9c1b03af1dfa6bd  guix-build-1c26d10b23bb/output/x86_64-w64-mingw32/SHA256SUMS.part
44556b4c3e7140c5d8df64b07b491daa3eef2851b23d19963eb89a48c66adb50  guix-build-1c26d10b23bb/output/x86_64-w64-mingw32/bitcoin-1c26d10b23bb-win64-debug.zip
eb1e6368638f754af7980dd46e3482c9430604df451e819777727b9ad0720fc3  guix-build-1c26d10b23bb/output/x86_64-w64-mingw32/bitcoin-1c26d10b23bb-win64-setup-unsigned.exe
8e2137350f44640bbff5b97216d37673062dbb89f2b3985cb377effc75327e7f  guix-build-1c26d10b23bb/output/x86_64-w64-mingw32/bitcoin-1c26d10b23bb-win64-unsigned.tar.gz
18380b999dfb5eb2b6a8784335553039df4ac3c773b1869e504d22c155ae90bd  guix-build-1c26d10b23bb/output/x86_64-w64-mingw32/bitcoin-1c26d10b23bb-win64.zip

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
Status: Ready for Review PRs
Development

Successfully merging this pull request may close these issues.

None yet

7 participants