1
0
mirror of https://github.com/ACINQ/eclair.git synced 2024-11-20 02:27:32 +01:00
Commit Graph

604 Commits

Author SHA1 Message Date
Bastien Teinturier
453a7c66b1
Trampoline/MPP DB changes (#1287)
With MPP and Trampoline (and particularly the combination of the two),
we need to keep track of multiple amounts, recipients and fees.
There's a trampoline fee and a fee to reach the first trampoline node.
The trampoline nodes must appear in the route, but not as payment recipients.

Adding new fields to payment events and DB structs lets us distinguish those.

We also relax the spec requirement about feature graph dependencies.
The requirement to include `var_onion_optin` in invoice feature bits
was added after the first Phoenix release.
Phoenix users will thus have non spec-compliant invoices in their
payment history.
We accept invoices that don't set this field; this is a harmless
spec violation (as long as we set it in new invoices).
2020-01-29 14:21:41 +01:00
Candle
16456bbce0
Turn off SSL when custom Electrum server address is a hidden service (#1278)
This will let users connect to their own custom Electrum servers that are running behind TOR (once we add proper socks5 proxy support).
2020-01-29 11:16:09 +01:00
Bastien Teinturier
0a66d3f45f
Fix availableForSend/Receive (#1293)
There was a rounding issue with the availableForSend/Receive calculation.
Because CommitTx fee and Htlc fee were computed separately,
but each was individually rounded down to Satoshis, we could
end up with an off-by-one error.

This resulted in an incapacity to send/receive the maximum amount available.
We now allow computing fees in msat, which removes rounding issues.
2020-01-28 14:20:05 +01:00
Fabrice Drouin
d5cdd6ac9b
Channel queries: Encode empty arrays as UNCOMPRESSED (#1292)
c-lightning fails to decode empty arrays of scids or timestamps with an encoding type set to COMPRESSED_ZLIB.
The spec is not specific enough on whether this is valid or not, so we'll set the encoding type of empty arrays to UNCOMPRESSED.
2020-01-28 13:25:49 +01:00
Bastien Teinturier
60359c68e8 Allow deactivating MPP (#1289)
When paying an invoice, we weren't properly checking our own features.
If the invoice supported MPP, we would use it all the time.

If MPP isn't enabled in our features, we now default to a legacy payment.
2020-01-23 15:38:40 +01:00
Fabrice Drouin
5551242ef0 Read fee provider timeout from config correctly (#1288) 2020-01-22 18:52:08 +01:00
Bastien Teinturier
d34d342528
Improve NodeRelayer errors (#1261)
Add new errors that let senders know they need to raise the trampoline fee/ctlv.
When the error is downstream, select the best error to forward.

Implement retry with more fees for trampoline payments.
This process is currently quite manual: the sender decides upfront on
each attempt's fee/cltv.
2020-01-21 17:27:26 +01:00
Fabrice Drouin
a0ae5ef13f
Peer: use a minimum reconnection delay of 200 ms (#1285)
If our initial random deconnnection delay is 0 (unlikely but possible) then all "exponential backoff" reconnection delays will be 0 too, so we set a minimum value of 200 milliseconds.
2020-01-21 17:16:50 +01:00
Bastien Teinturier
ca713ba883
Add networks to init message (#1254) 2020-01-21 13:14:38 +01:00
Dave Scotese
01a30edc3c Better Non-segwit UTXOs assert message. (#1258) 2020-01-21 09:46:25 +01:00
Fabrice Drouin
2c0732e6a3
Make sure that ids chunks strictly cover the requested range, without gaps (#1279)
lnd expects ids ranges in reply_channel_range messages to strictly follow each other, without gaps.
For example, using block heights and not ids, [1,2,4,5] would be split into (first=1, num=2, [1,2]) :: (first=3, num=2, [4, 5])

This is arguably a limitation of lnd (c-lightning does not requires this and it's not needed to properly process replies) but is easy to implement.
2020-01-20 15:33:58 +01:00
Bastien Teinturier
518e56f462
Broadcast gossip regardless of timestamp filters (#1284)
This is needed to make sure we broadcast our own gossip.
Otherwise we will try to gossip at the beginning of the connection,
when the peer hasn't set any timestamp, so our gossip will be dropped.

See https://github.com/lightningnetwork/lightning-rfc/pull/684
2020-01-20 15:32:43 +01:00
Bastien Teinturier
aa137b7da6
MPP: allow using unannounced channels (#1283)
Otherwise eclair-mobile can't pay using MPP.
This heuristic was only here to help Trampoline nodes with a lot of
channels relay using MPP, but we disabled that in #1271 anyway.
We will reactivate Trampoline-MPP once split is done inside the router.
2020-01-17 15:11:26 +01:00
Bastien Teinturier
cb3ed7cde6
Improve error message when invalid funding tx (#1282)
Closes #1281
2020-01-17 13:39:53 +01:00
Anton Kumaigorodski
b81bf20d75 Find htlc by id method (#1266) 2020-01-16 13:16:34 +01:00
Bastien Teinturier
102e2a65d7
Fix Sphinx privacy leak (#1247)
* Final recipient should not collect a fee: see 
https://github.com/lightningnetwork/lightning-rfc/pull/711

* Fix Sphinx small privacy leak: see
https://github.com/lightningnetwork/lightning-rfc/pull/697
2020-01-15 15:48:25 +01:00
Fabrice Drouin
9579127dd0
Electrum improvements (#1164)
ElectrumWatcher: don't ask for Merkle proofs for unconfirmed transactions
2020-01-14 16:33:36 +01:00
Fabrice Drouin
90a1ee6abc
Fix how we split channel ids in channel queries (#1274)
* Add test to check that we split short channel ids correctly

reply_channel_range messages should not overlap i.e different replies should not contain
channel ids that have the same block height.

The test in this commit fails, because our 'split' function needs to be updated.

* Channel Queries: make sure that our replies match the request range (fixes #1269)

Even though it's not completely explicit in the specs, we should make sure that
the [firstBlock, numBlock] range that we cover in our replies is not computed
from the ids that we actually have but instead matches the [firstBlock, numBlock] range
that was requested.

* Make sure that serialised replies stay below the 65Kb limit

We prune short channel id chunks to make sure that serialised replies stay below the 65 Kb limit.
The pruning algo is very simple: for each chunk we randomly keep the first or last 3200 ids
Selection is random so peers that re-connect will eventually receive all channel info.
The limit of 3200 was chosen for the worst case where replies are not compressed and include timestamps and checksum.
It is a fairly conservative boundary, the highest number of public channels in a single block so far is <300, and
there 3200 is roughly the currently observed number of transactions in a "full" block.

* Set default ids chunk size to 1500

Have smaller chunks (smaller than 3200 / 2) reduces the probability of merging 2 chunks and having to prune the result because the encoded reply would be over 65K.

* Smarter algo for enforcing max chunk size policy

Instead of keeping either the first or last items, we use a random offset. This way peers will eventually receive info about all channels even if chunks are much larger than the max chunk size and are pruned.
2020-01-14 14:28:51 +01:00
Pierre-Marie Padiou
d3a2998998
Always encode empty list of scids as uncompressed (#1276)
For compatibility with c-lightning & lnd.

This is a simpler alternative to #1275.
2020-01-14 11:22:15 +01:00
Bastien Teinturier
c496a2264d
Avoid sending PaymentSecret/MPP in Init (#1273)
There is currently a backwards-compatibility issue with eclair-mobile.
Eclair-mobile mistakes feature bit 15 (payment_secret) for the
gossip_queries_ex prototype (which is incompatible with the spec-ed version).

To temporarily avoid this issue (until eclair-mobile is patched and all users have updated),
we never advertize those ambiguous bits in Init.
They're only really needed in the invoice so it's ok.
2020-01-10 15:57:01 +01:00
Fabrice Drouin
34740fbdc2
Restore missing 'db.close()' methods (#1272)
* Db: restore missing 'close' methods

They are used by the mobile applications.
2020-01-10 14:37:37 +01:00
Bastien Teinturier
72338ab58d
Flat features (#1253)
Implement https://github.com/lightningnetwork/lightning-rfc/pull/666

Keep the global/local split in Commitments to avoid backwards incompatibility in the codec.
Remove allowMultiPart API field: we instead rely on the MPP feature being set in nodeParams.
That means MPP-enabled nodes need to update their reference.conf.

Rework features:

* Add types to allow cleaner dependency validation.
* Most of the time we don't care whether a feature is activated as optional or mandatory, which caused duplicate code. This is now handled more cleanly.
* It also paves the way to annotate features with the places they should be advertised (Init vs NodeAnn vs ChannelAnn vs invoice).
2020-01-09 13:47:43 +01:00
Bastien Teinturier
dbb6c8ffdf
Disable Trampoline-MPP to non-Phoenix recipients (#1271)
This is safer for now since the splitting algorithm isn't working
well on nodes with a large number of channels and we don't
expect too many payments from Phoenix to non-Phoenix to
actually need MPP in the short term.
2020-01-08 16:47:01 +01:00
Bastien Teinturier
6773eda0ab
Remove mockito from switchboard tests (#1267)
Mockito sometimes throws an unnecessary stubbing exception, it's unclear whether the test is faulty or mockito has issues with our parallel setup.

Rewrite switchboard tests without mockito makes them more flexible.
In case they randomly fail we should get more useful data to help troubleshooting.
2020-01-07 16:49:38 +01:00
Pierre-Marie Padiou
5d3c85984e
More consistency in sending messages during sync (#1268)
Instead of sending messages to the connection actor, we put them in a
list and send during transitions, like it's done elsewhere in the
channel actor.
2020-01-07 16:44:51 +01:00
Anton Kumaigorodski
7362f33a8a Remove repeated code (#1265)
Small refactoring of common tasks in channel management.
2019-12-24 13:06:45 +01:00
Bastien Teinturier
80b642089a
Improve CommandSend type (#1260)
Add type with upper bound to make `asInstanceOf` unnecessary.
Split `HasHtlcId` from `Command`: they are orthogonal traits.
2019-12-18 16:39:20 +01:00
Bastien Teinturier
611f0cfebe
Relay Trampoline payments (#1220)
Start relaying trampoline payments with multi-part aggregation (disabled by default,
must be enabled with config).
Recovery after a restart is correctly handled, even if payments were being forwarded.
No DB schema update in this commit.

The trampoline UX will be somewhat bad because many improvements/polish are missing.
Some shortcuts were taken, a few hacks here and there need to be fixed, but nothing too scary.
Those improvements will be done in separate commits before the next release.
2019-12-18 14:34:52 +01:00
Dominique
709e3f416a Add synchronization when locking database connection (#1200)
* Exclusive lock on eclair.sqlite method is now synchronized
* Close SQL connections if connection creation fails
2019-12-12 09:22:17 +01:00
Anton Kumaigorodski
7460f3b0d8 Add HasHtlcIdCommand trait (#1245) 2019-12-11 14:40:22 +01:00
Pierre-Marie Padiou
e1c48ebda1
Better randomization of reconnection delay (#1250)
Randomization is necessary, otherwise if two peers attempt to reconnect
to each other in a synchronized fashion, they will enter in a
disconnect-reconnect loop.

We already had randomization for the initial reconnection attempt, but
further reconnection attempts were using a deterministic schedule
following an exponential backoff curve.

Fixes #1238.
2019-12-11 14:16:48 +01:00
Pierre-Marie Padiou
e2d472a08e
Minor: missing log category in peer (#1241) 2019-12-11 14:03:30 +01:00
Bastien Teinturier
27a68a4898
MPP: don't retry if failure comes from final recipient (#1246) 2019-12-11 13:53:53 +01:00
Pierre-Marie Padiou
6ffd35f8a7
Minor: ignore "disconnecting" message in Channel (#1231)
This message is sent by the `Peer` in answer to a `Peer.Disconnect` command.
2019-12-10 13:40:38 +01:00
Fabrice Drouin
b6f922f3c3
Add a configurable time-out to onchain fee provider requests (#1244)
* Add a configurable time-out to onchain fee provider requests

We configure a timeout of 5 seconds, applicable to all fee providers. If a provider times out we switch to the next one in our list.
Our mobile app needs a feerate to start properly and currently waits too long when a fee provider is online but very slow to respond.
2019-12-09 16:18:12 +01:00
Bastien Teinturier
b6511ad904
Fix MPP flaky test (#1243)
We can't guarantee with the current algorithm that the last HTLC won't be
a small one (the leftovers).
If we see that happen in real scenario, we'll need to add heuristics to avoid it.
2019-12-09 14:12:27 +01:00
Pierre-Marie Padiou
be7429fad4
added blank lines to minimize conflicts (#1236)
See
https://about.gitlab.com/blog/2015/02/10/gitlab-reduced-merge-conflicts-by-90-percent-with-changelog-placeholders/
2019-12-06 14:23:56 +01:00
Dominique
f5a626686f
Fix outgoing payments order in payments overview (#1232)
Using the `max()` aggregating function on outgoing payments' 
timestamps, we can ensure that the non-aggregated columns 
for the outgoing payments contain the most recent/pertinent data.
2019-12-04 17:29:55 +01:00
Pierre-Marie Padiou
167d65bc36
Added a 'category' in logs (#1227)
Also added paymentHash to MDC context
2019-12-04 14:17:56 +01:00
Bastien Teinturier
12f95ca8f5
Handle chain re-org in balance computation (#1228)
If a chain re-org happens and a new ShortChannelId is assigned,
the `Relayer` kept both entries (new and old).

This resulted in an incorrect balance because we effectively counted this channel twice.
2019-12-02 16:15:56 +01:00
Bastien Teinturier
215be94640
Fix onion codec test (#1229)
While #1222 was being reviewed, a new unit test was added to OnionCodecsSpec.
It didn't cause any file conflict so Github didn't warn about merging #1222.
However this test needed to be updated to the new truncated int format.
2019-12-02 11:40:22 +01:00
Dominique
fd5d9aec0a
High level payments overview method (#1225)
Add a method to fetch a high level/high performance overview of the 
payments from the payment database.
2019-12-02 11:35:34 +01:00
Bastien Teinturier
20380b2991
Rework truncated integers codecs (#1212)
The spec defines tu64 (and friends) without the length prefix.
Multi-part uses a tu64 without a length prefix inside the PaymentData record.

Our previous implementation only supported using tu64 alone in a TLV record.
We make this more flexible by separating the length encoding.
2019-12-02 11:06:47 +01:00
Pierre-Marie Padiou
b5f993c1ab
Extended doHandle to other messages in MultiPartHandler (#1226) 2019-11-29 17:03:26 +01:00
Bastien Teinturier
d1342eb072
Avoid incoherent payment request features. (#1222)
MPP implies payment secret.
Avoid raising exceptions in PaymentInitiator: validate invoice instead of using a require.
This way senders always get a response.
2019-11-29 10:43:23 +01:00
Bastien Teinturier
631336ed84
Fix MPP post-restart HTLC clean-up (#1224)
We previously had some logic where we would fail incoming HTLCs
for which we were the final recipient when a channel would come online.

That made sense when we didn't have MPP, but with MPP we cannot do that.
There is a risk that we would be failing HTLCs that are considered received by the MPP FSM.
Instead we need to use the CommandBuffer when we are the final recipient.
This way pending commands cannot be lost and HTLCs are cleaned-up on restart.
2019-11-28 18:06:29 +01:00
Pierre-Marie Padiou
0937af3a0b
Improved tracing of single/multi-part payments (#1218)
This includes a bit of refactoring in `MultiPartPaymentLifecycle`. Note
that we can't use the `onTermination` handler to finish the spans,
because it is asynchronous and may not be called after a long time.
That's why we use a dedicated `myStop` function.

In Kamon 2.0, by default spans are automatically generated for tracked
actors, which we don't want because we define our own spans. That's why
there is an additional configuration in `application.conf`.
2019-11-22 11:57:28 +01:00
n1bor
ff3aefa45e Add networkstats API call to allow display of network stats (#1221) 2019-11-22 09:58:08 +01:00
Bastien Teinturier
321ecef35c
MPP routing improvements (#1219)
MPP split/retry improvements:
* Only use public channels when sending to remote node
* Don't retry when sending to direct peer
* Blacklist channels that are a bad route prefix
2019-11-21 09:29:49 +01:00
Bastien Teinturier
c76cc5bfe6
PaymentLifecycle should tell the router to ignore route prefix (#1217)
When paying a multi-part payment, we tell the PaymentLifecycle to use a route prefix that contains the first hop (for example a -> b via channel 1).

We need to also tell the router to ignore the nodes that are in the route prefix, otherwise when retrying it may try some completely dumb routes that have no chance of succeeding.
2019-11-18 15:25:38 +01:00