Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
178 commits
Select commit Hold shift + click to select a range
d06dabf
node: allocate index caches proportional to usage patterns
svanstaa Feb 20, 2026
4afbabd
Fix startup failure with RLIM_INFINITY fd limits
Sjors Mar 31, 2026
8ab4b9f
init: clamp fd limits to int
Sjors Mar 31, 2026
735b255
support: clamp RLIMIT_MEMLOCK to size_t
Sjors Mar 31, 2026
47d68cd
ci: backport iwyu PR 2013 std::hash mapping
Sjors Apr 24, 2026
a9301cf
refactor: disable default std::hash for CTransactionRef
Sjors Apr 27, 2026
0e4b0ba
validation: Don't add pruned blocks to m_blocks_unlinked on startup
marcofleon Apr 27, 2026
5a2e359
clarify blockfilterindex cache allocation rationale
svanstaa May 4, 2026
b3a3f88
crypto: cleanse HMAC stack buffers after use
thomasbuilds May 10, 2026
3f44f9a
test: Add coverage for m_blocks_unlinked invariant in LoadBlockIndex
marcofleon Apr 27, 2026
21a1380
key: cleanse ChainCode on destruction
thomasbuilds May 12, 2026
fa2afba
p2p: Release m_peer_mutex early in InitiateTxBroadcastToAll
May 15, 2026
faf7e38
ci: refactor: Avoid warning: INSTALL_BCC_TRACING_TOOLS: unbound variable
May 27, 2026
fa98d44
ci: Rewrite broken wrap-valgrind.sh to .py
May 27, 2026
4731049
build: exclude mptest target from compile commands
Sanjana2906 Jun 2, 2026
726e196
ci: inline runner selection
willcl-ark Jun 2, 2026
de92208
migrate: Handle HD chains that have identical seeds but different IDs
achow101 Jun 1, 2026
2189a6f
p2p: Saturate LocalServiceInfo::nScore updates at INT_MAX
codeabysss Jun 1, 2026
b5e91e9
wallet: Remove CoinsResult::Clear()
hodlinator Jun 3, 2026
43ca54c
refactor(test): Make CAmount arg explicit for BuildCreditingTransacti…
hodlinator Jun 3, 2026
d0b76c7
rpc+bitcoin-tx: Specify correct type for ParseFixedPoint()
hodlinator Jun 3, 2026
659671a
qa: Avoid cleanup when exception is raised
hodlinator Jun 4, 2026
f42226d
qa: Silence socket.timeout exception when substituting it for a JSONR…
hodlinator Jun 4, 2026
54de023
guix: add setup.sh
fanquake May 18, 2026
1b3f776
serialize: string_view serialization
ajtowns Feb 26, 2026
94ed454
serialize: add LimitedVectorFormatter
ajtowns May 6, 2026
5b65e31
test: remove two unnecessary nodes from the test
rkrux Jun 4, 2026
3210fc4
net: Add AdvertisedVersion() for protocol version advertised to a peer
ajtowns May 6, 2026
6a12998
BIP434: FEATURE message support
ajtowns Jan 26, 2026
01b8a11
test_framework: BIP 434 support
ajtowns May 6, 2026
da74ff9
test: Add functional test for BIP434
fjahr May 12, 2026
2cf2b22
depends: Drop trailing slash from `CMAKE_INSTALL_LIBDIR`
hebasto Jun 4, 2026
44fc3a2
rpc: introduce HelpElision variant and ElideGroup helper
satsfy Mar 16, 2026
b2fbd5b
ci: run ipc functional tests in arm job
fanquake Jun 4, 2026
f6bdbcf
lint: Grep for `AUTO` test suites in file names
rustaceanrob Jun 3, 2026
27472a5
Merge bitcoin/bitcoin#35466: ci: run ipc functional tests in arm job
sedited Jun 6, 2026
19b32a2
fuzz: reset the mockable steady clock between iterations
HowHsu Jun 7, 2026
5deb053
fuzz: fix dead HD keypaths (de)serialization round-trip
theStack Jun 7, 2026
5f33da9
Merge bitcoin/bitcoin#35481: fuzz: fix dead HD keypaths (de)serializa…
sedited Jun 7, 2026
7b821ef
rpc: getprivatebroadcastinfo and abortprivatebroadcast throw if -priv…
polespinasa May 13, 2026
fdc9fc1
test: check getprivatebroadcast and abortprivatebroadcast throw if th…
polespinasa May 31, 2026
0bfc5e4
add release notes
polespinasa May 11, 2026
7c2ec39
test: Enter mocktime before peer creation in block_relay_only_eviction
seduless Apr 17, 2026
758fea5
test: Drop ++ from NodeClockContext default constructor
seduless Apr 17, 2026
1e9546f
test: Use NodeClockContext in more call sites
seduless Apr 17, 2026
55e402f
scripted-diff: Rename NodeClockContext to FakeNodeClock
seduless Apr 18, 2026
35a814a
test: Limit clocks to one active instance
Jun 8, 2026
ec6cf49
blockstorage: Remove cs_LastBlockFile recursive mutex
sedited May 21, 2026
84d07e4
test: add coverage for importdescriptor with an encrypted wallet
polespinasa Apr 29, 2026
1aafd49
Merge bitcoin/bitcoin#35359: blockstorage: Remove cs_LastBlockFile re…
fanquake Jun 8, 2026
fba713a
scripted-diff: Rename UNIQUE_NAME to BITCOIN_UNIQUE_NAME
hebasto Jun 8, 2026
1d3bc81
Merge bitcoin/bitcoin#35267: rpc: make getprivatebroadcastinfo and ab…
sedited Jun 8, 2026
e36f5d5
Merge bitcoin/bitcoin#35456: test: Perform full reset of CoinsResult …
sedited Jun 8, 2026
577999c
Merge bitcoin/bitcoin#35462: test: remove unnecessary nodes from wall…
sedited Jun 8, 2026
9868e1b
Merge bitcoin/bitcoin#35487: scripted-diff: Rename UNIQUE_NAME to BIT…
sedited Jun 9, 2026
6d47f7c
ci: use llvm 22.1.7
fanquake Jun 3, 2026
087f02c
ci: skip libunwind runtime in LLVM build
fanquake Jun 3, 2026
17ed7f5
Merge bitcoin/bitcoin#35297: p2p: Release m_peer_mutex early in Initi…
fanquake Jun 9, 2026
543c00f
Merge bitcoin/bitcoin#35448: ci: don't build libunwind in msan
sedited Jun 9, 2026
bcbf5ba
Merge bitcoin/bitcoin#35114: test: NodeClockContext follow-ups
sedited Jun 9, 2026
a6ed29d
bench, refactor: Use `std::string_view` for `BenchRunner` ctor parameter
hebasto Jun 4, 2026
fae9623
test: Add FakeNodeClock m_clock to TestChain100Setup
Jun 9, 2026
fa3716c
test: Use FakeNodeClock in more places
Jun 9, 2026
fa03852
test: Use SteadyClockContext in pcp_tests
Jun 9, 2026
4b91316
Merge bitcoin/bitcoin#35459: guix: add setup.sh
hebasto Jun 9, 2026
359680b
net: move cs_main up in FetchBlock to fix rpc assert crash
Crypt-iQ Jun 9, 2026
fa1414a
ci: Debian Trixie -> Ubuntu 26.04
May 14, 2026
fa4774d
ci: Bump APT_LLVM_V-based task configs to Ubuntu 26.04
Jun 10, 2026
fab5228
refactor: Drop unused includes after iwyu CI bump
Jun 10, 2026
6751a32
iwyu: Fix warnings in `src/bench` and treat them as error
hebasto Jun 4, 2026
ddceb4e
test: updated different_key to be different_field and also used a sin…
kevkevinpal Jun 10, 2026
ad388bf
test: add coverage for importdescriptors while wallet is rescanning
polespinasa Apr 29, 2026
d90d7f0
test: add coverage for importdescriptors errors when using assumeutxo
polespinasa Apr 29, 2026
ed11dd6
test: add coverage for importdescriptors when manually interrupting a…
polespinasa Jun 8, 2026
c85e04f
Merge bitcoin/bitcoin#35478: fuzz: reset the mockable steady clock be…
fanquake Jun 10, 2026
2880181
Merge bitcoin/bitcoin#35254: crypto: cleanse HMAC stack buffers after…
achow101 Jun 10, 2026
3bbc3c6
Merge bitcoin/bitcoin#35101: refactor: disable default std::hash for …
achow101 Jun 10, 2026
53b836c
Merge bitcoin/bitcoin#34028: p2p: Prevent integer overflow in LocalSe…
achow101 Jun 10, 2026
fb47793
Merge bitcoin/bitcoin#35168: validation: Don't add pruned blocks to `…
achow101 Jun 10, 2026
1ce9e26
fuzz: improve dbwrapper_concurrent_reads performance
andrewtoth Jun 4, 2026
472b950
qa: Use custom assert_greater_than() over naked assert
hodlinator Jun 10, 2026
526aae3
fuzz: test non-max descriptor satisfaction weight
w0xlt Jun 8, 2026
8598ec2
Merge bitcoin/bitcoin#35221: BIP 434 Support: Peer feature negotiation
achow101 Jun 10, 2026
530e1f5
Merge bitcoin/bitcoin#34636: node: allocate index caches proportional…
achow101 Jun 10, 2026
809f909
Merge bitcoin/bitcoin#35451: lint: Grep for `AUTO` test suites in fil…
achow101 Jun 10, 2026
50e9f2a
Merge bitcoin/bitcoin#35497: test: FakeNodeClock follow-ups in unit t…
sedited Jun 11, 2026
e0fb41f
Merge bitcoin/bitcoin#35489: fuzz: test non-max descriptor satisfacti…
sedited Jun 11, 2026
d0b8d44
Merge bitcoin/bitcoin#35455: fuzz: improve dbwrapper_concurrent_reads…
sedited Jun 11, 2026
46d0e21
Merge bitcoin/bitcoin#35288: ci: Bump toward Ubuntu 26.04
hebasto Jun 11, 2026
b83a999
btcsignals: delete broken scoped_connection move assignment
thomasbuilds Apr 20, 2026
bc30e95
wallet: move fAbortRescan reset into WalletRescanReserver reserve()
polespinasa Jun 11, 2026
2818a17
test: add abortscan unit test
polespinasa Jun 11, 2026
3b712b9
Merge bitcoin/bitcoin#35120: btcsignals: delete broken scoped_connect…
fanquake Jun 11, 2026
3be1115
ci: Alpine 3.24
fanquake Jun 11, 2026
c117bbc
Merge bitcoin/bitcoin#35514: ci: Alpine 3.24
sedited Jun 11, 2026
faad9d6
refactor: Mark btcsignals operator [[nodiscard]]
Jun 11, 2026
fa4badc
refactor: Make ThreadSafeMessageBox signal void
Apr 9, 2026
fa86e5d
refactor: Properly return from ThreadSafeQuestion signal
Apr 9, 2026
fa1bc1f
test: Check btcsignals determinism in thread_safety test case
Apr 9, 2026
fa4903d
refactor: Make scoped_connection ctor explicit
Apr 9, 2026
fa45783
mv btcsignals.h to src/util
Apr 9, 2026
77772e7
undo "ui: Compile boost:signals2 only once"
Apr 9, 2026
216b50c
Merge bitcoin/bitcoin#35179: test: Add importdescriptors rpc error co…
achow101 Jun 11, 2026
142e86a
Merge bitcoin/bitcoin#35458: qa: Avoid extra tracebacks when exceptio…
fanquake Jun 12, 2026
9bfdde7
guix: add package.sh
fanquake May 18, 2026
4c99ed1
Merge bitcoin/bitcoin#35418: build: exclude mptest target from compil…
fanquake Jun 12, 2026
b337102
doc: use signing pubkey instead of aggregate xonly key
kevkevinpal Jun 10, 2026
946feb3
test: remove redundant test suite uniqueness lint
l0rinc Jun 12, 2026
0380a1c
rpc: extend TxDoc() for getrawtransaction verbosity 2
satsfy Mar 17, 2026
372ac28
rpc: extend TxDoc() for getblock verbosity 2/3
satsfy Mar 17, 2026
8a615a8
rpc: extract ListSinceBlockTxFields() helper
satsfy Mar 17, 2026
a9f9e7d
rpc: extract fee estimate result helpers
satsfy Mar 17, 2026
88e2a6a
rpc: expand getaddressinfo embedded with explicit fields
satsfy Mar 17, 2026
7a85118
rpc: expand decodepsbt output script with explicit fields
satsfy Jun 4, 2026
2447385
rpc: remove unused RPCResult::Type::ELISION
satsfy Jun 13, 2026
d186c39
Revert "build: exclude mptest target from compile commands"
fanquake Jun 13, 2026
406c234
rpc: tighten setmocktime upper bound to UINT32_MAX
stringintech Jun 12, 2026
debac5f
Merge bitcoin/bitcoin#35523: Revert "build: exclude mptest target fro…
hebasto Jun 13, 2026
17353f9
ci: bump MSan fuzz timeout
Sjors Jun 13, 2026
9fae7e9
test: doc: remove `--perf` profiling from functional test framework
theStack Jun 13, 2026
2cfb10b
Merge bitcoin/bitcoin#35498: net: move cs_main up in FetchBlock to fi…
sedited Jun 14, 2026
04eccc2
Merge bitcoin/bitcoin#35043: refactor: Properly return from ThreadSaf…
sedited Jun 14, 2026
87d099d
Merge bitcoin/bitcoin#35519: rpc: tighten setmocktime upper bound to …
fanquake Jun 14, 2026
6bc2d99
Merge bitcoin/bitcoin#35499: guix: add `package.sh`
hebasto Jun 15, 2026
46927cf
Merge bitcoin/bitcoin#35504: test/doc: Follow-up nits for #35269
fanquake Jun 15, 2026
355fffb
Merge bitcoin/bitcoin#35528: test: doc: remove `--perf` profiling fro…
fanquake Jun 15, 2026
6921f5d
Merge bitcoin/bitcoin#35414: iwyu: Fix warnings in `src/bench` and tr…
fanquake Jun 15, 2026
d92a20b
iwyu: Fix warning in `bench/pool.cpp`
hebasto Jun 15, 2026
2d86083
guix: Drop redundant CMake `--verbose` options
hebasto Jun 11, 2026
059edf1
guix: Fix "Ignoring empty string" CMake warning for non-Linux hosts
hebasto Jun 11, 2026
f655d88
Merge bitcoin/bitcoin#35535: iwyu: Fix warning in `bench/pool.cpp`
fanquake Jun 15, 2026
6e93ef4
Merge bitcoin/bitcoin#35503: guix: CMake-related improvements
fanquake Jun 15, 2026
58cc2a0
test: make TestChain100Setup's m_clock timestamp more readable
HowHsu Jun 15, 2026
011ad6e
Merge bitcoin/bitcoin#35441: ci: inline runner selection
fanquake Jun 15, 2026
92d8124
Merge bitcoin/bitcoin#35538: test: make TestChain100Setup's m_clock t…
fanquake Jun 16, 2026
41e531c
util: shorten `ThreadPool` worker names
l0rinc May 20, 2026
d69c462
util: zero-pad thread number suffixes
l0rinc May 20, 2026
d3e40af
index: shorten indexer thread names
l0rinc May 20, 2026
6d5c1fb
Merge bitcoin/bitcoin#35173: util: shorten thread names to avoid Linu…
sedited Jun 16, 2026
61a0305
Merge bitcoin/bitcoin#35526: ci: bump MSan fuzz timeout from 150 to 1…
sedited Jun 16, 2026
9460090
Merge bitcoin/bitcoin#35520: lint: remove redundant test suite unique…
sedited Jun 16, 2026
55a4c94
test: descriptor: bare multisig at TOP level with 3 pubkeys is allowed
brunoerg Jun 16, 2026
a30ef6b
Merge bitcoin/bitcoin#35396: ci: Rewrite broken wrap-valgrind.sh to .py
fanquake Jun 16, 2026
32df86f
argsman: Prevent duplicate option registration across categories
pablomartin4btc Jun 5, 2026
fae482b
ci: Use GCC consistently in i686 task
Jun 16, 2026
0136e17
Merge bitcoin/bitcoin#35546: ci: Use GCC consistently in i686 task
sedited Jun 17, 2026
0e47509
Merge bitcoin/bitcoin#35463: depends: Drop trailing slash from `CMAKE…
fanquake Jun 17, 2026
09ba59f
Merge bitcoin/bitcoin#35540: test: descriptor: bare multisig at TOP l…
sedited Jun 17, 2026
0f156c1
Merge bitcoin/bitcoin#35470: argsman: Prevent duplicate option regist…
fanquake Jun 17, 2026
2a36d6a
lint: Require scripted-diff script to succeed
hodlinator Jun 17, 2026
744d495
ci: updated docs to reflect removal of REPO_USE_WARP_RUNNERS flag
m3dwards Jun 17, 2026
f570d7c
Merge bitcoin/bitcoin#35547: lint: Require scripted-diff script to su…
hebasto Jun 17, 2026
1e169a8
Merge bitcoin/bitcoin#35548: doc: updated ci docs to reflect removal …
fanquake Jun 17, 2026
0654511
util: Check write failures before renaming settings.json
sh011 May 28, 2026
f963f2b
argsman: allow duplicate registration between HIDDEN and other catego…
pablomartin4btc Jun 17, 2026
3413609
Merge bitcoin/bitcoin#35549: argsman: Fix duplicate option assertion …
fanquake Jun 18, 2026
1f3f0a4
Squashed 'src/secp256k1/' changes from 7262adb4b4..bd0287d650
fanquake Jun 18, 2026
9caae50
Update secp256k1 subtree to latest upstream
fanquake Jun 18, 2026
0e95e1a
Merge bitcoin/bitcoin#35437: migrate: Handle HD chains that have iden…
fanquake Jun 18, 2026
794befd
Merge bitcoin/bitcoin#35384: util: Check write failures before renami…
ryanofsky Jun 19, 2026
61c754a
Merge bitcoin/bitcoin#35512: wallet: move fAbortRescan reset into Wal…
achow101 Jun 19, 2026
f6939fd
Merge bitcoin/bitcoin#35564: Update secp256k1 subtree to latest master
sedited Jun 19, 2026
5883ba7
Merge bitcoin/bitcoin#34764: rpc: replace ELISION references with exp…
achow101 Jun 19, 2026
1a2523e
Merge bitcoin/bitcoin#34937: Fix startup failure with RLIM_INFINITY f…
achow101 Jun 19, 2026
d0ff1bf
Change CheckBlockHeader
optout21 May 1, 2026
59b02d3
Change ContextualCheckBlockHeader
optout21 May 2, 2026
f9566c7
Change AcceptBlockHeader
optout21 May 1, 2026
8f162f4
Change ProcessNewBlockHeaders
yuvicc Apr 14, 2026
abbb462
Change CheckMerkleRoot
optout21 Jun 19, 2026
0a90e44
Change CheckBlock
optout21 May 2, 2026
1f8245b
Change CheckWitnessMalleation
optout21 Jun 19, 2026
c3a8e48
Change ContextualCheckBlock
optout21 Jun 19, 2026
6137be7
Change FatalError
optout21 Jun 19, 2026
26c0c73
validation: In AcceptBlock, don't ignore flush result
optout21 Jun 19, 2026
7fe7736
Change FlushStateToDisk
optout21 Jun 19, 2026
1de5e40
Change AcceptBlock
optout21 Jun 18, 2026
1a037e7
Internal simplification in TestBlockValidity
optout21 Jun 20, 2026
cc4bac4
Mark some BlockValidationState returns const
optout21 Jun 20, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 19 additions & 40 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ concurrency:

