Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use substitude channel for forwarding if we have another with the same peer #1278

Closed
TheBlueMatt opened this issue Jan 25, 2022 · 6 comments · Fixed by #3127
Closed

Use substitude channel for forwarding if we have another with the same peer #1278

TheBlueMatt opened this issue Jan 25, 2022 · 6 comments · Fixed by #3127
Milestone

Comments

@TheBlueMatt
Copy link
Collaborator

I believe we're now the only major lightning implementation that insists on forwarding HTLCs out over the same channel as described in the SCID in the onion. Instead, all other implementations will happily forward over a different channel if another one is available to the same counterparty node and it doesn't have enough liquidity in the first channel. We should do the same.

@jurvis
Copy link
Contributor

jurvis commented Mar 8, 2022

hi @ViktorTigerstrom, does your PR #1325 address this issue?

@ViktorTigerstrom
Copy link
Contributor

ViktorTigerstrom commented Mar 8, 2022

Hi @jurvis, no not really. My PR does not deal with forwarding HTCLs at all.

The only way my PR could be seen as slightly related to this is that when our implementation is used to generate the invoice, the hints generally won't include channels with too low inbound capacity, so that this scenario hopefully shouldn't occur at end of the path (meaning the sender hopefully shouldn't construct a route for the last hop in which the 2nd last node will face this problem). But that's stretching it a bit :)

@jurvis
Copy link
Contributor

jurvis commented Mar 9, 2022

@ViktorTigerstrom ah okay -- I saw that this issue was tagged in #1279 so I wanted to clarify. thank you!

@ViktorTigerstrom
Copy link
Contributor

I'd be interested in trying to this one up, unless you think this one is too big to tackle at the moment.
It would be fun to work on something a bit more substantial, and to get into the HTLC handling!

Before I dig too deep into this, I just have a few questions which would be really helpful to get an answer to:

Do I understand the issue correctly, that we should forward the HTLC over another channel with the same counterparty node (if a channel with enough outbound balance exists) if send_htlc fails here due too low outbound balance in the channel?

