What changed, and why it matters
This commit simply updates Eclair's required Bitcoin Core version from 29.x to 30.2. It changes documentation, download URLs, SHA-256 checksums, and a runtime version check. There is no security vulnerability in this change itself.
No security action required. Operators should ensure their Bitcoin Core node is upgraded to version 30.x before deploying this Eclair release, as required by the updated assertion.
Security signals we found
No strong security signals were identified.
Evidence from the diff
The commit bumps the minimum supported Bitcoin Core version from 29.0.0 to 30.0.0. Changes include: README and release notes updates; Maven profile properties updated to download Bitcoin Core 30.2 for Linux, macOS, and Windows with corresponding SHA-256 hashes; Setup.scala assertion updated from >= 290000 to >= 300000; and the integration test BitcoindService path updated from bitcoin-29.2 to bitcoin-30.2. No code logic affecting transaction handling, cryptography, networking, or authentication was modified.
Changed components
README.mddocs/release-notes/eclair-vnext.mdeclair-core/pom.xmleclair-core/src/main/scala/fr/acinq/eclair/Setup.scalaeclair-core/src/test/scala/fr/acinq/eclair/blockchain/bitcoind/BitcoindService.scalaInspect captured patch +14 / −9
diff --git a/README.md b/README.md
index 4aaccf4..fbe2255 100644
--- a/README.md
+++ b/README.md
@@ -62,7 +62,7 @@ This means that instead of re-implementing them, Eclair benefits from the verifi
* Eclair needs a _synchronized_, _segwit-ready_, **_zeromq-enabled_**, _wallet-enabled_, _non-pruning_, _tx-indexing_ [Bitcoin Core](https://github.com/bitcoin/bitcoin) node.
* You must configure your Bitcoin node to use `bech32` or `bech32m` (segwit) addresses. If your wallet has "non-segwit UTXOs" (outputs that are neither `p2sh-segwit`, `bech32` or `bech32m`), you must send them to a `bech32` or `bech32m` address before running Eclair.
-* Eclair requires Bitcoin Core 29 or higher. If you are upgrading an existing wallet, you may need to create a new address and send all your funds to that address.
+* Eclair requires Bitcoin Core 30 or higher. If you are upgrading an existing wallet, you may need to create a new address and send all your funds to that address.
Run bitcoind with the following minimal `bitcoin.conf`:
diff --git a/docs/release-notes/eclair-vnext.md b/docs/release-notes/eclair-vnext.md
index 453f5e9..026b348 100644
--- a/docs/release-notes/eclair-vnext.md
+++ b/docs/release-notes/eclair-vnext.md
@@ -4,6 +4,11 @@
## Major changes
+### Update minimal version of Bitcoin Core
+
+With this release, eclair requires using Bitcoin Core 30.x.
+Newer versions of Bitcoin Core may be used, but have not been extensively tested.
+
### Remove support for non-anchor channels
We remove the code used to support legacy channels that don't use anchor outputs or taproot.
diff --git a/eclair-core/pom.xml b/eclair-core/pom.xml
index ebc7e78..1090062 100644
--- a/eclair-core/pom.xml
+++ b/eclair-core/pom.xml
@@ -87,8 +87,8 @@
<activeByDefault>true</activeByDefault>
</activation>
<properties>
- <bitcoind.url>https://bitcoincore.org/bin/bitcoin-core-29.2/bitcoin-29.2-x86_64-linux-gnu.tar.gz</bitcoind.url>
- <bitcoind.sha256>1fd58d0ae94b8a9e21bbaeab7d53395a44976e82bd5492b0a894826c135f9009</bitcoind.sha256>
+ <bitcoind.url>https://bitcoincore.org/bin/bitcoin-core-30.2/bitcoin-30.2-x86_64-linux-gnu.tar.gz</bitcoind.url>
+ <bitcoind.sha256>6aa7bb4feb699c4c6262dd23e4004191f6df7f373b5d5978b5bcdd4bb72f75d8</bitcoind.sha256>
</properties>
</profile>
<profile>
@@ -99,8 +99,8 @@
</os>
</activation>
<properties>
- <bitcoind.url>https://bitcoincore.org/bin/bitcoin-core-29.2/bitcoin-29.2-x86_64-apple-darwin.tar.gz</bitcoind.url>
- <bitcoind.sha256>69ca05fbe838123091cf4d6d2675352f36cf55f49e2e6fb3b52fcf32b5e8dd9f</bitcoind.sha256>
+ <bitcoind.url>https://bitcoincore.org/bin/bitcoin-core-30.2/bitcoin-30.2-x86_64-apple-darwin.tar.gz</bitcoind.url>
+ <bitcoind.sha256>99d5cee9b9c37be506396c30837a4b98e320bfea71c474d6120a7e8eb6075c7b</bitcoind.sha256>
</properties>
</profile>
<profile>
@@ -111,8 +111,8 @@
</os>
</activation>
<properties>
- <bitcoind.url>https://bitcoincore.org/bin/bitcoin-core-29.2/bitcoin-29.2-win64.zip</bitcoind.url>
- <bitcoind.sha256>83f90a5bab1fc30849862aa1db88906b91e0730b78993c085f9e547a1c3cce79</bitcoind.sha256>
+ <bitcoind.url>https://bitcoincore.org/bin/bitcoin-core-30.2/bitcoin-30.2-win64.zip</bitcoind.url>
+ <bitcoind.sha256>0d7e1f16f8823aa26d29b44855ff6dbac11c03d75631a6c1d2ea5fab3a84fdf8</bitcoind.sha256>
</properties>
</profile>
</profiles>
diff --git a/eclair-core/src/main/scala/fr/acinq/eclair/Setup.scala b/eclair-core/src/main/scala/fr/acinq/eclair/Setup.scala
index 8a32f5e..771c11c 100644
--- a/eclair-core/src/main/scala/fr/acinq/eclair/Setup.scala
+++ b/eclair-core/src/main/scala/fr/acinq/eclair/Setup.scala
@@ -195,7 +195,7 @@ class Setup(val datadir: File,
await(getBitcoinStatus(bitcoinClient), 30 seconds, "bitcoind did not respond after 30 seconds")
}
logger.info(s"bitcoind version=${bitcoinStatus.version}")
- assert(bitcoinStatus.version >= 290000, "Eclair requires Bitcoin Core 29 or higher")
+ assert(bitcoinStatus.version >= 300000, "Eclair requires Bitcoin Core 30 or higher")
bitcoinStatus.unspentAddresses.foreach { address =>
val isSegwit = addressToPublicKeyScript(bitcoinStatus.chainHash, address).map(script => Script.isNativeWitnessScript(script)).getOrElse(false)
assert(isSegwit, s"Your wallet contains non-segwit UTXOs (e.g. address=$address). You must send those UTXOs to a segwit address to use Eclair (check out our README for more details).")
diff --git a/eclair-core/src/test/scala/fr/acinq/eclair/blockchain/bitcoind/BitcoindService.scala b/eclair-core/src/test/scala/fr/acinq/eclair/blockchain/bitcoind/BitcoindService.scala
index 7b6d3b8..6ca2a7a 100644
--- a/eclair-core/src/test/scala/fr/acinq/eclair/blockchain/bitcoind/BitcoindService.scala
+++ b/eclair-core/src/test/scala/fr/acinq/eclair/blockchain/bitcoind/BitcoindService.scala
@@ -62,7 +62,7 @@ trait BitcoindService extends Logging {
val PATH_BITCOIND = sys.env.get("BITCOIND_DIR") match {
case Some(customBitcoinDir) => new File(customBitcoinDir, "bitcoind")
- case None => new File(TestUtils.BUILD_DIRECTORY, "bitcoin-29.2/bin/bitcoind")
+ case None => new File(TestUtils.BUILD_DIRECTORY, "bitcoin-30.2/bin/bitcoind")
}
logger.info(s"using bitcoind: $PATH_BITCOIND")
val PATH_BITCOIND_DATADIR = new File(INTEGRATION_TMP_DIR, "datadir-bitcoin")
Why this scored 15/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.