env:
CI_FAILFAST_TEST_LEAVE_DANGLING: 1 # GHA does not care about dangling processes and setting this variable avoids killing the CI script itself on error
REPO_USE_WARP_RUNNERS: 'bitcoin/bitcoin' # Use warp runners for this repo, instead of falling back to the slow GHA runners

defaults:
run:
Expand All @@ -28,12 +27,16 @@ defaults:
shell: bash

jobs:
runners:
name: '[meta] determine runners'
runs-on: ubuntu-slim
outputs:
provider: ${{ steps.runners.outputs.provider }}
test-each-commit:
name: 'test ancestor commits'
runs-on: ${{ github.repository == 'bitcoin/bitcoin' && 'warp-ubuntu-latest-x64-8x' || 'ubuntu-latest' }}
env:
TEST_RUNNER_PORT_MIN: "14000" # Use a larger port range to avoid colliding with other CI services.
if: github.event_name == 'pull_request' && github.event.pull_request.commits != 1
timeout-minutes: 360 # Use maximum time, see https://docs.github.com/en/actions/writing-workflows/workflow-syntax-for-github-actions#jobsjob_idtimeout-minutes.
steps:
- name: Determine fetch depth
run: echo "FETCH_DEPTH=$((${{ github.event.pull_request.commits }} + 2))" >> "$GITHUB_ENV"
- &ANNOTATION_PR_NUMBER
name: Annotate with pull request number
# This annotation is machine-readable and can be used to assign a check
Expand All @@ -44,28 +47,6 @@ jobs:
if [ "${{ github.event_name }}" = "pull_request" ]; then
echo "::notice title=debug_pull_request_number_str::${{ github.event.number }}"
fi
- id: runners
run: |
if [[ "${REPO_USE_WARP_RUNNERS}" == "${{ github.repository }}" ]]; then
echo "provider=warp" >> "$GITHUB_OUTPUT"
echo "::notice title=Runner Selection::Using Warp Runners"
else
echo "provider=gha" >> "$GITHUB_OUTPUT"
echo "::notice title=Runner Selection::Using GitHub-hosted runners"
fi

