Separate ChannelDetails' outbound capacity from the next HTLC max - #1435

Merged
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
TheBlueMatt:2022-04-1126-first-step
Apr 28, 2022
Merged

Separate ChannelDetails' outbound capacity from the next HTLC max#1435
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
TheBlueMatt:2022-04-1126-first-step

Conversation

@TheBlueMatt

@TheBlueMattTheBlueMatt commented Apr 20, 2022

Copy link
Copy Markdown
Collaborator

ChannelDetails::outbound_capacity_msat describes the total amount
available for sending across several HTLCs, basically just our
balance minus the reserve value maintained by our counterparty.
However, when routing we use it to guess the maximum amount we can
send in a single additional HTLC, which it is not.

There are numerous reasons why our balance may not match the amount
we can send in a single HTLC, whether the HTLC in-flight limit, the
channe's HTLC maximum, or our feerate buffer.

This commit splits the outbound_capacity_msat field into two -
outbound_capacity_msat and outbound_htlc_limit_msat, setting us
up for correctly handling our next-HTLC-limit in the future.

This also addresses the first of the reasons why the values may
not match - the max-in-flight limit. The inaccuracy is ultimately
tracked as #1126.

This is pulled out of #1434 and is really just enough of #1126 fixed so that we can do MPP tests more easily - because we default to a max in-flight limit of 10% of the channel size we need to consider the in-flight limit when routing so that we can really simply just ask the router to give us a route of, eg, 15 sats over two 100 sats channels and get back a valid route (currently it'll give us a route over one channel which will fail).

Also threw in a bonus cause we all like bonuses.

@codecov-commenter

codecov-commenter commented Apr 20, 2022

Copy link
Copy Markdown

Codecov Report

Merging #1435 (ad683d8) into main (637fb88) will increase coverage by 0.11%.
The diff coverage is 100.00%.

❗ Current head ad683d8 differs from pull request most recent head 61629bc. Consider uploading reports for the commit 61629bc to get more accurate results

@@ Coverage Diff @@## main #1435 +/- ##
==========================================
+ Coverage 90.88% 91.00% +0.11% 
==========================================
Files 75 75 Lines 41474 42633 +1159 Branches 41474 42633 +1159 ==========================================
+ Hits 37695 38797 +1102 - Misses 3779 3836 +57 
Impacted FilesCoverage Δ
lightning/src/ln/channel.rs88.42% <100.00%> (+<0.01%)⬆️
lightning/src/ln/channelmanager.rs85.45% <100.00%> (+0.72%)⬆️
lightning/src/routing/router.rs92.51% <100.00%> (-0.09%)⬇️
lightning/src/util/events.rs33.56% <100.00%> (ø)
lightning/src/chain/mod.rs59.25% <0.00%> (-1.86%)⬇️
lightning/src/routing/scoring.rs94.00% <0.00%> (-0.36%)⬇️
lightning-invoice/src/utils.rs96.70% <0.00%> (-0.15%)⬇️
lightning-background-processor/src/lib.rs95.11% <0.00%> (-0.11%)⬇️
lightning/src/ln/functional_tests.rs97.08% <0.00%> (-0.07%)⬇️
... and 5 more

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 637fb88...61629bc. Read the comment docs.

@TheBlueMatt
TheBlueMattforce-pushed the 2022-04-1126-first-step branch from fae8b63 to 1218a85CompareApril 20, 2022 15:44
Comment threadlightning/src/ln/channelmanager.rs Outdated
/// to use a limit as close as possible to the HTLC limit we can currently send.
///
/// See also [`ChannelDetails::balance_msat`] and [`ChannelDetails::outbound_capacity_msat`].
pub outbound_htlc_limit_msat: u64,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think outbound_per_htlc_limit_msatwould be clearer, kinda reads as the limit for all htlcs otherwise

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmmm, per_htlc reads like a static limit on any HTLC, though, which this is not - its the limit for the next HTLC. Maybe I should add the word "next" again?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

True. I'd prefer re-adding next

