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

wallet: Cleanup accidental encryption keys in watchonly wallets #28724

Merged
merged 3 commits into from
Jan 10, 2025

Conversation

achow101
Copy link
Member

An earlier version allowed users to create watchonly wallets (wallets without private keys) that were "encrypted". Such wallets would have a stored encryption keys, but nothing would actually be encrypted with them. This can cause unexpected behavior such as bitcoin-core/gui#772.

We can detect such wallets as they will have the disable private keys flag set, no encrypted keys, and encryption keys. For such wallets, we can remove those encryption keys thereby avoiding any issues that may result from this unexpected situation.

@DrahtBot
Copy link
Contributor

DrahtBot commented Oct 24, 2023

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/28724.

Reviews

See the guideline for information on the review process.

Type Reviewers
ACK laanwj, sipa, furszy
Stale ACK willcl-ark

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:

  • #28710 (Remove the legacy wallet and BDB dependency 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.

Copy link
Member

@laanwj laanwj left a comment

Choose a reason for hiding this comment

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

Code review ACK aaa6b70

Copy link
Member

@willcl-ark willcl-ark left a comment

Choose a reason for hiding this comment

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

ACK aaa6b70

I left a few comments, but they're mainly thoughts I had and questions for my own understanding.

Also checked the test manually with --legacy-wallet and --descriptors and lightly inspected the dumps to ensure the records were being removed:

log
$ test/functional/wallet_encryption.py
2023-11-01T11:51:31.078000Z TestFramework (INFO): PRNG seed is: 196471712041506435
2023-11-01T11:51:31.079000Z TestFramework (INFO): Initializing test directory /tmp/bitcoin_func_test_hm1fob6j
2023-11-01T11:51:35.739000Z TestFramework (INFO): Check a timeout less than the limit
2023-11-01T11:51:35.850000Z TestFramework (INFO): Check a timeout greater than the limit
2023-11-01T11:51:36.579000Z TestFramework (INFO): Test that wallets without private keys cannot be encrypted
2023-11-01T11:51:36.595000Z TestFramework (INFO): Test that encryption keys in wallets without privkeys are removed
{'walletname': 'noprivs', 'walletversion': 169900, 'format': 'sqlite', 'balance': Decimal('0E-8'), 'unconfirmed_balance': Decimal('0E-8'), 'immature_balance': Decimal('0E-8'), 'txcount': 0, 'keypoolsize': 0, 'keypoolsize_hd_internal': 0, 'paytxfee': Decimal('0E-8'), 'private_keys_enabled': False, 'avoid_reuse': False, 'scanning': False, 'descriptors': True, 'external_signer': False, 'blank': False, 'lastprocessedblock': {'hash': '0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206', 'height': 0}}
orig_dump=['BITCOIN_CORE_WALLET_DUMP,1\n', 'format,sqlite\n', '0776657273696f6e,4c1e0400\n', '0a6d696e76657273696f6e,ac970200\n', '0962657374626c6f636b,8011010000\n', '1262657374626c6f636b5f6e6f6d65726b6c65,801101000106226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910f\n', '05666c616773,0400000005000000\n', 'checksum,058c1f6af6fcbbf22056c1f690d7b9fa27ec2a37dec2b0bcadca89977666634f\n']
after_dump=['BITCOIN_CORE_WALLET_DUMP,1\n', 'format,sqlite\n', '0776657273696f6e,4c1e0400\n', '0a6d696e76657273696f6e,ac970200\n', '0962657374626c6f636b,8011010000\n', '1262657374626c6f636b5f6e6f6d65726b6c65,801101000106226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910f\n', '05666c616773,0400000005000000\n', '046d6b657901000000,300dc926f3b3887aad3d5d5f5a0fc1b1a4a1722f9284bd5c6ff93b64a83902765953939c58fe144013c8b819f42cf698b208e9911e5f0c544fa300000000cc52050000\n', 'checksum,e63f7200466a4d2d6e05b505be87b148a96ae57702590f0fc284fbbeac332036\n']
Result of set(orig_dump) ^ set(after_dump):
{'046d6b657901000000,300dc926f3b3887aad3d5d5f5a0fc1b1a4a1722f9284bd5c6ff93b64a83902765953939c58fe144013c8b819f42cf698b208e9911e5f0c544fa300000000cc52050000\n', 'checksum,058c1f6af6fcbbf22056c1f690d7b9fa27ec2a37dec2b0bcadca89977666634f\n', 'checksum,e63f7200466a4d2d6e05b505be87b148a96ae57702590f0fc284fbbeac332036\n'}
2023-11-01T11:51:37.068000Z TestFramework (INFO): Stopping nodes
2023-11-01T11:51:37.223000Z TestFramework (INFO): Cleaning up /tmp/bitcoin_func_test_hm1fob6j on exit
2023-11-01T11:51:37.223000Z TestFramework (INFO): Tests successful