test-each-commit:
name: 'test ancestor commits'
needs: runners
runs-on: ${{ needs.runners.outputs.provider == 'warp' && 'warp-ubuntu-latest-x64-8x' || 'ubuntu-latest' }}
env:
TEST_RUNNER_PORT_MIN: "14000" # Use a larger port range to avoid colliding with other CI services.
if: github.event_name == 'pull_request' && github.event.pull_request.commits != 1
timeout-minutes: 360 # Use maximum time, see https://docs.github.com/en/actions/writing-workflows/workflow-syntax-for-github-actions#jobsjob_idtimeout-minutes.
steps:
- name: Determine fetch depth
run: echo "FETCH_DEPTH=$((${{ github.event.pull_request.commits }} + 2))" >> "$GITHUB_ENV"
- *ANNOTATION_PR_NUMBER
- uses: actions/checkout@v6
with:
ref: ${{ github.event.pull_request.head.sha }}
Expand Down Expand Up @@ -324,8 +305,8 @@ jobs:

windows-cross:
name: 'Windows-cross to x86_64, ${{ matrix.crt }}'
needs: [runners, record-frozen-commit]
runs-on: ${{ needs.runners.outputs.provider == 'warp' && 'warp-ubuntu-latest-x64-4x' || 'ubuntu-latest' }}
needs: record-frozen-commit
runs-on: ${{ github.repository == 'bitcoin/bitcoin' && 'warp-ubuntu-latest-x64-4x' || 'ubuntu-latest' }}
if: ${{ vars.SKIP_BRANCH_PUSH != 'true' || github.event_name == 'pull_request' }}

