1
0
Fork 0
mirror of https://github.com/ACINQ/eclair.git synced 2025-02-24 14:50:46 +01:00
Commit graph

1396 commits

Author SHA1 Message Date
Pierre-Marie Padiou
633deb5c0b
Send an event when an error occurs in a channel (#663)
This allows e.g. the mobile app to know why a channel got closed.
Depending on whether the error is local or remote, a
`Throwable`/`wire.Error` will be attached to the event.
2018-07-18 14:45:12 +02:00
Chris Stewart
fe82641e92 Clean up ExecutionContext/ActorSystem (#652)
This allows for a user of the library to implicitly pass the `ActorSystem` to the eclair node. Although if you are running multiple eclair instances on the same machine you need to make sure the `ActorSystems` that are passed implicitly are unique.
2018-07-16 14:25:20 +02:00
Fabrice Drouin
fef0df7607
Use "unsigned long" comparison for short channel ids (#656) 2018-07-16 12:18:38 +02:00
Fabrice Drouin
9f708acf04
Improve initial routing sync (#453)
* Implement new 'routing sync' messages

* add a new feature bit for channel queries

when we receive their init message and check their features:
- if they set `initial_routing_sync` and `channel_range_queries` we do nothing, we should receive a
range query shorly
- if they support channel range queries we send a range query

* Modify query_short_channel_id to ask for a range of ids

And not just a single id

* use `SortedMap` to store channel announcements

* don't send prune channels with channel range queries

* update range queries type to match BOLT PR

* add timestamp-based filters for gossip messages

each peer can speficy a `timestamp range` to filter gossip messages against.

* don't preserve order in `decodeShortChannelIds`

It is not needed and allows us to return a `Set`, which is better suited
to how we use the result.

* channel range queries: handle multi-message responses

Handle case where there are too many short ids to fit in a single message.

* channel range queries: use zlib instead of gzip

but detect when a message was encoded with gzip and reply with gzip in that case.

* router: add more channel range queries logs

* Channel range queries: correctly set firstBlockNum and numberOfBlocks fields

* channel range queries: properly handle case where there is no data

we will just receive on byte (compression format)

* channel range queries: use their compression format to query channels

when we query channels with `query_short_channel_ids`, we now use the same compression
format as in their `repy_channel_range` message. So we should be able to communicate
with peers that have not implemented all compression formats.

* router: make sure that channel ids are sorted

For channel range queries to work properly, channel ids need to be sorted.
It is then much more efficient to use a sorted map in our router state.

* always use `keySet` instead of `keys`

`SortedMap`.`keySet` returns a `SortedSet`, whereas `SortedMap`.`keys`
returns an `Iterable`. This is a critical difference because channel
range queries has requirements on ordering of channel ids.

Using the former allows us to rely on type guarantees instead of on
assumptions that the `Iterable` is sorted in `ChannelRangeQueries`.

There is no cost difference as internally the `Iterator` is actually a
`SortedSet`.

Also, explicitely specified the type instead of relying on comments in
`Router`.

* publish channel update event on router startup

* channel range queries: use uint32 for 4-byte integers (and not int32)

* channel range queries: make sure we send at least one reply to `query_channel_range`

reply to `query_channel_range` messages for which we have no matching channel ids
with a single `reply_channel_range` that contains no channel ids.

* channel range queries: handle `query_channel_range` cleanly

add an explicit test when we have no matching channel ids and send back a reply with an
empty (uncompressed) channel ids payload

* channel range queries: rename GossipTimeRange to GossipTimestampFilter

* channel range queries: add gossip filtering test

* peer: forward all routing messages to the router

and not just channel range queries. this should not break anything and if
it does it would reveal a problem

* peer: add remote node id to messages sent to the router

this will improve logging and debugging and will help if we implement
banning strategies for mis-behaving peers

* router: filter messages with a wrong chainHash more cleanly

* channel range queries: set a "pass-all" timestamp filter

* router: remove useless pattern match

ChannelUpdates are wapped in a PeerRoutingMessage now

* Peer: fit typo in comment

* Peer: optimize our timestamp filter

* Router: use mdc to log remote node id when possible

* fix typos and improve log message formatting

* Peer: rephrase scala doc comment that breaks travis

* Peer: improve timestamp filtering + minor fixes

* Electrum tests: properly stop actor system at the end of the test

* Peer: filter out node announcements against our peer's timestamp

But we don't prune node annoucements for which we don't have a matching
channel in the same "rebroadcast" message
2018-07-12 21:36:57 +02:00
Pierre-Marie Padiou
5ea623ae8c
Relay payments to channel with highest balance (#648)
* relay htlcs to channels with the highest balance

In order to reduce unnecessary back-and-forth in case an outgoing
channel doesn't have enough capacity but another one has, the relayer
can now forward a payment to a different channel that the one specified
in the onion (to the same node of course).

If this preferred channel returns an error, then we will retry to the original
requested channel, this way if it fails again, the sender will always receive 
an error for the channel she requested.
2018-07-09 12:36:11 +02:00
nayuta-gondo
5ad65063a0 Set MIN_CLTV_EXPIRY to 9 as per BOLT 11 (#650) 2018-07-09 11:17:32 +02:00
Pierre-Marie Padiou
86e91f76fc
Added context to logs (#638)
* improved logs on sig sent/received

* put 'sent announcements' log in debug

* added logging of IN/OUT wire messages

* added mdc support to IO classes

* reduced package length to 24 chars in logs
2018-07-02 18:25:19 +02:00
Fabrice Drouin
923d8661f8
Electrum: add wallet and watcher tests (via Docker) (#592)
* add basic electrum wallet test

our wallet connects to a dockerized electrumx server

* electrum: clean up tests, and add watcher docker tests

* electrum wallet: fix balance computation issue

when different keys produced the exact same confirmed + unconfirmed balances, we
would compute an invalid balance because these duplicates would be pruned.

* electrum: rename wallet test

* electrum: add a specific test with identical outputs

* electrum: change scripthash balance logging level to debug

* electrum: make docker tests run on windows/mac

Our electrumx docker container needs to contains to bitcoind that is running on the host.
On linux we use the host network mode, which is not available on windows/osx
On windows/osx we use host.docker.internal, which is not available on linux. This
requires docker 18.03 or higher.
2018-06-27 14:34:02 +02:00
sstone
a74a62b359
Revert "electrum: make docker tests run on windows/mac"
This reverts commit eecddcb340.
2018-06-27 14:26:00 +02:00
sstone
eecddcb340
electrum: make docker tests run on windows/mac
Our electrumx docker container needs to contains to bitcoind that
    is running on the host.
    On linux we use the host network mode, which is not available on windows/osx
    On windows/osx we use host.docker.internal, which is not available on linux. This
    requires docker 18.03 or higher.

    electrum: change scripthash balance logging level to debug

    electrum: add a specific test with identical outputs

    electrum: rename wallet test

    electrum wallet: fix balance computation issue

    when different keys produced the exact same confirmed + unconfirmed balances, we
    would compute an invalid balance because these duplicates would be pruned.

    electrum: clean up tests, and add watcher docker tests

    add basic electrum wallet test

    our wallet connects to a dockerized electrumx server
2018-06-26 23:12:48 +02:00
Dominique
2d829d40eb
Can generate payment request with extra routing information (#637)
* `ReceivePayment` now accepts additional routing info, which is useful for nodes that are not announced on the network but still want to receive funds.
2018-06-26 18:35:22 +02:00
rorp
71e50520ec Proper parsing of public-ips config parameter
* Fix scala.NotImplementedError when public-ips config parameter contains invalid values

* more comprehensive validations

* fix unit tests

This fixes #630
2018-06-26 18:15:01 +02:00
sstone
cd6524e25b
set version to 0.2-SNAPSHOT 2018-06-20 09:45:09 +02:00
sstone
8aa51f4e02
set version to 0.2-beta5 2018-06-20 09:21:05 +02:00
Pierre-Marie Padiou
a9348f0774
Check when relay fee is insufficient (#634)
We should return a `FeeInsufficient` error when an incoming htlc doesn't
pay us what we require in our latest `channel_update`.

Note that the spec encourages us to being a bit more lax than that (BOLT
7):

> SHOULD accept HTLCs that pay an older fee, for some reasonable time
after sending channel_update.

>    Note: this allows for any propagation delay.
2018-06-19 16:58:40 +02:00
n1bor
b7b9f4929a Add api call to update channel relay fees (#620)
* add api call to update channel relay fees

* fixed bug in GUI, as channel can had different fees in each direction!

* fire transitions on `TickRefreshChannelUpdate` (fixes #621)

* make router publish `channel_update`s on startup

* (gui) Channel info fees are now options and case where channels have no known fees data is now properly handled.
2018-06-19 14:09:37 +02:00
n1bor
b3731adabd Adding ability to set expiry when creating a new invoice (#632) 2018-06-19 13:13:07 +02:00
Fabrice Drouin
5afd9fa035
Add missing BOLT 2 checks (fixes #613) (#618)
* rename InvalidDustLimit to DustLimitTooSmall
* make sure that our reserve is above our dust limit
* check that their accept message is valid

see BOLT 2:
- their channel reserve must be above their dust limit
- their channel reserve must be above our dust limit
- their dust limit must be below our reserve

* channel: check to_local and to_remote amounts againt channel_reserve_satoshis

see BOLT 2: The receiving node MUST fail the channel if both to_local and to_remote amounts for
the initial commitment transaction are less than or equal to channel_reserve_satoshis (see BOLT 3).

* channel: check that their open.max_accepted_htlcs is valid
2018-06-18 19:06:14 +02:00
Fabrice Drouin
3a38c734ed
Routing: remove final CLTV expiry check on outgoing HTLCs (#627)
Checking the final CLTV expiry makes sense when we receive a payment, but
not when we're sending one
2018-06-14 10:28:45 +02:00
sstone
a85ba9ceef
set version to 0.2-SNAPSHOT 2018-05-30 19:15:06 +02:00
sstone
e6fe077582
set version to 0.2-beta4 2018-05-30 19:11:44 +02:00
Dominique
e1b884c58d Add server address in ElectrumReady object (#556)
* Added server address in ElectrumReady object

* Assigned remote address to variable to improve readability

* Checking that the master address exists in the addresses map
2018-05-30 18:53:07 +02:00
Anton Kumaigorodski
d75788039a Inform clients about incoming payments via websocket connection (#610) 2018-05-30 15:20:55 +02:00
Fabrice Drouin
3bf8db3f26
Set a minimum feerate-per-kw of 253 (fixes #602) (#608)
* set a minimum feerate-per-kw of 253 (fixes #602)

why 253 and not 250 since feerate-per-kw is feerate-per-kb / 250 and the minimum relay fee rate is 1000 satoshi/Kb ?

because bitcoin core uses neither the actual tx size in bytes or the tx weight to check fees, but a "virtual size" which is (3 * weight) / 4 ...

so we want :
fee > 1000 * virtual size
feerate-per-kw * weight > 1000 * (3 * weight / 4)
feerate_per-kw > 250 + 3000 / (4 * weight)

with a conservative minimum weight of 400, we get a minimum feerate_per-kw of 253

* set minimum fee rate to 2 satoshi/byte

users can still change it to 1 satoshi/byte

* use better weight estimations when computing fees

* test that tx fees are above min-relay-fee

* check that remote fee updates are above acceptable minimum

we need to check that their fee rate is always above our absolute minimum threshold
or we will end up with unrelayable txs

* fix ClaimHtlcSuccessTx weight computation

* channel tests: use actual minimum fee rate

test with our absolute minimum fee rate (253), it should be valid and anything below
sould be invalid and trigger and specific error
2018-05-30 13:38:40 +02:00
Fabrice Drouin
7b5b665fe9
Update electrum testnet server list, and fix flaky client pool tests (#609)
* electrum: update testnet server list

* electrum: filter out onion addresses

* electrum pool test: wait until we have a stable master server
2018-05-25 11:47:23 +02:00
araspitzu
db43747d2b Filter out non-spendable outputs from bitcoind 'listunspent' call during setup (#605)
Fixes #599
2018-05-22 12:36:01 +02:00
pm47
644b4a2a98
back to SNAPSHOT 2018-05-18 15:53:02 +02:00
pm47
1dd8aa5aab
set version to 0.2-beta3 2018-05-18 15:14:52 +02:00
Fabrice Drouin
75437cbe81
electrum wallet: fix balance computation issue (#600)
Electrum wallet: fix balance computation issue
2018-05-18 12:58:48 +02:00
Gustavo Fernandes
f983160288 Increase startup timeout (#577) (#590) 2018-05-18 11:55:53 +02:00
Fabrice Drouin
3058ce343d
Update Sphinx test vectors (#593)
We were still using payloads with 32 bits amounts instead of 64 bits.
See https://github.com/lightningnetwork/lightning-rfc/pull/372
2018-05-18 11:55:31 +02:00
Anton Kumaigorodski
588eae93a9 Enforce min feerate per byte on regtest (#595) 2018-05-18 11:55:11 +02:00
Pierre-Marie Padiou
d95cdc5ebe
Fixed conversion: 1 BTC = 1e8 satoshis (#589)
Fixes #585
2018-05-04 18:16:30 +02:00
Pierre-Marie Padiou
d9f69bd563
Cache serialized network announcements (#588)
Because we keep sending them over and over.

Using `CacheBuilder.weakKeys` will cause the serialized messages to be
cleaned up when messages are garbage collected, hence there is no need
to set a maximum size.
2018-05-04 17:32:03 +02:00
Fabrice Drouin
d3244c8499
electrum wallet: export xpub (#586) 2018-05-04 15:06:27 +02:00
Pierre-Marie Padiou
7c12a7fecf
Check if closing tx is known before handling it (#587)
If the closing tx is already in `mutualClosePublished`, it means that we
already know about it and don't need to re-handle it again. Everytime we
succesfully negotiate a mutual close, we end up publishing ourselves the
closing tx, and right after that we are notified of this tx by the
watcher. We always ended up with duplicates in the
`mutualClosePublished`field.

This fixes #568.
2018-05-04 14:46:36 +02:00
rorp
30155f3262 Remove utxo lock when call to signrawtransaction fails (#579)
Also add `timefactor`=3 in tests.

This fixes #567.
2018-05-04 14:14:01 +02:00
Anton Kumaigorodski
e05cb6d928 Use fallbackAddress tag in PaymentRequest builder (#581) 2018-05-04 11:30:54 +02:00
Anton Kumaigorodski
96e6df9df2 Add configurable min funding satoshis limit (#580)
* Add configurable min funding satoshis limit

* Update parameters
2018-05-03 14:56:07 +02:00
Fabrice Drouin
2d0564b9f8
Update bitcoin-lib to 0.9.17 (#582)
* use bitcoin-lib 0.9.17

* use Long values in BIP32 key path
2018-05-03 14:53:59 +02:00
Fabrice Drouin
bc1d995389
Retrieve and store feerate in satoshi/kB (instead of satoshi/byte) (#574)
* feerate: use satoshi/kb instead of satoshi/byte

* API fixup: convert input feerate from sat/bytes to sat/kw

* fixup: convert input feerate from sat/bytes to sat/kw

* add cleaner access to current feerate
implementation (blocks 2,6,12...) is not exposed, users will call getFeerate()

* fix feerate conversions

a kilobyte is 1000 bytes, not 1024 bytes (thanks @jimpo)

* revert commit 179dadc

keep this PR focused on 1 task only

* rename FeeratesPerKb to FeeratesPerKB
2018-04-30 19:21:52 +02:00
Gustavo Fernandes
64afc38709 Add json serializers for NodeAddress and Direction (#570)
* Enable and fix failing test (#565)

* Add json serializers for `NodeAddress` type (#565)

* Add json serializers for `Direction` type (#565)
2018-04-23 22:53:04 +02:00
Pierre-Marie Padiou
410e005703
Update local node_announcement on startup (#564)
This fixes a regression that was introduced when we stopped
re-validating all channels at startup.

Fixes #563.
2018-04-17 19:21:33 +02:00
Pierre-Marie Padiou
4db5564ada
Handle IPv4-mapped/tor2/tor3 addresses (#559)
* reproduces bug decoding ipv4-mapped-as-ipv6 addresses

* handle IPv4-mapped addresses

`InetAddress.getByAddress` automatically converted IPv4-mapped addresses
into IPv4 addresses, which resulted in them being serialized as IPv4
addresses instead of IPv6 addresses, invalidating the signature.

We now use `Inet6Address.getByAddress` instead.

* added support for parsing tor2/tor3 addresses

Note that there are currently invalid announcements on mainnet due to
https://github.com/ElementsProject/lightning/pull/1175#pullrequestreview-111994441.
2018-04-16 11:23:49 +02:00
Pierre-Marie Padiou
449c307132
Support signing multiple similar/identical HTLCs (#553)
* support signing multiple identical htlcs

We previously resolved the commitment tx output based only on the
`pubkeyScript`, causing us to reuse the same output for multiple htlcs.

We now keep track of which commitment tx output has been used.

* resolve htlcs using the amount too

We may have htlcs with identical `payment_hash` + `cltv_expiry`, but
different amounts.

In that case we need to use the `amount` to differentiate and choose the
correct commitment output for each htlc.

In other cases, when there is no risk of confusion it is ok to only rely
on `pubkeyScript`.
2018-04-11 15:44:39 +02:00
Pierre-Marie Padiou
91c6645247
Correctly extract pubkeyScript from tx witness (#555)
When publishing delayed txes, we need to first watch the parent
transaction in order to know how many confirmations it has.

Electrum relies on hashes of `pubkeyScript`s in order to track
transactions.

In order to do this without having the parent transaction at hand,
we recompute the `pubkeyScript` from the child transaction witness data
and give it to Electrum.

But if the script was a `pay2wsh`, we were using the `redeemScript`
instead of computing the `pubkeyScript`.

This is the root cause of https://github.com/ACINQ/eclair-wallet/issues/17.
2018-04-11 12:01:51 +02:00
Dominique
935f138882
Resolve Electrum server address only when connecting (#554)
Electrum client should not resolve addresses when reading server list ; instead 
resolution should be made only when attempting connection.
2018-04-10 18:49:57 +02:00
pm47
b5437c9bad
back to SNAPSHOT 2018-04-04 13:52:24 +02:00
pm47
7598615263
set version to 0.2-beta2 2018-04-04 13:40:03 +02:00
Fabrice Drouin
da3eb3b9b2
Accept bech32 addresses (#531)
* Accept bech32 addresses

Our android wallet will be able to send funds to bech32 addresses

* improve parsing of base58/bech32 addresses

Return appropriate errors when a base58 address is parseable but on the wrong chain

* add test with invalid address (not parseable as base58 or bech32)

* fix invalid version test
2018-04-03 20:35:05 +02:00