match chan.get_mut().send_htlc(amt_to_forward, payment_hash, outgoing_cltv_value, htlc_source.clone(), onion_packet, &self.logger) {

Do I also understand it correctly, that in order to do that in reasonably effective way, we would need to update the ChannelManager::per_peer_state to hold the Channels per counterparty node, so that the other channels for the same counterparty node could be found easily?

We'd also need to refactor the code in the if clause here, so that it uses the correct channel for the corresponding add_htlc_msgs if another channel was used to forward the payment:

if !add_htlc_msgs.is_empty() || !fail_htlc_msgs.is_empty() {

Are there other aspects to this issue that complicates it further?

@TheBlueMatt
Copy link
Collaborator Author

Instead of doing this all at once, probably best to break it into small chunks and make progress over time. eg if you first redo the storage of channels, try tackling #105 as a side-effect of doing so then coming back to this one.

@ViktorTigerstrom
Copy link
Contributor

Ok thanks, sounds like a good idea! I'll start by looking into that :)

wvanlint added a commit to wvanlint/rust-lightning that referenced this issue Jun 14, 2024
This change implements non-strict forwarding, allowing the node to
forward an HTLC along an outgoing channel other than the one specified
by short_channel_id in the onion message, so long as the receiver has
the same node public key intended by short_channel_id
([BOLT](https://github.com/lightning/bolts/blob/57ce4b1e05c996fa649f00dc13521f6d496a288f/04-onion-routing.md#non-strict-forwarding).

The implemented forwarding strategy now chooses the channel with the
least amount of outbound liquidity for each forwardable HTLC to maximize
the probability of being able to successfully forward a subsequent HTLC.

Fixes lightningdevkit#1278.
wvanlint added a commit to wvanlint/rust-lightning that referenced this issue Jun 14, 2024
This change implements non-strict forwarding, allowing the node to
forward an HTLC along an outgoing channel other than the one specified
by short_channel_id in the onion message, so long as the receiver has
the same node public key intended by short_channel_id
([BOLT](https://github.com/lightning/bolts/blob/57ce4b1e05c996fa649f00dc13521f6d496a288f/04-onion-routing.md#non-strict-forwarding)).
This can result in improved payment reliability e.g. when outbound
liquidity is replenished by opening a new channel.

The implemented forwarding strategy now chooses the channel with the
least amount of outbound liquidity that can forward an HTLC to maximize
the probability of being able to successfully forward a subsequent HTLC.

Fixes lightningdevkit#1278.
wvanlint added a commit to wvanlint/rust-lightning that referenced this issue Jun 14, 2024
This change implements non-strict forwarding, allowing the node to
forward an HTLC along an outgoing channel other than the one specified
by short_channel_id in the onion message, so long as the receiver has
the same node public key intended by short_channel_id
([BOLT](https://github.com/lightning/bolts/blob/57ce4b1e05c996fa649f00dc13521f6d496a288f/04-onion-routing.md#non-strict-forwarding)).
This can result in improved payment reliability e.g. when outbound
liquidity is replenished by opening a new channel.

The implemented forwarding strategy now chooses the channel with the
least amount of outbound liquidity that can forward an HTLC to maximize
the probability of being able to successfully forward a subsequent HTLC.

Fixes lightningdevkit#1278.
wvanlint added a commit to wvanlint/rust-lightning that referenced this issue Jun 17, 2024
This change implements non-strict forwarding, allowing the node to
forward an HTLC along a channel other than the one specified
by short_channel_id in the onion message, so long as the receiver has
the same node public key intended by short_channel_id
([BOLT](https://github.com/lightning/bolts/blob/57ce4b1e05c996fa649f00dc13521f6d496a288f/04-onion-routing.md#non-strict-forwarding)).
This can improve payment reliability when there are multiple channels
with the same peer e.g. when outbound liquidity is replenished by
opening a new channel.

The implemented forwarding strategy now chooses the channel with the
lowest outbound liquidity that can forward an HTLC to maximize the
probability of being able to successfully forward a subsequent HTLC.

Fixes lightningdevkit#1278.
wvanlint added a commit to wvanlint/rust-lightning that referenced this issue Jun 17, 2024
This change implements non-strict forwarding, allowing the node to
forward an HTLC along a channel other than the one specified
by short_channel_id in the onion message, so long as the receiver has
the same node public key intended by short_channel_id
([BOLT](https://github.com/lightning/bolts/blob/57ce4b1e05c996fa649f00dc13521f6d496a288f/04-onion-routing.md#non-strict-forwarding)).
This can improve payment reliability when there are multiple channels
with the same peer e.g. when outbound liquidity is replenished by
opening a new channel.

The implemented forwarding strategy now chooses the channel with the
lowest outbound liquidity that can forward an HTLC to maximize the
probability of being able to successfully forward a subsequent HTLC.

Fixes lightningdevkit#1278.
wvanlint added a commit to wvanlint/rust-lightning that referenced this issue Jun 17, 2024
This change implements non-strict forwarding, allowing the node to
forward an HTLC along a channel other than the one specified
by short_channel_id in the onion message, so long as the receiver has
the same node public key intended by short_channel_id
([BOLT](https://github.com/lightning/bolts/blob/57ce4b1e05c996fa649f00dc13521f6d496a288f/04-onion-routing.md#non-strict-forwarding)).
This can improve payment reliability when there are multiple channels
with the same peer e.g. when outbound liquidity is replenished by
opening a new channel.

The implemented forwarding strategy now chooses the channel with the
lowest outbound liquidity that can forward an HTLC to maximize the
probability of being able to successfully forward a subsequent HTLC.

Fixes lightningdevkit#1278.
wvanlint added a commit to wvanlint/rust-lightning that referenced this issue Jun 17, 2024
This change implements non-strict forwarding, allowing the node to
forward an HTLC along a channel other than the one specified
by short_channel_id in the onion message, so long as the receiver has
the same node public key intended by short_channel_id
([BOLT](https://github.com/lightning/bolts/blob/57ce4b1e05c996fa649f00dc13521f6d496a288f/04-onion-routing.md#non-strict-forwarding)).
This can improve payment reliability when there are multiple channels
with the same peer e.g. when outbound liquidity is replenished by
opening a new channel.

The implemented forwarding strategy now chooses the channel with the
lowest outbound liquidity that can forward an HTLC to maximize the
probability of being able to successfully forward a subsequent HTLC.

Fixes lightningdevkit#1278.
wvanlint added a commit to wvanlint/rust-lightning that referenced this issue Jun 17, 2024
This change implements non-strict forwarding, allowing the node to
forward an HTLC along a channel other than the one specified
by short_channel_id in the onion message, so long as the receiver has
the same node public key intended by short_channel_id
([BOLT](https://github.com/lightning/bolts/blob/57ce4b1e05c996fa649f00dc13521f6d496a288f/04-onion-routing.md#non-strict-forwarding)).
This can improve payment reliability when there are multiple channels
with the same peer e.g. when outbound liquidity is replenished by
opening a new channel.

The implemented forwarding strategy now chooses the channel with the
lowest outbound liquidity that can forward an HTLC to maximize the
probability of being able to successfully forward a subsequent HTLC.

Fixes lightningdevkit#1278.
wvanlint added a commit to wvanlint/rust-lightning that referenced this issue Jun 20, 2024
This change implements non-strict forwarding, allowing the node to
forward an HTLC along a channel other than the one specified
by short_channel_id in the onion message, so long as the receiver has
the same node public key intended by short_channel_id
([BOLT](https://github.com/lightning/bolts/blob/57ce4b1e05c996fa649f00dc13521f6d496a288f/04-onion-routing.md#non-strict-forwarding)).
This can improve payment reliability when there are multiple channels
with the same peer e.g. when outbound liquidity is replenished by
opening a new channel.

The implemented forwarding strategy now chooses the channel with the
lowest outbound liquidity that can forward an HTLC to maximize the
probability of being able to successfully forward a subsequent HTLC.

Fixes lightningdevkit#1278.
wvanlint added a commit to cequals/rust-lightning that referenced this issue Jun 24, 2024
This change implements non-strict forwarding, allowing the node to
forward an HTLC along a channel other than the one specified
by short_channel_id in the onion message, so long as the receiver has
the same node public key intended by short_channel_id
([BOLT](https://github.com/lightning/bolts/blob/57ce4b1e05c996fa649f00dc13521f6d496a288f/04-onion-routing.md#non-strict-forwarding)).
This can improve payment reliability when there are multiple channels
with the same peer e.g. when outbound liquidity is replenished by
opening a new channel.

The implemented forwarding strategy now chooses the channel with the
lowest outbound liquidity that can forward an HTLC to maximize the
probability of being able to successfully forward a subsequent HTLC.

Fixes lightningdevkit#1278.
shaavan pushed a commit to shaavan/rust-lightning that referenced this issue Jul 12, 2024
This change implements non-strict forwarding, allowing the node to
forward an HTLC along a channel other than the one specified
by short_channel_id in the onion message, so long as the receiver has
the same node public key intended by short_channel_id
([BOLT](https://github.com/lightning/bolts/blob/57ce4b1e05c996fa649f00dc13521f6d496a288f/04-onion-routing.md#non-strict-forwarding)).
This can improve payment reliability when there are multiple channels
with the same peer e.g. when outbound liquidity is replenished by
opening a new channel.

The implemented forwarding strategy now chooses the channel with the
lowest outbound liquidity that can forward an HTLC to maximize the
probability of being able to successfully forward a subsequent HTLC.

Fixes lightningdevkit#1278.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
3 participants