strategy:
Expand Down Expand Up @@ -359,7 +340,7 @@ jobs:
id: restore-cache
uses: ./.github/actions/cache/restore
with:
provider: ${{ needs.runners.outputs.provider }}
provider: ${{ github.repository == 'bitcoin/bitcoin' && 'warp' || 'gha' }}

- name: Configure Docker
uses: ./.github/actions/configure-docker
Expand All @@ -372,7 +353,7 @@ jobs:
- name: Save caches
uses: ./.github/actions/cache/save
with:
provider: ${{ needs.runners.outputs.provider }}
provider: ${{ github.repository == 'bitcoin/bitcoin' && 'warp' || 'gha' }}

- name: Upload built executables
uses: actions/upload-artifact@v7
Expand Down Expand Up @@ -439,8 +420,7 @@ jobs:

ci-matrix:
name: ${{ matrix.name }}
needs: runners
runs-on: ${{ needs.runners.outputs.provider == 'warp' && matrix.warp-runner || matrix.fallback-runner }}
runs-on: ${{ github.repository == 'bitcoin/bitcoin' && matrix.warp-runner || matrix.fallback-runner }}
if: ${{ vars.SKIP_BRANCH_PUSH != 'true' || github.event_name == 'pull_request' }}
timeout-minutes: ${{ matrix.timeout-minutes }}

