Merge bitcoin/bitcoin#34283: [30.x] More backports

624c745e4917306198443fc9fb3465e1d6f8f214 doc: update release notes for v30.x (fanquake)
0f01a4c2458bb5a3d6584697345c116512e62ebf ci: Check windows manifests for all executables (Max Edwards)
4664621abeac2c2311d0d1aee878d844d5371ea5 ci: use a more generic way of finding mt.exe (Max Edwards)
aa937589326dfc7d315fd19f83b7372df15d09ab ci: remove 3rd party js from windows dll gha job (Max Edwards)
290526bc6dec1cdf0f6db8415b05a794260de14a wallet: fix removeprunedfunds bug with conflicting transactions (Martin Zumsande)
4deda48fa44989ee73278fe4eb6e8a27e9e56807 build: Remove outdated comment about -ffile-prefix-map (MarcoFalke)
eda6c979bd7b6971560938c1a4b24671894c6f44 doc: Remove outdated -fdebug-prefix-map section in dev notes (MarcoFalke)
c294b661266bcf81b16894aa6bff0dafa88d7b86 build: Temporarily remove confusing and brittle -fdebug-prefix-map (MarcoFalke)
33195bdd9ee9ded5aec562602978fb89d2d99f4b test: allow overriding tar in get_previous_releases (fanquake)
810c75b9b1a7efb2f8c021fcdc278488f702cd98 chore: Update outdated GitHub Actions versions (Padraic Slattery)
de79f7d01ce43189006cadf08296672fb4d5d5ca qa: Fix Windows logging bug (Hennadii Stepanov)
311da7fee3aba2e6765e193f963b568cf668dbd1 test: check wallet rescan properly in feature_pruning (brunoerg)
4431a60f9c75da2a417d50cd87bcd269f3147489 test: fix feature_pruning when built without wallet (brunoerg)
7e1090f5e8056dd6042ecfe34eae3992a81a18fd psbt: Fix `PSBTInputSignedAndVerified` bounds `assert` (Lőrinc)
22bd00651a48a50ec1d3b7f717b375f62719b456 doc: add 433 (Pay to Anchor) to bips.md (Sebastian Falbesoner)

Pull request description:

  Backports:
  * #32513
  * #34185
  * #34272
  * #34252
  * #34281
  * #34282
  * #34344
  * #34358
  * #34390
  * #34413

ACKs for top commit:
  willcl-ark:
    ACK 624c745e4917306198443fc9fb3465e1d6f8f214
  marcofleon:
    ACK 624c745e4917306198443fc9fb3465e1d6f8f214

Tree-SHA512: 65f413419b50784d2661d89f2044acd5196eacd50841bb93d7437b83bd23ce535565168cd4c53f96ba485863a911f5a1ea5476b22955d6b931b65e87f78b9a17
This commit is contained in:
merge-script 2026-01-29 15:50:49 +00:00
commit 3761863e14
No known key found for this signature in database
GPG Key ID: 2EEB9F5CC09526C1
12 changed files with 127 additions and 99 deletions

View File

