* Fix eclair-cli to work with equal sign in arguments (#926) * Fix eclair cli argument passing * Modify eclair-cli to work with equals in arguments * Eclair-cli: show usage when wrong params are received * Remove deprecated call from eclair-cli help message [ci skip] * Make Electrum tests pass on windows (#932) There was an obscure Docker error when trying to start an Electrum server in tests. [1] It appears that there is a conflict between Docker and Hyper-V on some range of ports. A workaround is to just change the port we were using. [1] https://github.com/docker/for-win/issues/3171 * API: fix fee rate conversion (#936) Our `open` API calls expects an optional fee rate in satoshi/byte, which is the most widely used unit, but failed to convert to satoshi/kiloweight which is the standard in LN. We also check that the converted fee rate cannot go below 253 satoshi/kiloweight. * Expose the websocket over HTTP GET to work properly with basic auth (#934) * Expose the websocket over HTTP GET * Add test for basic auth over websocket endpoint * Set max payment attempts from configuration (#931) With a default to `5`. * Add a proper payments database (#885) There is no unique identifier for payments in LN protocol. Critically, we can't use `payment_hash` as a unique id because there is no way to ensure unicity at the protocol level. Also, the general case for a "payment" is to be associated to multiple `update_add_htlc`s, because of automated retries. We also routinely retry payments, which means that the same `payment_hash` will be conceptually linked to a list of lists of `update_add_htlc`s. In order to address this, we introduce a payment id, which uniquely identifies a payment, as in a set of sequential `update_add_htlc` managed by a single `PaymentLifecycle` that ends with a `PaymentSent` or `PaymentFailed` outcome. We can then query the api using either `payment_id` or `payment_hash`. The former will return a single payment status, the latter will return a set of payment statuses, each identified by their `payment_id`. * Add a payment identifier * Remove InvalidPaymentHash channel exception * Remove unused 'close' from paymentsDb * Introduce sent_payments in PaymentDB, bump db version * Return the UUID of the ongoing payment in /send API * Add api to query payments by ID * Add 'fallbackAddress' in /receive API * Expose /paymentinfo by paymentHash * Add id column to audit.sent table, add test for db migration * Add invoices to payment DB * Add license header to ExtraDirective.scala * Respond with HTTP 404 if the corresponding invoice/paymentHash was not found. * Left-pad numeric bolt11 tagged fields to have a number of bits multiple of five (bech32 encoding). * Add invoices API * Remove CheckPayment message * GUI: consume UUID reply from payment initiator * API: reply with JSON encoded response if the queried element wasn't found * Return a payment request object in /receive * Remove limit of pending payment requests! * Avoid printing "null" fields when serializing an invoice to json * Add index on paymentDb.sent_payments.payment_hash * Order results in descending order in listPaymentRequest * Electrum: do not persist transaction locks (#953) Locks held on utxos that are used in unpublished funding transactions should not be persisted. If the app is stopped before the funding transaction has been published the channel is forgotten and so should be locks on its funding tx utxos. * Added a timeout for channel open request (#928) Until now, if the peer is unresponsive (typically doesn't respond to `open_channel` or `funding_created`), we waited indefinitely, or until the connection closed. It translated to an API timeout for users, and uncertainty about the state of the channel. This PR: - adds an optional `--openTimeoutSeconds` timeout to the `open` endpoint, that will actively cancel the channel opening if it takes too long before reaching state `WAIT_FOR_FUNDING_CONFIRMED`. - makes the `ask` timeout configurable per request with a new `--timeoutSeconds` - makes the akka http timeout slightly greater than the `ask` timeout Ask timeout is set to 30s by default. * Set `MAX_BUFFERED` to 1,000,000 (#948) Note that this doesn't mean that we will buffer 1M objects in memory: those are just pointers to (mostly) network announcements that already exist in our routing table. Routing table has recently gone over 100K elements (nodes, announcements, updates) and this causes the connection to be closed when peer requests a full initial sync. * Fix Dockerfile maven binary checksum (#956) The Maven 3.6.0 SHA256 checksum was invalid and caused the docker build to fail. * Add channel errors in audit db (#955) We now keep track of all local/remote channel errors in the audit db. * Added simple plugin support (#927) Using org.clapper:classutil library and a very simple `Plugin` interface. * Live channel database backup (#951) * Backup running channel database when needed Every time our channel database needs to be persisted, we create a backup which is always safe to copy even when the system is busy. * Upgrade sqlite-jdbc to 3.27.2.1 * BackupHandler: use a specific bounded mailbox BackupHandler is now private, users have to call BackupHandler.props() which always specifies our custom bounded maibox. * BackupHandler: use a specific threadpool with a single thread * Add backup notification script Once a new backup has been created, call an optional user defined script. * Update readme with bitcoin 0.17 instructions (#958) This has somehow been missed by PR #826. * Backup: explicitely specify move options (#960) * Backup: explicitely specify move options We now specify that we want to atomically overwrite the existing backup file with the new one (fixes a potential issue on Windows). We also publish a specific notification when the backup process has been completed. * Print stack trace when crashing during boot sequence (#949) * Print stack trace when crashing during boot sequence * Use friendly message when db compatibility check fails * ElectrumWallet should not send ready if syncing (#963) This commit is already embedded in version `0.2-android-beta22`. * Channel: Log additional data (#943) * Channel: Log additional data Log local channel parameters, and our peer's open or accept message. This should be enough to recompute keys needed to recover funds in case of unilateral close. * Electrum: make debug logs shorter (#964) * Better handling of closed channels (#944) * Remove closed channels when application starts If the app is stopped just after a channel has transition from CLOSING to CLOSED, when the application starts again if will be restored as CLOSING. This commit checks channel data and remove closed channels instead of restoring them. * Channels Database: tag closed channels but don't delete them Instead we add a new `closed` column that we check when we restore channels. * Document how we check and remove closed channels on startup * Do not print the stacktrace on stderr when there is an error at boot (#966) * Do not print the stacktrace on stdout when there is an error at boot * Fix flaky test in PaymentLifecycleSpec (#967) * Use local random pamentHash for each test in paymentlifecyclespec, intercept the route request before the router. * Rename `eclair.bak` to `eclair.sqlite.bak` (#968) This removes any ambiguity about what the content of the file is about. * Fixed concurrency issue in `IndexedObservableList` (#961) Update map with new indexes after element is removed Fixes #915 * Various fix and improvements in time/timestamp handling (#971) This PR standardizes the way we compute the current time as unix timestamp - Scala's Platform is used and the conversion is done via scala's concurrent.duration facilities - Java's Instant has been replaced due to broken compatibility with android - AuditDB events use milliseconds (fixes #970) - PaymentDB events use milliseconds - Query filters for AuditDB and PaymentDB use seconds * API: Support query by `channelId` or `shortChannelId` everywhere (#969) Add support for querying a channel information by its `shortChannelId`. * Smarter strategy for sending `channel_update`s (#950) The goal is to prevent sending a lot of updates for flappy channels. Instead of sending a disabled `channel_update` after each disconnection, we now wait for a payment to try to route through the channel and only then reply with a disabled `channel_update` and broadcast it on the network. The reason is that in case of a disconnection, if noone cares about that channel then there is no reason to tell everyone about its current (disconnected) state. In addition to that, when switching from `SYNCING`->`NORMAL`, instead of emitting a new `channel_update` with flag=enabled right away, we wait a little bit and send it later. We also don't send a new `channel_update` if it is identical to the previous one (except if the previous one is outdated). This way, if a connection to a peer is unstable and we keep getting disconnected/reconnected, we won't spam the network. The extra delay allows us to remove the change made in #888, which was a workaround in case we generated `channel_update` too quickly. Also, increased refresh interval from 7 days to 10 days. There was no need to be so conservative. Note that on startup we still need to re-send `channel_update` for all channels in order to properly initialize the `Router` and the `Relayer`. Otherwise they won't know about those channels, and e.g. the `Relayer` will return `UnknownNextPeer` errors. But we don't need to create new `channel_update`s in most cases, so this should have little or no impact to gossip because our peers will already know the updates and will filter them out. On the other hand, if some global parameters (like relaying fees) are changed, it will cause the creation a new `channel_update` for all channels. * Fixed overflow issue with max duration (#975) This is a regression caused by #971, because `Duration` has a max value of `Long.MaxValue` *nanoseconds*, not *seconds*. * Use proper closing type in `ChannelClosed` event (#977) There was actually a change introduced by #944 where we used `ClosingType.toString` instead of manually defining types, causing a regression in the audit database. * Update bash autocompletion for eclair-cli (#983) * Update bash autocompletition file to suggest all the endpoints * Update list of commands in eclair-cli help message * Replace `UnknownPaymentHash` and `IncorrectPaymentAmount` with `IncorrectOrUnknownPaymentDetails` (#984) See https://github.com/lightningnetwork/lightning-rfc/pull/516 and https://github.com/lightningnetwork/lightning-rfc/pull/544 * Wireshark dissector support (#981) * Transport: add support for encryption key logging. This is the format the wireshark lightning-dissector uses to be able to decrypt lightning messages. * Enrich test for internal eclair API implementation (fr.acinq.eclair.Eclair.scala) (#938) * Add test to EclairImpl for `/send`, `/allupdates` and `/forceclose/` * Set default chain to "mainnet" (#989) Eclair is now configured to run on mainnet by default. * Set tcp client timeout to 20s (#990) So that it fails before the ask/api time out. * Add bot support for code coverage (codecov) (#982) * Add scoverage-maven-plugin dependency * Update travis build to generate a scoverage report * Add custom codecov configuration to have nice PR comments * Add badge for test coverage in readme * Accept `commit_sig` without changes (#988) LND sometimes sends a new signature without any changes, which is a (harmless) spec violation. Note that the test was previously not failing because it wasn't specific enough. The test now fails and has been ignored. * Ignore subprojects eclair-node/eclair-node-gui in the codecov report (#991) * Use bitcoind fee estimator first (#987) * use bitcoind fee provider first * set default `smooth-feerate-window`=6 * Configuration: increase fee rate mismatch threshold We wil accept fee rates that up to 8x bigger or smaller than our local fee rate * Updated license header (#992) * Release v0.3 (#994) * gui: include javafx native libraries for windows, mac, linux * Release v0.3 * Set version to 0.3.1-SNAPSHOT * Improved test coverage of `io` package (#996) * improved test coverage of `NodeURI` * improved test coverage of `Peer` * Fix TextUI * BackupHandler: use renameTo() on Android Most Path methods are not available at our current API level |
||
---|---|---|
.github | ||
.readme | ||
contrib | ||
eclair-core | ||
eclair-node | ||
.codecov.yml | ||
.dockerignore | ||
.gitignore | ||
.travis.yml | ||
BUILD.md | ||
Dockerfile | ||
LICENSE | ||
OLD-API-DOCS.md | ||
pom.xml | ||
README.md | ||
TOR.md |
Eclair (French for Lightning) is a Scala implementation of the Lightning Network. It can run with or without a GUI, and a JSON API is also available.
This software follows the Lightning Network Specifications (BOLTs). Other implementations include c-lightning and lnd.
🚧 Both the BOLTs and Eclair itself are still a work in progress. Expect things to break/change!
🚨 If you run Eclair on mainnet (which is the default setting):
- Keep in mind that it is beta-quality software and don't put too much money in it
- Eclair's JSON API should NOT be accessible from the outside world (similarly to Bitcoin Core API)
Lightning Network Specification Compliance
Please see the latest release note for detailed information on BOLT compliance.
Overview
JSON API
Eclair offers a feature rich HTTP API that enables application developers to easily integrate.
For more information please visit the API documentation website.
⚠️ You can still use the old API by setting the eclair.api.use-old-api=true
parameter, but it is now deprecated and will soon be removed. The old documentation is still available here.
Installation
Configuring Bitcoin Core
⚠️ Eclair requires Bitcoin Core 0.17.1 or higher. If you are upgrading an existing wallet, you need to create a new address and send all your funds to that address.
Eclair needs a synchronized, segwit-ready, zeromq-enabled, wallet-enabled, non-pruning, tx-indexing Bitcoin Core node.
Eclair will use any BTC it finds in the Bitcoin Core wallet to fund any channels you choose to open. Eclair will return BTC from closed channels to this wallet.
You can configure your Bitcoin Node to use either p2sh-segwit
addresses or bech32
addresses, Eclair is compatible with both modes.
Run bitcoind with the following minimal bitcoin.conf
:
server=1
rpcuser=foo
rpcpassword=bar
txindex=1
zmqpubrawblock=tcp://127.0.0.1:29000
zmqpubrawtx=tcp://127.0.0.1:29000
Installing Eclair
Eclair is developed in Scala, a powerful functional language that runs on the JVM, and is packaged as a JAR (Java Archive) file. We provide 2 different packages, which internally use the same core libraries:
- eclair-node, which is a headless application that you can run on servers and desktops, and control from the command line
- eclair-node-gui, which also includes a JavaFX GUI
To run Eclair, you first need to install Java, we recommend that you use OpenJDK 11. Eclair will also run on Oracle JDK 1.8, Oracle JDK 11, and other versions of OpenJDK but we don't recommend using them.
Then download our latest release and depending on whether or not you want a GUI run the following command:
- with GUI:
java -jar eclair-node-gui-<version>-<commit_id>.jar
- without GUI:
java -jar eclair-node-<version>-<commit_id>.jar
Configuring Eclair
Configuration file
Eclair reads its configuration file, and write its logs, to ~/.eclair
by default.
To change your node's configuration, create a file named eclair.conf
in ~/.eclair
. Here's an example configuration file:
eclair.node-alias=eclair
eclair.node-color=49daaa
Here are some of the most common options:
name | description | default value |
---|---|---|
eclair.chain | Which blockchain to use: regtest, testnet or mainnet | mainnet |
eclair.server.port | Lightning TCP port | 9735 |
eclair.api.enabled | Enable/disable the API | false. By default the API is disabled. If you want to enable it, you must set a password. |
eclair.api.port | API HTTP port | 8080 |
eclair.api.password | API password (BASIC) | "" (must be set if the API is enabled) |
eclair.bitcoind.rpcuser | Bitcoin Core RPC user | foo |
eclair.bitcoind.rpcpassword | Bitcoin Core RPC password | bar |
eclair.bitcoind.zmqblock | Bitcoin Core ZMQ block address | "tcp://127.0.0.1:29000" |
eclair.bitcoind.zmqtx | Bitcoin Core ZMQ tx address | "tcp://127.0.0.1:29000" |
eclair.gui.unit | Unit in which amounts are displayed (possible values: msat, sat, bits, mbtc, btc) | btc |
Quotes are not required unless the value contains special characters. Full syntax guide here.
→ see reference.conf
for full reference. There are many more options!
Java Environment Variables
Some advanced parameters can be changed with java environment variables. Most users won't need this and can skip this section.
⚠️ Using separate datadir
is mandatory if you want to run several instances of eclair on the same machine. You will also have to change ports in eclair.conf
(see above).
name | description | default value |
---|---|---|
eclair.datadir | Path to the data directory | ~/.eclair |
eclair.headless | Run eclair without a GUI | |
eclair.printToConsole | Log to stdout (in addition to eclair.log) |
For example, to specify a different data directory you would run the following command:
java -Declair.datadir=/tmp/node1 -jar eclair-node-gui-<version>-<commit_id>.jar
Logging
Eclair uses logback
for logging. To use a different configuration, and override the internal logback.xml, run:
java -Dlogback.configurationFile=/path/to/logback-custom.xml -jar eclair-node-gui-<version>-<commit_id>.jar
Backup
The files that you need to backup are located in your data directory. You must backup:
- your seed (
seed.dat
) - your channel database (
eclair.sqlite.bak
under directorymainnet
,testnet
orregtest
depending on which chain you're running on)
Your seed never changes once it has been created, but your channels will change whenever you receive or send payments. Eclair will
create and maintain a snapshot of its database, named eclair.sqlite.bak
, in your data directory, and update it when needed. This file is
always consistent and safe to use even when Eclair is running, and this is what you should backup regularly.
For example you could configure a cron
task for your backup job. Or you could configure an optional notification script to be called by eclair once a new database snapshot has been created, using the following option:
eclair.backup-notify-script = "/absolute/path/to/script.sh"
Make sure that your script is executable and uses an absolute path name for eclair.sqlite.bak
.
Note that depending on your filesystem, in your backup process we recommend first moving eclair.sqlite.bak
to some temporary file
before copying that file to your final backup location.
Docker
A Dockerfile image is built on each commit on docker hub for running a dockerized eclair-node.
You can use the JAVA_OPTS
environment variable to set arguments to eclair-node
.
docker run -ti --rm -e "JAVA_OPTS=-Xmx512m -Declair.api.binding-ip=0.0.0.0 -Declair.node-alias=node-pm -Declair.printToConsole" acinq/eclair
If you want to persist the data directory, you can make the volume to your host with the -v
argument, as the following example:
docker run -ti --rm -v "/path_on_host:/data" -e "JAVA_OPTS=-Declair.printToConsole" acinq/eclair
Plugins
For advanced usage, Eclair supports plugins written in Scala, Java, or any JVM-compatible language.
A valid plugin is a jar that contains an implementation of the Plugin interface.
Here is how to run Eclair with plugins:
java -jar eclair-node-<version>-<commit_id>.jar <plugin1.jar> <plugin2.jar> <...>
Testnet usage
Eclair is configured to run on mainnet by default, but you can still run it on testnet (or regtest): start your Bitcoin Node in
testnet mode (add testnet=1
in bitcoin.conf
or start with -testnet
), and change Eclair's chain parameter and Bitcoin RPC port:
eclair.chain=testnet
eclair.bitcoind.rpcport=18332
You may also want to take advantage of the new configuration sections in bitcoin.conf
to manage parameters that are network specific,
so you can easily run your bitcoin node on both mainnet and testnet. For example you could use:
server=1
txindex=1
[main]
rpcuser=<your-mainnet-rpc-user-here>
rpcpassword=<your-mainnet-rpc-password-here>
zmqpubrawblock=tcp://127.0.0.1:29000
zmqpubrawtx=tcp://127.0.0.1:29000
[test]
rpcuser=<your-testnet-rpc-user-here>
rpcpassword=<your-testnet-rpc-password-here>
zmqpubrawblock=tcp://127.0.0.1:29001
zmqpubrawtx=tcp://127.0.0.1:29001
Resources
- [1] The Bitcoin Lightning Network: Scalable Off-Chain Instant Payments by Joseph Poon and Thaddeus Dryja
- [2] Reaching The Ground With Lightning by Rusty Russell
- [3] Lightning Network Explorer - Explore testnet LN nodes you can connect to