Expand Down Expand Up @@ -534,7 +514,7 @@ jobs:
- name: 'MSan, fuzz'
warp-runner: 'warp-ubuntu-latest-x64-8x'
fallback-runner: 'ubuntu-latest'
timeout-minutes: 150
timeout-minutes: 180
file-env: './ci/test/00_setup_env_native_fuzz_with_msan.sh'

- name: 'MSan'
Expand All @@ -555,15 +535,15 @@ jobs:
id: restore-cache
uses: ./.github/actions/cache/restore
with:
provider: ${{ matrix.provider || needs.runners.outputs.provider }}
provider: ${{ matrix.provider || (github.repository == 'bitcoin/bitcoin' && 'warp' || 'gha') }}

- name: Configure Docker
uses: ./.github/actions/configure-docker
with:
provider: ${{ matrix.provider || needs.runners.outputs.provider }}

- name: Clear unnecessary files
if: ${{ needs.runners.outputs.provider == 'gha' && true || false }} # Only needed on GHA runners
if: ${{ github.repository != 'bitcoin/bitcoin' || matrix.provider == 'gha' }} # Only needed on GHA runners
uses: ./.github/actions/clear-files

- name: Enable bpfcc script
Expand All @@ -583,12 +563,11 @@ jobs:
- name: Save caches
uses: ./.github/actions/cache/save
with:
provider: ${{ matrix.provider || needs.runners.outputs.provider }}
provider: ${{ matrix.provider || (github.repository == 'bitcoin/bitcoin' && 'warp' || 'gha') }}

lint:
name: 'lint'
needs: runners
runs-on: ${{ needs.runners.outputs.provider == 'warp' && 'warp-ubuntu-latest-x64-2x' || 'ubuntu-latest' }}
runs-on: ${{ github.repository == 'bitcoin/bitcoin' && 'warp-ubuntu-latest-x64-2x' || 'ubuntu-latest' }}
if: ${{ vars.SKIP_BRANCH_PUSH != 'true' || github.event_name == 'pull_request' }}
timeout-minutes: 20
env:
Expand Down
2 changes: 1 addition & 1 deletion ci/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -97,5 +97,5 @@ To configure the primary repository, follow these steps:
When used in a fork the CI will run on GitHub's free hosted runners by default.
In this case, GitHub's cache size limitations may cause caches to be frequently evicted and missed, but the workflows will run (slowly).

It is also possible to use your own WarpBuild Runners in your own fork with an appropriate patch to the `REPO_USE_WARP_RUNNERS` variable in ../.github/workflows/ci.yml
It is also possible to use your own WarpBuild Runners in your own fork by replacing the references to `bitcoin/bitcoin` in `../.github/workflows/ci.yml` with the name of your fork (e.g. `your-org/bitcoin`).
NB that WarpBuild Runners only work at an organisation level, therefore in order to use your own WarpBuild Runners, *the fork must be within your own organisation*.
3 changes: 2 additions & 1 deletion ci/test/00_setup_env_arm.sh
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@ export LC_ALL=C.UTF-8