@ -211,11 +211,16 @@ jobs:
steps:
- *CHECKOUT
- name: Configure Developer Command Prompt for Microsoft Visual C++
# Using microsoft/setup-msbuild is not enough.
uses: ilammy/msvc-dev-cmd@v1
with:
arch: x64
- &SET_UP_VS
name: Set up VS Developer Prompt
shell: pwsh -Command "$PSVersionTable; $PSNativeCommandUseErrorActionPreference = $true; $ErrorActionPreference = 'Stop'; & '{0}'"
run: |
$vswherePath = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe"
$installationPath = & $vswherePath -latest -property installationPath
& "${env:COMSPEC}" /s /c "`"$installationPath\Common7\Tools\vsdevcmd.bat`" -arch=x64 -no_logo && set" | foreach-object {
$name, $value = $_ -split '=', 2
echo "$name=$value" >> $env:GITHUB_ENV
}
- name: Get tool information
shell: pwsh
@ -235,7 +240,7 @@ jobs:
sed -i '1s/^/set(ENV{CMAKE_POLICY_VERSION_MINIMUM} 3.5)\n/' "${VCPKG_INSTALLATION_ROOT}/scripts/ports.cmake"
- name: vcpkg tools cache
uses: actions/cache@v4
uses: actions/cache@v5
with:
path: C:/vcpkg/downloads/tools
key: ${{ github.job }}-vcpkg-tools
@ -263,14 +268,26 @@ jobs:
run: |
cmake --build . -j $NUMBER_OF_PROCESSORS --config Release
- name: Get bitcoind manifest
- name: Check executable manifests
if: matrix.job-type == 'standard'
working-directory: build
shell: pwsh -Command "$PSVersionTable; $PSNativeCommandUseErrorActionPreference = $true; $ErrorActionPreference = 'Stop'; & '{0}'"
run: |
mt.exe -nologo -inputresource:bin/Release/bitcoind.exe -out:bitcoind.manifest
cat bitcoind.manifest
echo
mt.exe -nologo -inputresource:bin/Release/bitcoind.exe -validate_manifest
mt.exe -nologo -inputresource:bin\Release\bitcoind.exe -out:bitcoind.manifest
Get-Content bitcoind.manifest
Get-ChildItem -Filter "bin\Release\*.exe" | ForEach-Object {
$exeName = $_.Name
# Skip as they currently do not have manifests
if ($exeName -eq "fuzz.exe" -or $exeName -eq "bench_bitcoin.exe" -or $exeName -eq "test_bitcoin-qt.exe") {
Write-Host "Skipping $exeName (no manifest present)"
return
}
Write-Host "Checking $exeName"
& mt.exe -nologo -inputresource:$_.FullName -validate_manifest
}
- name: Run test suite
if: matrix.job-type == 'standard'
@ -341,7 +358,7 @@ jobs:
uses: ./.github/actions/save-caches
- name: Upload built executables
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v6
with:
name: x86_64-w64-mingw32-executables-${{ github.run_id }}
path: |
@ -363,26 +380,33 @@ jobs:
- *CHECKOUT
- name: Download built executables
uses: actions/download-artifact@v4
uses: actions/download-artifact@v7
with:
name: x86_64-w64-mingw32-executables-${{ github.run_id }}
- name: Run bitcoind.exe
run: ./bin/bitcoind.exe -version
- name: Find mt.exe tool
shell: pwsh
run: |
$sdk_dir = (Get-ItemProperty 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows Kits\Installed Roots' -Name KitsRoot10).KitsRoot10
$sdk_latest = (Get-ChildItem "$sdk_dir\bin" -Directory | Where-Object { $_.Name -match '^\d+\.\d+\.\d+\.\d+$' } | Sort-Object Name -Descending | Select-Object -First 1).Name
"MT_EXE=${sdk_dir}bin\${sdk_latest}\x64\mt.exe" >> $env:GITHUB_ENV
- *SET_UP_VS
- name: Get bitcoind manifest
shell: pwsh
- name: Check executable manifests
shell: pwsh -Command "$PSVersionTable; $PSNativeCommandUseErrorActionPreference = $true; $ErrorActionPreference = 'Stop'; & '{0}'"
run: |
& $env:MT_EXE -nologo -inputresource:bin\bitcoind.exe -out:bitcoind.manifest
mt.exe -nologo -inputresource:bin\bitcoind.exe -out:bitcoind.manifest
Get-Content bitcoind.manifest
& $env:MT_EXE -nologo -inputresource:bin\bitcoind.exe -validate_manifest
Get-ChildItem -Filter "bin\*.exe" | ForEach-Object {
$exeName = $_.Name
# Skip as they currently do not have manifests
if ($exeName -eq "fuzz.exe" -or $exeName -eq "bench_bitcoin.exe") {
Write-Host "Skipping $exeName (no manifest present)"
return
}
Write-Host "Checking $exeName"
& mt.exe -nologo -inputresource:$_.FullName -validate_manifest
}
- name: Run unit tests
# Can't use ctest here like other jobs as we don't have a CMake build tree.

View File

@ -479,14 +479,8 @@ configure_file(contrib/filter-lcov.py filter-lcov.py USE_SOURCE_PERMISSIONS COPY
# Don't allow extended (non-ASCII) symbols in identifiers. This is easier for code review.
try_append_cxx_flags("-fno-extended-identifiers" TARGET core_interface SKIP_LINK)
# Avoiding the `-ffile-prefix-map` compiler option because it implies
# `-fcoverage-prefix-map` on Clang or `-fprofile-prefix-map` on GCC,
# which can cause issues with coverage builds, particularly when using
# Clang in the OSS-Fuzz environment due to its use of other options
# and a third party script, or with GCC.
try_append_cxx_flags("-fdebug-prefix-map=A=B" TARGET core_interface SKIP_LINK
IF_CHECK_PASSED "-fdebug-prefix-map=${PROJECT_SOURCE_DIR}/src=."
)
# Set `-fmacro-prefix-map`, so that source file names are expanded without the
# src prefix.
try_append_cxx_flags("-fmacro-prefix-map=A=B" TARGET core_interface SKIP_LINK
IF_CHECK_PASSED "-fmacro-prefix-map=${PROJECT_SOURCE_DIR}/src=."
)

View File

@ -211,6 +211,7 @@ CONFIGFLAGS="-DREDUCE_EXPORTS=ON -DBUILD_BENCH=OFF -DBUILD_GUI_TESTS=OFF -DBUILD
# CFLAGS
HOST_CFLAGS="-O2 -g"
HOST_CFLAGS+=$(find /gnu/store -maxdepth 1 -mindepth 1 -type d -exec echo -n " -ffile-prefix-map={}=/usr" \;)
HOST_CFLAGS+=" -fdebug-prefix-map=${DISTSRC}/src=."
case "$HOST" in
*mingw*) HOST_CFLAGS+=" -fno-ident" ;;
*darwin*) unset HOST_CFLAGS ;;

View File

@ -73,3 +73,4 @@ BIPs that are implemented by Bitcoin Core:
* [`BIP 386`](https://github.com/bitcoin/bips/blob/master/bip-0386.mediawiki): tr() Output Script Descriptors are implemented as of **v22.0** ([PR 22051](https://github.com/bitcoin/bitcoin/pull/22051)).
* [`BIP 387`](https://github.com/bitcoin/bips/blob/master/bip-0387.mediawiki): Tapscript Multisig Output Script Descriptors are implemented as of **v24.0** ([PR 24043](https://github.com/bitcoin/bitcoin/pull/24043)).
* [`BIP 431`](https://github.com/bitcoin/bips/blob/master/bip-0431.mediawiki): transactions with nVersion=3 are standard and treated as Topologically Restricted Until Confirmation as of **v28.0** ([PR 29496](https://github.com/bitcoin/bitcoin/pull/29496)).
* [`BIP 433`](https://github.com/bitcoin/bips/blob/master/bip-0433.mediawiki): Spending of Pay to Anchor (P2A) outputs is standard as of **v28.0** ([PR 30352](https://github.com/bitcoin/bitcoin/pull/30352)).

View File

@ -305,37 +305,6 @@ If you need to build exclusively for debugging, set the `-DCMAKE_BUILD_TYPE`
to `Debug` (i.e. `-DCMAKE_BUILD_TYPE=Debug`). You can always check the cmake
build options of an existing build with `ccmake build`.
### Show sources in debugging
If you have ccache enabled, absolute paths are stripped from debug information
with the `-fdebug-prefix-map` and `-fmacro-prefix-map` options (if supported by the
compiler). This might break source file detection in case you move binaries
after compilation, debug from the directory other than the project root or use
an IDE that only supports absolute paths for debugging (e.g. it won't stop at breakpoints).
There are a few possible fixes:
1. Configure source file mapping.
For `gdb` create or append to [`.gdbinit` file](https://sourceware.org/gdb/current/onlinedocs/gdb#gdbinit-man):
```
set substitute-path ./src /path/to/project/root/src
```
For `lldb` create or append to [`.lldbinit` file](https://lldb.llvm.org/man/lldb.html#configuration-files):
```
settings set target.source-map ./src /path/to/project/root/src
```
2. Add a symlink to the `./src` directory:
```
ln -s /path/to/project/root/src src
```
3. Use `debugedit` to modify debug information in the binary.
4. If your IDE has an option for this, change your breakpoints to use the file name only.
### debug.log
If the code is behaving strangely, take a look in the `debug.log` file in the data directory;

View File

@ -1,9 +1,9 @@
v30.2 Release Notes
v30.x Release Notes
===================
Bitcoin Core version v30.2 is now available from:
Bitcoin Core version v30.x is now available from:
<https://bitcoincore.org/bin/bitcoin-core-30.2/>
<https://bitcoincore.org/bin/bitcoin-core-30.x/>
This release includes new features, various bug fixes and performance
improvements, as well as updated translations.
@ -42,50 +42,46 @@ Notable changes
### Wallet
- #34156 wallet: fix unnamed legacy wallet migration failure
- #34215 wallettool: fix unnamed createfromdump failure walletsdir deletion
- #34221 test: migration, avoid backup name mismatch in default_wallet_failure
- #34358 wallet: fix removeprunedfunds bug with conflicting transactions
### IPC
### PSBT
- #33511 init: Fix Ctrl-C shutdown hangs during wait calls
- #34272 psbt: Fix PSBTInputSignedAndVerified bounds assert
### Build
- #33950 guix: reduce allowed exported symbols
- #34107 build: Update minimum required Boost version
- #34227 guix: Fix osslsigncode tests
- #34281 build: Temporarily remove confusing and brittle -fdebug-prefix-map
### Test
- #34137 test: Avoid hard time.sleep(1) in feature_init.py
- #34226 wallet: test: Relative wallet failed migration cleanup
### Fuzz
- #34091 fuzz: doc: remove any mention to address_deserialize_v2
- #34185 test: fix feature_pruning when built without wallet
- #34282 qa: Fix Windows logging bug
- #34390 test: allow overriding tar in get_previous_releases.py
### Doc
- #34182 doc: Update OpenBSD Build Guide
- #34252 doc: add 433 (Pay to Anchor) to bips.md
- #34413 doc: Remove outdated -fdebug-prefix-map section in dev notes
### Misc
### CI
- #34174 doc: update copyright year to 2026
- #32513 ci: remove 3rd party js from windows dll gha job
- #34344 ci: update GitHub Actions versions
Credits
=======
Thanks to everyone who directly contributed to this release:
- Ava Chow
- brunoerg
- davidgumberg
- fanquake
- furszy
- Hennadii Stepanov
- Lőrinc
- m3dwards
- MarcoFalke
- Ryan Ofsky
- mzumsande
- Padraic Slattery
- Sebastian Falbesoner
As well as to everyone that helped with translations on
[Transifex](https://explore.transifex.com/bitcoin/bitcoin/).

View File

@ -301,7 +301,7 @@ bool PSBTInputSigned(const PSBTInput& input)
bool PSBTInputSignedAndVerified(const PartiallySignedTransaction psbt, unsigned int input_index, const PrecomputedTransactionData* txdata)
{
CTxOut utxo;
assert(psbt.inputs.size() >= input_index);
assert(input_index < psbt.inputs.size());
const PSBTInput& input = psbt.inputs[input_index];
if (input.non_witness_utxo) {

View File

@ -2383,8 +2383,15 @@ util::Result<void> CWallet::RemoveTxs(WalletBatch& batch, std::vector<Txid>& txs
for (const auto& it : erased_txs) {
const Txid hash{it->first};
wtxOrdered.erase(it->second.m_it_wtxOrdered);
for (const auto& txin : it->second.tx->vin)
mapTxSpends.erase(txin.prevout);
for (const auto& txin : it->second.tx->vin) {
auto range = mapTxSpends.equal_range(txin.prevout);
for (auto iter = range.first; iter != range.second; ++iter) {
if (iter->second == hash) {
mapTxSpends.erase(iter);
break;
}
}
}
for (unsigned int i = 0; i < it->second.tx->vout.size(); ++i) {
m_txos.erase(COutPoint(hash, i));
}

View File

@ -346,20 +346,22 @@ class PruneTest(BitcoinTestFramework):
self.log.info("Success")
def wallet_test(self):
def test_wallet_rescan(self):
# check that the pruning node's wallet is still in good shape
self.log.info("Stop and start pruning node to trigger wallet rescan")
self.restart_node(2, extra_args=["-prune=550"])
self.log.info("Success")
wallet_info = self.nodes[2].getwalletinfo()
self.wait_until(lambda: wallet_info["scanning"] == False)
self.wait_until(lambda: wallet_info["lastprocessedblock"]["height"] == self.nodes[2].getblockcount())
# check that wallet loads successfully when restarting a pruned node after IBD.
# this was reported to fail in #7494.
self.log.info("Syncing node 5 to test wallet")
self.connect_nodes(0, 5)
nds = [self.nodes[0], self.nodes[5]]
self.sync_blocks(nds, wait=5, timeout=300)
self.restart_node(5, extra_args=["-prune=550", "-blockfilterindex=1"]) # restart to trigger rescan
self.log.info("Success")
wallet_info = self.nodes[5].getwalletinfo()
self.wait_until(lambda: wallet_info["scanning"] == False)
self.wait_until(lambda: wallet_info["lastprocessedblock"]["height"] == self.nodes[0].getblockcount())
def run_test(self):
self.log.info("Warning! This test requires 4GB of disk space")
@ -467,9 +469,13 @@ class PruneTest(BitcoinTestFramework):
self.log.info("Test manual pruning with timestamps")
self.manual_test(4, use_timestamp=True)
self.log.info("Syncing node 5 to node 0")
self.connect_nodes(0, 5)
self.sync_blocks([self.nodes[0], self.nodes[5]], wait=5, timeout=300)
if self.is_wallet_compiled():
self.log.info("Test wallet re-scan")
self.wallet_test()
self.test_wallet_rescan()
self.log.info("Test it's not possible to rescan beyond pruned data")
self.test_rescan_blockchain()

View File

@ -765,7 +765,7 @@ class TestHandler:
status = "Passed"
elif proc.returncode == TEST_EXIT_SKIPPED:
status = "Skipped"
skip_reason = re.search(r"Test Skipped: (.*)", stdout).group(1)
skip_reason = re.search(r"Test Skipped: (.*)", stdout).group(1).strip()
else:
status = "Failed"
self.jobs.remove(job)

View File

@ -14,6 +14,7 @@ from test_framework.messages import (
from test_framework.test_framework import BitcoinTestFramework
from test_framework.util import (
assert_equal,
assert_not_equal,
assert_raises_rpc_error,
wallet_importprivkey,
)
@ -129,6 +130,33 @@ class ImportPrunedFundsTest(BitcoinTestFramework):
mb.header.nTime += 1 # modify arbitrary block header field to change block hash
assert_raises_rpc_error(-5, "Block not found in chain", w1.importprunedfunds, rawtxn1, mb.serialize().hex())
self.log.info("Test removeprunedfunds with conflicting transactions")
node = self.nodes[0]
# Create a transaction
utxo = node.listunspent()[0]
addr = node.getnewaddress()
tx1_id = node.send(outputs=[{addr: 1}], inputs=[utxo])["txid"]
tx1_fee = node.gettransaction(tx1_id)["fee"]
# Create a conflicting tx with a larger fee (tx1_fee is negative)
output_value = utxo["amount"] + tx1_fee - Decimal("0.00001")
raw_tx2 = node.createrawtransaction(inputs=[utxo], outputs=[{addr: output_value}])
signed_tx2 = node.signrawtransactionwithwallet(raw_tx2)
tx2_id = node.sendrawtransaction(signed_tx2["hex"])
assert_not_equal(tx2_id, tx1_id)
# Both txs should be in the wallet, tx2 replaced tx1 in mempool
assert tx1_id in [tx["txid"] for tx in node.listtransactions()]
assert tx2_id in [tx["txid"] for tx in node.listtransactions()]
# Remove the replaced tx from wallet
node.removeprunedfunds(tx1_id)
# The UTXO should still be considered spent (by tx2)
available_utxos = [u["txid"] for u in node.listunspent(minconf=0)]
assert utxo["txid"] not in available_utxos, "UTXO should still be spent by conflicting tx"
if __name__ == '__main__':
ImportPrunedFundsTest(__file__).main()

View File

@ -23,6 +23,8 @@ import time
import urllib.request
import zipfile
TAR = os.getenv('TAR', 'tar')
SHA256_SUMS = {
"0e2819135366f150d9906e294b61dff58fd1996ebd26c2f8e979d6c0b7a79580": {"tag": "v0.14.3", "archive": "bitcoin-0.14.3-aarch64-linux-gnu.tar.gz"},
"d86fc90824a85c38b25c8488115178d5785dbc975f5ff674f9f5716bc8ad6e65": {"tag": "v0.14.3", "archive": "bitcoin-0.14.3-arm-linux-gnueabihf.tar.gz"},
@ -202,7 +204,7 @@ def download_binary(tag, args) -> int:
print(f"Zip extraction failed: {e}", file=sys.stderr)
return 1
else:
ret = subprocess.run(['tar', '-zxf', archive, '-C', tag,
ret = subprocess.run([TAR, '-zxf', archive, '-C', tag,
'--strip-components=1',
'bitcoin-{tag}'.format(tag=tag[1:])]).returncode
if ret != 0: