Skip to content

Commit e974b2e

Browse files
committed
Merge branch 'master' into testing-v25.12rc1
2 parents 4d4fd0e + f32e5c6 commit e974b2e

File tree

83 files changed

+3622
-2099
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

83 files changed

+3622
-2099
lines changed

.github/workflows/ci.yaml

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,86 @@ jobs:
235235
./configure --enable-debugbuild --enable-fuzzing --enable-address-sanitizer --enable-ub-sanitizer --disable-valgrind CC=clang
236236
uv run make -j $(nproc) check-fuzz
237237
238+
check-downgrade:
239+
name: Check we can downgrade the node
240+
runs-on: ubuntu-22.04
241+
needs:
242+
- compile
243+
strategy:
244+
fail-fast: false
245+
matrix:
246+
include:
247+
- CFG: compile-gcc
248+
TEST_DB_PROVIDER: sqlite3
249+
TEST_NETWORK: regtest
250+
VALGRIND: 1
251+
- CFG: compile-gcc
252+
TEST_DB_PROVIDER: postgres
253+
TEST_NETWORK: regtest
254+
- CFG: compile-gcc
255+
TEST_DB_PROVIDER: sqlite3
256+
TEST_NETWORK: liquid-regtest
257+
steps:
258+
- name: Checkout
259+
uses: actions/checkout@v4
260+
261+
- name: Set up Python 3.10
262+
uses: actions/setup-python@v5
263+
with:
264+
python-version: "3.10"
265+
266+
- name: Install uv
267+
uses: astral-sh/setup-uv@v5
268+
269+
- name: Install dependencies
270+
run: |
271+
bash -x .github/scripts/setup.sh
272+
273+
- name: Install bitcoind
274+
env:
275+
TEST_NETWORK: ${{ matrix.TEST_NETWORK }}
276+
run: .github/scripts/install-bitcoind.sh
277+
278+
- name: Download build
279+
uses: actions/download-artifact@v4
280+
with:
281+
name: cln-${{ matrix.CFG }}.tar.bz2
282+
283+
- name: Unpack pre-built CLN
284+
env:
285+
CFG: ${{ matrix.CFG }}
286+
run: |
287+
tar -xaf cln-${CFG}.tar.bz2
288+
289+
- name: Fetch and unpack previous CLN
290+
run: |
291+
mkdir /tmp/old-cln
292+
cd /tmp/old-cln
293+
wget https://github.com/ElementsProject/lightning/releases/download/v25.09/clightning-v25.09-Ubuntu-22.04-amd64.tar.xz
294+
tar -xaf clightning-v25.09-Ubuntu-22.04-amd64.tar.xz
295+
296+
- name: Switch network
297+
if: ${{ matrix.TEST_NETWORK == 'liquid-regtest' }}
298+
run: |
299+
# Loading the network from config.vars rather than the envvar is a terrible idea...
300+
sed -i 's/TEST_NETWORK=regtest/TEST_NETWORK=liquid-regtest/g' config.vars
301+
cat config.vars
302+
303+
- name: Test
304+
env:
305+
SLOW_MACHINE: 1
306+
PYTEST_PAR: 10
307+
TEST_DEBUG: 1
308+
TEST_DB_PROVIDER: ${{ matrix.TEST_DB_PROVIDER }}
309+
TEST_NETWORK: ${{ matrix.TEST_NETWORK }}
310+
LIGHTNINGD_POSTGRES_NO_VACUUM: 1
311+
VALGRIND: ${{ matrix.VALGRIND }}
312+
PREV_LIGHTNINGD: /tmp/old-cln/usr/bin/lightningd
313+
run: |
314+
env
315+
cat config.vars
316+
uv run eatmydata pytest tests/test_downgrade.py -vvv -n ${PYTEST_PAR} ${PYTEST_OPTS}
317+
238318
integration:
239319
name: Test CLN ${{ matrix.name }}
240320
runs-on: ubuntu-22.04
@@ -627,6 +707,7 @@ jobs:
627707
- integration-valgrind
628708
- integration-sanitizers
629709
- min-btc-support
710+
- check-downgrade
630711
if: ${{ always() }}
631712
steps:
632713
- name: Complete
@@ -638,6 +719,7 @@ jobs:
638719
SANITIZERS: ${{ needs['integration-sanitizers'].result }}
639720
DOCS: ${{ needs['update-docs-examples'].result }}
640721
BTC: ${{ needs['min-btc-support'].result }}
722+
CHECK_DOWNGRADE: ${{ needs['check-downgrade'].result }}
641723
run: |
642724
failed=""
643725
for name in $JOB_NAMES; do

.github/workflows/release.yml

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,13 @@ on:
1212
version:
1313
description: 'Release version'
1414
required: true
15+
skip_validation:
16+
description: Skip release validation for untagged commit testing
17+
default: no
18+
type: choice
19+
options:
20+
- yes
21+
- no
1522
create_release:
1623
description: Create a draft release
1724
default: no
@@ -31,6 +38,7 @@ jobs:
3138
uses: actions/checkout@v4
3239
with:
3340
ref: ${{ github.ref }}
41+
fetch-depth: 0
3442

3543
- name: Determine version
3644
run: |
@@ -46,6 +54,7 @@ jobs:
4654
echo "Determined version: $VERSION"
4755
4856
- name: Validate release
57+
if: github.event_name != 'workflow_dispatch' || github.event.inputs.skip_validation != 'yes'
4958
run: tools/check-release.sh --version=${VERSION}
5059

5160
- name: Catpure version output
@@ -55,6 +64,8 @@ jobs:
5564
releases:
5665
name: Releases
5766
needs: check
67+
env:
68+
version: ${{ needs.check.outputs.version }}
5869
runs-on: ubuntu-24.04
5970
strategy:
6071
fail-fast: false # Let each build finish.
@@ -67,6 +78,9 @@ jobs:
6778
steps:
6879
- name: Git checkout
6980
uses: actions/checkout@v4
81+
with:
82+
ref: ${{ github.ref }}
83+
fetch-depth: 0
7084

7185
- name: Build environment setup
7286
run: |
@@ -83,7 +97,13 @@ jobs:
8397
if: contains(matrix.target, 'Ubuntu')
8498

8599
- name: Build release
86-
run: tools/build-release.sh ${{ matrix.target }}
100+
run: |
101+
# Allow build release to execute if manually triggered for testing
102+
if [ "${{ github.event_name }}" == "workflow_dispatch" && github.event.inputs.skip_validation == 'yes' ]; then
103+
tools/build-release.sh ${{ matrix.target }} --force-version "${{ env.version }}" --force-unclean --force-mtime "$(date +%Y-%m-%d)"
104+
else
105+
tools/build-release.sh ${{ matrix.target }}
106+
fi
87107
88108
- name: Upload target artifacts
89109
uses: actions/upload-artifact@v4
@@ -119,6 +139,9 @@ jobs:
119139
steps:
120140
- name: Git checkout
121141
uses: actions/checkout@v4
142+
with:
143+
ref: ${{ github.ref }}
144+
fetch-depth: 0
122145

123146
- name: Download artifact
124147
uses: actions/download-artifact@v4
@@ -138,10 +161,7 @@ jobs:
138161
run: echo "default-key ${{ steps.gpg.outputs.keyid }}" >> ~/.gnupg/gpg.conf
139162

140163
- name: Sign release
141-
run: |
142-
sudo apt-get install -y lowdown
143-
./configure
144-
tools/build-release.sh --without-zip sign
164+
run: tools/build-release.sh --without-zip sign
145165

146166
- name: Upload signed artifact
147167
uses: actions/upload-artifact@v4

.version

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
v25.12rc1
1+
v25.12rc3

CHANGELOG.md

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ All notable changes to this project will be documented in this file.
44

55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
66

7-
## [25.12rc1] - 2025-11-25: "Boltz's Seamless Upgrade Experience"
7+
## [25.12rc2] - 2025-11-28: "Boltz's Seamless Upgrade Experience"
88

99
Release Candidate for Core Lightning v25.12
1010

@@ -16,6 +16,7 @@ This release named by @sangbida
1616
- JSON-RPC: `fundchannel_complete` new parameter `withhold` for zero-conf channels (default false). ([#8546])
1717
- Plugins: `xpay` will now wait if it suspects a payment failure is due to a height disagreement with the final node. ([#8645])
1818
- Tools: `lightning-hsmtool` now supports hsm_secret files using a 12-word mnemonic. ([#8400])
19+
- Tools: `lightningd-downgrade` can downgrade your database from v25.12 to v25.09 if something goes wrong. ([#8702])
1920
- JSON-RPC: `askrene-bias-node`: an RPC command to set a bias on node's outgoing or incoming channels. ([#8608])
2021
- JSON-RPC: `listpeerchannels` `funding` object `withheld` flag, and `listclosedchannels` `funding_withheld` flags, indicating fundchannel_complete was called with the `withheld` parameter true. ([#8546])
2122
- JSON-RPC: `psbt` field in `funding` in listpeerchannels, and `funding_psbt` in listclosedchannels. ([#8546])
@@ -58,9 +59,11 @@ Note: You should always set `allow-deprecated-apis=false` to test for changes.
5859

5960
### Fixed
6061

62+
- lightningd: we could miss tx spends which happened in the past blocks when we restarted. ([#8735])
6163
- lightningd: multiple significant speedups for large nodes, especially preventing "freezes" under exceptionally high load. ([#8677])
6264
 - `xpay` will not try to send too many HTLCs through unknown channels (6, as that is Phoenix's limit) unless it has no choice ([#8537])
6365
 - `xpay` fixed clash with simultaneous payments via routehints and blinded paths. ([#8685])
66+
- `xpay`: error messages no longer incorrectly label intermediate channels as "the invoice's route hint". ([#8741])
6467
- JSON-RPC: `signpsbt` no longer crashes if asked to sign an already-signed PSBT with taproot paths. ([#8546])
6568
 - Offers: require peers for blinded paths to have `option_onion_messages`, due to reports of LND not forwarding our blinded payments correctly. ([#8682])
6669
- Protocol: we now re-transmit unseen funding transactions on startup, for more robustness. ([#8546])
@@ -93,6 +96,10 @@ Note: You should always set `allow-deprecated-apis=false` to test for changes.
9396
- Splicing: Fixed crash when we splice a channel which hasn't been announced yet. ([#8555])
9497
- JSON-RPC: `cancelrecurringinvoice` command to send new "don't expect any more invoice requests" msg to recurring bolt12 invoices. ([#8398])
9598

99+
100+
[#8741]: https://github.com/ElementsProject/lightning/pull/8741
101+
[#8735]: https://github.com/ElementsProject/lightning/pull/8735
102+
[#8702]: https://github.com/ElementsProject/lightning/pull/8702
96103
[#8506]: https://github.com/ElementsProject/lightning/pull/8506
97104
[#8646]: https://github.com/ElementsProject/lightning/pull/8646
98105
[#8546]: https://github.com/ElementsProject/lightning/pull/8546
@@ -131,7 +138,7 @@ Note: You should always set `allow-deprecated-apis=false` to test for changes.
131138
[#8651]: https://github.com/ElementsProject/lightning/pull/8651
132139
[#8561]: https://github.com/ElementsProject/lightning/pull/8561
133140
[#8302]: https://github.com/ElementsProject/lightning/pull/8302
134-
[v25.12rc1]: https://github.com/ElementsProject/lightning/releases/tag/v25.12rc1
141+
[v25.12rc2]: https://github.com/ElementsProject/lightning/releases/tag/v25.12rc2
135142

136143

137144
## [25.09.3] - 2025-11-06: "Hot Wallet Guardian IV"

Makefile

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ $(info Building version $(VERSION))
99
# Next release.
1010
CLN_NEXT_VERSION := v25.12
1111

12+
# Previous release (for downgrade testing)
13+
CLN_PREV_VERSION := v25.09
14+
1215
# --quiet / -s means quiet, dammit!
1316
ifeq ($(findstring s,$(word 1, $(MAKEFLAGS))),s)
1417
ECHO := :
@@ -552,8 +555,8 @@ CHECK_BOLT_PREFIX=--prefix="BOLT-$(BOLTVERSION)"
552555
endif
553556

554557
# Any mention of BOLT# must be followed by an exact quote, modulo whitespace.
555-
bolt-check/%: % bolt-precheck tools/check-bolt
556-
@if [ -d .tmp.lightningrfc ]; then tools/check-bolt $(CHECK_BOLT_PREFIX) .tmp.lightningrfc $<; else echo "Not checking BOLTs: BOLTDIR $(BOLTDIR) does not exist" >&2; fi
558+
bolt-check/%: % bolt-precheck devtools/check-bolt
559+
@if [ -d .tmp.lightningrfc ]; then devtools/check-bolt $(CHECK_BOLT_PREFIX) .tmp.lightningrfc $<; else echo "Not checking BOLTs: BOLTDIR $(BOLTDIR) does not exist" >&2; fi
557560

558561
LOCAL_BOLTDIR=.tmp.lightningrfc
559562

@@ -565,7 +568,7 @@ check-source-bolt: $(ALL_NONGEN_SRCFILES:%=bolt-check/%)
565568
check-whitespace/%: %
566569
@if grep -Hn '[ ]$$' $<; then echo Extraneous whitespace found >&2; exit 1; fi
567570

568-
check-whitespace: check-whitespace/Makefile check-whitespace/tools/check-bolt.c $(ALL_NONGEN_SRCFILES:%=check-whitespace/%)
571+
check-whitespace: check-whitespace/Makefile check-whitespace/devtools/check-bolt.c $(ALL_NONGEN_SRCFILES:%=check-whitespace/%)
569572

570573
check-spelling:
571574
@tools/check-spelling.sh
@@ -934,8 +937,7 @@ TESTBINS = \
934937
$(CLN_PLUGIN_EXAMPLES) \
935938
tests/plugins/test_libplugin \
936939
tests/plugins/channeld_fakenet \
937-
tests/plugins/test_selfdisable_after_getmanifest \
938-
tools/hsmtool
940+
tests/plugins/test_selfdisable_after_getmanifest
939941

940942
# The testpack is used in CI to transfer built artefacts between the
941943
# build and the test phase. This is necessary because the fixtures in
@@ -944,7 +946,7 @@ TESTBINS = \
944946
# version of `lightningd` leading to bogus results. We bundle up all
945947
# built artefacts here, and will unpack them on the tester (overlaying
946948
# on top of the checked out repo as if we had just built it in place).
947-
testpack.tar.bz2: $(BIN_PROGRAMS) $(PKGLIBEXEC_PROGRAMS) $(PLUGINS) $(PY_PLUGINS) $(MAN1PAGES) $(MAN5PAGES) $(MAN7PAGES) $(MAN8PAGES) $(DOC_DATA) config.vars $(TESTBINS) $(DEVTOOLS)
949+
testpack.tar.bz2: $(BIN_PROGRAMS) $(PKGLIBEXEC_PROGRAMS) $(PLUGINS) $(PY_PLUGINS) $(MAN1PAGES) $(MAN5PAGES) $(MAN7PAGES) $(MAN8PAGES) $(DOC_DATA) config.vars $(TESTBINS) $(DEVTOOLS) $(TOOLS)
948950
tar -caf $@ $^
949951

950952
uninstall:

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ Core Lightning (previously c-lightning) is a lightweight, highly customizable an
1111
* [Sending and Receiving Payments](#sending-and-receiving-payments)
1212
* [Configuration File](#configuration-file)
1313
* [Further Information](#further-information)
14-
* [FAQ](doc/FAQ.md)
14+
* [FAQ](doc/node-operators-guide/faq.md)
1515
* [Pruning](#pruning)
1616
* [HD wallet encryption](#hd-wallet-encryption)
1717
* [Developers](#developers)
@@ -198,7 +198,7 @@ If the two blockheights drift apart it might be necessary to intervene.
198198

199199
### HD wallet encryption
200200

201-
You can encrypt the `hsm_secret` content (which is used to derive the HD wallet's master key) by passing the `--encrypted-hsm` startup argument, or by using the `hsmtool` (which you can find in the `tool/` directory at the root of this repo) with the `encrypt` method. You can unencrypt an encrypted `hsm_secret` using the `hsmtool` with the `decrypt` method.
201+
You can encrypt the `hsm_secret` content (which is used to derive the HD wallet's master key) by passing the `--encrypted-hsm` startup argument, or by using the `lightning-hsmtool` (which you can find in the `tool/` directory at the root of this repo) with the `encrypt` method. You can unencrypt an encrypted `hsm_secret` using the `lightning-hsmtool` with the `decrypt` method.
202202

203203
If you encrypt your `hsm_secret`, you will have to pass the `--encrypted-hsm` startup option to `lightningd`. Once your `hsm_secret` is encrypted, you __will not__ be able to access your funds without your password, so please beware with your password management. Also, beware of not feeling too safe with an encrypted `hsm_secret`: unlike for `bitcoind` where the wallet encryption can restrict the usage of some RPC command, `lightningd` always needs to access keys from the wallet which is thus __not locked__ (yet), even with an encrypted BIP32 master seed.
204204

connectd/multiplex.c

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1280,9 +1280,17 @@ static struct io_plan *read_body_from_peer_done(struct io_conn *peer_conn,
12801280
* more verbose: hang up on error. */
12811281
if (type == WIRE_ERROR || type == WIRE_WARNING) {
12821282
char *desc = sanitize_error(tmpctx, decrypted, NULL);
1283-
status_peer_info(&peer->id,
1284-
"Received %s: %s",
1285-
peer_wire_name(type), desc);
1283+
/* FIXME: We should check old gossip, since we get many of
1284+
* these "no unspent txout" for closed channels which we
1285+
* somehow missed. */
1286+
if (strstr(desc, "no unspent txout"))
1287+
status_peer_debug(&peer->id,
1288+
"Received %s: %s",
1289+
peer_wire_name(type), desc);
1290+
else
1291+
status_peer_info(&peer->id,
1292+
"Received %s: %s",
1293+
peer_wire_name(type), desc);
12861294
if (type == WIRE_WARNING)
12871295
return next_read(peer_conn, peer);
12881296
return io_close(peer_conn);
-1.17 KB
Binary file not shown.

contrib/msggen/msggen/schema.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7472,7 +7472,7 @@
74727472
"Value to be decoded:",
74737473
" * a *bolt11* or *bolt12* string (optionally prefixed by `lightning:` or `LIGHTNING:`) as specified by the BOLT 11 and BOLT 12 specifications.",
74747474
" * a *rune* as created by lightning-commando-rune(7).",
7475-
" * an *emergency_recover* string generated by hsmtool like `lightning-hsmtool getemergencyrecover <path/to/emergency.recover>`. It holds `emergency.recover` contents and starts with `clnemerg1`."
7475+
" * an *emergency_recover* string generated by lightning-hsmtool like `lightning-hsmtool getemergencyrecover <path/to/emergency.recover>`. It holds `emergency.recover` contents and starts with `clnemerg1`."
74767476
]
74777477
}
74787478
}
@@ -30511,7 +30511,7 @@
3051130511
"description": [
3051230512
"The **recover** RPC command wipes your node and restarts it with the `--recover` option. This is only permitted if the node is unused: no channels, no bitcoin addresses issued (you can use `check` to see if recovery is possible).",
3051330513
"",
30514-
"*hsmsecret* is either a codex32 secret starting with \"cl1\" as returned by `hsmtool getcodexsecret`, or a raw 64 character hex string.",
30514+
"*hsmsecret* is either a codex32 secret starting with \"cl1\" as returned by `lightning-hsmtool getcodexsecret`, or a raw 64 character hex string.",
3051530515
"",
3051630516
"NOTE: this command only currently works with the `sqlite3` database backend."
3051730517
],
@@ -30524,7 +30524,7 @@
3052430524
"hsmsecret": {
3052530525
"type": "string",
3052630526
"description": [
30527-
"Either a codex32 secret starting with `cl1` as returned by `hsmtool getcodexsecret`, or a raw 64 character hex string."
30527+
"Either a codex32 secret starting with `cl1` as returned by `lightning-hsmtool getcodexsecret`, or a raw 64 character hex string."
3052830528
]
3052930529
}
3053030530
}

contrib/pyln-client/pyln/client/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from .gossmapstats import GossmapStats
55
from .version import NodeVersion
66

7-
__version__ = "v25.12rc1"
7+
__version__ = "v25.12rc3"
88

99
__all__ = [
1010
"LightningRpc",

0 commit comments

Comments
 (0)