export HOST=arm-linux-gnueabihf
export DPKG_ADD_ARCH="armhf"
export PACKAGES="python3-zmq g++-arm-linux-gnueabihf libc6:armhf libstdc++6:armhf libfontconfig1:armhf libxcb1:armhf"
export PACKAGES="python3-pip python3-zmq g++-arm-linux-gnueabihf libc6:armhf libstdc++6:armhf libfontconfig1:armhf libxcb1:armhf"
export PIP_PACKAGES="--break-system-packages pycapnp"
export CONTAINER_NAME=ci_arm_linux
export CI_IMAGE_NAME_TAG="mirror.gcr.io/debian:trixie" # Check that https://packages.debian.org/trixie/g++-arm-linux-gnueabihf (version 14.x, similar to guix) can cross-compile
export CI_IMAGE_PLATFORM="linux/arm64"
Expand Down
2 changes: 1 addition & 1 deletion ci/test/00_setup_env_freebsd_cross.sh
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
export LC_ALL=C.UTF-8

export CONTAINER_NAME=ci_freebsd_cross
export CI_IMAGE_NAME_TAG="mirror.gcr.io/ubuntu:24.04"
export CI_IMAGE_NAME_TAG="mirror.gcr.io/ubuntu:26.04"
export APT_LLVM_V="22"
export FREEBSD_VERSION=15.0
export PACKAGES="clang-${APT_LLVM_V} llvm-${APT_LLVM_V} lld"
Expand Down
6 changes: 2 additions & 4 deletions ci/test/00_setup_env_i686_no_ipc.sh
Original file line number Diff line number Diff line change
Expand Up @@ -8,18 +8,16 @@ export LC_ALL=C.UTF-8

export HOST=i686-pc-linux-gnu
export CONTAINER_NAME=ci_i686_no_multiprocess
export CI_IMAGE_NAME_TAG="mirror.gcr.io/debian:trixie"
export CI_IMAGE_NAME_TAG="mirror.gcr.io/ubuntu:26.04"
export CI_IMAGE_PLATFORM="linux/amd64"
export CI_CONTAINER_CAP="--security-opt seccomp=unconfined"
export PACKAGES="llvm clang g++-multilib"
export PACKAGES="g++-multilib"
export DEP_OPTS="DEBUG=1 NO_IPC=1"
export GOAL="install"
export CI_LIMIT_STACK_SIZE=1
export BITCOIN_CONFIG="\
--preset=dev-mode \
-DENABLE_IPC=OFF \
-DCMAKE_BUILD_TYPE=Debug \
-DCMAKE_C_COMPILER='clang;-m32' \
-DCMAKE_CXX_COMPILER='clang++;-m32' \
-DAPPEND_CPPFLAGS='-DBOOST_MULTI_INDEX_ENABLE_SAFE_MODE' \
"
2 changes: 1 addition & 1 deletion ci/test/00_setup_env_native_alpine_musl.sh
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
export LC_ALL=C.UTF-8

export CONTAINER_NAME=ci_native_alpine_musl
export CI_IMAGE_NAME_TAG="mirror.gcr.io/alpine:3.23"
export CI_IMAGE_NAME_TAG="mirror.gcr.io/alpine:3.24"
export CI_BASE_PACKAGES="build-base musl-dev pkgconf curl ccache make ninja git python3-dev py3-pip which patch xz procps rsync util-linux bison e2fsprogs cmake dash linux-headers"
export PIP_PACKAGES="--break-system-packages pyzmq pycapnp"
export DEP_OPTS="DEBUG=1"
Expand Down
2 changes: 1 addition & 1 deletion ci/test/00_setup_env_native_asan.sh
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ export LC_ALL=C.UTF-8
export CI_IMAGE_NAME_TAG="mirror.gcr.io/ubuntu:24.04"

# Only install BCC tracing packages in CI. Container has to match the host for BCC to work.
if [[ "${INSTALL_BCC_TRACING_TOOLS}" == "true" ]]; then
if [[ "${INSTALL_BCC_TRACING_TOOLS:-}" == "true" ]]; then
# Required for USDT functional tests to run
BPFCC_PACKAGE="bpfcc-tools linux-headers-$(uname --kernel-release)"
export CI_CONTAINER_CAP="--privileged -v /sys/kernel:/sys/kernel:rw"
Expand Down
2 changes: 1 addition & 1 deletion ci/test/00_setup_env_native_fuzz.sh
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

export LC_ALL=C.UTF-8

export CI_IMAGE_NAME_TAG="mirror.gcr.io/ubuntu:24.04"
export CI_IMAGE_NAME_TAG="mirror.gcr.io/ubuntu:26.04"
export CONTAINER_NAME=ci_native_fuzz
export APT_LLVM_V="22"
export PACKAGES="clang-${APT_LLVM_V} llvm-${APT_LLVM_V} libclang-rt-${APT_LLVM_V}-dev libevent-dev libboost-dev libsqlite3-dev libcapnp-dev capnproto"
Expand Down
2 changes: 1 addition & 1 deletion ci/test/00_setup_env_native_fuzz_with_msan.sh
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

export LC_ALL=C.UTF-8

export CI_IMAGE_NAME_TAG="mirror.gcr.io/ubuntu:24.04"
export CI_IMAGE_NAME_TAG="mirror.gcr.io/ubuntu:26.04"
export APT_LLVM_V="22"
LIBCXX_DIR="/cxx_build/"
export MSAN_FLAGS="-fsanitize=memory -fsanitize-memory-track-origins=2 -fno-omit-frame-pointer -g -O1 -fno-optimize-sibling-calls"
Expand Down
2 changes: 1 addition & 1 deletion ci/test/00_setup_env_native_fuzz_with_valgrind.sh
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

export LC_ALL=C.UTF-8

export CI_IMAGE_NAME_TAG="mirror.gcr.io/debian:trixie"
export CI_IMAGE_NAME_TAG="mirror.gcr.io/ubuntu:26.04"
export CONTAINER_NAME=ci_native_fuzz_valgrind
export PACKAGES="clang llvm libclang-rt-dev libevent-dev libboost-dev libsqlite3-dev valgrind libcapnp-dev capnproto"
export NO_DEPENDS=1
Expand Down
2 changes: 1 addition & 1 deletion ci/test/00_setup_env_native_iwyu.sh
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

export LC_ALL=C.UTF-8

export CI_IMAGE_NAME_TAG="mirror.gcr.io/debian:trixie" # To build codegen, CMake must be 3.31 or newer.
export CI_IMAGE_NAME_TAG="mirror.gcr.io/ubuntu:26.04" # To build codegen, CMake must be 3.31 or newer.
export CONTAINER_NAME=ci_native_iwyu
export IWYU_LLVM_V="22"
export APT_LLVM_V="${IWYU_LLVM_V}"
Expand Down
2 changes: 1 addition & 1 deletion ci/test/00_setup_env_native_msan.sh
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

export LC_ALL=C.UTF-8

export CI_IMAGE_NAME_TAG="mirror.gcr.io/ubuntu:24.04"
export CI_IMAGE_NAME_TAG="mirror.gcr.io/ubuntu:26.04"
export APT_LLVM_V="22"
LIBCXX_DIR="/cxx_build/"
export MSAN_FLAGS="-fsanitize=memory -fsanitize-memory-track-origins=2 -fno-omit-frame-pointer -g -O1 -fno-optimize-sibling-calls"
Expand Down
2 changes: 1 addition & 1 deletion ci/test/00_setup_env_native_tidy.sh
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

export LC_ALL=C.UTF-8

export CI_IMAGE_NAME_TAG="mirror.gcr.io/ubuntu:24.04"
export CI_IMAGE_NAME_TAG="mirror.gcr.io/ubuntu:26.04"
export CONTAINER_NAME=ci_native_tidy
export TIDY_LLVM_V="22"
export APT_LLVM_V="${TIDY_LLVM_V}"
Expand Down
2 changes: 1 addition & 1 deletion ci/test/00_setup_env_native_valgrind.sh
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

export LC_ALL=C.UTF-8

export CI_IMAGE_NAME_TAG="mirror.gcr.io/debian:trixie"
export CI_IMAGE_NAME_TAG="mirror.gcr.io/ubuntu:26.04"
export CONTAINER_NAME=ci_native_valgrind
export PACKAGES="clang llvm libclang-rt-dev valgrind python3-zmq libevent-dev libboost-dev libzmq3-dev libsqlite3-dev libcapnp-dev capnproto python3-pip"
export PIP_PACKAGES="--break-system-packages pycapnp"
Expand Down
2 changes: 1 addition & 1 deletion ci/test/00_setup_env_s390x.sh
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ export LC_ALL=C.UTF-8
export HOST=s390x-linux-gnu
export PACKAGES="python3-zmq"
export CONTAINER_NAME=ci_s390x
export CI_IMAGE_NAME_TAG="mirror.gcr.io/debian:trixie"
export CI_IMAGE_NAME_TAG="mirror.gcr.io/ubuntu:26.04"
export CI_IMAGE_PLATFORM="linux/s390x"
# bind tests excluded for now, see https://github.com/bitcoin/bitcoin/issues/17765#issuecomment-602068547
export TEST_RUNNER_EXTRA="--exclude rpc_bind --exclude feature_bind_extra"
Expand Down
12 changes: 9 additions & 3 deletions ci/test/01_base_install.sh
Original file line number Diff line number Diff line change
Expand Up @@ -62,10 +62,13 @@ if [ -n "$PIP_PACKAGES" ]; then
fi

if [[ -n "${USE_INSTRUMENTED_LIBCPP}" ]]; then
${CI_RETRY_EXE} git clone --depth=1 https://github.com/llvm/llvm-project -b "llvmorg-22.1.3" /llvm-project
${CI_RETRY_EXE} git clone --depth=1 https://github.com/llvm/llvm-project -b "llvmorg-22.1.7" /llvm-project

# LLVM is configured with LIBCXXABI_USE_LLVM_UNWINDER=OFF,
# because libunwind doesn't handle exceptions under MSAN.
# https://github.com/llvm/llvm-project/issues/84348
cmake -G Ninja -B /cxx_build/ \
-DLLVM_ENABLE_RUNTIMES="libcxx;libcxxabi;libunwind" \
-DLLVM_ENABLE_RUNTIMES="libcxx;libcxxabi" \
-DCMAKE_BUILD_TYPE=Release \
-DLLVM_USE_SANITIZER="${USE_INSTRUMENTED_LIBCPP}" \
-DCMAKE_C_COMPILER=clang \
Expand All @@ -86,7 +89,10 @@ fi

if [[ "${RUN_IWYU}" == true ]]; then
${CI_RETRY_EXE} git clone --depth=1 https://github.com/include-what-you-use/include-what-you-use -b clang_"${IWYU_LLVM_V}" /include-what-you-use
(cd /include-what-you-use && patch -p1 < /ci_container_base/ci/test/01_iwyu.patch)
pushd /include-what-you-use
patch -p1 < /ci_container_base/ci/test/01_iwyu.patch
patch -p1 < /ci_container_base/ci/test/02_iwyu_hash.patch
popd
cmake -B /iwyu-build/ -G 'Unix Makefiles' -DCMAKE_PREFIX_PATH=/usr/lib/llvm-"${IWYU_LLVM_V}" -S /include-what-you-use
make -C /iwyu-build/ install "$MAKEJOBS"
fi
Expand Down
44 changes: 44 additions & 0 deletions ci/test/02_iwyu_hash.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
Map std::hash to its providing standard headers.
Backport of https://github.com/include-what-you-use/include-what-you-use/pull/2013
(commit 52f85e1f4d990f55fc6556d543eb051d79364a16) to the clang_22 release
branch. Drop once the upstream fix lands in the IWYU branch tracked by
ci/test/00_setup_env_native_iwyu.sh.