Comment threadlightning/src/ln/channel.rs Outdated
Comment on lines +2343 to +2345
let outbound_capacity_msat = cmp::max(self.value_to_self_msat as i64
- outbound_stats.pending_htlcs_value_msat as i64
- self.counterparty_selected_channel_reserve_satoshis.unwrap_or(0) as i64 * 1000,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would this ever want to incorporate commit_tx_fee_msat (and/or the fee spike buffer)?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, it totally should! I have a WIP commit to do that but haven't had a chance to work on the tests.

@TheBlueMatt
TheBlueMattforce-pushed the 2022-04-1126-first-step branch from 1218a85 to ace4693CompareApril 20, 2022 17:22
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/routing/router.rs
@TheBlueMatt
TheBlueMattforce-pushed the 2022-04-1126-first-step branch from ace4693 to 24150eeCompareApril 20, 2022 19:21
valentinewallace
valentinewallace previously approved these changes Apr 21, 2022
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Rebased and squashed with only conflicts fixed.

@valentinewallace

Copy link
Copy Markdown
Contributor

CI sad, will re-ack after that and another reviewer

@TheBlueMatt
TheBlueMattforce-pushed the 2022-04-1126-first-step branch from 2a13cbd to 95b2048CompareApril 21, 2022 20:54
`ChannelDetails::outbound_capacity_msat` describes the total amount
available for sending across several HTLCs, basically just our
balance minus the reserve value maintained by our counterparty.
However, when routing we use it to guess the maximum amount we can
send in a single additional HTLC, which it is not.
There are numerous reasons why our balance may not match the amount
we can send in a single HTLC, whether the HTLC in-flight limit, the
channe's HTLC maximum, or our feerate buffer.
This commit splits the `outbound_capacity_msat` field into two -
`outbound_capacity_msat` and `outbound_htlc_limit_msat`, setting us
up for correctly handling our next-HTLC-limit in the future.
This also addresses the first of the reasons why the values may
not match - the max-in-flight limit. The inaccuracy is ultimately
tracked as lightningdevkit#1126.
Comment threadlightning/src/ln/channel.rs Outdated
/// The channel reserve is subtracted from each balance.
/// See also [`Channel::get_balance_msat`]
pub fn get_inbound_outbound_available_balance_msat(&self) -> (u64, u64) {
pub fn get_inbound_outbound_available_balance_msat(&self) -> (u64, u64, u64) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is getting a bit unwieldy. Tuples are great, but I think we may wanna introduce a custom response struct here with field labels.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good idea! Went ahead and moved get_balance_msat into the same function while we're at it (and left it as a separate commit for that reason).

@valentinewallace

Copy link
Copy Markdown
Contributor

CI benchmark sad

Comment threadlightning/src/ln/channel.rs Outdated
pub counterparty_dust_limit_msat: u64,
}

pub struct AvailableBalance {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

maybe AvailableBalances or AvailableBalanceBreakdown or something, because otherwise the naming is confusing.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm, its not a breakdown, though, is it? They're separate "available balances" not really a breakdown of a "total available balance"

Comment threadlightning/src/ln/channel.rs Outdated
/// The channel reserve is subtracted from each balance.
/// See also [`Channel::get_balance_msat`]
pub fn get_inbound_outbound_available_balance_msat(&self) -> (u64, u64) {
pub fn get_available_balance_msat(&self) -> AvailableBalance {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same as above here

arik-so
arik-so previously approved these changes Apr 27, 2022

@arik-soarik-so left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re-ACKing

@TheBlueMatt
TheBlueMattforce-pushed the 2022-04-1126-first-step branch from ad683d8 to a375f64CompareApril 27, 2022 18:44
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Squashed the fixup commit without changes.

arik-so
arik-so previously approved these changes Apr 27, 2022
valentinewallace
valentinewallace previously approved these changes Apr 27, 2022
Comment threadlightning/src/ln/channel.rs Outdated
Some simple code motion to clean up how channel balances get
fetched.
@TheBlueMatt
TheBlueMattforce-pushed the 2022-04-1126-first-step branch from a375f64 to 61629bcCompareApril 27, 2022 20:21
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Lol, sorry, the old function docs were stale/wrong, I fixed them now....had to change the docs on the capacity fields:

diff --git a/lightning/src/ln/channel.rs b/lightning/src/ln/channel.rs
index 32478ee31..3a12a2c06 100644
--- a/lightning/src/ln/channel.rs
+++ b/lightning/src/ln/channel.rs
@@ -58,23 +58,23 @@ pub struct ChannelValueStat {
pub pending_outbound_htlcs_amount_msat: u64,
pub pending_inbound_htlcs_amount_msat: u64,
pub holding_cell_outbound_amount_msat: u64,
pub counterparty_max_htlc_value_in_flight_msat: u64, // outgoing
pub counterparty_dust_limit_msat: u64,
}
pub struct AvailableBalances {
/// The amount that would go to us if we close the channel, ignoring any on-chain fees.
pub balance_msat: u64,
- /// Total amount available for our counterparty to send to us, ignoring HTLCs.
+ /// Total amount available for our counterparty to send to us.
pub inbound_capacity_msat: u64,
- /// Total amount available for us to send to our counterparty, ignoring HTLCs.
+ /// Total amount available for us to send to our counterparty.
pub outbound_capacity_msat: u64,
/// The maximum value we can assign to the next outbound HTLC
pub next_outbound_htlc_limit_msat: u64,
}
#[derive(Debug, Clone, Copy, PartialEq)]
enum FeeUpdateState {
// Inbound states mirroring InboundHTLCState
RemoteAnnounced,
AwaitingRemoteRevokeToAnnounce,

@TheBlueMatt
TheBlueMatt merged commit 62edee5 into lightningdevkit:mainApr 28, 2022
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@TheBlueMatt@codecov-commenter@valentinewallace@arik-so
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Separate ChannelDetails' outbound capacity from the next HTLC max - #1435

Merged
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
TheBlueMatt:2022-04-1126-first-step
Apr 28, 2022
Merged

Separate ChannelDetails' outbound capacity from the next HTLC max#1435
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
TheBlueMatt:2022-04-1126-first-step

Conversation

@TheBlueMatt

@TheBlueMattTheBlueMatt commented Apr 20, 2022

Copy link
Copy Markdown
Collaborator

ChannelDetails::outbound_capacity_msat describes the total amount
available for sending across several HTLCs, basically just our
balance minus the reserve value maintained by our counterparty.
However, when routing we use it to guess the maximum amount we can
send in a single additional HTLC, which it is not.

There are numerous reasons why our balance may not match the amount
we can send in a single HTLC, whether the HTLC in-flight limit, the
channe's HTLC maximum, or our feerate buffer.

This commit splits the outbound_capacity_msat field into two -
outbound_capacity_msat and outbound_htlc_limit_msat, setting us
up for correctly handling our next-HTLC-limit in the future.

This also addresses the first of the reasons why the values may
not match - the max-in-flight limit. The inaccuracy is ultimately
tracked as #1126.

This is pulled out of #1434 and is really just enough of #1126 fixed so that we can do MPP tests more easily - because we default to a max in-flight limit of 10% of the channel size we need to consider the in-flight limit when routing so that we can really simply just ask the router to give us a route of, eg, 15 sats over two 100 sats channels and get back a valid route (currently it'll give us a route over one channel which will fail).

Also threw in a bonus cause we all like bonuses.

@codecov-commenter

codecov-commenter commented Apr 20, 2022

Copy link
Copy Markdown

Codecov Report

Merging #1435 (ad683d8) into main (637fb88) will increase coverage by 0.11%.
The diff coverage is 100.00%.

❗ Current head ad683d8 differs from pull request most recent head 61629bc. Consider uploading reports for the commit 61629bc to get more accurate results

@@ Coverage Diff @@## main #1435 +/- ##
==========================================
+ Coverage 90.88% 91.00% +0.11% 
==========================================
Files 75 75 Lines 41474 42633 +1159 Branches 41474 42633 +1159 ==========================================
+ Hits 37695 38797 +1102 - Misses 3779 3836 +57 
Impacted FilesCoverage Δ
lightning/src/ln/channel.rs88.42% <100.00%> (+<0.01%)⬆️
lightning/src/ln/channelmanager.rs85.45% <100.00%> (+0.72%)⬆️
lightning/src/routing/router.rs92.51% <100.00%> (-0.09%)⬇️
lightning/src/util/events.rs33.56% <100.00%> (ø)
lightning/src/chain/mod.rs59.25% <0.00%> (-1.86%)⬇️
lightning/src/routing/scoring.rs94.00% <0.00%> (-0.36%)⬇️
lightning-invoice/src/utils.rs96.70% <0.00%> (-0.15%)⬇️
lightning-background-processor/src/lib.rs95.11% <0.00%> (-0.11%)⬇️
lightning/src/ln/functional_tests.rs97.08% <0.00%> (-0.07%)⬇️
... and 5 more

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 637fb88...61629bc. Read the comment docs.

@TheBlueMatt
TheBlueMattforce-pushed the 2022-04-1126-first-step branch from fae8b63 to 1218a85CompareApril 20, 2022 15:44
Comment threadlightning/src/ln/channelmanager.rs Outdated
/// to use a limit as close as possible to the HTLC limit we can currently send.
///
/// See also [`ChannelDetails::balance_msat`] and [`ChannelDetails::outbound_capacity_msat`].
pub outbound_htlc_limit_msat: u64,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think outbound_per_htlc_limit_msatwould be clearer, kinda reads as the limit for all htlcs otherwise

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmmm, per_htlc reads like a static limit on any HTLC, though, which this is not - its the limit for the next HTLC. Maybe I should add the word "next" again?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

True. I'd prefer re-adding next

Comment threadlightning/src/ln/channel.rs Outdated
Comment on lines +2343 to +2345
let outbound_capacity_msat = cmp::max(self.value_to_self_msat as i64
- outbound_stats.pending_htlcs_value_msat as i64
- self.counterparty_selected_channel_reserve_satoshis.unwrap_or(0) as i64 * 1000,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would this ever want to incorporate commit_tx_fee_msat (and/or the fee spike buffer)?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, it totally should! I have a WIP commit to do that but haven't had a chance to work on the tests.

@TheBlueMatt
TheBlueMattforce-pushed the 2022-04-1126-first-step branch from 1218a85 to ace4693CompareApril 20, 2022 17:22
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/routing/router.rs
@TheBlueMatt
TheBlueMattforce-pushed the 2022-04-1126-first-step branch from ace4693 to 24150eeCompareApril 20, 2022 19:21
valentinewallace
valentinewallace previously approved these changes Apr 21, 2022
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Rebased and squashed with only conflicts fixed.

@valentinewallace

Copy link
Copy Markdown
Contributor

CI sad, will re-ack after that and another reviewer

@TheBlueMatt
TheBlueMattforce-pushed the 2022-04-1126-first-step branch from 2a13cbd to 95b2048CompareApril 21, 2022 20:54
`ChannelDetails::outbound_capacity_msat` describes the total amount
available for sending across several HTLCs, basically just our
balance minus the reserve value maintained by our counterparty.
However, when routing we use it to guess the maximum amount we can
send in a single additional HTLC, which it is not.
There are numerous reasons why our balance may not match the amount
we can send in a single HTLC, whether the HTLC in-flight limit, the
channe's HTLC maximum, or our feerate buffer.
This commit splits the `outbound_capacity_msat` field into two -
`outbound_capacity_msat` and `outbound_htlc_limit_msat`, setting us
up for correctly handling our next-HTLC-limit in the future.
This also addresses the first of the reasons why the values may
not match - the max-in-flight limit. The inaccuracy is ultimately
tracked as lightningdevkit#1126.
Comment threadlightning/src/ln/channel.rs Outdated
/// The channel reserve is subtracted from each balance.
/// See also [`Channel::get_balance_msat`]
pub fn get_inbound_outbound_available_balance_msat(&self) -> (u64, u64) {
pub fn get_inbound_outbound_available_balance_msat(&self) -> (u64, u64, u64) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is getting a bit unwieldy. Tuples are great, but I think we may wanna introduce a custom response struct here with field labels.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good idea! Went ahead and moved get_balance_msat into the same function while we're at it (and left it as a separate commit for that reason).

@valentinewallace

Copy link
Copy Markdown
Contributor

CI benchmark sad

Comment threadlightning/src/ln/channel.rs Outdated
pub counterparty_dust_limit_msat: u64,
}

pub struct AvailableBalance {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

maybe AvailableBalances or AvailableBalanceBreakdown or something, because otherwise the naming is confusing.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm, its not a breakdown, though, is it? They're separate "available balances" not really a breakdown of a "total available balance"

Comment threadlightning/src/ln/channel.rs Outdated
/// The channel reserve is subtracted from each balance.
/// See also [`Channel::get_balance_msat`]
pub fn get_inbound_outbound_available_balance_msat(&self) -> (u64, u64) {
pub fn get_available_balance_msat(&self) -> AvailableBalance {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same as above here

arik-so
arik-so previously approved these changes Apr 27, 2022

@arik-soarik-so left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re-ACKing

@TheBlueMatt
TheBlueMattforce-pushed the 2022-04-1126-first-step branch from ad683d8 to a375f64CompareApril 27, 2022 18:44
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Squashed the fixup commit without changes.

arik-so
arik-so previously approved these changes Apr 27, 2022
valentinewallace
valentinewallace previously approved these changes Apr 27, 2022
Comment threadlightning/src/ln/channel.rs Outdated
Some simple code motion to clean up how channel balances get
fetched.
@TheBlueMatt
TheBlueMattforce-pushed the 2022-04-1126-first-step branch from a375f64 to 61629bcCompareApril 27, 2022 20:21
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Lol, sorry, the old function docs were stale/wrong, I fixed them now....had to change the docs on the capacity fields:

diff --git a/lightning/src/ln/channel.rs b/lightning/src/ln/channel.rs
index 32478ee31..3a12a2c06 100644
--- a/lightning/src/ln/channel.rs
+++ b/lightning/src/ln/channel.rs
@@ -58,23 +58,23 @@ pub struct ChannelValueStat {
pub pending_outbound_htlcs_amount_msat: u64,
pub pending_inbound_htlcs_amount_msat: u64,
pub holding_cell_outbound_amount_msat: u64,
pub counterparty_max_htlc_value_in_flight_msat: u64, // outgoing
pub counterparty_dust_limit_msat: u64,
}
pub struct AvailableBalances {
/// The amount that would go to us if we close the channel, ignoring any on-chain fees.
pub balance_msat: u64,
- /// Total amount available for our counterparty to send to us, ignoring HTLCs.
+ /// Total amount available for our counterparty to send to us.
pub inbound_capacity_msat: u64,
- /// Total amount available for us to send to our counterparty, ignoring HTLCs.
+ /// Total amount available for us to send to our counterparty.
pub outbound_capacity_msat: u64,
/// The maximum value we can assign to the next outbound HTLC
pub next_outbound_htlc_limit_msat: u64,
}
#[derive(Debug, Clone, Copy, PartialEq)]
enum FeeUpdateState {
// Inbound states mirroring InboundHTLCState
RemoteAnnounced,
AwaitingRemoteRevokeToAnnounce,

@TheBlueMatt
TheBlueMatt merged commit 62edee5 into lightningdevkit:mainApr 28, 2022
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@TheBlueMatt@codecov-commenter@valentinewallace@arik-so
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Separate ChannelDetails' outbound capacity from the next HTLC max - #1435

Merged
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
TheBlueMatt:2022-04-1126-first-step
Apr 28, 2022
Merged

Separate ChannelDetails' outbound capacity from the next HTLC max#1435
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
TheBlueMatt:2022-04-1126-first-step

Conversation

@TheBlueMatt

@TheBlueMattTheBlueMatt commented Apr 20, 2022

Copy link
Copy Markdown
Collaborator

ChannelDetails::outbound_capacity_msat describes the total amount
available for sending across several HTLCs, basically just our
balance minus the reserve value maintained by our counterparty.
However, when routing we use it to guess the maximum amount we can
send in a single additional HTLC, which it is not.

There are numerous reasons why our balance may not match the amount
we can send in a single HTLC, whether the HTLC in-flight limit, the
channe's HTLC maximum, or our feerate buffer.

This commit splits the outbound_capacity_msat field into two -
outbound_capacity_msat and outbound_htlc_limit_msat, setting us
up for correctly handling our next-HTLC-limit in the future.

This also addresses the first of the reasons why the values may
not match - the max-in-flight limit. The inaccuracy is ultimately
tracked as #1126.

This is pulled out of #1434 and is really just enough of #1126 fixed so that we can do MPP tests more easily - because we default to a max in-flight limit of 10% of the channel size we need to consider the in-flight limit when routing so that we can really simply just ask the router to give us a route of, eg, 15 sats over two 100 sats channels and get back a valid route (currently it'll give us a route over one channel which will fail).

Also threw in a bonus cause we all like bonuses.

@codecov-commenter

codecov-commenter commented Apr 20, 2022

Copy link
Copy Markdown

Codecov Report

Merging #1435 (ad683d8) into main (637fb88) will increase coverage by 0.11%.
The diff coverage is 100.00%.

❗ Current head ad683d8 differs from pull request most recent head 61629bc. Consider uploading reports for the commit 61629bc to get more accurate results

@@ Coverage Diff @@## main #1435 +/- ##
==========================================
+ Coverage 90.88% 91.00% +0.11% 
==========================================
Files 75 75 Lines 41474 42633 +1159 Branches 41474 42633 +1159 ==========================================
+ Hits 37695 38797 +1102 - Misses 3779 3836 +57 
Impacted FilesCoverage Δ
lightning/src/ln/channel.rs88.42% <100.00%> (+<0.01%)⬆️
lightning/src/ln/channelmanager.rs85.45% <100.00%> (+0.72%)⬆️
lightning/src/routing/router.rs92.51% <100.00%> (-0.09%)⬇️
lightning/src/util/events.rs33.56% <100.00%> (ø)
lightning/src/chain/mod.rs59.25% <0.00%> (-1.86%)⬇️
lightning/src/routing/scoring.rs94.00% <0.00%> (-0.36%)⬇️
lightning-invoice/src/utils.rs96.70% <0.00%> (-0.15%)⬇️
lightning-background-processor/src/lib.rs95.11% <0.00%> (-0.11%)⬇️
lightning/src/ln/functional_tests.rs97.08% <0.00%> (-0.07%)⬇️
... and 5 more

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 637fb88...61629bc. Read the comment docs.

@TheBlueMatt
TheBlueMattforce-pushed the 2022-04-1126-first-step branch from fae8b63 to 1218a85CompareApril 20, 2022 15:44
Comment threadlightning/src/ln/channelmanager.rs Outdated
/// to use a limit as close as possible to the HTLC limit we can currently send.
///
/// See also [`ChannelDetails::balance_msat`] and [`ChannelDetails::outbound_capacity_msat`].
pub outbound_htlc_limit_msat: u64,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think outbound_per_htlc_limit_msatwould be clearer, kinda reads as the limit for all htlcs otherwise

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmmm, per_htlc reads like a static limit on any HTLC, though, which this is not - its the limit for the next HTLC. Maybe I should add the word "next" again?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

True. I'd prefer re-adding next

Comment threadlightning/src/ln/channel.rs Outdated
Comment on lines +2343 to +2345
let outbound_capacity_msat = cmp::max(self.value_to_self_msat as i64
- outbound_stats.pending_htlcs_value_msat as i64
- self.counterparty_selected_channel_reserve_satoshis.unwrap_or(0) as i64 * 1000,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would this ever want to incorporate commit_tx_fee_msat (and/or the fee spike buffer)?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, it totally should! I have a WIP commit to do that but haven't had a chance to work on the tests.

@TheBlueMatt
TheBlueMattforce-pushed the 2022-04-1126-first-step branch from 1218a85 to ace4693CompareApril 20, 2022 17:22
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/routing/router.rs
@TheBlueMatt
TheBlueMattforce-pushed the 2022-04-1126-first-step branch from ace4693 to 24150eeCompareApril 20, 2022 19:21
valentinewallace
valentinewallace previously approved these changes Apr 21, 2022
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Rebased and squashed with only conflicts fixed.

@valentinewallace

Copy link
Copy Markdown
Contributor

CI sad, will re-ack after that and another reviewer

@TheBlueMatt
TheBlueMattforce-pushed the 2022-04-1126-first-step branch from 2a13cbd to 95b2048CompareApril 21, 2022 20:54
`ChannelDetails::outbound_capacity_msat` describes the total amount
available for sending across several HTLCs, basically just our
balance minus the reserve value maintained by our counterparty.
However, when routing we use it to guess the maximum amount we can
send in a single additional HTLC, which it is not.
There are numerous reasons why our balance may not match the amount
we can send in a single HTLC, whether the HTLC in-flight limit, the
channe's HTLC maximum, or our feerate buffer.
This commit splits the `outbound_capacity_msat` field into two -
`outbound_capacity_msat` and `outbound_htlc_limit_msat`, setting us
up for correctly handling our next-HTLC-limit in the future.
This also addresses the first of the reasons why the values may
not match - the max-in-flight limit. The inaccuracy is ultimately
tracked as lightningdevkit#1126.
Comment threadlightning/src/ln/channel.rs Outdated
/// The channel reserve is subtracted from each balance.
/// See also [`Channel::get_balance_msat`]
pub fn get_inbound_outbound_available_balance_msat(&self) -> (u64, u64) {
pub fn get_inbound_outbound_available_balance_msat(&self) -> (u64, u64, u64) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is getting a bit unwieldy. Tuples are great, but I think we may wanna introduce a custom response struct here with field labels.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good idea! Went ahead and moved get_balance_msat into the same function while we're at it (and left it as a separate commit for that reason).

@valentinewallace

Copy link
Copy Markdown
Contributor

CI benchmark sad

Comment threadlightning/src/ln/channel.rs Outdated
pub counterparty_dust_limit_msat: u64,
}

pub struct AvailableBalance {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

maybe AvailableBalances or AvailableBalanceBreakdown or something, because otherwise the naming is confusing.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm, its not a breakdown, though, is it? They're separate "available balances" not really a breakdown of a "total available balance"

Comment threadlightning/src/ln/channel.rs Outdated
/// The channel reserve is subtracted from each balance.
/// See also [`Channel::get_balance_msat`]
pub fn get_inbound_outbound_available_balance_msat(&self) -> (u64, u64) {
pub fn get_available_balance_msat(&self) -> AvailableBalance {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same as above here

arik-so
arik-so previously approved these changes Apr 27, 2022

@arik-soarik-so left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re-ACKing

@TheBlueMatt
TheBlueMattforce-pushed the 2022-04-1126-first-step branch from ad683d8 to a375f64CompareApril 27, 2022 18:44
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Squashed the fixup commit without changes.

arik-so
arik-so previously approved these changes Apr 27, 2022
valentinewallace
valentinewallace previously approved these changes Apr 27, 2022
Comment threadlightning/src/ln/channel.rs Outdated
Some simple code motion to clean up how channel balances get
fetched.
@TheBlueMatt
TheBlueMattforce-pushed the 2022-04-1126-first-step branch from a375f64 to 61629bcCompareApril 27, 2022 20:21
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Lol, sorry, the old function docs were stale/wrong, I fixed them now....had to change the docs on the capacity fields:

diff --git a/lightning/src/ln/channel.rs b/lightning/src/ln/channel.rs
index 32478ee31..3a12a2c06 100644
--- a/lightning/src/ln/channel.rs
+++ b/lightning/src/ln/channel.rs
@@ -58,23 +58,23 @@ pub struct ChannelValueStat {
pub pending_outbound_htlcs_amount_msat: u64,
pub pending_inbound_htlcs_amount_msat: u64,
pub holding_cell_outbound_amount_msat: u64,
pub counterparty_max_htlc_value_in_flight_msat: u64, // outgoing
pub counterparty_dust_limit_msat: u64,
}
pub struct AvailableBalances {
/// The amount that would go to us if we close the channel, ignoring any on-chain fees.
pub balance_msat: u64,
- /// Total amount available for our counterparty to send to us, ignoring HTLCs.
+ /// Total amount available for our counterparty to send to us.
pub inbound_capacity_msat: u64,
- /// Total amount available for us to send to our counterparty, ignoring HTLCs.
+ /// Total amount available for us to send to our counterparty.
pub outbound_capacity_msat: u64,
/// The maximum value we can assign to the next outbound HTLC
pub next_outbound_htlc_limit_msat: u64,
}
#[derive(Debug, Clone, Copy, PartialEq)]
enum FeeUpdateState {
// Inbound states mirroring InboundHTLCState
RemoteAnnounced,
AwaitingRemoteRevokeToAnnounce,

@TheBlueMatt
TheBlueMatt merged commit 62edee5 into lightningdevkit:mainApr 28, 2022
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@TheBlueMatt@codecov-commenter@valentinewallace@arik-so
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Separate ChannelDetails' outbound capacity from the next HTLC max - #1435

Merged
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
TheBlueMatt:2022-04-1126-first-step
Apr 28, 2022
Merged

Separate ChannelDetails' outbound capacity from the next HTLC max#1435
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
TheBlueMatt:2022-04-1126-first-step

Conversation

@TheBlueMatt

@TheBlueMattTheBlueMatt commented Apr 20, 2022

Copy link
Copy Markdown
Collaborator

ChannelDetails::outbound_capacity_msat describes the total amount
available for sending across several HTLCs, basically just our
balance minus the reserve value maintained by our counterparty.
However, when routing we use it to guess the maximum amount we can
send in a single additional HTLC, which it is not.

There are numerous reasons why our balance may not match the amount
we can send in a single HTLC, whether the HTLC in-flight limit, the
channe's HTLC maximum, or our feerate buffer.

This commit splits the outbound_capacity_msat field into two -
outbound_capacity_msat and outbound_htlc_limit_msat, setting us
up for correctly handling our next-HTLC-limit in the future.

This also addresses the first of the reasons why the values may
not match - the max-in-flight limit. The inaccuracy is ultimately
tracked as #1126.

This is pulled out of #1434 and is really just enough of #1126 fixed so that we can do MPP tests more easily - because we default to a max in-flight limit of 10% of the channel size we need to consider the in-flight limit when routing so that we can really simply just ask the router to give us a route of, eg, 15 sats over two 100 sats channels and get back a valid route (currently it'll give us a route over one channel which will fail).

Also threw in a bonus cause we all like bonuses.

@codecov-commenter

codecov-commenter commented Apr 20, 2022

Copy link
Copy Markdown

Codecov Report

Merging #1435 (ad683d8) into main (637fb88) will increase coverage by 0.11%.
The diff coverage is 100.00%.

❗ Current head ad683d8 differs from pull request most recent head 61629bc. Consider uploading reports for the commit 61629bc to get more accurate results

@@ Coverage Diff @@## main #1435 +/- ##
==========================================
+ Coverage 90.88% 91.00% +0.11% 
==========================================
Files 75 75 Lines 41474 42633 +1159 Branches 41474 42633 +1159 ==========================================
+ Hits 37695 38797 +1102 - Misses 3779 3836 +57 
Impacted FilesCoverage Δ
lightning/src/ln/channel.rs88.42% <100.00%> (+<0.01%)⬆️
lightning/src/ln/channelmanager.rs85.45% <100.00%> (+0.72%)⬆️
lightning/src/routing/router.rs92.51% <100.00%> (-0.09%)⬇️
lightning/src/util/events.rs33.56% <100.00%> (ø)
lightning/src/chain/mod.rs59.25% <0.00%> (-1.86%)⬇️
lightning/src/routing/scoring.rs94.00% <0.00%> (-0.36%)⬇️
lightning-invoice/src/utils.rs96.70% <0.00%> (-0.15%)⬇️
lightning-background-processor/src/lib.rs95.11% <0.00%> (-0.11%)⬇️
lightning/src/ln/functional_tests.rs97.08% <0.00%> (-0.07%)⬇️
... and 5 more

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 637fb88...61629bc. Read the comment docs.

@TheBlueMatt
TheBlueMattforce-pushed the 2022-04-1126-first-step branch from fae8b63 to 1218a85CompareApril 20, 2022 15:44
Comment threadlightning/src/ln/channelmanager.rs Outdated
/// to use a limit as close as possible to the HTLC limit we can currently send.
///
/// See also [`ChannelDetails::balance_msat`] and [`ChannelDetails::outbound_capacity_msat`].
pub outbound_htlc_limit_msat: u64,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think outbound_per_htlc_limit_msatwould be clearer, kinda reads as the limit for all htlcs otherwise

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmmm, per_htlc reads like a static limit on any HTLC, though, which this is not - its the limit for the next HTLC. Maybe I should add the word "next" again?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

True. I'd prefer re-adding next

Comment threadlightning/src/ln/channel.rs Outdated
Comment on lines +2343 to +2345
let outbound_capacity_msat = cmp::max(self.value_to_self_msat as i64
- outbound_stats.pending_htlcs_value_msat as i64
- self.counterparty_selected_channel_reserve_satoshis.unwrap_or(0) as i64 * 1000,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would this ever want to incorporate commit_tx_fee_msat (and/or the fee spike buffer)?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, it totally should! I have a WIP commit to do that but haven't had a chance to work on the tests.

@TheBlueMatt
TheBlueMattforce-pushed the 2022-04-1126-first-step branch from 1218a85 to ace4693CompareApril 20, 2022 17:22
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/routing/router.rs
@TheBlueMatt
TheBlueMattforce-pushed the 2022-04-1126-first-step branch from ace4693 to 24150eeCompareApril 20, 2022 19:21
valentinewallace
valentinewallace previously approved these changes Apr 21, 2022
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Rebased and squashed with only conflicts fixed.

@valentinewallace

Copy link
Copy Markdown
Contributor

CI sad, will re-ack after that and another reviewer

@TheBlueMatt
TheBlueMattforce-pushed the 2022-04-1126-first-step branch from 2a13cbd to 95b2048CompareApril 21, 2022 20:54
`ChannelDetails::outbound_capacity_msat` describes the total amount
available for sending across several HTLCs, basically just our
balance minus the reserve value maintained by our counterparty.
However, when routing we use it to guess the maximum amount we can
send in a single additional HTLC, which it is not.
There are numerous reasons why our balance may not match the amount
we can send in a single HTLC, whether the HTLC in-flight limit, the
channe's HTLC maximum, or our feerate buffer.
This commit splits the `outbound_capacity_msat` field into two -
`outbound_capacity_msat` and `outbound_htlc_limit_msat`, setting us
up for correctly handling our next-HTLC-limit in the future.
This also addresses the first of the reasons why the values may
not match - the max-in-flight limit. The inaccuracy is ultimately
tracked as lightningdevkit#1126.
Comment threadlightning/src/ln/channel.rs Outdated
/// The channel reserve is subtracted from each balance.
/// See also [`Channel::get_balance_msat`]
pub fn get_inbound_outbound_available_balance_msat(&self) -> (u64, u64) {
pub fn get_inbound_outbound_available_balance_msat(&self) -> (u64, u64, u64) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is getting a bit unwieldy. Tuples are great, but I think we may wanna introduce a custom response struct here with field labels.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good idea! Went ahead and moved get_balance_msat into the same function while we're at it (and left it as a separate commit for that reason).

@valentinewallace

Copy link
Copy Markdown
Contributor

CI benchmark sad

Comment threadlightning/src/ln/channel.rs Outdated
pub counterparty_dust_limit_msat: u64,
}

pub struct AvailableBalance {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

maybe AvailableBalances or AvailableBalanceBreakdown or something, because otherwise the naming is confusing.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm, its not a breakdown, though, is it? They're separate "available balances" not really a breakdown of a "total available balance"

Comment threadlightning/src/ln/channel.rs Outdated
/// The channel reserve is subtracted from each balance.
/// See also [`Channel::get_balance_msat`]
pub fn get_inbound_outbound_available_balance_msat(&self) -> (u64, u64) {
pub fn get_available_balance_msat(&self) -> AvailableBalance {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same as above here

arik-so
arik-so previously approved these changes Apr 27, 2022

@arik-soarik-so left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re-ACKing

@TheBlueMatt
TheBlueMattforce-pushed the 2022-04-1126-first-step branch from ad683d8 to a375f64CompareApril 27, 2022 18:44
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Squashed the fixup commit without changes.

arik-so
arik-so previously approved these changes Apr 27, 2022
valentinewallace
valentinewallace previously approved these changes Apr 27, 2022
Comment threadlightning/src/ln/channel.rs Outdated
Some simple code motion to clean up how channel balances get
fetched.
@TheBlueMatt
TheBlueMattforce-pushed the 2022-04-1126-first-step branch from a375f64 to 61629bcCompareApril 27, 2022 20:21
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Lol, sorry, the old function docs were stale/wrong, I fixed them now....had to change the docs on the capacity fields:

diff --git a/lightning/src/ln/channel.rs b/lightning/src/ln/channel.rs
index 32478ee31..3a12a2c06 100644
--- a/lightning/src/ln/channel.rs
+++ b/lightning/src/ln/channel.rs
@@ -58,23 +58,23 @@ pub struct ChannelValueStat {
pub pending_outbound_htlcs_amount_msat: u64,
pub pending_inbound_htlcs_amount_msat: u64,
pub holding_cell_outbound_amount_msat: u64,
pub counterparty_max_htlc_value_in_flight_msat: u64, // outgoing
pub counterparty_dust_limit_msat: u64,
}
pub struct AvailableBalances {
/// The amount that would go to us if we close the channel, ignoring any on-chain fees.
pub balance_msat: u64,
- /// Total amount available for our counterparty to send to us, ignoring HTLCs.
+ /// Total amount available for our counterparty to send to us.
pub inbound_capacity_msat: u64,
- /// Total amount available for us to send to our counterparty, ignoring HTLCs.
+ /// Total amount available for us to send to our counterparty.
pub outbound_capacity_msat: u64,
/// The maximum value we can assign to the next outbound HTLC
pub next_outbound_htlc_limit_msat: u64,
}
#[derive(Debug, Clone, Copy, PartialEq)]
enum FeeUpdateState {
// Inbound states mirroring InboundHTLCState
RemoteAnnounced,
AwaitingRemoteRevokeToAnnounce,

@TheBlueMatt
TheBlueMatt merged commit 62edee5 into lightningdevkit:mainApr 28, 2022
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@TheBlueMatt@codecov-commenter@valentinewallace@arik-so
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Separate ChannelDetails' outbound capacity from the next HTLC max - #1435

Merged
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
TheBlueMatt:2022-04-1126-first-step
Apr 28, 2022
Merged

Separate ChannelDetails' outbound capacity from the next HTLC max#1435
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
TheBlueMatt:2022-04-1126-first-step

Conversation

@TheBlueMatt

@TheBlueMattTheBlueMatt commented Apr 20, 2022

Copy link
Copy Markdown
Collaborator

ChannelDetails::outbound_capacity_msat describes the total amount
available for sending across several HTLCs, basically just our
balance minus the reserve value maintained by our counterparty.
However, when routing we use it to guess the maximum amount we can
send in a single additional HTLC, which it is not.

There are numerous reasons why our balance may not match the amount
we can send in a single HTLC, whether the HTLC in-flight limit, the
channe's HTLC maximum, or our feerate buffer.

This commit splits the outbound_capacity_msat field into two -
outbound_capacity_msat and outbound_htlc_limit_msat, setting us
up for correctly handling our next-HTLC-limit in the future.

This also addresses the first of the reasons why the values may
not match - the max-in-flight limit. The inaccuracy is ultimately
tracked as #1126.

This is pulled out of #1434 and is really just enough of #1126 fixed so that we can do MPP tests more easily - because we default to a max in-flight limit of 10% of the channel size we need to consider the in-flight limit when routing so that we can really simply just ask the router to give us a route of, eg, 15 sats over two 100 sats channels and get back a valid route (currently it'll give us a route over one channel which will fail).

Also threw in a bonus cause we all like bonuses.

@codecov-commenter

codecov-commenter commented Apr 20, 2022

Copy link
Copy Markdown

Codecov Report

Merging #1435 (ad683d8) into main (637fb88) will increase coverage by 0.11%.
The diff coverage is 100.00%.

❗ Current head ad683d8 differs from pull request most recent head 61629bc. Consider uploading reports for the commit 61629bc to get more accurate results

@@ Coverage Diff @@## main #1435 +/- ##
==========================================
+ Coverage 90.88% 91.00% +0.11% 
==========================================
Files 75 75 Lines 41474 42633 +1159 Branches 41474 42633 +1159 ==========================================
+ Hits 37695 38797 +1102 - Misses 3779 3836 +57 
Impacted FilesCoverage Δ
lightning/src/ln/channel.rs88.42% <100.00%> (+<0.01%)⬆️
lightning/src/ln/channelmanager.rs85.45% <100.00%> (+0.72%)⬆️
lightning/src/routing/router.rs92.51% <100.00%> (-0.09%)⬇️
lightning/src/util/events.rs33.56% <100.00%> (ø)
lightning/src/chain/mod.rs59.25% <0.00%> (-1.86%)⬇️
lightning/src/routing/scoring.rs94.00% <0.00%> (-0.36%)⬇️
lightning-invoice/src/utils.rs96.70% <0.00%> (-0.15%)⬇️
lightning-background-processor/src/lib.rs95.11% <0.00%> (-0.11%)⬇️
lightning/src/ln/functional_tests.rs97.08% <0.00%> (-0.07%)⬇️
... and 5 more

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 637fb88...61629bc. Read the comment docs.

@TheBlueMatt
TheBlueMattforce-pushed the 2022-04-1126-first-step branch from fae8b63 to 1218a85CompareApril 20, 2022 15:44
Comment threadlightning/src/ln/channelmanager.rs Outdated
/// to use a limit as close as possible to the HTLC limit we can currently send.
///
/// See also [`ChannelDetails::balance_msat`] and [`ChannelDetails::outbound_capacity_msat`].
pub outbound_htlc_limit_msat: u64,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think outbound_per_htlc_limit_msatwould be clearer, kinda reads as the limit for all htlcs otherwise

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmmm, per_htlc reads like a static limit on any HTLC, though, which this is not - its the limit for the next HTLC. Maybe I should add the word "next" again?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

True. I'd prefer re-adding next

Comment threadlightning/src/ln/channel.rs Outdated
Comment on lines +2343 to +2345
let outbound_capacity_msat = cmp::max(self.value_to_self_msat as i64
- outbound_stats.pending_htlcs_value_msat as i64
- self.counterparty_selected_channel_reserve_satoshis.unwrap_or(0) as i64 * 1000,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would this ever want to incorporate commit_tx_fee_msat (and/or the fee spike buffer)?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, it totally should! I have a WIP commit to do that but haven't had a chance to work on the tests.

@TheBlueMatt
TheBlueMattforce-pushed the 2022-04-1126-first-step branch from 1218a85 to ace4693CompareApril 20, 2022 17:22
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/routing/router.rs
@TheBlueMatt
TheBlueMattforce-pushed the 2022-04-1126-first-step branch from ace4693 to 24150eeCompareApril 20, 2022 19:21
valentinewallace
valentinewallace previously approved these changes Apr 21, 2022
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Rebased and squashed with only conflicts fixed.

@valentinewallace

Copy link
Copy Markdown
Contributor

CI sad, will re-ack after that and another reviewer

@TheBlueMatt
TheBlueMattforce-pushed the 2022-04-1126-first-step branch from 2a13cbd to 95b2048CompareApril 21, 2022 20:54
`ChannelDetails::outbound_capacity_msat` describes the total amount
available for sending across several HTLCs, basically just our
balance minus the reserve value maintained by our counterparty.
However, when routing we use it to guess the maximum amount we can
send in a single additional HTLC, which it is not.
There are numerous reasons why our balance may not match the amount
we can send in a single HTLC, whether the HTLC in-flight limit, the
channe's HTLC maximum, or our feerate buffer.
This commit splits the `outbound_capacity_msat` field into two -
`outbound_capacity_msat` and `outbound_htlc_limit_msat`, setting us
up for correctly handling our next-HTLC-limit in the future.
This also addresses the first of the reasons why the values may
not match - the max-in-flight limit. The inaccuracy is ultimately
tracked as lightningdevkit#1126.
Comment threadlightning/src/ln/channel.rs Outdated
/// The channel reserve is subtracted from each balance.
/// See also [`Channel::get_balance_msat`]
pub fn get_inbound_outbound_available_balance_msat(&self) -> (u64, u64) {
pub fn get_inbound_outbound_available_balance_msat(&self) -> (u64, u64, u64) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is getting a bit unwieldy. Tuples are great, but I think we may wanna introduce a custom response struct here with field labels.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good idea! Went ahead and moved get_balance_msat into the same function while we're at it (and left it as a separate commit for that reason).

@valentinewallace

Copy link
Copy Markdown
Contributor

CI benchmark sad

Comment threadlightning/src/ln/channel.rs Outdated
pub counterparty_dust_limit_msat: u64,
}

pub struct AvailableBalance {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

maybe AvailableBalances or AvailableBalanceBreakdown or something, because otherwise the naming is confusing.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm, its not a breakdown, though, is it? They're separate "available balances" not really a breakdown of a "total available balance"

Comment threadlightning/src/ln/channel.rs Outdated
/// The channel reserve is subtracted from each balance.
/// See also [`Channel::get_balance_msat`]
pub fn get_inbound_outbound_available_balance_msat(&self) -> (u64, u64) {
pub fn get_available_balance_msat(&self) -> AvailableBalance {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same as above here

arik-so
arik-so previously approved these changes Apr 27, 2022

@arik-soarik-so left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re-ACKing

@TheBlueMatt
TheBlueMattforce-pushed the 2022-04-1126-first-step branch from ad683d8 to a375f64CompareApril 27, 2022 18:44
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Squashed the fixup commit without changes.

arik-so
arik-so previously approved these changes Apr 27, 2022
valentinewallace
valentinewallace previously approved these changes Apr 27, 2022
Comment threadlightning/src/ln/channel.rs Outdated
Some simple code motion to clean up how channel balances get
fetched.
@TheBlueMatt
TheBlueMattforce-pushed the 2022-04-1126-first-step branch from a375f64 to 61629bcCompareApril 27, 2022 20:21
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Lol, sorry, the old function docs were stale/wrong, I fixed them now....had to change the docs on the capacity fields:

diff --git a/lightning/src/ln/channel.rs b/lightning/src/ln/channel.rs
index 32478ee31..3a12a2c06 100644
--- a/lightning/src/ln/channel.rs
+++ b/lightning/src/ln/channel.rs
@@ -58,23 +58,23 @@ pub struct ChannelValueStat {
pub pending_outbound_htlcs_amount_msat: u64,
pub pending_inbound_htlcs_amount_msat: u64,
pub holding_cell_outbound_amount_msat: u64,
pub counterparty_max_htlc_value_in_flight_msat: u64, // outgoing
pub counterparty_dust_limit_msat: u64,
}
pub struct AvailableBalances {
/// The amount that would go to us if we close the channel, ignoring any on-chain fees.
pub balance_msat: u64,
- /// Total amount available for our counterparty to send to us, ignoring HTLCs.
+ /// Total amount available for our counterparty to send to us.
pub inbound_capacity_msat: u64,
- /// Total amount available for us to send to our counterparty, ignoring HTLCs.
+ /// Total amount available for us to send to our counterparty.
pub outbound_capacity_msat: u64,
/// The maximum value we can assign to the next outbound HTLC
pub next_outbound_htlc_limit_msat: u64,
}
#[derive(Debug, Clone, Copy, PartialEq)]
enum FeeUpdateState {
// Inbound states mirroring InboundHTLCState
RemoteAnnounced,
AwaitingRemoteRevokeToAnnounce,

@TheBlueMatt
TheBlueMatt merged commit 62edee5 into lightningdevkit:mainApr 28, 2022
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@TheBlueMatt@codecov-commenter@valentinewallace@arik-so
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Separate ChannelDetails' outbound capacity from the next HTLC max - #1435

Merged
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
TheBlueMatt:2022-04-1126-first-step
Apr 28, 2022
Merged

Separate ChannelDetails' outbound capacity from the next HTLC max#1435
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
TheBlueMatt:2022-04-1126-first-step

Conversation

@TheBlueMatt

@TheBlueMattTheBlueMatt commented Apr 20, 2022

Copy link
Copy Markdown
Collaborator

ChannelDetails::outbound_capacity_msat describes the total amount
available for sending across several HTLCs, basically just our
balance minus the reserve value maintained by our counterparty.
However, when routing we use it to guess the maximum amount we can
send in a single additional HTLC, which it is not.

There are numerous reasons why our balance may not match the amount
we can send in a single HTLC, whether the HTLC in-flight limit, the
channe's HTLC maximum, or our feerate buffer.

This commit splits the outbound_capacity_msat field into two -
outbound_capacity_msat and outbound_htlc_limit_msat, setting us
up for correctly handling our next-HTLC-limit in the future.

This also addresses the first of the reasons why the values may
not match - the max-in-flight limit. The inaccuracy is ultimately
tracked as #1126.

This is pulled out of #1434 and is really just enough of #1126 fixed so that we can do MPP tests more easily - because we default to a max in-flight limit of 10% of the channel size we need to consider the in-flight limit when routing so that we can really simply just ask the router to give us a route of, eg, 15 sats over two 100 sats channels and get back a valid route (currently it'll give us a route over one channel which will fail).

Also threw in a bonus cause we all like bonuses.

@codecov-commenter

codecov-commenter commented Apr 20, 2022

Copy link
Copy Markdown

Codecov Report

Merging #1435 (ad683d8) into main (637fb88) will increase coverage by 0.11%.
The diff coverage is 100.00%.

❗ Current head ad683d8 differs from pull request most recent head 61629bc. Consider uploading reports for the commit 61629bc to get more accurate results

@@ Coverage Diff @@## main #1435 +/- ##
==========================================
+ Coverage 90.88% 91.00% +0.11% 
==========================================
Files 75 75 Lines 41474 42633 +1159 Branches 41474 42633 +1159 ==========================================
+ Hits 37695 38797 +1102 - Misses 3779 3836 +57 
Impacted FilesCoverage Δ
lightning/src/ln/channel.rs88.42% <100.00%> (+<0.01%)⬆️
lightning/src/ln/channelmanager.rs85.45% <100.00%> (+0.72%)⬆️
lightning/src/routing/router.rs92.51% <100.00%> (-0.09%)⬇️
lightning/src/util/events.rs33.56% <100.00%> (ø)
lightning/src/chain/mod.rs59.25% <0.00%> (-1.86%)⬇️
lightning/src/routing/scoring.rs94.00% <0.00%> (-0.36%)⬇️
lightning-invoice/src/utils.rs96.70% <0.00%> (-0.15%)⬇️
lightning-background-processor/src/lib.rs95.11% <0.00%> (-0.11%)⬇️
lightning/src/ln/functional_tests.rs97.08% <0.00%> (-0.07%)⬇️
... and 5 more

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 637fb88...61629bc. Read the comment docs.

@TheBlueMatt
TheBlueMattforce-pushed the 2022-04-1126-first-step branch from fae8b63 to 1218a85CompareApril 20, 2022 15:44
Comment threadlightning/src/ln/channelmanager.rs Outdated
/// to use a limit as close as possible to the HTLC limit we can currently send.
///
/// See also [`ChannelDetails::balance_msat`] and [`ChannelDetails::outbound_capacity_msat`].
pub outbound_htlc_limit_msat: u64,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think outbound_per_htlc_limit_msatwould be clearer, kinda reads as the limit for all htlcs otherwise

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmmm, per_htlc reads like a static limit on any HTLC, though, which this is not - its the limit for the next HTLC. Maybe I should add the word "next" again?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

True. I'd prefer re-adding next

Comment threadlightning/src/ln/channel.rs Outdated
Comment on lines +2343 to +2345
let outbound_capacity_msat = cmp::max(self.value_to_self_msat as i64
- outbound_stats.pending_htlcs_value_msat as i64
- self.counterparty_selected_channel_reserve_satoshis.unwrap_or(0) as i64 * 1000,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would this ever want to incorporate commit_tx_fee_msat (and/or the fee spike buffer)?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, it totally should! I have a WIP commit to do that but haven't had a chance to work on the tests.

@TheBlueMatt
TheBlueMattforce-pushed the 2022-04-1126-first-step branch from 1218a85 to ace4693CompareApril 20, 2022 17:22
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/routing/router.rs
@TheBlueMatt
TheBlueMattforce-pushed the 2022-04-1126-first-step branch from ace4693 to 24150eeCompareApril 20, 2022 19:21
valentinewallace
valentinewallace previously approved these changes Apr 21, 2022
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Rebased and squashed with only conflicts fixed.

@valentinewallace

Copy link
Copy Markdown
Contributor

CI sad, will re-ack after that and another reviewer

@TheBlueMatt
TheBlueMattforce-pushed the 2022-04-1126-first-step branch from 2a13cbd to 95b2048CompareApril 21, 2022 20:54
`ChannelDetails::outbound_capacity_msat` describes the total amount
available for sending across several HTLCs, basically just our
balance minus the reserve value maintained by our counterparty.
However, when routing we use it to guess the maximum amount we can
send in a single additional HTLC, which it is not.
There are numerous reasons why our balance may not match the amount
we can send in a single HTLC, whether the HTLC in-flight limit, the
channe's HTLC maximum, or our feerate buffer.
This commit splits the `outbound_capacity_msat` field into two -
`outbound_capacity_msat` and `outbound_htlc_limit_msat`, setting us
up for correctly handling our next-HTLC-limit in the future.
This also addresses the first of the reasons why the values may
not match - the max-in-flight limit. The inaccuracy is ultimately
tracked as lightningdevkit#1126.
Comment threadlightning/src/ln/channel.rs Outdated
/// The channel reserve is subtracted from each balance.
/// See also [`Channel::get_balance_msat`]
pub fn get_inbound_outbound_available_balance_msat(&self) -> (u64, u64) {
pub fn get_inbound_outbound_available_balance_msat(&self) -> (u64, u64, u64) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is getting a bit unwieldy. Tuples are great, but I think we may wanna introduce a custom response struct here with field labels.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good idea! Went ahead and moved get_balance_msat into the same function while we're at it (and left it as a separate commit for that reason).

@valentinewallace

Copy link
Copy Markdown
Contributor

CI benchmark sad

Comment threadlightning/src/ln/channel.rs Outdated
pub counterparty_dust_limit_msat: u64,
}

pub struct AvailableBalance {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

maybe AvailableBalances or AvailableBalanceBreakdown or something, because otherwise the naming is confusing.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm, its not a breakdown, though, is it? They're separate "available balances" not really a breakdown of a "total available balance"

Comment threadlightning/src/ln/channel.rs Outdated
/// The channel reserve is subtracted from each balance.
/// See also [`Channel::get_balance_msat`]
pub fn get_inbound_outbound_available_balance_msat(&self) -> (u64, u64) {
pub fn get_available_balance_msat(&self) -> AvailableBalance {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same as above here

arik-so
arik-so previously approved these changes Apr 27, 2022

@arik-soarik-so left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re-ACKing

@TheBlueMatt
TheBlueMattforce-pushed the 2022-04-1126-first-step branch from ad683d8 to a375f64CompareApril 27, 2022 18:44
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Squashed the fixup commit without changes.

arik-so
arik-so previously approved these changes Apr 27, 2022
valentinewallace
valentinewallace previously approved these changes Apr 27, 2022
Comment threadlightning/src/ln/channel.rs Outdated
Some simple code motion to clean up how channel balances get
fetched.
@TheBlueMatt
TheBlueMattforce-pushed the 2022-04-1126-first-step branch from a375f64 to 61629bcCompareApril 27, 2022 20:21
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Lol, sorry, the old function docs were stale/wrong, I fixed them now....had to change the docs on the capacity fields:

diff --git a/lightning/src/ln/channel.rs b/lightning/src/ln/channel.rs
index 32478ee31..3a12a2c06 100644
--- a/lightning/src/ln/channel.rs
+++ b/lightning/src/ln/channel.rs
@@ -58,23 +58,23 @@ pub struct ChannelValueStat {
pub pending_outbound_htlcs_amount_msat: u64,
pub pending_inbound_htlcs_amount_msat: u64,
pub holding_cell_outbound_amount_msat: u64,
pub counterparty_max_htlc_value_in_flight_msat: u64, // outgoing
pub counterparty_dust_limit_msat: u64,
}
pub struct AvailableBalances {
/// The amount that would go to us if we close the channel, ignoring any on-chain fees.
pub balance_msat: u64,
- /// Total amount available for our counterparty to send to us, ignoring HTLCs.
+ /// Total amount available for our counterparty to send to us.
pub inbound_capacity_msat: u64,
- /// Total amount available for us to send to our counterparty, ignoring HTLCs.
+ /// Total amount available for us to send to our counterparty.
pub outbound_capacity_msat: u64,
/// The maximum value we can assign to the next outbound HTLC
pub next_outbound_htlc_limit_msat: u64,
}
#[derive(Debug, Clone, Copy, PartialEq)]
enum FeeUpdateState {
// Inbound states mirroring InboundHTLCState
RemoteAnnounced,
AwaitingRemoteRevokeToAnnounce,

@TheBlueMatt
TheBlueMatt merged commit 62edee5 into lightningdevkit:mainApr 28, 2022
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@TheBlueMatt@codecov-commenter@valentinewallace@arik-so
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Separate ChannelDetails' outbound capacity from the next HTLC max - #1435

Merged
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
TheBlueMatt:2022-04-1126-first-step
Apr 28, 2022
Merged

Separate ChannelDetails' outbound capacity from the next HTLC max#1435
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
TheBlueMatt:2022-04-1126-first-step

Conversation

@TheBlueMatt

@TheBlueMattTheBlueMatt commented Apr 20, 2022

Copy link
Copy Markdown
Collaborator

ChannelDetails::outbound_capacity_msat describes the total amount
available for sending across several HTLCs, basically just our
balance minus the reserve value maintained by our counterparty.
However, when routing we use it to guess the maximum amount we can
send in a single additional HTLC, which it is not.

There are numerous reasons why our balance may not match the amount
we can send in a single HTLC, whether the HTLC in-flight limit, the
channe's HTLC maximum, or our feerate buffer.

This commit splits the outbound_capacity_msat field into two -
outbound_capacity_msat and outbound_htlc_limit_msat, setting us
up for correctly handling our next-HTLC-limit in the future.

This also addresses the first of the reasons why the values may
not match - the max-in-flight limit. The inaccuracy is ultimately
tracked as #1126.

This is pulled out of #1434 and is really just enough of #1126 fixed so that we can do MPP tests more easily - because we default to a max in-flight limit of 10% of the channel size we need to consider the in-flight limit when routing so that we can really simply just ask the router to give us a route of, eg, 15 sats over two 100 sats channels and get back a valid route (currently it'll give us a route over one channel which will fail).

Also threw in a bonus cause we all like bonuses.

@codecov-commenter

codecov-commenter commented Apr 20, 2022

Copy link
Copy Markdown

Codecov Report

Merging #1435 (ad683d8) into main (637fb88) will increase coverage by 0.11%.
The diff coverage is 100.00%.

❗ Current head ad683d8 differs from pull request most recent head 61629bc. Consider uploading reports for the commit 61629bc to get more accurate results

@@ Coverage Diff @@## main #1435 +/- ##
==========================================
+ Coverage 90.88% 91.00% +0.11% 
==========================================
Files 75 75 Lines 41474 42633 +1159 Branches 41474 42633 +1159 ==========================================
+ Hits 37695 38797 +1102 - Misses 3779 3836 +57 
Impacted FilesCoverage Δ
lightning/src/ln/channel.rs88.42% <100.00%> (+<0.01%)⬆️
lightning/src/ln/channelmanager.rs85.45% <100.00%> (+0.72%)⬆️
lightning/src/routing/router.rs92.51% <100.00%> (-0.09%)⬇️
lightning/src/util/events.rs33.56% <100.00%> (ø)
lightning/src/chain/mod.rs59.25% <0.00%> (-1.86%)⬇️
lightning/src/routing/scoring.rs94.00% <0.00%> (-0.36%)⬇️
lightning-invoice/src/utils.rs96.70% <0.00%> (-0.15%)⬇️
lightning-background-processor/src/lib.rs95.11% <0.00%> (-0.11%)⬇️
lightning/src/ln/functional_tests.rs97.08% <0.00%> (-0.07%)⬇️
... and 5 more

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 637fb88...61629bc. Read the comment docs.

@TheBlueMatt
TheBlueMattforce-pushed the 2022-04-1126-first-step branch from fae8b63 to 1218a85CompareApril 20, 2022 15:44
Comment threadlightning/src/ln/channelmanager.rs Outdated
/// to use a limit as close as possible to the HTLC limit we can currently send.
///
/// See also [`ChannelDetails::balance_msat`] and [`ChannelDetails::outbound_capacity_msat`].
pub outbound_htlc_limit_msat: u64,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think outbound_per_htlc_limit_msatwould be clearer, kinda reads as the limit for all htlcs otherwise

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmmm, per_htlc reads like a static limit on any HTLC, though, which this is not - its the limit for the next HTLC. Maybe I should add the word "next" again?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

True. I'd prefer re-adding next

Comment threadlightning/src/ln/channel.rs Outdated
Comment on lines +2343 to +2345
let outbound_capacity_msat = cmp::max(self.value_to_self_msat as i64
- outbound_stats.pending_htlcs_value_msat as i64
- self.counterparty_selected_channel_reserve_satoshis.unwrap_or(0) as i64 * 1000,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would this ever want to incorporate commit_tx_fee_msat (and/or the fee spike buffer)?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, it totally should! I have a WIP commit to do that but haven't had a chance to work on the tests.

@TheBlueMatt
TheBlueMattforce-pushed the 2022-04-1126-first-step branch from 1218a85 to ace4693CompareApril 20, 2022 17:22
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/routing/router.rs
@TheBlueMatt
TheBlueMattforce-pushed the 2022-04-1126-first-step branch from ace4693 to 24150eeCompareApril 20, 2022 19:21
valentinewallace
valentinewallace previously approved these changes Apr 21, 2022
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Rebased and squashed with only conflicts fixed.

@valentinewallace

Copy link
Copy Markdown
Contributor

CI sad, will re-ack after that and another reviewer

@TheBlueMatt
TheBlueMattforce-pushed the 2022-04-1126-first-step branch from 2a13cbd to 95b2048CompareApril 21, 2022 20:54
`ChannelDetails::outbound_capacity_msat` describes the total amount
available for sending across several HTLCs, basically just our
balance minus the reserve value maintained by our counterparty.
However, when routing we use it to guess the maximum amount we can
send in a single additional HTLC, which it is not.
There are numerous reasons why our balance may not match the amount
we can send in a single HTLC, whether the HTLC in-flight limit, the
channe's HTLC maximum, or our feerate buffer.
This commit splits the `outbound_capacity_msat` field into two -
`outbound_capacity_msat` and `outbound_htlc_limit_msat`, setting us
up for correctly handling our next-HTLC-limit in the future.
This also addresses the first of the reasons why the values may
not match - the max-in-flight limit. The inaccuracy is ultimately
tracked as lightningdevkit#1126.
Comment threadlightning/src/ln/channel.rs Outdated
/// The channel reserve is subtracted from each balance.
/// See also [`Channel::get_balance_msat`]
pub fn get_inbound_outbound_available_balance_msat(&self) -> (u64, u64) {
pub fn get_inbound_outbound_available_balance_msat(&self) -> (u64, u64, u64) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is getting a bit unwieldy. Tuples are great, but I think we may wanna introduce a custom response struct here with field labels.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good idea! Went ahead and moved get_balance_msat into the same function while we're at it (and left it as a separate commit for that reason).

@valentinewallace

Copy link
Copy Markdown
Contributor

CI benchmark sad

Comment threadlightning/src/ln/channel.rs Outdated
pub counterparty_dust_limit_msat: u64,
}

pub struct AvailableBalance {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

maybe AvailableBalances or AvailableBalanceBreakdown or something, because otherwise the naming is confusing.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm, its not a breakdown, though, is it? They're separate "available balances" not really a breakdown of a "total available balance"

Comment threadlightning/src/ln/channel.rs Outdated
/// The channel reserve is subtracted from each balance.
/// See also [`Channel::get_balance_msat`]
pub fn get_inbound_outbound_available_balance_msat(&self) -> (u64, u64) {
pub fn get_available_balance_msat(&self) -> AvailableBalance {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same as above here

arik-so
arik-so previously approved these changes Apr 27, 2022

@arik-soarik-so left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re-ACKing

@TheBlueMatt
TheBlueMattforce-pushed the 2022-04-1126-first-step branch from ad683d8 to a375f64CompareApril 27, 2022 18:44
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Squashed the fixup commit without changes.

arik-so
arik-so previously approved these changes Apr 27, 2022
valentinewallace
valentinewallace previously approved these changes Apr 27, 2022
Comment threadlightning/src/ln/channel.rs Outdated
Some simple code motion to clean up how channel balances get
fetched.
@TheBlueMatt
TheBlueMattforce-pushed the 2022-04-1126-first-step branch from a375f64 to 61629bcCompareApril 27, 2022 20:21
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Lol, sorry, the old function docs were stale/wrong, I fixed them now....had to change the docs on the capacity fields:

diff --git a/lightning/src/ln/channel.rs b/lightning/src/ln/channel.rs
index 32478ee31..3a12a2c06 100644
--- a/lightning/src/ln/channel.rs
+++ b/lightning/src/ln/channel.rs
@@ -58,23 +58,23 @@ pub struct ChannelValueStat {
pub pending_outbound_htlcs_amount_msat: u64,
pub pending_inbound_htlcs_amount_msat: u64,
pub holding_cell_outbound_amount_msat: u64,
pub counterparty_max_htlc_value_in_flight_msat: u64, // outgoing
pub counterparty_dust_limit_msat: u64,
}
pub struct AvailableBalances {
/// The amount that would go to us if we close the channel, ignoring any on-chain fees.
pub balance_msat: u64,
- /// Total amount available for our counterparty to send to us, ignoring HTLCs.
+ /// Total amount available for our counterparty to send to us.
pub inbound_capacity_msat: u64,
- /// Total amount available for us to send to our counterparty, ignoring HTLCs.
+ /// Total amount available for us to send to our counterparty.
pub outbound_capacity_msat: u64,
/// The maximum value we can assign to the next outbound HTLC
pub next_outbound_htlc_limit_msat: u64,
}
#[derive(Debug, Clone, Copy, PartialEq)]
enum FeeUpdateState {
// Inbound states mirroring InboundHTLCState
RemoteAnnounced,
AwaitingRemoteRevokeToAnnounce,

@TheBlueMatt
TheBlueMatt merged commit 62edee5 into lightningdevkit:mainApr 28, 2022
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@TheBlueMatt@codecov-commenter@valentinewallace@arik-so
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Separate ChannelDetails' outbound capacity from the next HTLC max - #1435

Merged
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
TheBlueMatt:2022-04-1126-first-step
Apr 28, 2022
Merged

Separate ChannelDetails' outbound capacity from the next HTLC max#1435
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
TheBlueMatt:2022-04-1126-first-step

Conversation

@TheBlueMatt

@TheBlueMattTheBlueMatt commented Apr 20, 2022

Copy link
Copy Markdown
Collaborator

ChannelDetails::outbound_capacity_msat describes the total amount
available for sending across several HTLCs, basically just our
balance minus the reserve value maintained by our counterparty.
However, when routing we use it to guess the maximum amount we can
send in a single additional HTLC, which it is not.

There are numerous reasons why our balance may not match the amount
we can send in a single HTLC, whether the HTLC in-flight limit, the
channe's HTLC maximum, or our feerate buffer.

This commit splits the outbound_capacity_msat field into two -
outbound_capacity_msat and outbound_htlc_limit_msat, setting us
up for correctly handling our next-HTLC-limit in the future.

This also addresses the first of the reasons why the values may
not match - the max-in-flight limit. The inaccuracy is ultimately
tracked as #1126.

This is pulled out of #1434 and is really just enough of #1126 fixed so that we can do MPP tests more easily - because we default to a max in-flight limit of 10% of the channel size we need to consider the in-flight limit when routing so that we can really simply just ask the router to give us a route of, eg, 15 sats over two 100 sats channels and get back a valid route (currently it'll give us a route over one channel which will fail).

Also threw in a bonus cause we all like bonuses.

@codecov-commenter

codecov-commenter commented Apr 20, 2022

Copy link
Copy Markdown

Codecov Report

Merging #1435 (ad683d8) into main (637fb88) will increase coverage by 0.11%.
The diff coverage is 100.00%.

❗ Current head ad683d8 differs from pull request most recent head 61629bc. Consider uploading reports for the commit 61629bc to get more accurate results

@@ Coverage Diff @@## main #1435 +/- ##
==========================================
+ Coverage 90.88% 91.00% +0.11% 
==========================================
Files 75 75 Lines 41474 42633 +1159 Branches 41474 42633 +1159 ==========================================
+ Hits 37695 38797 +1102 - Misses 3779 3836 +57 
Impacted FilesCoverage Δ
lightning/src/ln/channel.rs88.42% <100.00%> (+<0.01%)⬆️
lightning/src/ln/channelmanager.rs85.45% <100.00%> (+0.72%)⬆️
lightning/src/routing/router.rs92.51% <100.00%> (-0.09%)⬇️
lightning/src/util/events.rs33.56% <100.00%> (ø)
lightning/src/chain/mod.rs59.25% <0.00%> (-1.86%)⬇️
lightning/src/routing/scoring.rs94.00% <0.00%> (-0.36%)⬇️
lightning-invoice/src/utils.rs96.70% <0.00%> (-0.15%)⬇️
lightning-background-processor/src/lib.rs95.11% <0.00%> (-0.11%)⬇️
lightning/src/ln/functional_tests.rs97.08% <0.00%> (-0.07%)⬇️
... and 5 more

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 637fb88...61629bc. Read the comment docs.

@TheBlueMatt
TheBlueMattforce-pushed the 2022-04-1126-first-step branch from fae8b63 to 1218a85CompareApril 20, 2022 15:44
Comment threadlightning/src/ln/channelmanager.rs Outdated
/// to use a limit as close as possible to the HTLC limit we can currently send.
///
/// See also [`ChannelDetails::balance_msat`] and [`ChannelDetails::outbound_capacity_msat`].
pub outbound_htlc_limit_msat: u64,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think outbound_per_htlc_limit_msatwould be clearer, kinda reads as the limit for all htlcs otherwise

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmmm, per_htlc reads like a static limit on any HTLC, though, which this is not - its the limit for the next HTLC. Maybe I should add the word "next" again?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

True. I'd prefer re-adding next

Comment threadlightning/src/ln/channel.rs Outdated
Comment on lines +2343 to +2345
let outbound_capacity_msat = cmp::max(self.value_to_self_msat as i64
- outbound_stats.pending_htlcs_value_msat as i64
- self.counterparty_selected_channel_reserve_satoshis.unwrap_or(0) as i64 * 1000,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would this ever want to incorporate commit_tx_fee_msat (and/or the fee spike buffer)?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, it totally should! I have a WIP commit to do that but haven't had a chance to work on the tests.

@TheBlueMatt
TheBlueMattforce-pushed the 2022-04-1126-first-step branch from 1218a85 to ace4693CompareApril 20, 2022 17:22
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/routing/router.rs
@TheBlueMatt
TheBlueMattforce-pushed the 2022-04-1126-first-step branch from ace4693 to 24150eeCompareApril 20, 2022 19:21
valentinewallace
valentinewallace previously approved these changes Apr 21, 2022
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Rebased and squashed with only conflicts fixed.

@valentinewallace

Copy link
Copy Markdown
Contributor

CI sad, will re-ack after that and another reviewer

@TheBlueMatt
TheBlueMattforce-pushed the 2022-04-1126-first-step branch from 2a13cbd to 95b2048CompareApril 21, 2022 20:54
`ChannelDetails::outbound_capacity_msat` describes the total amount
available for sending across several HTLCs, basically just our
balance minus the reserve value maintained by our counterparty.
However, when routing we use it to guess the maximum amount we can
send in a single additional HTLC, which it is not.
There are numerous reasons why our balance may not match the amount
we can send in a single HTLC, whether the HTLC in-flight limit, the
channe's HTLC maximum, or our feerate buffer.
This commit splits the `outbound_capacity_msat` field into two -
`outbound_capacity_msat` and `outbound_htlc_limit_msat`, setting us
up for correctly handling our next-HTLC-limit in the future.
This also addresses the first of the reasons why the values may
not match - the max-in-flight limit. The inaccuracy is ultimately
tracked as lightningdevkit#1126.
Comment threadlightning/src/ln/channel.rs Outdated
/// The channel reserve is subtracted from each balance.
/// See also [`Channel::get_balance_msat`]
pub fn get_inbound_outbound_available_balance_msat(&self) -> (u64, u64) {
pub fn get_inbound_outbound_available_balance_msat(&self) -> (u64, u64, u64) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is getting a bit unwieldy. Tuples are great, but I think we may wanna introduce a custom response struct here with field labels.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good idea! Went ahead and moved get_balance_msat into the same function while we're at it (and left it as a separate commit for that reason).

@valentinewallace

Copy link
Copy Markdown
Contributor

CI benchmark sad

Comment threadlightning/src/ln/channel.rs Outdated
pub counterparty_dust_limit_msat: u64,
}

pub struct AvailableBalance {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

maybe AvailableBalances or AvailableBalanceBreakdown or something, because otherwise the naming is confusing.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm, its not a breakdown, though, is it? They're separate "available balances" not really a breakdown of a "total available balance"

Comment threadlightning/src/ln/channel.rs Outdated
/// The channel reserve is subtracted from each balance.
/// See also [`Channel::get_balance_msat`]
pub fn get_inbound_outbound_available_balance_msat(&self) -> (u64, u64) {
pub fn get_available_balance_msat(&self) -> AvailableBalance {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same as above here

arik-so
arik-so previously approved these changes Apr 27, 2022

@arik-soarik-so left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re-ACKing

@TheBlueMatt
TheBlueMattforce-pushed the 2022-04-1126-first-step branch from ad683d8 to a375f64CompareApril 27, 2022 18:44
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Squashed the fixup commit without changes.

arik-so
arik-so previously approved these changes Apr 27, 2022
valentinewallace
valentinewallace previously approved these changes Apr 27, 2022
Comment threadlightning/src/ln/channel.rs Outdated
Some simple code motion to clean up how channel balances get
fetched.
@TheBlueMatt
TheBlueMattforce-pushed the 2022-04-1126-first-step branch from a375f64 to 61629bcCompareApril 27, 2022 20:21
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Lol, sorry, the old function docs were stale/wrong, I fixed them now....had to change the docs on the capacity fields:

diff --git a/lightning/src/ln/channel.rs b/lightning/src/ln/channel.rs
index 32478ee31..3a12a2c06 100644
--- a/lightning/src/ln/channel.rs
+++ b/lightning/src/ln/channel.rs
@@ -58,23 +58,23 @@ pub struct ChannelValueStat {
pub pending_outbound_htlcs_amount_msat: u64,
pub pending_inbound_htlcs_amount_msat: u64,
pub holding_cell_outbound_amount_msat: u64,
pub counterparty_max_htlc_value_in_flight_msat: u64, // outgoing
pub counterparty_dust_limit_msat: u64,
}
pub struct AvailableBalances {
/// The amount that would go to us if we close the channel, ignoring any on-chain fees.
pub balance_msat: u64,
- /// Total amount available for our counterparty to send to us, ignoring HTLCs.
+ /// Total amount available for our counterparty to send to us.
pub inbound_capacity_msat: u64,
- /// Total amount available for us to send to our counterparty, ignoring HTLCs.
+ /// Total amount available for us to send to our counterparty.
pub outbound_capacity_msat: u64,
/// The maximum value we can assign to the next outbound HTLC
pub next_outbound_htlc_limit_msat: u64,
}
#[derive(Debug, Clone, Copy, PartialEq)]
enum FeeUpdateState {
// Inbound states mirroring InboundHTLCState
RemoteAnnounced,
AwaitingRemoteRevokeToAnnounce,

@TheBlueMatt
TheBlueMatt merged commit 62edee5 into lightningdevkit:mainApr 28, 2022
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@TheBlueMatt@codecov-commenter@valentinewallace@arik-so