1
0
mirror of https://github.com/ACINQ/eclair.git synced 2024-11-20 18:50:43 +01:00
Commit Graph

515 Commits

Author SHA1 Message Date
Pierre-Marie Padiou
ff0b4c81e6
Add monitoring with Kamon (disabled by default) (#1126)
For now:
- we only track some tasks (especially in the router, but not even
`node_announcement` and `channel_update`
- all db calls are monitored
- kamon is disabled by default
2019-09-06 14:37:26 +02:00
Bastien Teinturier
7a50610e48
Router computes network stats (#1116)
* Add comments and fix warnings in graph processing
* Add small feature to set the htlcMaximumMsat for routing hints (otherwise the graph processing algorithm used a minimum value which slightly reduced the benefits of those routing hints)
* Add the computation of network statistics to the router: this will be useful for multi-part payments to decide what thresholds should be used to split a payment
2019-09-06 09:39:23 +00:00
Bastien Teinturier
0bc77f23c5
Activate support for variable-length onion (#1087)
This is now enabled by default.
We forward variable-length onions if we receive some.
We accept variable-length payments.
However for maximum compatibility with the network, we send payments using legacy payloads.
2019-09-05 15:41:45 +00:00
Pierre-Marie Padiou
4bea8551f0
Made sync params configurable (#1124)
This allows us to choose smaller parameters for tests and reduce cpu
requirement during testing.

NB: The default value of 3500 for `reply_channel_range` was wrong. Theoretical max is ~2700.
2019-09-05 12:46:28 +02:00
Bastien Teinturier
e73e672fbf
Reject expired invoices before payment flow starts (#1117) 2019-09-04 12:22:21 +00:00
Bastien Teinturier
c28be0fc23
Implement Bolt 11 invoice feature bits (#1121)
lightningnetwork/lightning-rfc#656 introduced invoice feature bits as a pre-requisite for AMP and other advanced payment use-cases.
2019-09-04 11:38:00 +00:00
araspitzu
5607b81572
Use Long to back the UInt64 type (#1109)
* Use Long to back the UInt64 type

* Define comparison operators between UInt64 and MilliSatoshi
2019-09-04 11:57:11 +02:00
Bastien Teinturier
abe7470401
Fix build (#1115)
A new file was added that used the removed failure code.
Since this was a new file, Github didn't
detect a merge conflicts.
2019-09-02 08:53:36 +00:00
Bastien Teinturier
2ec9e47d1c
Bolt4: remove final_expiry_too_soon error message (#1106)
It allowed probing attacks and the spec deprecated it in favor of IncorrectOrUnknownPaymentDetails.
Also add better support for unknown failure messages.
2019-09-02 08:06:44 +00:00
Pierre-Marie Padiou
9507ba99fa
Fix regression in Commitments.availableForSend (#1107)
We must consider `nextRemoteCommit` when applicable.

This is a regression caused in #784. The core bug only exists when we
have a pending unacked `commit_sig`, but since we only send the
`AvailableBalanceChanged` event when sending a signature (not when
receiving a revocation), actors relying on this event to know the
current available balance (e.g. the `Relayer`) will have a wrong
value in-between two outgoing sigs.
2019-08-30 18:44:26 +02:00
araspitzu
74af0304bd
Move http APIs to subproject eclair-node (#1102)
* Move Service and FormParamExtractor to eclair-node

* Move dependency akka-http-json4s into eclair-node

* Move json serializers to eclair-node
2019-08-30 09:44:24 +02:00
Pierre-Marie Padiou
d67ba48fc0
Add a sync whitelist (#954)
We will only sync with whilelisted peer. If the whitelist is empty then
we sync with everyone.
2019-08-29 12:50:37 +02:00
araspitzu
8d1354a21d
Use unsigned comparison for 'maxHtlcValueInFlightMsat' (#1105)
* Use unsigned comparison for HtlcValueTooHighInFlight
2019-08-29 11:58:10 +02:00
Bastien Teinturier
46e4873562
Add more numeric utilities to MilliSatoshi (#1103)
Add comparisons and postfix operators.
Update most of the codebase to leverage those.
2019-08-29 07:19:01 +00:00
Pierre-Marie Padiou
8f7a415f5a
Rework router data structures (#902)
Instead of using two separate maps (for channels and channel_updates), we now use a single map, which groups channel+channel_updates. This is also true for data storage, resulting in the removal of the channel_updates table.
2019-08-28 16:58:49 +02:00
Pierre-Marie Padiou
2f42538660
Extended queries optional (#899)
This is the implementation of https://github.com/lightningnetwork/lightning-rfc/pull/557.

* Correctly handle multiple channel_range_replies

The scheme we use to keep tracks of channel queries with each peer would forget about
missing data when several channel_range_replies are sent back for a single channel_range_queries.

* RoutingSync: remove peer entry properly

* Remove peer entry on our sync map only when we've received
a `reply_short_channel_ids_end` message.
* Make routing sync test more explicit

* Routing Sync: rename Sync.count to Sync.totalMissingCount

* Do not send channel queries if we don't want to sync

* Router: clean our sync state when we (re)connect to a peer

We must clean up leftovers for the previous session and start the sync process again.

* Router: reset sync state on reconnection

When we're reconnected to a peer we will start a new sync process and should reset our sync
state with that peer.

* Extended Queries: use TLV format for optional data

Optional query extensions now use TLV instead of a custom format.
Flags are encoded as varint instead of bytes as originally proposed. With the current proposal they will all fit on a single byte, but will be
much easier to extends this way.

* Optional TLVs are represented as a list, not an optional list

TLVs that extend regular LN messages can be represented as a TlvStream and not an Option[TlvStream] since we don't need
to explicitely terminate the stream (either by preprending its length or using a specific terminator) as we do in Onion TLVs.

No TLVs simply means that the TLV stream is empty.

* TLV Stream: Implement a generic "get" method for TLV fields

If a have a TLV stream of type MyTLV which is a subtype of TLV, and MyTLV1 and MYTLV2 are both
subtypes of MyTLV then we can use stream.get[MyTLV1] to get the TLV record of type MYTLV1 (if any)
in our TLV stream.

* Use extended range queries on regtest and testnet

We will use them on mainnet as soon as https://github.com/lightningnetwork/lightning-rfc/pull/557 has been merged.

* Channel range queries: send back node announcements if requested (#1108)

This PR adds support for sending back node announcements when replying to channel range queries:
- when explicitly requested (bit is set in the optional query flag)
- when query flags are not used and a channel announcement is sent (as per the BOLTs)

A new configuration option `request-node-announcements` has been added in the `router` section. If set to true, we
will request node announcements when we receive a channel id (through channel range queries) that we don't know of.
This is a setting that we will probably turn off on mobile devices.

* Extended Channel Queries: add CL interop test
2019-08-28 15:03:55 +02:00
Bastien Teinturier
0b18abfc54
Typed cltv expiry (#1104)
Untyped cltv expiry was confusing: delta and absolute expiries really need to be handled differently.
Even variable names were sometimes misleading.
Now the compiler will help us catch errors early.
2019-08-26 13:15:33 +00:00
Pierre-Marie Padiou
a406d2fcea
Publish transactions during transitions (#1089)
Follow up to #1082.

The goal is to be able to publish transactions only after we have
persisted the state. Otherwise we may run into corner cases like [1]
where a refund tx has been published, but we haven't kept track of it
and generate a different one (with different fees) the next time.

As a side effect, we can now remove the special case that we were
doing when publishing the funding tx, and remove the `store` function.

NB: the new `calling` transition method isn't restricted to publishing
transactions but that is the only use case for now.

[1] https://github.com/ACINQ/eclair-mobile/issues/206
2019-08-26 15:02:56 +02:00
Fabrice Drouin
290ac3dbb2
Route computation: fix fee check (#1101)
* Route computation: fix fee check

Fee check during route computation is:
- fee is below maximum value
- OR fee is below amout * maximum percentage

The second check was buggy and route computation would failed when fees we above maximum value but below maximum percentage of amount being paid.
2019-08-20 15:56:56 +02:00
araspitzu
4929febbd1
Typed amounts (#1088)
* Type all amounts used in eclair

* Add eclair.MilliSatoshi class

* Use bitcoin-lib 0.14

* Add specialized codecs for Satoshi/MilliSatoshi

* Rename 'toSatoshi' to 'truncateToSatoshi' to highlight it's a precision-losing conversion
2019-08-07 17:37:38 +02:00
araspitzu
648415771e
Update list of commands in eclair-cli help (#1091)
* Add missing API endpoints to eclair-cli help
2019-07-29 10:32:05 +02:00
araspitzu
d88d376cf0
Use correct cost comparison when evaluating candidate channels (#1090)
* Use correct cost comparison when evaluating if the amount we're sending is within the range htlcMinimumMsat/htlcMaximumMsat of the candidate channel
2019-07-26 17:15:08 +02:00
araspitzu
131f50adf4
Configurable transaction confirmation target (#1083)
* Use feeEstimator in NodeParams, remove all calls to Globals.feeratePerKw

* Introduce FeeConf object and config block for confirmation targets, remove unused 'smartfeeNBlocks'

* Use a custom confirmation target for commitment transaction

* Use a custom confirmation target for funding transaction

* Use custom confirmation target for mutual close transaction

* Use custom confirmation target for claim transactions

* Add confirmation target block 144

* Use block target = 12 as default for claim transactions
2019-07-25 19:06:18 +02:00
Pierre-Marie Padiou
e62adf2dea
Made using/storing/sending consistent (#1082)
We know can now do `goto(STATE) using DATA storing() sending msg1 msg2`.
2019-07-24 10:03:44 +02:00
Bastien Teinturier
93d9369f90
Variable-length onion payloads (#976)
Add support for variable-length onion payloads at the Sphinx (cryptographic) layer.
This is currently unused as we keep using the legacy format by default (this will be changed in a later commit).
This commit also refactors quite heavily the Sphinx file.
2019-07-23 12:22:29 +02:00
Bastien Teinturier
189b11e9bf
Handle fulfill not acked upstream (#1079)
When we want to fulfill an HTLC but the upstream peer is unresponsive, we must close the channel if we get too close to the HTLC timeout on their side.
Otherwise we risk an on-chain race condition between our HTLC success transaction and their HTLC timeout transaction, which could result in a loss of funds.
2019-07-23 11:11:40 +02:00
Pierre-Marie Padiou
00df431472
Replace traits by bitfield for ChannelVersion (#1073)
We now store the channel version on a 8B bitfield prefixed by `0x01`
2019-07-15 13:11:20 +02:00
Bastien Teinturier
62946a0426
Switch varint codec to big-endian. (#1075) 2019-07-15 11:55:40 +02:00
Pierre-Marie Padiou
c1a7b4fe50
Added a channel version to Commitments object (#1059)
In a backward-compatible way, by using the fact that the first object of
a legacy `Commitments` was a public key, starting from 0x02 or 0x03.
2019-07-12 13:36:33 +02:00
Bastien Teinturier
1621e393dd
TLV improvements and full spec compatibility (#1069)
This PR adds support for truncated integers as defined in the spec.
The test vectors are updated to include all test vectors from rusty's spec PR.
It also provides many changes to the tlv and tlv stream classes:

- The tlv trait doesn't need a type field, the codec should handle that
- A TLV stream should be scoped to a specific subtrait of tlv
- Stream validation is done inside the codec instead of the tlv stream: it makes it more convenient for application layers to create tlv streams and manipulate them
2019-07-11 17:25:14 +02:00
araspitzu
5f4a2ebf3e
Wrap all routes in toStrictEntity (#1032)
* Wrap all routes in toStrictEntity
2019-07-09 16:49:55 +02:00
Fabrice Drouin
7d89dd01a1
Electrum: update checkpoints (#1067)
Checkpoints generated on July 9th 2019
2019-07-09 16:00:18 +02:00
Pierre-Marie Padiou
e5c5a4cfbc
Handle unknown fields in network announcements (#1047)
All the data contained in `node_announcement`, `channel_announcement`
and `channel_update` is to be included in the signature, including
unknown trailing fields. We were ignoring them, causing signature
verification to fail when there was unknown fields.

In the case of `channel_update` there is a backward compatibility issue
to handle, because when persisting channel data in state `NORMAL`, we
used to store the `channel_update` followed by other data, and without
prefixing it with size information.

To work around that we use the same trick as before, based on an
additional discriminator codec.
2019-07-08 17:14:01 +02:00
Bastien Teinturier
22548733e6
Add a few improvements to tlv. (#1065)
Hide some internals (tlvFallback, generictlv codecs).
Add a length-prefixed tlv stream codec.
2019-07-08 10:05:18 +02:00
Pierre-Marie Padiou
683294ee57
Use a RelayResult class instead of an Either (#1064)
It is functionnaly the same but it's cleaner and removes the need for
tuples in the success case.
2019-07-04 14:06:05 +02:00
Fabrice Drouin
bbe07c2c42
Set version to 0.3.2-SNAPSHOT (#1062) 2019-07-04 10:00:44 +02:00
Fabrice Drouin
6906ecb403
Set version to v0.3.1 (#1061) 2019-07-03 17:23:12 +02:00
araspitzu
20ea9d0e1d
Reject payments for expired invoices (#1057)
* Reject payments for expired invoices
2019-07-03 15:52:03 +02:00
Pierre-Marie Padiou
32145e8d6a
Connect immediately on restart, then wait (#1040)
* connect immediately on restart, then wait

This is to allow herd effect when we restart the app and have numerous
peers.

Also removed the unnecessary transition and cleaned up delay
computation.

* always reconnect immediately when disconnected

Whether we go to this state from startup, or after getting disconnected.

It makes the transition logic simpler, and the potential herd effect at
startup is inevitable anyway since our peers will try to reconnect too.

* add randomization when reconnecting

* randomize delay for first reconnection attempt after startup

* make some parameters configurable
2019-07-03 13:15:20 +02:00
Pierre-Marie Padiou
f724efaa76
Close the channel if the funding tx never confirms (#1034)
If we are fundee and after 5 days the funding isn't even in the mempool,
then we give up waiting and consider the channel closed. Note that if
the funding tx stays unconfirmed forever we won't give up waiting.

If we are funder, we never give up until the funding tx is double spent,
and we periodically republish it.

This applies to states `WAIT_FOR_FUNDING_CONFIRMED` and `CLOSING` (and
also `OFFLINE`/`SYNCING` when underlying state is
`WAIT_FOR_FUNDING_CONFIRMED`).

Also, added a generic way of passing context to `ElectrumClient`
requests/responses.

Fixes #1029.
2019-07-03 12:00:00 +02:00
araspitzu
667444cd0e
Check 'initialblockdownload' from bitcoind during startup (#1058) 2019-07-02 17:31:53 +02:00
Bastien Teinturier
1cc14aeda3
Add TLV and TLV stream codec support (#1045)
TLV (tag-length-value) types and TLV streams have been defined in the following spec PR: https://github.com/lightningnetwork/lightning-rfc/pull/607

New Lightning Messages should use TLV extensively instead of ad-hoc per-message encoding. This also allows ignoring unknown odd TLV types, which lets implementers safely test new features on mainnet without impacting legacy nodes. It also allows type re-use which speeds up new features development.

Also cleaned-up and refactored common codecs.
2019-07-02 11:53:14 +02:00
Anton Kumaigorodski
c4f07e8742 Add more data to usablebalances API method (#1053)
Now it additionally returns remote `nodeId` and `shortChannelId` for each channel. Also negative balances are represented as `0`s.
2019-07-02 11:20:02 +02:00
Anton Kumaigorodski
a35d50d4c8 Add balances API method (#962)
Currently balances can be obtained from `channels` call but this requires a lot of work on caller side and also some specific knowledge (reserves, commit tx fee, in-flight payments), so this new `balances` endpoint only returns a correct balance info for each channel.
2019-06-26 12:05:51 +02:00
araspitzu
de50cc437e Remove old service and related docs (#1046) 2019-06-24 17:46:55 +02:00
Pierre-Marie Padiou
316ba02ff8
Ack unhandled lightning messages (#1042)
In the event when we receive an unexpected message, the `Peer` was just logging a warning and not sending an `Ack` to the `TransportHandler`. This resulted in a stuck connection, because no more data was read on the connection.

Fixes #1037.
2019-06-20 11:40:01 +02:00
Pierre-Marie Padiou
38696b56e4
Minor fixes (#1043)
* fixed javadoc

* make bitcoind only bind on localhost for tests
2019-06-19 11:36:30 +02:00
Bastien Teinturier
a53145a6da
Electrum: add data to TxIdFromPosResponse. (#1038)
To make the response usable, we need to copy the request input (block height and transaction position).
2019-06-17 12:10:10 +02:00
Anton Kumaigorodski
cb1196cf95 Correctly decode requests without multipliers (#1020)
Since MAX_PAYMENT_AMOUNT has been removed we may now get payment requests without multiplier which means a whole bitcoin is requested.
2019-06-14 15:01:10 +02:00
Pierre-Marie Padiou
a3563e38bb
Removed cached codec (#1036)
It turns out that performance gains of the cached codec are not that
great, and they come at a cost of significant pressure on the GC. In
other words: premature optimization.

When removed, the heap usage becomes very stable, which is much better
than hypothetical performance gains.

Fixes #1031.
2019-06-14 14:04:15 +02:00