--- a/std_symbol_map.inc
+++ b/std_symbol_map.inc
@@ -1054,12 +1054,27 @@
{ "std::has_unique_object_representations_v", kPrivate, "<type_traits>", kPublic },
{ "std::has_virtual_destructor", kPrivate, "<type_traits>", kPublic },
{ "std::has_virtual_destructor_v", kPrivate, "<type_traits>", kPublic },
+{ "std::hash", kPrivate, "<functional>", kPublic },
+{ "std::hash", kPrivate, "<bitset>", kPublic },
+{ "std::hash", kPrivate, "<coroutine>", kPublic },
+{ "std::hash", kPrivate, "<filesystem>", kPublic },
+{ "std::hash", kPrivate, "<memory>", kPublic },
+{ "std::hash", kPrivate, "<optional>", kPublic },
+{ "std::hash", kPrivate, "<stacktrace>", kPublic },
+{ "std::hash", kPrivate, "<string>", kPublic },
+{ "std::hash", kPrivate, "<string_view>", kPublic },
+{ "std::hash", kPrivate, "<system_error>", kPublic },
+{ "std::hash", kPrivate, "<thread>", kPublic },
+{ "std::hash", kPrivate, "<typeindex>", kPublic },
+{ "std::hash", kPrivate, "<variant>", kPublic },
+{ "std::hash", kPrivate, "<vector>", kPublic },
{ "std::hash<std::basic_stacktrace<:0>>", kPrivate, "<stacktrace>", kPublic },
{ "std::hash<std::basic_string<char, std::char_traits<char>, :0>>", kPrivate, "<string>", kPublic },
{ "std::hash<std::basic_string<char16_t, std::char_traits<char16_t>, :0>>", kPrivate, "<string>", kPublic },
{ "std::hash<std::basic_string<char32_t, std::char_traits<char32_t>, :0>>", kPrivate, "<string>", kPublic },
{ "std::hash<std::basic_string<char8_t, std::char_traits<char8_t>, :0>>", kPrivate, "<string>", kPublic },
{ "std::hash<std::basic_string<wchar_t, std::char_traits<wchar_t>, :0>>", kPrivate, "<string>", kPublic },
+{ "std::hash<std::bitset<:0>>", kPrivate, "<bitset>", kPublic },
{ "std::hash<std::coroutine_handle<:0>>", kPrivate, "<coroutine>", kPublic },
{ "std::hash<std::error_code>", kPrivate, "<system_error>", kPublic },
{ "std::hash<std::error_condition>", kPrivate, "<system_error>", kPublic },
@@ -1069,6 +1084,7 @@
{ "std::hash<std::shared_ptr<:0>>", kPrivate, "<memory>", kPublic },
{ "std::hash<std::stacktrace_entry>", kPrivate, "<stacktrace>", kPublic },
{ "std::hash<std::string_view>", kPrivate, "<string_view>", kPublic },
+{ "std::hash<std::thread::id>", kPrivate, "<thread>", kPublic },
{ "std::hash<std::type_index>", kPrivate, "<typeindex>", kPublic },
{ "std::hash<std::u16string_view>", kPrivate, "<string_view>", kPublic },
{ "std::hash<std::u32string_view>", kPrivate, "<string_view>", kPublic },
4 changes: 2 additions & 2 deletions ci/test/03_test_script.sh
Original file line number Diff line number Diff line change
Expand Up @@ -168,7 +168,7 @@ if [ -n "${CI_LIMIT_STACK_SIZE}" ]; then
fi

if [ -n "$USE_VALGRIND" ]; then
"${BASE_ROOT_DIR}/ci/test/wrap-valgrind.sh"
"${BASE_ROOT_DIR}/ci/test/wrap-valgrind.py"
fi

if [ "$RUN_CHECK_DEPS" = "true" ]; then
Expand Down Expand Up @@ -229,7 +229,7 @@ fi

if [[ "${RUN_IWYU}" == true ]]; then
# TODO: Consider enforcing IWYU across the entire codebase.
FILES_WITH_ENFORCED_IWYU="/src/(((crypto|index|kernel|primitives|script|univalue/(lib|test)|util|zmq)/.*|bench/(block_assemble|connectblock)|common/license_info|node/(blockstorage|interfaces|miner|mining_args|utxo_snapshot)|rpc/mining|clientversion|core_io|signet|init)\\.cpp)"
FILES_WITH_ENFORCED_IWYU="/src/(((bench|crypto|index|kernel|primitives|script|univalue/(lib|test)|util|zmq)/.*|common/license_info|node/(blockstorage|interfaces|miner|mining_args|utxo_snapshot)|rpc/mining|clientversion|core_io|signet|init)\\.cpp)"
jq --arg patterns "$FILES_WITH_ENFORCED_IWYU" 'map(select(.file | test($patterns)))' "${BASE_BUILD_DIR}/compile_commands.json" > "${BASE_BUILD_DIR}/compile_commands_iwyu_errors.json"
jq --arg patterns "$FILES_WITH_ENFORCED_IWYU" 'map(select(.file | test($patterns) | not))' "${BASE_BUILD_DIR}/compile_commands.json" > "${BASE_BUILD_DIR}/compile_commands_iwyu_warnings.json"

Expand Down
Loading
Loading