// such a wallet and remove the encryption key records to avoid any future issues.
// Although wallets without private keys should not have *ckey records, we should double check that.
// Removing the mkey records is only safe if there are no *ckey records.
if (pwallet->IsWalletFlagSet(WALLET_FLAG_DISABLE_PRIVATE_KEYS) && pwallet->HasEncryptionKeys() && !pwallet->HaveCryptedKeys()) {
Copy link
Member

Choose a reason for hiding this comment

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

I notice that nothing in this block requires any locks (even though cs_wallet will be locked at this stage in this function).

For my own understanding, is this because the db operations, i.e. writing to the on-disk file, have their synchronisation handled by the db's transaction system?

I see for example in LoadEncryptionKey that we lock cs_wallet to load the keys into the wallet, which makes intuitive sense. But it feels that conversely there should be something asserting the lock is held here too, as we remove encryption keys from the wallet? Or at least when pwallet->mapMasterKeys.clear(); is called.

Perhaps it doesn't matter as it's done during loading from the db, so nothing else will have started to access the Wallet?

Copy link
Member Author

Choose a reason for hiding this comment

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

The lock is already being held from the top of the function.

// Although wallets without private keys should not have *ckey records, we should double check that.
// Removing the mkey records is only safe if there are no *ckey records.
if (pwallet->IsWalletFlagSet(WALLET_FLAG_DISABLE_PRIVATE_KEYS) && pwallet->HasEncryptionKeys() && !pwallet->HaveCryptedKeys()) {
pwallet->WalletLogPrintf("Detected extraneous encryption keys in this wallet without private keys. Removing extraneous encryption keys.\n");
Copy link
Member

Choose a reason for hiding this comment

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

I was wondering if if could be a good idea to log the removed keys at this point as a backup (safe-ish seeing as we are deleting), but I'm struggling to think of a scenario where a user with this type of wallet might somehow need these keys again...

Copy link
Member Author

Choose a reason for hiding this comment

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

I don't think it would be useful to log them.

// Although wallets without private keys should not have *ckey records, we should double check that.
// Removing the mkey records is only safe if there are no *ckey records.
if (pwallet->IsWalletFlagSet(WALLET_FLAG_DISABLE_PRIVATE_KEYS) && pwallet->HasEncryptionKeys() && !pwallet->HaveCryptedKeys()) {
pwallet->WalletLogPrintf("Detected extraneous encryption keys in this wallet without private keys. Removing extraneous encryption keys.\n");
Copy link
Member

@furszy furszy Nov 1, 2023

Choose a reason for hiding this comment

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

I'm still not sure about #28142 but, if we ever do something like that, we could have an encrypted wallet without encrypted private keys. So, might want to change the "without private keys" to "without any encrypted record".

Copy link
Member Author

Choose a reason for hiding this comment

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

I think this is fine as is. It can be updated in the future if it becomes outdated.

Copy link
Member

@furszy furszy left a comment

Choose a reason for hiding this comment

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

As the process of reading wallet records from db disregards unknown record types, what if the encryption key is ever used for something else?. Wouldn't that mean that opening such wallet on any previous version (post this PR) would erase the encryption key forever?

The erase process can only verify the private keys disabled flag and whether there is any crypted key or not. But it cannot verify if the encryption key was used for something else.

Guessing that in the case of adding a new type of encrypted record in the future for private keys disabled wallets, we would be forced to add downgrade protection if we merge this PR?

@achow101
Copy link
Member Author

achow101 commented Jan 2, 2024

Guessing that in the case of adding a new type of encrypted record in the future for private keys disabled wallets, we would be forced to add downgrade protection if we merge this PR?

Yes, but I think it's unlikely such usage of encryption keys would be added, and if it were, it could still be added in a way that does not interact with this PR.

For example,although #28142 allows for encryption of records regardless of the wallet flags, it does this at the database level and uses separate records, so this PR doesn't affect it at all.

Due to a bug in earlier versions, some wallets without private keys may
have an encryption key. This encryption key is unused and can lead to
confusing behavior elsewhere. When such wallets are detected, those
encryption keys will now be deleted from the wallet. For safety, we only
do this to wallets which have private keys disabled, have encryption keys,
and definitely do not have encrypted keys.
@achow101 achow101 force-pushed the cleanup-accidental-watchonly-mkeys branch from e975301 to 69e95c2 Compare October 16, 2024 10:07
@bitcoin bitcoin deleted a comment from baycclark Oct 18, 2024
@bitcoin bitcoin deleted a comment from baycclark Oct 18, 2024
Copy link
Member

@laanwj laanwj left a comment

Choose a reason for hiding this comment

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

Code review re-ACK 69e95c2

@sipa
Copy link
Member

sipa commented Dec 23, 2024

utACK 69e95c2.

I can't imagine any way that this could affect operations later. The key isn't used, so deleting it can't hurt backups, and with or without encryption key no ckey records can be added later. Is that correct?

@achow101
Copy link
Member Author

achow101 commented Jan 8, 2025

The key isn't used, so deleting it can't hurt backups, and with or without encryption key no ckey records can be added later. Is that correct?

That's correct. ckey is a private key record, and wallets without private keys definitionally do not have private keys. No private keys can be generated or imported to such wallets.

Copy link
Member

@furszy furszy left a comment

Choose a reason for hiding this comment

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

Code review ACK 69e95c2

@fanquake fanquake merged commit 35bf426 into bitcoin:master Jan 10, 2025
16 checks passed
@hebasto
Copy link
Member

hebasto commented Jan 11, 2025

The new code in test/functional/wallet_encryption.py fails on NetBSD:

230/313 - wallet_encryption.py --legacy-wallet failed, Duration: 8 s

stdout:
2025-01-11T03:37:44.955000Z TestFramework (INFO): PRNG seed is: 6983165365525497692
2025-01-11T03:37:44.956000Z TestFramework (INFO): Initializing test directory /home/runner/work/bitcoin-core-nightly/bitcoin-core-nightly/test_runner_₿_🏃_20250111_031054/wallet_encryption_83
2025-01-11T03:37:51.630000Z TestFramework (INFO): Check a timeout less than the limit
2025-01-11T03:37:51.726000Z TestFramework (INFO): Check a timeout greater than the limit
2025-01-11T03:37:52.424000Z TestFramework (INFO): Test that wallets without private keys cannot be encrypted
2025-01-11T03:37:52.453000Z TestFramework (INFO): Test that encryption keys in wallets without privkeys are removed
2025-01-11T03:37:52.468000Z TestFramework (ERROR): Assertion failed
Traceback (most recent call last):
  File "/home/runner/work/bitcoin-core-nightly/bitcoin-core-nightly/test/functional/test_framework/test_framework.py", line 135, in main
    self.run_test()
    ~~~~~~~~~~~~~^^
  File "/home/runner/work/bitcoin-core-nightly/bitcoin-core-nightly/build/test/functional/wallet_encryption.py", line 133, in run_test
    do_wallet_tool("-wallet=noprivs", f"-dumpfile={dumpfile_path}", "dump")
    ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/bitcoin-core-nightly/bitcoin-core-nightly/build/test/functional/wallet_encryption.py", line 122, in do_wallet_tool
    assert_equal(proc.poll(), 0)
    ~~~~~~~~~~~~^^^^^^^^^^^^^^^^
  File "/home/runner/work/bitcoin-core-nightly/bitcoin-core-nightly/test/functional/test_framework/util.py", line 77, in assert_equal
    raise AssertionError("not(%s)" % " == ".join(str(arg) for arg in (thing1, thing2) + args))
AssertionError: not(1 == 0)
2025-01-11T03:37:52.567000Z TestFramework (INFO): Stopping nodes

and

233/313 - wallet_encryption.py --descriptors failed, Duration: 8 s

stdout:
2025-01-11T03:37:47.381000Z TestFramework (INFO): PRNG seed is: 7931229293434170297
2025-01-11T03:37:47.383000Z TestFramework (INFO): Initializing test directory /home/runner/work/bitcoin-core-nightly/bitcoin-core-nightly/test_runner_₿_🏃_20250111_031054/wallet_encryption_82
2025-01-11T03:37:53.996000Z TestFramework (INFO): Check a timeout less than the limit
2025-01-11T03:37:54.142000Z TestFramework (INFO): Check a timeout greater than the limit
2025-01-11T03:37:55.004000Z TestFramework (INFO): Test that wallets without private keys cannot be encrypted
2025-01-11T03:37:55.014000Z TestFramework (INFO): Test that encryption keys in wallets without privkeys are removed
2025-01-11T03:37:55.017000Z TestFramework (ERROR): Assertion failed
Traceback (most recent call last):
  File "/home/runner/work/bitcoin-core-nightly/bitcoin-core-nightly/test/functional/test_framework/test_framework.py", line 135, in main
    self.run_test()
    ~~~~~~~~~~~~~^^
  File "/home/runner/work/bitcoin-core-nightly/bitcoin-core-nightly/build/test/functional/wallet_encryption.py", line 133, in run_test
    do_wallet_tool("-wallet=noprivs", f"-dumpfile={dumpfile_path}", "dump")
    ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/bitcoin-core-nightly/bitcoin-core-nightly/build/test/functional/wallet_encryption.py", line 122, in do_wallet_tool
    assert_equal(proc.poll(), 0)
    ~~~~~~~~~~~~^^^^^^^^^^^^^^^^
  File "/home/runner/work/bitcoin-core-nightly/bitcoin-core-nightly/test/functional/test_framework/util.py", line 77, in assert_equal
    raise AssertionError("not(%s)" % " == ".join(str(arg) for arg in (thing1, thing2) + args))
AssertionError: not(1 == 0)
2025-01-11T03:37:55.021000Z TestFramework (INFO): Stopping nodes

@hebasto
Copy link
Member

hebasto commented Jan 12, 2025

The new code in test/functional/wallet_encryption.py fails on NetBSD...

The root cause of the issue is that the -Wl,-z,separate-code linker option is incompatible with NetBSD's dynamic linker. Building with -DENABLE_HARDENING=OFF or -DAPPEND_LDFLAGS="-Wl,-z,noseparate-code" fixes the issue.

@fanquake
Copy link
Member

The root cause of the issue is that the -Wl,-z,separate-code linker option is incompatible with NetBSD's dynamic linker.

That's pretty surprising, because -z,separate-code has been enabled by default, in the NetBSD linker, for the upcoming 11.0 release. https://www.netbsd.org/changes/changes-11.0.html#x86:

Enable the -z separate-code security feature by default in ld(1).

It seems kinda unlikely they'd do that if the option was incompatible with the dynamic linker.

@hebasto
Copy link
Member

hebasto commented Jan 14, 2025

The root cause of the issue is that the -Wl,-z,separate-code linker option is incompatible with NetBSD's dynamic linker.

That's pretty surprising, because -z,separate-code has been enabled by default, in the NetBSD linker, for the upcoming 11.0 release. https://www.netbsd.org/changes/changes-11.0.html#x86:

Enable the -z separate-code security feature by default in ld(1).

It seems kinda unlikely they'd do that if the option was incompatible with the dynamic linker.

The underlying issue with supported NetBSD releases is that ld.elf_so can only handle 2 PT_LOAD segments.

When linking with -z noseparate-code, the bitcoind is produced with 2 PT_LOAD segments:

$ readelf -l ./build/src/bitcoind

Elf file type is DYN (Shared object file)
Entry point 0x2eb40
There are 9 program headers, starting at offset 64

Program Headers:
  Type           Offset             VirtAddr           PhysAddr
                 FileSiz            MemSiz              Flags  Align
  PHDR           0x0000000000000040 0x0000000000000040 0x0000000000000040
                 0x00000000000001f8 0x00000000000001f8  R      0x8
  INTERP         0x0000000000000238 0x0000000000000238 0x0000000000000238
                 0x0000000000000017 0x0000000000000017  R      0x1
      [Requesting program interpreter: /usr/libexec/ld.elf_so]
  LOAD           0x0000000000000000 0x0000000000000000 0x0000000000000000
                 0x0000000000c1dd55 0x0000000000c1dd55  R E    0x200000
  LOAD           0x0000000000c1e278 0x0000000000e1e278 0x0000000000e1e278
                 0x000000000000ff28 0x0000000000019910  RW     0x200000
  DYNAMIC        0x0000000000c29a78 0x0000000000e29a78 0x0000000000e29a78
                 0x0000000000000290 0x0000000000000290  RW     0x8
  NOTE           0x0000000000000250 0x0000000000000250 0x0000000000000250
                 0x000000000000002c 0x000000000000002c  R      0x4
  TLS            0x0000000000c1e278 0x0000000000e1e278 0x0000000000e1e278
                 0x0000000000000000 0x0000000000000080  R      0x1
  GNU_EH_FRAME   0x0000000000b09a14 0x0000000000b09a14 0x0000000000b09a14
                 0x000000000001becc 0x000000000001becc  R      0x4
  GNU_RELRO      0x0000000000c1e278 0x0000000000e1e278 0x0000000000e1e278
                 0x000000000000cd88 0x000000000000cd88  R      0x1

 Section to Segment mapping:
  Segment Sections...
   00     
   01     .interp 
   02     .interp .note.netbsd.ident .note.netbsd.pax .hash .dynsym .dynstr .gnu.version .gnu.version_r .rela.dyn .rela.plt .init .plt .plt.got .text .fini .rodata .eh_frame_hdr .eh_frame .gcc_except_table 
   03     .init_array .ctors .dtors .data.rel.ro .dynamic .got .data .bss 
   04     .dynamic 
   05     .note.netbsd.ident .note.netbsd.pax 
   06     .tbss 
   07     .eh_frame_hdr 
   08     .init_array .ctors .dtors .data.rel.ro .dynamic .got 

However, linking with -z separate-code results in bitcoind with 4 PT_LOAD segments:


Elf file type is DYN (Shared object file)
Entry point 0x201c00
There are 11 program headers, starting at offset 64

Program Headers:
  Type           Offset             VirtAddr           PhysAddr
                 FileSiz            MemSiz              Flags  Align
  PHDR           0x0000000000000040 0x0000000000000040 0x0000000000000040
                 0x0000000000000268 0x0000000000000268  R      0x8
  INTERP         0x00000000000002a8 0x00000000000002a8 0x00000000000002a8
                 0x0000000000000017 0x0000000000000017  R      0x1
      [Requesting program interpreter: /usr/libexec/ld.elf_so]
  LOAD           0x0000000000000000 0x0000000000000000 0x0000000000000000
                 0x000000000002cfc8 0x000000000002cfc8  R      0x200000
  LOAD           0x0000000000200000 0x0000000000200000 0x0000000000200000
                 0x00000000008fe03e 0x00000000008fe03e  R E    0x200000
  LOAD           0x0000000000c00000 0x0000000000c00000 0x0000000000c00000
                 0x00000000002f2dd5 0x00000000002f2dd5  R      0x200000
  LOAD           0x0000000000ef3278 0x00000000010f3278 0x00000000010f3278
                 0x000000000000ff28 0x0000000000019910  RW     0x200000
  DYNAMIC        0x0000000000efea78 0x00000000010fea78 0x00000000010fea78
                 0x0000000000000290 0x0000000000000290  RW     0x8
  NOTE           0x00000000000002c0 0x00000000000002c0 0x00000000000002c0
                 0x000000000000002c 0x000000000000002c  R      0x4
  TLS            0x0000000000ef3278 0x00000000010f3278 0x00000000010f3278
                 0x0000000000000000 0x0000000000000080  R      0x1
  GNU_EH_FRAME   0x0000000000ddea94 0x0000000000ddea94 0x0000000000ddea94
                 0x000000000001becc 0x000000000001becc  R      0x4
  GNU_RELRO      0x0000000000ef3278 0x00000000010f3278 0x00000000010f3278
                 0x000000000000cd88 0x000000000000cd88  R      0x1

 Section to Segment mapping:
  Segment Sections...
   00     
   01     .interp 
   02     .interp .note.netbsd.ident .note.netbsd.pax .hash .dynsym .dynstr .gnu.version .gnu.version_r .rela.dyn .rela.plt 
   03     .init .plt .plt.got .text .fini 
   04     .rodata .eh_frame_hdr .eh_frame .gcc_except_table 
   05     .init_array .ctors .dtors .data.rel.ro .dynamic .got .data .bss 
   06     .dynamic 
   07     .note.netbsd.ident .note.netbsd.pax 
   08     .tbss 
   09     .eh_frame_hdr 
   10     .init_array .ctors .dtors .data.rel.ro .dynamic .got 

This limitation has been removed in NetBSD/src@acf7fb3 and will be included in the upcoming 11.0 release.

TheCharlatan added a commit to TheCharlatan/rust-bitcoinkernel that referenced this pull request Jan 17, 2025
…38671edce58

538671edce58 kernel: Add pure kernel bitcoin-chainstate
0f79e00c5b3e kernel: Add functions to get the block hash from a block
6f7a47f53b10 kernel: Add block index utility functions to C header
5af7950c744b kernel: Add function to read block undo data from disk to C header
b456fb6c0b34 kernel: Add functions to read block from disk to C header
b6c157fee16d kernel: Add function for copying  block data to C header
011cd3f59677 kernel: Add functions for the block validation state to C header
9532bfb81739 kernel: Add validation interface to C header
8dde5a04ebc8 kernel: Add interrupt function to C header
729d2d393972 kernel: Add import blocks function to C header
dfa7109e8f0a kernel: Add chainstate load options for in-memory dbs in C header
d012fe0147fc kernel: Add options for reindexing in C header
6d12d7868c17 kernel: Add block validation to C header
8ad7b67c6527 Kernel: Add chainstate loading to kernel C header
5d09bf543704 kernel: Add chainstate manager option for setting worker threads
9cea88cb6077 kernel: Add chainstate manager object to C header
c74f2c8a2340 kernel: Add notifications context option to C header
b90b7e07b803 kerenl: Add chain params context option to C header
438f55f06500 kernel: Add kernel library context object
870c37278035 kernel: Add logging to kernel library C header
7aed64b54dba kernel: Introduce initial kernel C header API
f9032a4abb74 Merge bitcoin/bitcoin#31242: wallet, desc spkm: Return SigningProvider only if we have the privkey
9dc4eedb670b Merge bitcoin/bitcoin#31673: doc: fix minor typos in comments
b30cc71e853c doc: fix typos
df8bf657450d Merge bitcoin/bitcoin#31483: kernel: Move kernel-related cache constants to kernel cache
335798c49637 Merge bitcoin/bitcoin#31397: p2p: track and use all potential peers for orphan resolution
98939ce7b744 Merge bitcoin/bitcoin#31655: refactor: Avoid UB in SHA3_256::Write
712cab3a8f8a Merge bitcoin/bitcoin#31061: refactor: Check translatable format strings at compile-time
2a92702bafca init: Use size_t consistently for cache sizes
65cde3621dbb kernel: Move default cache constants to caches
8826cae28549 kernel: Move non-kernel db cache size constants
e758b26b85da kernel: Move kernel-specific cache size options to kernel
d5e2c4a4097c fuzz: Add fuzz test for checked and saturating add and left shift
c03a2795a8e0 util: Add integer left shift helpers
fa3efb572909 refactor: Introduce struct to hold a runtime format string
fa6adb013440 lint: Remove unused and broken format string linter
fadc6b9bac82 refactor: Check translatable format strings at compile-time
fa1d5acb8d8e refactor: Use TranslateFn type consistently
e7c479495509 Merge bitcoin/bitcoin#31630: doc: Archive 28.1 release notes
7cd862aab94f Merge bitcoin/bitcoin#31646: test: avoid internet traffic
eeee6cf2ffb2 refactor: Delay translation of _() literals
fabeca3458b3 refactor: Avoid UB in SHA3_256::Write
fad4032b219e refactor: Drop unused UCharCast
2ed161c5ce64 test: avoid generating non-loopback traffic from p2p_dns_seeds.py
a5746dc559c2 test: avoid generating non-loopback traffic from feature_config_args.py
6b3f6eae70bb test: avoid generating non-loopback traffic from p2p_seednode.py
bb5f76ee013e doc: Archive 28.1 release notes
35bf426e0221 Merge bitcoin/bitcoin#28724: wallet: Cleanup accidental encryption keys in watchonly wallets
216840659780 Merge bitcoin/bitcoin#31608: doc: Clarify min macOS and Xcode version
2f6c7e7f6c05 Merge bitcoin/bitcoin#31612: ci: build msan's libc++ with _LIBCPP_ABI_BOUNDED_*
528354e213a9 Merge bitcoin/bitcoin#31616: init,log: Unify block index log line
4bedfb5c8338 Merge bitcoin/bitcoin#31623: tracing: Rename the `MIN` macro to `_TRACEPOINT_TEST_MIN` in log_raw_p2p_msgs
e5c268084ebb Merge bitcoin/bitcoin#31627: depends: Fix spacing issue
d695d1391718 Merge bitcoin/bitcoin#31611: doc: upgrade license to 2025.
37af8bfb34d6 Merge bitcoin/bitcoin#31549: fuzz: Abort if system time is called without mock time being set
54115d8de5c0 Merge bitcoin/bitcoin#31617: build, test: Build `db_tests.cpp` regardless of `USE_BDB`
0a77441158cd Merge bitcoin/bitcoin#31451: wallet: migration, avoid loading legacy wallet after failure when BDB isn't compiled
56725f882937 Merge bitcoin/bitcoin#31462: test: raise explicit error if any of the needed release binaries is missing
8a46286da667 depends: Fix spacing issue
e04be3731f49 init,log: Unify block index and chainstate loading log line
8bd5f8a38ce9 [refactor] init: Simplify coinsdb cache calculation
f93f0c93961b tracing: Rename the `MIN` macro to `_TRACEPOINT_TEST_MIN` in log_raw_p2p_msgs
66aa6a47bd8e Merge bitcoin/bitcoin#30391: BlockAssembler: return selected packages virtual size and fee
7c123c08ddce  miner: add package feerate vector to CBlockTemplate
fd2d96d9087b build, test: Build `db_tests.cpp` regardless of `USE_BDB`
fb37acd932b0 ci: build msan's libc++ with _LIBCPP_ABI_BOUNDED_*
1ea7e45a1f44 test: raise explicit error if any of the needed release binaries is missing
433412fd8478 Merge bitcoin/bitcoin#31596: doc: Clarify comments about endianness after #30526
c506f2cee7b8 Merge bitcoin/bitcoin#31581: test: have miner_tests use  Mining interface
a96b84cb1b76 fuzz: Abort when calling system time without setting mock time
ff21870e20b2 fuzz: Add SetMockTime() to necessary targets
41a2ce9b7d73 Merge bitcoin/bitcoin#31464: util: Add missing types in make_secure_unique
86d7135e36ef [p2p] only attempt 1p1c when both txns provided by the same peer
f7658d9b1475 [cleanup] remove p2p_inv from AddTxAnnouncement
063c1324c143 [functional test] getorphantxs reflects multiple announcers
0da693f7e129 [functional test] orphan handling with multiple announcers
b6ea4a9afe2d [p2p] try multiple peers for orphan resolution
1d2e1d709ce3 [refactor] move creation of unique_parents to helper function
c6893b0f0b7b [txdownload] remove unique_parents that we already have
163aaf285af9 [fuzz] orphanage multiple announcer functions
22b023b09da3 [unit test] multiple orphan announcers
96c1a822a274 [unit test] TxOrphanage EraseForBlock
04448ce32a3b [txorphanage] add GetTx so that orphan vin can be read
e810842acda6 [txorphanage] support multiple announcers
62a9ff187076 [refactor] change type of unique_parents to Txid
6951ddcefd9e [txrequest] GetCandidatePeers
6475849c4020 Merge bitcoin/bitcoin#31435: lint: Move assertion linter into lint runner
b537a2c02a99 doc: upgrade license to 2025.
49fc2258cf39 Merge bitcoin/bitcoin#31526: doc: Install `net/py-pyzmq` port on FreeBSD for `interface_zmq.py`
ac918c7cc0e9 Merge bitcoin/bitcoin#31552: depends: Update capnproto to 1.1.0
fa029a78780f doc: Clarify min macOS and Xcode version
a0f0c48ae20e Merge bitcoin/bitcoin#31584: txmempool: fix typos in comments
558783625ca7 Merge bitcoin/bitcoin#31586: doc: Update NetBSD Build Guide
3e936789b167 Merge bitcoin/bitcoin#31592: ci: Run functional tests in msan task
5af642bf48bb Merge bitcoin/bitcoin#31604: test: fix typo in mempool_ephemeral_dust
29bca9713d21 test: fix typo in mempool_ephemeral_dust
4036ee3f2bf5 Merge bitcoin/bitcoin#31542: test: Embed univalue json tests in binary
f6a6d912059c test: add check for getting SigningProvider for a CPubKey
62a95f5af9b9 test: refactor: move `CreateDescriptor` helper to wallet test util module
5db7d4d3d28b doc: Correct docstring describing max block tree db cache
6aa0e70ccbd5 Merge bitcoin/bitcoin#31524: refactor: Allow std::byte in Read(LE/BE)
3e0a992a3f0f doc: Clarify comments about endianness after #30526
604bf2ea37f8 Merge bitcoin/bitcoin#28121: include verbose "reject-details" field in testmempoolaccept response
04249682e381 test: use Mining interface in miner_tests
fa0411ee305f ci: Run functional tests in msan task
2bdaf52ed125 doc: Update NetBSD Build Guide
34e8ee23b83e txmempool: fix typos in comments
228aba2c4d9a Merge bitcoin/bitcoin#31555: descriptor: remove unreachable verification for `pkh`
9b9752217f2d Merge bitcoin/bitcoin#31570: test: descriptor: fix test for `MaxSatisfactionWeight`
87c9ebd88920 Merge bitcoin/bitcoin#31563: rpc: Extend scope of validation mutex in generateblock
df5c643f92d4 Merge bitcoin/bitcoin#31556: validation: Send correct notification during snapshot completion
fa3de038f744 Merge bitcoin/bitcoin#31537: qa: Limit `-maxconnections` in tests
ba0cb7d5a54f Merge bitcoin/bitcoin#31468: test: Avoid intermittent error in assert_equal(pruneheight_new, 248)
69e35f5c60ad Merge bitcoin/bitcoin#31403: test: Call generate RPCs through test framework only
17db84dbb8db Merge bitcoin/bitcoin#31251: test: report detailed msg during utf8 response decoding error
e6f14241f6d3 Merge bitcoin/bitcoin#31540: refactor: std::span compat fixes
a137b0bd6b21 Merge bitcoin/bitcoin#31215: rpc: increase the defaults for -rpcthreads and -rpcworkqueue
67bfe28995eb Merge bitcoin/bitcoin#31531: rpc: Add signet_challenge field to getblockchaininfo and getmininginfo
ad174c281758 Merge bitcoin/bitcoin#31497: Remove unused variable assignment
b29d68f942e3 test: descriptor: fix test for `MaxSatisfactionWeight`
9355578a7797 Merge bitcoin/bitcoin#31534: coins: warn on shutdown for big UTXO set flushes
f95fb793726b Merge bitcoin/bitcoin#28521: net, net_processing: additional and consistent disconnect logging
bc43ecaf6dc0 test: add functional test for balance after snapshot completion
226d03dd610d validation: Send correct notification during snapshot completion
fa63b8232f38 test: generateblocks called by multiple threads
fa62c8b1f04a rpc: Extend scope of validation mutex in generateblock
366ae00b779a descriptor: Assume `ParseScript` is not being called with a P2WPKH context
e36640859089 descriptor: remove unreachable verification for `pkh`
5709718b8301 coins: warn on shutdown for big UTXO set flushes
b0b8d96d93ea depends: Update capnproto to 1.1.0
fc7b21484703 Merge bitcoin/bitcoin#31529: guix: latest 2.31 glibc
273440d5c9dc Merge bitcoin/bitcoin#31535: doc: Install `py3-zmq` port on OpenBSD for `interface_zmq.py`
4cdf50c4ba81 Merge bitcoin/bitcoin#31544: cmake: Remove unused `BUILD_TESTING` variable from "dev-mode" preset
faf7eac364fb test: clang-format -i src/univalue/test/unitester.cpp
fafa9cc7a599 test: Embed univalue json tests in binary
fa044857caf7 test: Re-enable univalue test fail18.json
63b6b638aa5e build: Use character literals for generated headers to avoid narrowing
ecaa786cc103 rpc: add signet_challenge field to getblockchaininfo and getmininginfo
e196190a284f cmake: Remove unused `BUILD_TESTING` variable from "dev-mode" preset
bb57017b2945 Merge bitcoin/bitcoin#31521: fuzz: Fix misplaced SeedRand::ZEROS
5bbbc0d0eeb8 Merge bitcoin/bitcoin#31325: Make m_tip_block std::optional
d9d5bc2e7466 qa: Limit `-maxconnections` in tests
fa494a1d53f3 refactor: Specify const in std::span constructor, where needed
faaf4800aa75 Allow std::span in stream serialization
faa5391f7703 refactor: test: Return std::span from StringBytes
fa8622347535 refactor: Avoid passing span iterators when data pointers are expected
faae6fa5f614 refactor: Simplify SpanPopBack
facc4f120b06 refactor: Replace fwd-decl with proper include
fac3a782eaf3 refactor: Avoid needless, unsafe c-style cast
c1252b14d714 Merge bitcoin/bitcoin#31520: #31318 followups
be1a2e5dfbdf doc: Install `py3-zmq` port on OpenBSD for `interface_zmq.py`
fa0c473d4c82 Merge bitcoin/bitcoin#31196: Prune mining interface
ea53568a0685 Merge bitcoin/bitcoin#31393: refactor: Move GuessVerificationProgress into ChainstateManager
b8710201fbd0 guix: disable timezone tools & profiling in glibc
23b8a424fb06 guix: bump glibc 2.31 to 7b27c450c34563a28e634cccb399cd415e71ebfe
0a76c292ac8f doc: Install `net/py-pyzmq` port on FreeBSD for `interface_zmq.py`
fadd568931a2 fuzz: Fix misplaced SeedRand::ZEROS
fa83bec78ef3 refactor: Allow std::byte in Read(LE/BE)
4f06ae05ed6f refactor: fix typo in node/types.h
366fbf152c6c test: drop extraneous bracket in mining util
c991cea1a0c3 Remove processNewBlock() from mining interface
9a47852d88cf Remove getTransactionsUpdated() from mining interface
bfc4e029d41e Remove testBlockValidity() from mining interface
477b35746074 Merge bitcoin/bitcoin#31493: refactor: Use immediate lambda to work around GCC bug 117966
a60d5702fd5c Merge bitcoin/bitcoin#31486: fuzz: Abort when using global PRNG without re-seed
a95a8ba3a3f4 Merge bitcoin/bitcoin#31197: refactor: mining interface 30955 followups
cd3d9fa5ea87 Merge bitcoin/bitcoin#31318: Drop script_pub_key arg from createNewBlock
785486a97558 Merge bitcoin/bitcoin#31489: fuzz: Fix test_runner error reporting
1251a2364202 Merge bitcoin/bitcoin#31458: build: use `-mbig-obj` for Windows debug builds
d2136d32bb47 Merge bitcoin/bitcoin#31502: depends: Fix `CXXFLAGS` on NetBSD
58436d4af381 Merge bitcoin/bitcoin#31503: cmake: Link `bitcoin_consensus` as a library
38dcf0f98271 Merge bitcoin/bitcoin#31498: depends: Ignore prefix directory on OpenBSD
fae63bf13033 fuzz: Clarify that only SeedRandomStateForTest(SeedRand::ZEROS) is allowed
81cea5d4ee0e Ensure m_tip_block is never ZERO
e058544d0e83 Make m_tip_block an std::optional
f86678156a3d Check leaves size maximum in MerkleComputation
4d572882463b refactor: use CTransactionRef in submitSolution
2e81791d9072 Drop TransactionMerklePath default position arg
39d3b538e6a2 Rename merkle branch to path
fa18acb457e9 fuzz: Abort when using global PRNG without re-seed
fa9e0489f579 refactor: Use immediate lambda to work around GCC bug 117966
46e207d3296c cmake: Link `bitcoin_consensus` as a library
a10bb400e8cb depends: Fix CXXFLAGS on NetBSD
3353d4a5e9fc depends: Ignore prefix directory on OpenBSD
b9766c9977e5 Remove unused variable assignment
b042c4f0538c Merge bitcoin/bitcoin#31223: net, init: derive default onion port if a user specified a -port
e8f0e6efaf55 lint: output-only - Avoid repeated arrows, trim
facb4d010ca5 refactor: Move GuessVerificationProgress into ChainstateManager
2b9ff4a66d31 build: use `-mbig-obj` for mingw-w64 Debug builds
fa0e30b93aad fuzz: Fix test_runner error reporting
d73f37dda221 Merge bitcoin/bitcoin#31346: Set notifications m_tip_block in LoadChainTip()
fa7809aeab83 fuzz: Add missing SeedRandomStateForTest(SeedRand::ZEROS)
78f1bff7099b Merge bitcoin/bitcoin#31477: ci: Bump centos gcc to 12
84890e0291f0 Merge bitcoin/bitcoin#31484: depends: update capnproto to 1.0.2
d5ab5a47f0e6 Merge bitcoin/bitcoin#31452: wallet: Migrate non-HD keys to combo() descriptor
fa0998f0a028 test: Avoid intermittent error in assert_equal(pruneheight_new, 248)
fa9aacf614f6 lint: Move assertion linter into lint runner
beac62e541c8 Merge bitcoin/bitcoin#31480: refactor: Fix "modernize-use-starts-ends-with" clang-tidy warning
5cd9e95eea12 depends: update capnproto to 1.0.2
df27ee9f024f refactor: Fix "modernize-use-starts-ends-with" clang-tidy warning
435ad572a1af Merge bitcoin/bitcoin#31479: lint: Disable signature output in git log
ea9e64ff3cb0 Merge bitcoin/bitcoin#31461: depends: add `-g` to *BSD_debug flags
29ddee1796a6 Merge bitcoin/bitcoin#31478: docs: remove repetitive words
e2d3372e558d lint: Disable signature output in git log
fa47baa03bcf ci: Bump centos gcc
015aad8d6a69 docs: remove repetitive words
589ed1a8eafe wallet: migration, avoid loading wallet after failure when it wasn't loaded before
62bd61de110b Merge bitcoin/bitcoin#31450: guix: disable gcov in base-linux-gcc
676936845b1f Merge bitcoin/bitcoin#30933: test: Prove+document ConstevalFormatString/tinyformat parity
8ad2c9027420 Merge bitcoin/bitcoin#31343: test: avoid internet traffic in rpc_net.py
a582ee681c74 Merge bitcoin/bitcoin#29982: test: Fix intermittent issue in wallet_backwards_compatibility.py
fa397177acfa util: Add missing types in make_secure_unique
b6f0593f4330 doc: add release note about testmempoolaccept debug-message
f9cac6352371 test: cover testmempoolaccept debug-message in RBF test
b7ec69c25cf3 depends: add -g to *BSD_debug flags
37e49c2c7ca5 Merge bitcoin/bitcoin#31448: fuzz: add cstdlib to FuzzedDataProvider
62b2d23edbad wallet: Migrate non-HD keys to combo() descriptor
9039d8f1a1df Merge bitcoin/bitcoin#31374: wallet: fix crash during watch-only wallet migration
bb7e686341e4 fuzz: add cstdlib to FuzzedDataProvider
f6496a838828 guix: disable gcov in base-linux-gcc
35000e34cf33 Merge bitcoin/bitcoin#31433: test: #31212 follow up (spelling, refactor)
18d0cfb194cc Merge bitcoin/bitcoin#31306: ci: Update Clang in "tidy" job
c93bf0e6e2cd test: Add missing %c character test
76cca4aa6fcd test: Document non-parity between tinyformat and ConstevalFormatstring
533013cba206 test: Prove+document ConstevalFormatString/tinyformat parity
b81a4659950a refactor test: Profit from using namespace + using detail function
cdd207c0e480 test: add coverage for migrating standalone imported keys
297a876c9809 test: add coverage for migrating watch-only script
932cd1e92b6d wallet: fix crash during watch-only wallet migration
41d934c72df6 chore: Typo Overriden -> Overridden
c9fb38a590e3 refactor test: Cleaner combine_logs.py logic
22723c809a8a Merge bitcoin/bitcoin#31072: refactor: Clean up messy strformat and bilingual_str usages
b1f0f3c288af Merge bitcoin/bitcoin#31406: test: fix `test_invalid_tx_in_compactblock` in `p2p_compactblocks`
1a35447595d5 Merge bitcoin/bitcoin#31417: test: Avoid F541 (f-string without any placeholders)
eb2ebe6f30ac Merge bitcoin/bitcoin#31231: cmake: Fix `IF_CHECK_PASSED` option handling
5b283fa1477d Merge bitcoin/bitcoin#31431: util: use explicit cast in MultiIntBitSet::Fill()
37946c0aafee Set notifications m_tip_block in LoadChainTip()
fa6e599cf9fb test: Call generate through test framework only
2eccb8bc5e22 Merge bitcoin/bitcoin#31248: test: Rework wallet_migration.py to use previous releases
7239ddb7cec3 test: make sure node has all transactions
6d973f86f755 Merge bitcoin/bitcoin#31408: test: Avoid logging error when logging error
6a1e613e853d Merge bitcoin/bitcoin#31427: lint: bump MLC to v0.19.0
edb41e4814cc util: use explicit cast in MultiIntBitSet::Fill()
31e59d94c67b iwyu: Drop backported mapping
fe9bc5abef3d ci: Update Clang in "tidy" job
083770adbe7d Merge bitcoin/bitcoin#31414: test: orphan parent is re-requested from 2nd peer
f6afca46a1d7 lint: use clearer wording on error message
811a65d3c6b3 lint: bump MLC to v0.19.0
fae76393bdbf test: Avoid F541 (f-string without any placeholders)
e8cc790fe2a2 Merge bitcoin/bitcoin#30445: test: addrman: tried 3 times and never a success so `isTerrible=true`
f9650e18ea6e rbf: remove unecessary newline at end of error string
221c789e9169 rpc: include verbose reject-details field in testmempoolaccept response
0184d33b3d28 scripted-diff: Replace strprintf(Untranslated) with Untranslated(strprintf)
17372d788e6c Merge bitcoin/bitcoin#30906: refactor: prohibit direct flags access in CCoinsCacheEntry and remove invalid tests
006e4d1d5984 refactor: Use + instead of strformat to concatenate translated & untranslated strings
831d2bfcf941 refactor: Don't embed translated string in untranslated string.
058021969b54 refactor: Avoid concatenation of format strings
11f68cc81084 Merge bitcoin/bitcoin#31212: util: Improve documentation and negation of args
893ccea7e47d Merge bitcoin/bitcoin#31419: test: fix MIN macro redefinition
39950e148d80 Merge bitcoin/bitcoin#31295: refactor: Prepare compile-time check of bilingual format strings
00c1dbd26ddb test: fix MIN macro-redefinition
ae69fc37e4ff Merge bitcoin/bitcoin#31391: util: Drop boost posix_time in ParseISO8601DateTime
52fd1511a774 test: drop scriptPubKeyIn arg from CreateNewBlock
ff41b9e296ab Drop script_pub_key arg from createNewBlock
7ab733ede444 rpc: rename coinbase_script to coinbase_output_script
0f84cdd26614 func: test orphan parent is re-requested from 2nd peer
95a0104f2e98 test: Add tests for directories in place of config files
e85abe92c7cc args: Catch directories in place of config files
e4b6b1822ce0 test: Add tests for -noconf
483f0dacc413 args: Properly support -noconf
312ec64cc061 test refactor: feature_config_args.py - Stop nodes at the end of tests, not at the beginning
7402658bc2b9 test: -norpccookiefile
39cbd4f37c3d args: Support -norpccookiefile for bitcoind and bitcoin-cli
e82ad88452bc logs: Use correct path and more appropriate macros in cookie-related code
6e28c76907ca test: Harden testing of cookie file existence
75bacabb55f3 test: combine_logs.py - Output debug.log paths on error
cccca8a77f3c test: Avoid logging error when logging error
ee1b9bef000b test: replace `is not` to `!=` when comparing block hash
faf70cc9941c Remove wallet::ParseISO8601DateTime, use ParseISO8601DateTime instead
50cce20013c9 test, refactor: Compact ccoins_access and ccoins_spend
0a159f091477 test, refactor: Remove remaining unbounded flags from coins_tests
c0b4b2c1eef9 test: Validate error messages on fail
d5f8d607ab1f test: Group values and states in tests into CoinEntry wrappers
ca74aa7490a5 test, refactor: Migrate GetCoinsMapEntry to return MaybeCoin
15aaa81c3818 coins, refactor: Remove direct GetFlags access
6b733699cfc7 coins, refactor: Assume state after SetClean in AddFlags to prevent dangling pointers
fc8c282022e6 coins, refactor: Make AddFlags, SetDirty, SetFresh static
cd0498eabc91 coins, refactor: Split up AddFlags to remove invalid states
2222aecd5f80 util: Implement ParseISO8601DateTime based on C++20
06443b8f28bc net: clarify if we ever sent or received from peer
1d01ad4d73e0 net: add LogIP() helper, use in net_processing
937ef9eb408e net_processing: use CNode::DisconnectMsg helper
ad224429f823 net: additional disconnection logging
988721d37a3c test: avoid internet traffic in rpc_net.py
bffd92f00f5b args: Support -nopid
12f8d848fd91 args: Disallow -nodatadir
6ff966276009 scripted-diff: Avoid printing version information for -noversion
1807df3d9fb0 test: addrman: tried 3 times and never a success so `isTerrible=true`
55347a5018b2 test: Rework migratewallet to use previous release (v28.0)
e8a2054edc81 doc args: Document narrow scope of -color
1dd3af8fbc35 Add release note for #31223
997757dd2b4d test: add functional test for -port behavior
fa3e07430478 refactor: Tidy fixups
fa72646f2b19 move-only: Detail_CheckNumFormatSpecifiers and G_TRANSLATION_FUN
faff8403f0aa refactor: Pick translated string after format
0e2b12b92a28 net, init: derive default onion port if a user specified a -port
f42ec0f3bfbe wallet: Check specified wallet exists before migration
a2c45ae5480a test: report failure during utf8 response decoding
493656763f73 desc spkm: Return SigningProvider only if we have the privkey
97a18c85458b cmake: Fix `IF_CHECK_PASSED` option handling
e56fc7ce6a92 rpc: increase the defaults for -rpcthreads and -rpcworkqueue
69e95c2b4f99 tests: Test cleanup of mkeys from wallets without privkeys
2b9279b50a36 wallet: Remove unused encryption keys from watchonly wallets
813a16a46332 wallet: Add HasCryptedKeys
ec777917d6eb test: Fix intermittent issue in wallet_backwards_compatibility.py
REVERT: f157b0cbc7d9 kernel: Add pure kernel bitcoin-chainstate
REVERT: 692d1c23c272 kernel: Add functions to get the block hash from a block
REVERT: aad02fb561ae kernel: Add block index utility functions to C header
REVERT: 13f4911b0646 kernel: Add function to read block undo data from disk to C header
REVERT: 29fdbf260348 kernel: Add functions to read block from disk to C header
REVERT: 2ca304c1def7 kernel: Add function for copying  block data to C header
REVERT: 705c7f125fd9 kernel: Add functions for the block validation state to C header
REVERT: 92363c9469c0 kernel: Add validation interface to C header
REVERT: 7c539908113b kernel: Add interrupt function to C header
REVERT: 522d0886d8ff kernel: Add import blocks function to C header
REVERT: 1ae86e2ffe12 kernel: Add chainstate load options for in-memory dbs in C header
REVERT: 09620eeeae6c kernel: Add options for reindexing in C header
REVERT: b4fbf1931725 kernel: Add block validation to C header
REVERT: ce6ddde95eee Kernel: Add chainstate loading to kernel C header
REVERT: f5d21c94dc5a kernel: Add chainstate manager option for setting worker threads
REVERT: 783f56f0a290 kernel: Add chainstate manager object to C header
REVERT: 262039e4094c kernel: Add notifications context option to C header
REVERT: dc0d406dd5e9 kerenl: Add chain params context option to C header
REVERT: b5f84de7ad2d kernel: Add kernel library context object
REVERT: dad0009c86c1 kernel: Add logging to kernel library C header
REVERT: 27e25aa941c6 kernel: Introduce initial kernel C header API

git-subtree-dir: libbitcoinkernel-sys/bitcoin
git-subtree-split: 538671edce5813a62405b9bd5c50c39263c58435
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

9 participants