Skip to content

Refactor ShutdownResult type and construction - #2613

Merged
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
wvanlint:batch_funding_fix_up
Oct 29, 2023
Merged

Refactor ShutdownResult type and construction#2613
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
wvanlint:batch_funding_fix_up

Conversation

@wvanlint

@wvanlintwvanlint commented Sep 28, 2023

Copy link
Copy Markdown
Contributor

As a follow-up to #2486, this PR:

  • Refactors the ShutdownResult type and moves construction to Channel methods.
  • Cleans up typos and unused variables/imports.
  • Refactors check_closed_event to be able to share it for batch funding tests. The current implementation is not usable since there might be multiple ClosureReasons. Let me know if this is not worth it though.

@wvanlintwvanlint mentioned this pull request Sep 28, 2023
@codecov-commenter

codecov-commenter commented Sep 28, 2023

Copy link
Copy Markdown

Codecov Report

Attention: 11 lines in your changes are missing coverage. Please review.

Comparison is base (1852715) 88.92% compared to head (316a794) 88.98%.

❗ Your organization needs to install the Codecov GitHub app to enable full functionality.

Additional details and impacted files
@@ Coverage Diff @@## main #2613 +/- ##
==========================================
+ Coverage 88.92% 88.98% +0.05% 
==========================================
Files 112 112 Lines 87632 87650 +18 Branches 87632 87650 +18 ==========================================
+ Hits 77929 77992 +63 + Misses 7473 7422 -51 - Partials 2230 2236 +6 
FilesCoverage Δ
lightning/src/ln/functional_tests.rs97.25% <100.00%> (+0.01%)⬆️
lightning/src/ln/functional_test_utils.rs91.10% <97.36%> (+0.25%)⬆️
lightning/src/ln/channelmanager.rs81.28% <84.00%> (-0.03%)⬇️
lightning/src/ln/channel.rs88.38% <77.77%> (-0.01%)⬇️

... and 8 files with indirect coverage changes

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

@wpaulino

Copy link
Copy Markdown
Contributor

Any reason this is marked as draft?

pub fn get_shutdown(&mut self, signer_provider: &SP, their_features: &InitFeatures,
target_feerate_sats_per_kw: Option<u32>, override_shutdown_script: Option<ShutdownScript>)
-> Result<(msgs::Shutdown, Option<ChannelMonitorUpdate>, Vec<(HTLCSource, PaymentHash)>), APIError>
-> Result<(msgs::Shutdown, Option<ChannelMonitorUpdate>, Vec<(HTLCSource, PaymentHash)>, Option<ShutdownResult>), APIError>

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I wonder if these Option<ChannelMonitorUpdate>, Vec<(HTLCSource, PaymentHash)> can be collapsed into Option<ShutdownResult> although the use cases are slightly different.

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? I think I'd rather keep them separate though. We'd want to handle the monitor update result on the non-shutdown case.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Right, that was my main hesitation. It seems possible to branch on the update_id of the ChannelMonitorUpdate being equal to CLOSED_CHANNEL_UPDATE_ID, but might not be something we want to unify.

Comment threadlightning/src/ln/channelmanager.rs
@wvanlint
wvanlint marked this pull request as ready for review September 28, 2023 18:09
@wvanlint

Copy link
Copy Markdown
ContributorAuthor

Any reason this is marked as draft?

Took another look, ready for review now. :)

Comment threadlightning/src/ln/channel.rs
@wvanlint
wvanlintforce-pushed the batch_funding_fix_up branch from 9c2ee48 to 6960cb8CompareOctober 2, 2023 17:53

@vladimirfomenevladimirfomene 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.

Just a couple of comments here and there

Comment threadlightning/src/ln/channelmanager.rs Outdated

let (monitor_update_option, mut failed_htlcs, unbroadcasted_batch_funding_txid) = shutdown_res;
log_debug!(self.logger, "Finishing force-closure of channel with {} HTLCs to fail", failed_htlcs.len());
log_debug!(self.logger, "Finishing closure of channel with {} HTLCs to fail", failed_htlcs.len());

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.

Does force here not give more context to anyone reading the logs?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Problem is its not longer just force-closures, its all closures.

pub reason: Option<ClosureReason>,
}

impl Default for ExpectedCloseEvent {

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.

Does it not make sense to derive Default instead of manually implementing it?

@wvanlintwvanlintOct 11, 2023

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Definitely makes sense! Derived instead. :)

Comment threadlightning/src/ln/channel.rs Outdated
let shutdown_result;
let unbroadcasted_batch_funding_txid = self.context.unbroadcasted_batch_funding_txid();
self.context.target_closing_feerate_sats_per_kw = target_feerate_sats_per_kw;
if self.context.channel_state & !STATE_FLAGS < ChannelState::FundingSent as u32 {

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.

Instead of defining shutdown_result on L5645 won't it be better to have this if/else expression return a ShutdownResult and then capture it in the shutdown_result variable.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Done, capturing shutdown_result from if-else expressions in a couple places now.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Can you write more full commit messages that describe what we're doing (not just "refactor", but "refactor to do X") and why we're doing it?

@wvanlint
wvanlintforce-pushed the batch_funding_fix_up branch from 6960cb8 to 39e0b7dCompareOctober 11, 2023 00:22
@wvanlint

wvanlint commented Oct 11, 2023

Copy link
Copy Markdown
ContributorAuthor

Can you write more full commit messages that describe what we're doing (not just "refactor", but "refactor to do X") and why we're doing it?

I've rewritten the commit subjects and added explanations to the bodies following https://cbea.ms/git-commit/, let me know if anything can be reworded there though!

wpaulino
wpaulino previously approved these changes Oct 12, 2023

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM, but I'd rather expand a few assertions and checks cause this is all pretty delicate code.

channel_capacity_sats,
..
} if (
expected_event.channel_id.map(|expected| *channel_id == expected).unwrap_or(true) &&

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Shouldn't these all be unwrap_or(false)? We don't want to match if the caller specified a channel id to match but the event didn't have it.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

The .map function is called on the expected event field, so the unwrap_or(true) call is meant to match if the caller left expectations unspecified. Does that sound correct? A ChannelClosed event will always have a channel_id.

Comment on lines 1509 to 1521
pub fn check_closed_event(node: &Node, _events_count: usize, expected_reason: ClosureReason, is_check_discard_funding: bool,
expected_counterparty_node_ids: &[PublicKey], expected_channel_capacity: u64) {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

?

Suggested change
pubfn check_closed_event(node:&Node,_events_count:usize,expected_reason:ClosureReason,is_check_discard_funding:bool,
expected_counterparty_node_ids:&[PublicKey], expected_channel_capacity:u64){
pubfn check_closed_event(node:&Node,events_count:usize,expected_reason:ClosureReason,is_check_discard_funding:bool,
expected_counterparty_node_ids:&[PublicKey], expected_channel_capacity:u64){
assert_eq!(events_count, expected_counterparty_node_ids.len());

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Needed to account for the DiscardFunding events too but verified the events_count here.

Option<Txid>
);
/// The result of a shutdown that should be handled.
pub(crate) struct ShutdownResult {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Suggested change
pub(crate)structShutdownResult{
#[must_use]
pub(crate)structShutdownResult{

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Done.

let (shutdown_msg, mut monitor_update_opt, htlcs, local_shutdown_result) =
chan.get_shutdown(&self.signer_provider, their_features, target_feerate_sats_per_1000_weight, override_shutdown_script)?;
failed_htlcs = htlcs;
shutdown_result = local_shutdown_result;

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Let's debug_assert our assumptions.

Suggested change
shutdown_result = local_shutdown_result;
shutdown_result = local_shutdown_result;
debug_assert_eq!(shutdown_result.is_some(), chan.is_shutdown());

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Added this assertion to all the cooperative closing paths.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Ugh, sorry, this needs rebase due to a silent conflict with #2658.

The check_closed_event function verified closure events against multiple
counterparty nodes, but only a single closure reason and channel
capacity. This commit introduces a check_closed_events function to
verify events against descriptions of each expected event, and refactors
check_closed_event in function of check_closed_events.
This refactors ShutdownResult as follows:
- Makes ShutdownResult a struct instead of a tuple to represent
individual results that need to be handled. This recently also
includes funding batch closure propagations.
- Makes Channel solely responsible for constructing ShutdownResult as
it should own all channel-specific logic.
@wvanlint
wvanlintforce-pushed the batch_funding_fix_up branch from aa8a485 to 316a794CompareOctober 19, 2023 03:52
@wvanlint

Copy link
Copy Markdown
ContributorAuthor

Ugh, sorry, this needs rebase due to a silent conflict with #2658.

No problem! Rebased. :)

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Thanks!

@TheBlueMatt
TheBlueMatt merged commit 8f308f9 into lightningdevkit:mainOct 29, 2023
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.

6 participants

@wvanlint@codecov-commenter@wpaulino@TheBlueMatt@vladimirfomene@benthecarman
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
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;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Refactor ShutdownResult type and construction by wvanlint · Pull Request #2613 · lightningdevkit/rust-lightning · GitHub
Skip to content

Refactor ShutdownResult type and construction - #2613

Merged
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
wvanlint:batch_funding_fix_up
Oct 29, 2023
Merged

Refactor ShutdownResult type and construction#2613
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
wvanlint:batch_funding_fix_up

Conversation

@wvanlint

@wvanlintwvanlint commented Sep 28, 2023

Copy link
Copy Markdown
Contributor

As a follow-up to #2486, this PR:

  • Refactors the ShutdownResult type and moves construction to Channel methods.
  • Cleans up typos and unused variables/imports.
  • Refactors check_closed_event to be able to share it for batch funding tests. The current implementation is not usable since there might be multiple ClosureReasons. Let me know if this is not worth it though.

@wvanlintwvanlint mentioned this pull request Sep 28, 2023
@codecov-commenter

codecov-commenter commented Sep 28, 2023

Copy link
Copy Markdown

Codecov Report

Attention: 11 lines in your changes are missing coverage. Please review.

Comparison is base (1852715) 88.92% compared to head (316a794) 88.98%.

❗ Your organization needs to install the Codecov GitHub app to enable full functionality.

Additional details and impacted files
@@ Coverage Diff @@## main #2613 +/- ##
==========================================
+ Coverage 88.92% 88.98% +0.05% 
==========================================
Files 112 112 Lines 87632 87650 +18 Branches 87632 87650 +18 ==========================================
+ Hits 77929 77992 +63 + Misses 7473 7422 -51 - Partials 2230 2236 +6 
FilesCoverage Δ
lightning/src/ln/functional_tests.rs97.25% <100.00%> (+0.01%)⬆️
lightning/src/ln/functional_test_utils.rs91.10% <97.36%> (+0.25%)⬆️
lightning/src/ln/channelmanager.rs81.28% <84.00%> (-0.03%)⬇️
lightning/src/ln/channel.rs88.38% <77.77%> (-0.01%)⬇️

... and 8 files with indirect coverage changes

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

@wpaulino

Copy link
Copy Markdown
Contributor

Any reason this is marked as draft?

pub fn get_shutdown(&mut self, signer_provider: &SP, their_features: &InitFeatures,
target_feerate_sats_per_kw: Option<u32>, override_shutdown_script: Option<ShutdownScript>)
-> Result<(msgs::Shutdown, Option<ChannelMonitorUpdate>, Vec<(HTLCSource, PaymentHash)>), APIError>
-> Result<(msgs::Shutdown, Option<ChannelMonitorUpdate>, Vec<(HTLCSource, PaymentHash)>, Option<ShutdownResult>), APIError>

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I wonder if these Option<ChannelMonitorUpdate>, Vec<(HTLCSource, PaymentHash)> can be collapsed into Option<ShutdownResult> although the use cases are slightly different.

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? I think I'd rather keep them separate though. We'd want to handle the monitor update result on the non-shutdown case.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Right, that was my main hesitation. It seems possible to branch on the update_id of the ChannelMonitorUpdate being equal to CLOSED_CHANNEL_UPDATE_ID, but might not be something we want to unify.

Comment threadlightning/src/ln/channelmanager.rs
@wvanlint
wvanlint marked this pull request as ready for review September 28, 2023 18:09
@wvanlint

Copy link
Copy Markdown
ContributorAuthor

Any reason this is marked as draft?

Took another look, ready for review now. :)

Comment threadlightning/src/ln/channel.rs
@wvanlint
wvanlintforce-pushed the batch_funding_fix_up branch from 9c2ee48 to 6960cb8CompareOctober 2, 2023 17:53

@vladimirfomenevladimirfomene 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.

Just a couple of comments here and there

Comment threadlightning/src/ln/channelmanager.rs Outdated

let (monitor_update_option, mut failed_htlcs, unbroadcasted_batch_funding_txid) = shutdown_res;
log_debug!(self.logger, "Finishing force-closure of channel with {} HTLCs to fail", failed_htlcs.len());
log_debug!(self.logger, "Finishing closure of channel with {} HTLCs to fail", failed_htlcs.len());

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.

Does force here not give more context to anyone reading the logs?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Problem is its not longer just force-closures, its all closures.

pub reason: Option<ClosureReason>,
}

impl Default for ExpectedCloseEvent {

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.

Does it not make sense to derive Default instead of manually implementing it?

@wvanlintwvanlintOct 11, 2023

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Definitely makes sense! Derived instead. :)

Comment threadlightning/src/ln/channel.rs Outdated
let shutdown_result;
let unbroadcasted_batch_funding_txid = self.context.unbroadcasted_batch_funding_txid();
self.context.target_closing_feerate_sats_per_kw = target_feerate_sats_per_kw;
if self.context.channel_state & !STATE_FLAGS < ChannelState::FundingSent as u32 {

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.

Instead of defining shutdown_result on L5645 won't it be better to have this if/else expression return a ShutdownResult and then capture it in the shutdown_result variable.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Done, capturing shutdown_result from if-else expressions in a couple places now.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Can you write more full commit messages that describe what we're doing (not just "refactor", but "refactor to do X") and why we're doing it?

@wvanlint
wvanlintforce-pushed the batch_funding_fix_up branch from 6960cb8 to 39e0b7dCompareOctober 11, 2023 00:22
@wvanlint

wvanlint commented Oct 11, 2023

Copy link
Copy Markdown
ContributorAuthor

Can you write more full commit messages that describe what we're doing (not just "refactor", but "refactor to do X") and why we're doing it?

I've rewritten the commit subjects and added explanations to the bodies following https://cbea.ms/git-commit/, let me know if anything can be reworded there though!

wpaulino
wpaulino previously approved these changes Oct 12, 2023

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM, but I'd rather expand a few assertions and checks cause this is all pretty delicate code.

channel_capacity_sats,
..
} if (
expected_event.channel_id.map(|expected| *channel_id == expected).unwrap_or(true) &&

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Shouldn't these all be unwrap_or(false)? We don't want to match if the caller specified a channel id to match but the event didn't have it.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

The .map function is called on the expected event field, so the unwrap_or(true) call is meant to match if the caller left expectations unspecified. Does that sound correct? A ChannelClosed event will always have a channel_id.

Comment on lines 1509 to 1521
pub fn check_closed_event(node: &Node, _events_count: usize, expected_reason: ClosureReason, is_check_discard_funding: bool,
expected_counterparty_node_ids: &[PublicKey], expected_channel_capacity: u64) {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

?

Suggested change
pubfn check_closed_event(node:&Node,_events_count:usize,expected_reason:ClosureReason,is_check_discard_funding:bool,
expected_counterparty_node_ids:&[PublicKey], expected_channel_capacity:u64){
pubfn check_closed_event(node:&Node,events_count:usize,expected_reason:ClosureReason,is_check_discard_funding:bool,
expected_counterparty_node_ids:&[PublicKey], expected_channel_capacity:u64){
assert_eq!(events_count, expected_counterparty_node_ids.len());

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Needed to account for the DiscardFunding events too but verified the events_count here.

Option<Txid>
);
/// The result of a shutdown that should be handled.
pub(crate) struct ShutdownResult {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Suggested change
pub(crate)structShutdownResult{
#[must_use]
pub(crate)structShutdownResult{

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Done.

let (shutdown_msg, mut monitor_update_opt, htlcs, local_shutdown_result) =
chan.get_shutdown(&self.signer_provider, their_features, target_feerate_sats_per_1000_weight, override_shutdown_script)?;
failed_htlcs = htlcs;
shutdown_result = local_shutdown_result;

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Let's debug_assert our assumptions.

Suggested change
shutdown_result = local_shutdown_result;
shutdown_result = local_shutdown_result;
debug_assert_eq!(shutdown_result.is_some(), chan.is_shutdown());

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Added this assertion to all the cooperative closing paths.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Ugh, sorry, this needs rebase due to a silent conflict with #2658.

The check_closed_event function verified closure events against multiple
counterparty nodes, but only a single closure reason and channel
capacity. This commit introduces a check_closed_events function to
verify events against descriptions of each expected event, and refactors
check_closed_event in function of check_closed_events.
This refactors ShutdownResult as follows:
- Makes ShutdownResult a struct instead of a tuple to represent
individual results that need to be handled. This recently also
includes funding batch closure propagations.
- Makes Channel solely responsible for constructing ShutdownResult as
it should own all channel-specific logic.
@wvanlint
wvanlintforce-pushed the batch_funding_fix_up branch from aa8a485 to 316a794CompareOctober 19, 2023 03:52
@wvanlint

Copy link
Copy Markdown
ContributorAuthor

Ugh, sorry, this needs rebase due to a silent conflict with #2658.

No problem! Rebased. :)

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Thanks!

@TheBlueMatt
TheBlueMatt merged commit 8f308f9 into lightningdevkit:mainOct 29, 2023
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.

6 participants

@wvanlint@codecov-commenter@wpaulino@TheBlueMatt@vladimirfomene@benthecarman
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Refactor ShutdownResult type and construction by wvanlint · Pull Request #2613 · lightningdevkit/rust-lightning · GitHub
Skip to content

Refactor ShutdownResult type and construction - #2613

Merged
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
wvanlint:batch_funding_fix_up
Oct 29, 2023
Merged

Refactor ShutdownResult type and construction#2613
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
wvanlint:batch_funding_fix_up

Conversation

@wvanlint

@wvanlintwvanlint commented Sep 28, 2023

Copy link
Copy Markdown
Contributor

As a follow-up to #2486, this PR:

  • Refactors the ShutdownResult type and moves construction to Channel methods.
  • Cleans up typos and unused variables/imports.
  • Refactors check_closed_event to be able to share it for batch funding tests. The current implementation is not usable since there might be multiple ClosureReasons. Let me know if this is not worth it though.

@wvanlintwvanlint mentioned this pull request Sep 28, 2023
@codecov-commenter

codecov-commenter commented Sep 28, 2023

Copy link
Copy Markdown

Codecov Report

Attention: 11 lines in your changes are missing coverage. Please review.

Comparison is base (1852715) 88.92% compared to head (316a794) 88.98%.

❗ Your organization needs to install the Codecov GitHub app to enable full functionality.

Additional details and impacted files
@@ Coverage Diff @@## main #2613 +/- ##
==========================================
+ Coverage 88.92% 88.98% +0.05% 
==========================================
Files 112 112 Lines 87632 87650 +18 Branches 87632 87650 +18 ==========================================
+ Hits 77929 77992 +63 + Misses 7473 7422 -51 - Partials 2230 2236 +6 
FilesCoverage Δ
lightning/src/ln/functional_tests.rs97.25% <100.00%> (+0.01%)⬆️
lightning/src/ln/functional_test_utils.rs91.10% <97.36%> (+0.25%)⬆️
lightning/src/ln/channelmanager.rs81.28% <84.00%> (-0.03%)⬇️
lightning/src/ln/channel.rs88.38% <77.77%> (-0.01%)⬇️

... and 8 files with indirect coverage changes

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

@wpaulino

Copy link
Copy Markdown
Contributor

Any reason this is marked as draft?

pub fn get_shutdown(&mut self, signer_provider: &SP, their_features: &InitFeatures,
target_feerate_sats_per_kw: Option<u32>, override_shutdown_script: Option<ShutdownScript>)
-> Result<(msgs::Shutdown, Option<ChannelMonitorUpdate>, Vec<(HTLCSource, PaymentHash)>), APIError>
-> Result<(msgs::Shutdown, Option<ChannelMonitorUpdate>, Vec<(HTLCSource, PaymentHash)>, Option<ShutdownResult>), APIError>

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I wonder if these Option<ChannelMonitorUpdate>, Vec<(HTLCSource, PaymentHash)> can be collapsed into Option<ShutdownResult> although the use cases are slightly different.

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? I think I'd rather keep them separate though. We'd want to handle the monitor update result on the non-shutdown case.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Right, that was my main hesitation. It seems possible to branch on the update_id of the ChannelMonitorUpdate being equal to CLOSED_CHANNEL_UPDATE_ID, but might not be something we want to unify.

Comment threadlightning/src/ln/channelmanager.rs
@wvanlint
wvanlint marked this pull request as ready for review September 28, 2023 18:09
@wvanlint

Copy link
Copy Markdown
ContributorAuthor

Any reason this is marked as draft?

Took another look, ready for review now. :)

Comment threadlightning/src/ln/channel.rs
@wvanlint
wvanlintforce-pushed the batch_funding_fix_up branch from 9c2ee48 to 6960cb8CompareOctober 2, 2023 17:53

@vladimirfomenevladimirfomene 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.

Just a couple of comments here and there

Comment threadlightning/src/ln/channelmanager.rs Outdated

let (monitor_update_option, mut failed_htlcs, unbroadcasted_batch_funding_txid) = shutdown_res;
log_debug!(self.logger, "Finishing force-closure of channel with {} HTLCs to fail", failed_htlcs.len());
log_debug!(self.logger, "Finishing closure of channel with {} HTLCs to fail", failed_htlcs.len());

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.

Does force here not give more context to anyone reading the logs?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Problem is its not longer just force-closures, its all closures.

pub reason: Option<ClosureReason>,
}

impl Default for ExpectedCloseEvent {

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.

Does it not make sense to derive Default instead of manually implementing it?

@wvanlintwvanlintOct 11, 2023

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Definitely makes sense! Derived instead. :)

Comment threadlightning/src/ln/channel.rs Outdated
let shutdown_result;
let unbroadcasted_batch_funding_txid = self.context.unbroadcasted_batch_funding_txid();
self.context.target_closing_feerate_sats_per_kw = target_feerate_sats_per_kw;
if self.context.channel_state & !STATE_FLAGS < ChannelState::FundingSent as u32 {

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.

Instead of defining shutdown_result on L5645 won't it be better to have this if/else expression return a ShutdownResult and then capture it in the shutdown_result variable.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Done, capturing shutdown_result from if-else expressions in a couple places now.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Can you write more full commit messages that describe what we're doing (not just "refactor", but "refactor to do X") and why we're doing it?

@wvanlint
wvanlintforce-pushed the batch_funding_fix_up branch from 6960cb8 to 39e0b7dCompareOctober 11, 2023 00:22
@wvanlint

wvanlint commented Oct 11, 2023

Copy link
Copy Markdown
ContributorAuthor

Can you write more full commit messages that describe what we're doing (not just "refactor", but "refactor to do X") and why we're doing it?

I've rewritten the commit subjects and added explanations to the bodies following https://cbea.ms/git-commit/, let me know if anything can be reworded there though!

wpaulino
wpaulino previously approved these changes Oct 12, 2023

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM, but I'd rather expand a few assertions and checks cause this is all pretty delicate code.

channel_capacity_sats,
..
} if (
expected_event.channel_id.map(|expected| *channel_id == expected).unwrap_or(true) &&

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Shouldn't these all be unwrap_or(false)? We don't want to match if the caller specified a channel id to match but the event didn't have it.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

The .map function is called on the expected event field, so the unwrap_or(true) call is meant to match if the caller left expectations unspecified. Does that sound correct? A ChannelClosed event will always have a channel_id.

Comment on lines 1509 to 1521
pub fn check_closed_event(node: &Node, _events_count: usize, expected_reason: ClosureReason, is_check_discard_funding: bool,
expected_counterparty_node_ids: &[PublicKey], expected_channel_capacity: u64) {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

?

Suggested change
pubfn check_closed_event(node:&Node,_events_count:usize,expected_reason:ClosureReason,is_check_discard_funding:bool,
expected_counterparty_node_ids:&[PublicKey], expected_channel_capacity:u64){
pubfn check_closed_event(node:&Node,events_count:usize,expected_reason:ClosureReason,is_check_discard_funding:bool,
expected_counterparty_node_ids:&[PublicKey], expected_channel_capacity:u64){
assert_eq!(events_count, expected_counterparty_node_ids.len());

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Needed to account for the DiscardFunding events too but verified the events_count here.

Option<Txid>
);
/// The result of a shutdown that should be handled.
pub(crate) struct ShutdownResult {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Suggested change
pub(crate)structShutdownResult{
#[must_use]
pub(crate)structShutdownResult{

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Done.

let (shutdown_msg, mut monitor_update_opt, htlcs, local_shutdown_result) =
chan.get_shutdown(&self.signer_provider, their_features, target_feerate_sats_per_1000_weight, override_shutdown_script)?;
failed_htlcs = htlcs;
shutdown_result = local_shutdown_result;

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Let's debug_assert our assumptions.

Suggested change
shutdown_result = local_shutdown_result;
shutdown_result = local_shutdown_result;
debug_assert_eq!(shutdown_result.is_some(), chan.is_shutdown());

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Added this assertion to all the cooperative closing paths.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Ugh, sorry, this needs rebase due to a silent conflict with #2658.

The check_closed_event function verified closure events against multiple
counterparty nodes, but only a single closure reason and channel
capacity. This commit introduces a check_closed_events function to
verify events against descriptions of each expected event, and refactors
check_closed_event in function of check_closed_events.
This refactors ShutdownResult as follows:
- Makes ShutdownResult a struct instead of a tuple to represent
individual results that need to be handled. This recently also
includes funding batch closure propagations.
- Makes Channel solely responsible for constructing ShutdownResult as
it should own all channel-specific logic.
@wvanlint
wvanlintforce-pushed the batch_funding_fix_up branch from aa8a485 to 316a794CompareOctober 19, 2023 03:52
@wvanlint

Copy link
Copy Markdown
ContributorAuthor

Ugh, sorry, this needs rebase due to a silent conflict with #2658.

No problem! Rebased. :)

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Thanks!

@TheBlueMatt
TheBlueMatt merged commit 8f308f9 into lightningdevkit:mainOct 29, 2023
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.

6 participants

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

Refactor ShutdownResult type and construction - #2613

Merged
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
wvanlint:batch_funding_fix_up
Oct 29, 2023
Merged

Refactor ShutdownResult type and construction#2613
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
wvanlint:batch_funding_fix_up

Conversation

@wvanlint

@wvanlintwvanlint commented Sep 28, 2023

Copy link
Copy Markdown
Contributor

As a follow-up to #2486, this PR:

  • Refactors the ShutdownResult type and moves construction to Channel methods.
  • Cleans up typos and unused variables/imports.
  • Refactors check_closed_event to be able to share it for batch funding tests. The current implementation is not usable since there might be multiple ClosureReasons. Let me know if this is not worth it though.

@wvanlintwvanlint mentioned this pull request Sep 28, 2023
@codecov-commenter

codecov-commenter commented Sep 28, 2023

Copy link
Copy Markdown

Codecov Report

Attention: 11 lines in your changes are missing coverage. Please review.

Comparison is base (1852715) 88.92% compared to head (316a794) 88.98%.

❗ Your organization needs to install the Codecov GitHub app to enable full functionality.

Additional details and impacted files
@@ Coverage Diff @@## main #2613 +/- ##
==========================================
+ Coverage 88.92% 88.98% +0.05% 
==========================================
Files 112 112 Lines 87632 87650 +18 Branches 87632 87650 +18 ==========================================
+ Hits 77929 77992 +63 + Misses 7473 7422 -51 - Partials 2230 2236 +6 
FilesCoverage Δ
lightning/src/ln/functional_tests.rs97.25% <100.00%> (+0.01%)⬆️
lightning/src/ln/functional_test_utils.rs91.10% <97.36%> (+0.25%)⬆️
lightning/src/ln/channelmanager.rs81.28% <84.00%> (-0.03%)⬇️
lightning/src/ln/channel.rs88.38% <77.77%> (-0.01%)⬇️

... and 8 files with indirect coverage changes

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

@wpaulino

Copy link
Copy Markdown
Contributor

Any reason this is marked as draft?

pub fn get_shutdown(&mut self, signer_provider: &SP, their_features: &InitFeatures,
target_feerate_sats_per_kw: Option<u32>, override_shutdown_script: Option<ShutdownScript>)
-> Result<(msgs::Shutdown, Option<ChannelMonitorUpdate>, Vec<(HTLCSource, PaymentHash)>), APIError>
-> Result<(msgs::Shutdown, Option<ChannelMonitorUpdate>, Vec<(HTLCSource, PaymentHash)>, Option<ShutdownResult>), APIError>

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I wonder if these Option<ChannelMonitorUpdate>, Vec<(HTLCSource, PaymentHash)> can be collapsed into Option<ShutdownResult> although the use cases are slightly different.

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? I think I'd rather keep them separate though. We'd want to handle the monitor update result on the non-shutdown case.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Right, that was my main hesitation. It seems possible to branch on the update_id of the ChannelMonitorUpdate being equal to CLOSED_CHANNEL_UPDATE_ID, but might not be something we want to unify.

Comment threadlightning/src/ln/channelmanager.rs
@wvanlint
wvanlint marked this pull request as ready for review September 28, 2023 18:09
@wvanlint

Copy link
Copy Markdown
ContributorAuthor

Any reason this is marked as draft?

Took another look, ready for review now. :)

Comment threadlightning/src/ln/channel.rs
@wvanlint
wvanlintforce-pushed the batch_funding_fix_up branch from 9c2ee48 to 6960cb8CompareOctober 2, 2023 17:53

@vladimirfomenevladimirfomene 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.

Just a couple of comments here and there

Comment threadlightning/src/ln/channelmanager.rs Outdated

let (monitor_update_option, mut failed_htlcs, unbroadcasted_batch_funding_txid) = shutdown_res;
log_debug!(self.logger, "Finishing force-closure of channel with {} HTLCs to fail", failed_htlcs.len());
log_debug!(self.logger, "Finishing closure of channel with {} HTLCs to fail", failed_htlcs.len());

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.

Does force here not give more context to anyone reading the logs?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Problem is its not longer just force-closures, its all closures.

pub reason: Option<ClosureReason>,
}

impl Default for ExpectedCloseEvent {

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.

Does it not make sense to derive Default instead of manually implementing it?

@wvanlintwvanlintOct 11, 2023

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Definitely makes sense! Derived instead. :)

Comment threadlightning/src/ln/channel.rs Outdated
let shutdown_result;
let unbroadcasted_batch_funding_txid = self.context.unbroadcasted_batch_funding_txid();
self.context.target_closing_feerate_sats_per_kw = target_feerate_sats_per_kw;
if self.context.channel_state & !STATE_FLAGS < ChannelState::FundingSent as u32 {

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.

Instead of defining shutdown_result on L5645 won't it be better to have this if/else expression return a ShutdownResult and then capture it in the shutdown_result variable.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Done, capturing shutdown_result from if-else expressions in a couple places now.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Can you write more full commit messages that describe what we're doing (not just "refactor", but "refactor to do X") and why we're doing it?

@wvanlint
wvanlintforce-pushed the batch_funding_fix_up branch from 6960cb8 to 39e0b7dCompareOctober 11, 2023 00:22
@wvanlint

wvanlint commented Oct 11, 2023

Copy link
Copy Markdown
ContributorAuthor

Can you write more full commit messages that describe what we're doing (not just "refactor", but "refactor to do X") and why we're doing it?

I've rewritten the commit subjects and added explanations to the bodies following https://cbea.ms/git-commit/, let me know if anything can be reworded there though!

wpaulino
wpaulino previously approved these changes Oct 12, 2023

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM, but I'd rather expand a few assertions and checks cause this is all pretty delicate code.

channel_capacity_sats,
..
} if (
expected_event.channel_id.map(|expected| *channel_id == expected).unwrap_or(true) &&

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Shouldn't these all be unwrap_or(false)? We don't want to match if the caller specified a channel id to match but the event didn't have it.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

The .map function is called on the expected event field, so the unwrap_or(true) call is meant to match if the caller left expectations unspecified. Does that sound correct? A ChannelClosed event will always have a channel_id.

Comment on lines 1509 to 1521
pub fn check_closed_event(node: &Node, _events_count: usize, expected_reason: ClosureReason, is_check_discard_funding: bool,
expected_counterparty_node_ids: &[PublicKey], expected_channel_capacity: u64) {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

?

Suggested change
pubfn check_closed_event(node:&Node,_events_count:usize,expected_reason:ClosureReason,is_check_discard_funding:bool,
expected_counterparty_node_ids:&[PublicKey], expected_channel_capacity:u64){
pubfn check_closed_event(node:&Node,events_count:usize,expected_reason:ClosureReason,is_check_discard_funding:bool,
expected_counterparty_node_ids:&[PublicKey], expected_channel_capacity:u64){
assert_eq!(events_count, expected_counterparty_node_ids.len());

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Needed to account for the DiscardFunding events too but verified the events_count here.

Option<Txid>
);
/// The result of a shutdown that should be handled.
pub(crate) struct ShutdownResult {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Suggested change
pub(crate)structShutdownResult{
#[must_use]
pub(crate)structShutdownResult{

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Done.

let (shutdown_msg, mut monitor_update_opt, htlcs, local_shutdown_result) =
chan.get_shutdown(&self.signer_provider, their_features, target_feerate_sats_per_1000_weight, override_shutdown_script)?;
failed_htlcs = htlcs;
shutdown_result = local_shutdown_result;

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Let's debug_assert our assumptions.

Suggested change
shutdown_result = local_shutdown_result;
shutdown_result = local_shutdown_result;
debug_assert_eq!(shutdown_result.is_some(), chan.is_shutdown());

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Added this assertion to all the cooperative closing paths.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Ugh, sorry, this needs rebase due to a silent conflict with #2658.

The check_closed_event function verified closure events against multiple
counterparty nodes, but only a single closure reason and channel
capacity. This commit introduces a check_closed_events function to
verify events against descriptions of each expected event, and refactors
check_closed_event in function of check_closed_events.
This refactors ShutdownResult as follows:
- Makes ShutdownResult a struct instead of a tuple to represent
individual results that need to be handled. This recently also
includes funding batch closure propagations.
- Makes Channel solely responsible for constructing ShutdownResult as
it should own all channel-specific logic.
@wvanlint
wvanlintforce-pushed the batch_funding_fix_up branch from aa8a485 to 316a794CompareOctober 19, 2023 03:52
@wvanlint

Copy link
Copy Markdown
ContributorAuthor

Ugh, sorry, this needs rebase due to a silent conflict with #2658.

No problem! Rebased. :)

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Thanks!

@TheBlueMatt
TheBlueMatt merged commit 8f308f9 into lightningdevkit:mainOct 29, 2023
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.

6 participants

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

Refactor ShutdownResult type and construction - #2613

Merged
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
wvanlint:batch_funding_fix_up
Oct 29, 2023
Merged

Refactor ShutdownResult type and construction#2613
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
wvanlint:batch_funding_fix_up

Conversation

@wvanlint

@wvanlintwvanlint commented Sep 28, 2023

Copy link
Copy Markdown
Contributor

As a follow-up to #2486, this PR:

  • Refactors the ShutdownResult type and moves construction to Channel methods.
  • Cleans up typos and unused variables/imports.
  • Refactors check_closed_event to be able to share it for batch funding tests. The current implementation is not usable since there might be multiple ClosureReasons. Let me know if this is not worth it though.

@wvanlintwvanlint mentioned this pull request Sep 28, 2023
@codecov-commenter

codecov-commenter commented Sep 28, 2023

Copy link
Copy Markdown

Codecov Report

Attention: 11 lines in your changes are missing coverage. Please review.

Comparison is base (1852715) 88.92% compared to head (316a794) 88.98%.

❗ Your organization needs to install the Codecov GitHub app to enable full functionality.

Additional details and impacted files
@@ Coverage Diff @@## main #2613 +/- ##
==========================================
+ Coverage 88.92% 88.98% +0.05% 
==========================================
Files 112 112 Lines 87632 87650 +18 Branches 87632 87650 +18 ==========================================
+ Hits 77929 77992 +63 + Misses 7473 7422 -51 - Partials 2230 2236 +6 
FilesCoverage Δ
lightning/src/ln/functional_tests.rs97.25% <100.00%> (+0.01%)⬆️
lightning/src/ln/functional_test_utils.rs91.10% <97.36%> (+0.25%)⬆️
lightning/src/ln/channelmanager.rs81.28% <84.00%> (-0.03%)⬇️
lightning/src/ln/channel.rs88.38% <77.77%> (-0.01%)⬇️

... and 8 files with indirect coverage changes

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

@wpaulino

Copy link
Copy Markdown
Contributor

Any reason this is marked as draft?

pub fn get_shutdown(&mut self, signer_provider: &SP, their_features: &InitFeatures,
target_feerate_sats_per_kw: Option<u32>, override_shutdown_script: Option<ShutdownScript>)
-> Result<(msgs::Shutdown, Option<ChannelMonitorUpdate>, Vec<(HTLCSource, PaymentHash)>), APIError>
-> Result<(msgs::Shutdown, Option<ChannelMonitorUpdate>, Vec<(HTLCSource, PaymentHash)>, Option<ShutdownResult>), APIError>

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I wonder if these Option<ChannelMonitorUpdate>, Vec<(HTLCSource, PaymentHash)> can be collapsed into Option<ShutdownResult> although the use cases are slightly different.

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? I think I'd rather keep them separate though. We'd want to handle the monitor update result on the non-shutdown case.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Right, that was my main hesitation. It seems possible to branch on the update_id of the ChannelMonitorUpdate being equal to CLOSED_CHANNEL_UPDATE_ID, but might not be something we want to unify.

Comment threadlightning/src/ln/channelmanager.rs
@wvanlint
wvanlint marked this pull request as ready for review September 28, 2023 18:09
@wvanlint

Copy link
Copy Markdown
ContributorAuthor

Any reason this is marked as draft?

Took another look, ready for review now. :)

Comment threadlightning/src/ln/channel.rs
@wvanlint
wvanlintforce-pushed the batch_funding_fix_up branch from 9c2ee48 to 6960cb8CompareOctober 2, 2023 17:53

@vladimirfomenevladimirfomene 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.

Just a couple of comments here and there

Comment threadlightning/src/ln/channelmanager.rs Outdated

let (monitor_update_option, mut failed_htlcs, unbroadcasted_batch_funding_txid) = shutdown_res;
log_debug!(self.logger, "Finishing force-closure of channel with {} HTLCs to fail", failed_htlcs.len());
log_debug!(self.logger, "Finishing closure of channel with {} HTLCs to fail", failed_htlcs.len());

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.

Does force here not give more context to anyone reading the logs?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Problem is its not longer just force-closures, its all closures.

pub reason: Option<ClosureReason>,
}

impl Default for ExpectedCloseEvent {

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.

Does it not make sense to derive Default instead of manually implementing it?

@wvanlintwvanlintOct 11, 2023

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Definitely makes sense! Derived instead. :)

Comment threadlightning/src/ln/channel.rs Outdated
let shutdown_result;
let unbroadcasted_batch_funding_txid = self.context.unbroadcasted_batch_funding_txid();
self.context.target_closing_feerate_sats_per_kw = target_feerate_sats_per_kw;
if self.context.channel_state & !STATE_FLAGS < ChannelState::FundingSent as u32 {

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.

Instead of defining shutdown_result on L5645 won't it be better to have this if/else expression return a ShutdownResult and then capture it in the shutdown_result variable.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Done, capturing shutdown_result from if-else expressions in a couple places now.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Can you write more full commit messages that describe what we're doing (not just "refactor", but "refactor to do X") and why we're doing it?

@wvanlint
wvanlintforce-pushed the batch_funding_fix_up branch from 6960cb8 to 39e0b7dCompareOctober 11, 2023 00:22
@wvanlint

wvanlint commented Oct 11, 2023

Copy link
Copy Markdown
ContributorAuthor

Can you write more full commit messages that describe what we're doing (not just "refactor", but "refactor to do X") and why we're doing it?

I've rewritten the commit subjects and added explanations to the bodies following https://cbea.ms/git-commit/, let me know if anything can be reworded there though!

wpaulino
wpaulino previously approved these changes Oct 12, 2023

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM, but I'd rather expand a few assertions and checks cause this is all pretty delicate code.

channel_capacity_sats,
..
} if (
expected_event.channel_id.map(|expected| *channel_id == expected).unwrap_or(true) &&

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Shouldn't these all be unwrap_or(false)? We don't want to match if the caller specified a channel id to match but the event didn't have it.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

The .map function is called on the expected event field, so the unwrap_or(true) call is meant to match if the caller left expectations unspecified. Does that sound correct? A ChannelClosed event will always have a channel_id.

Comment on lines 1509 to 1521
pub fn check_closed_event(node: &Node, _events_count: usize, expected_reason: ClosureReason, is_check_discard_funding: bool,
expected_counterparty_node_ids: &[PublicKey], expected_channel_capacity: u64) {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

?

Suggested change
pubfn check_closed_event(node:&Node,_events_count:usize,expected_reason:ClosureReason,is_check_discard_funding:bool,
expected_counterparty_node_ids:&[PublicKey], expected_channel_capacity:u64){
pubfn check_closed_event(node:&Node,events_count:usize,expected_reason:ClosureReason,is_check_discard_funding:bool,
expected_counterparty_node_ids:&[PublicKey], expected_channel_capacity:u64){
assert_eq!(events_count, expected_counterparty_node_ids.len());

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Needed to account for the DiscardFunding events too but verified the events_count here.

Option<Txid>
);
/// The result of a shutdown that should be handled.
pub(crate) struct ShutdownResult {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Suggested change
pub(crate)structShutdownResult{
#[must_use]
pub(crate)structShutdownResult{

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Done.

let (shutdown_msg, mut monitor_update_opt, htlcs, local_shutdown_result) =
chan.get_shutdown(&self.signer_provider, their_features, target_feerate_sats_per_1000_weight, override_shutdown_script)?;
failed_htlcs = htlcs;
shutdown_result = local_shutdown_result;

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Let's debug_assert our assumptions.

Suggested change
shutdown_result = local_shutdown_result;
shutdown_result = local_shutdown_result;
debug_assert_eq!(shutdown_result.is_some(), chan.is_shutdown());

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Added this assertion to all the cooperative closing paths.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Ugh, sorry, this needs rebase due to a silent conflict with #2658.

The check_closed_event function verified closure events against multiple
counterparty nodes, but only a single closure reason and channel
capacity. This commit introduces a check_closed_events function to
verify events against descriptions of each expected event, and refactors
check_closed_event in function of check_closed_events.
This refactors ShutdownResult as follows:
- Makes ShutdownResult a struct instead of a tuple to represent
individual results that need to be handled. This recently also
includes funding batch closure propagations.
- Makes Channel solely responsible for constructing ShutdownResult as
it should own all channel-specific logic.
@wvanlint
wvanlintforce-pushed the batch_funding_fix_up branch from aa8a485 to 316a794CompareOctober 19, 2023 03:52
@wvanlint

Copy link
Copy Markdown
ContributorAuthor

Ugh, sorry, this needs rebase due to a silent conflict with #2658.

No problem! Rebased. :)

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Thanks!

@TheBlueMatt
TheBlueMatt merged commit 8f308f9 into lightningdevkit:mainOct 29, 2023
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.

6 participants

@wvanlint@codecov-commenter@wpaulino@TheBlueMatt@vladimirfomene@benthecarman
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Refactor ShutdownResult type and construction by wvanlint · Pull Request #2613 · lightningdevkit/rust-lightning · GitHub
Skip to content

Refactor ShutdownResult type and construction - #2613

Merged
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
wvanlint:batch_funding_fix_up
Oct 29, 2023
Merged

Refactor ShutdownResult type and construction#2613
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
wvanlint:batch_funding_fix_up

Conversation

@wvanlint

@wvanlintwvanlint commented Sep 28, 2023

Copy link
Copy Markdown
Contributor

As a follow-up to #2486, this PR:

  • Refactors the ShutdownResult type and moves construction to Channel methods.
  • Cleans up typos and unused variables/imports.
  • Refactors check_closed_event to be able to share it for batch funding tests. The current implementation is not usable since there might be multiple ClosureReasons. Let me know if this is not worth it though.

@wvanlintwvanlint mentioned this pull request Sep 28, 2023
@codecov-commenter

codecov-commenter commented Sep 28, 2023

Copy link
Copy Markdown

Codecov Report

Attention: 11 lines in your changes are missing coverage. Please review.

Comparison is base (1852715) 88.92% compared to head (316a794) 88.98%.

❗ Your organization needs to install the Codecov GitHub app to enable full functionality.

Additional details and impacted files
@@ Coverage Diff @@## main #2613 +/- ##
==========================================
+ Coverage 88.92% 88.98% +0.05% 
==========================================
Files 112 112 Lines 87632 87650 +18 Branches 87632 87650 +18 ==========================================
+ Hits 77929 77992 +63 + Misses 7473 7422 -51 - Partials 2230 2236 +6 
FilesCoverage Δ
lightning/src/ln/functional_tests.rs97.25% <100.00%> (+0.01%)⬆️
lightning/src/ln/functional_test_utils.rs91.10% <97.36%> (+0.25%)⬆️
lightning/src/ln/channelmanager.rs81.28% <84.00%> (-0.03%)⬇️
lightning/src/ln/channel.rs88.38% <77.77%> (-0.01%)⬇️

... and 8 files with indirect coverage changes

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

@wpaulino

Copy link
Copy Markdown
Contributor

Any reason this is marked as draft?

pub fn get_shutdown(&mut self, signer_provider: &SP, their_features: &InitFeatures,
target_feerate_sats_per_kw: Option<u32>, override_shutdown_script: Option<ShutdownScript>)
-> Result<(msgs::Shutdown, Option<ChannelMonitorUpdate>, Vec<(HTLCSource, PaymentHash)>), APIError>
-> Result<(msgs::Shutdown, Option<ChannelMonitorUpdate>, Vec<(HTLCSource, PaymentHash)>, Option<ShutdownResult>), APIError>

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I wonder if these Option<ChannelMonitorUpdate>, Vec<(HTLCSource, PaymentHash)> can be collapsed into Option<ShutdownResult> although the use cases are slightly different.

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? I think I'd rather keep them separate though. We'd want to handle the monitor update result on the non-shutdown case.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Right, that was my main hesitation. It seems possible to branch on the update_id of the ChannelMonitorUpdate being equal to CLOSED_CHANNEL_UPDATE_ID, but might not be something we want to unify.

Comment threadlightning/src/ln/channelmanager.rs
@wvanlint
wvanlint marked this pull request as ready for review September 28, 2023 18:09
@wvanlint

Copy link
Copy Markdown
ContributorAuthor

Any reason this is marked as draft?

Took another look, ready for review now. :)

Comment threadlightning/src/ln/channel.rs
@wvanlint
wvanlintforce-pushed the batch_funding_fix_up branch from 9c2ee48 to 6960cb8CompareOctober 2, 2023 17:53

@vladimirfomenevladimirfomene 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.

Just a couple of comments here and there

Comment threadlightning/src/ln/channelmanager.rs Outdated

let (monitor_update_option, mut failed_htlcs, unbroadcasted_batch_funding_txid) = shutdown_res;
log_debug!(self.logger, "Finishing force-closure of channel with {} HTLCs to fail", failed_htlcs.len());
log_debug!(self.logger, "Finishing closure of channel with {} HTLCs to fail", failed_htlcs.len());

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.

Does force here not give more context to anyone reading the logs?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Problem is its not longer just force-closures, its all closures.

pub reason: Option<ClosureReason>,
}

impl Default for ExpectedCloseEvent {

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.

Does it not make sense to derive Default instead of manually implementing it?

@wvanlintwvanlintOct 11, 2023

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Definitely makes sense! Derived instead. :)

Comment threadlightning/src/ln/channel.rs Outdated
let shutdown_result;
let unbroadcasted_batch_funding_txid = self.context.unbroadcasted_batch_funding_txid();
self.context.target_closing_feerate_sats_per_kw = target_feerate_sats_per_kw;
if self.context.channel_state & !STATE_FLAGS < ChannelState::FundingSent as u32 {

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.

Instead of defining shutdown_result on L5645 won't it be better to have this if/else expression return a ShutdownResult and then capture it in the shutdown_result variable.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Done, capturing shutdown_result from if-else expressions in a couple places now.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Can you write more full commit messages that describe what we're doing (not just "refactor", but "refactor to do X") and why we're doing it?

@wvanlint
wvanlintforce-pushed the batch_funding_fix_up branch from 6960cb8 to 39e0b7dCompareOctober 11, 2023 00:22
@wvanlint

wvanlint commented Oct 11, 2023

Copy link
Copy Markdown
ContributorAuthor

Can you write more full commit messages that describe what we're doing (not just "refactor", but "refactor to do X") and why we're doing it?

I've rewritten the commit subjects and added explanations to the bodies following https://cbea.ms/git-commit/, let me know if anything can be reworded there though!

wpaulino
wpaulino previously approved these changes Oct 12, 2023

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM, but I'd rather expand a few assertions and checks cause this is all pretty delicate code.

channel_capacity_sats,
..
} if (
expected_event.channel_id.map(|expected| *channel_id == expected).unwrap_or(true) &&

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Shouldn't these all be unwrap_or(false)? We don't want to match if the caller specified a channel id to match but the event didn't have it.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

The .map function is called on the expected event field, so the unwrap_or(true) call is meant to match if the caller left expectations unspecified. Does that sound correct? A ChannelClosed event will always have a channel_id.

Comment on lines 1509 to 1521
pub fn check_closed_event(node: &Node, _events_count: usize, expected_reason: ClosureReason, is_check_discard_funding: bool,
expected_counterparty_node_ids: &[PublicKey], expected_channel_capacity: u64) {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

?

Suggested change
pubfn check_closed_event(node:&Node,_events_count:usize,expected_reason:ClosureReason,is_check_discard_funding:bool,
expected_counterparty_node_ids:&[PublicKey], expected_channel_capacity:u64){
pubfn check_closed_event(node:&Node,events_count:usize,expected_reason:ClosureReason,is_check_discard_funding:bool,
expected_counterparty_node_ids:&[PublicKey], expected_channel_capacity:u64){
assert_eq!(events_count, expected_counterparty_node_ids.len());

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Needed to account for the DiscardFunding events too but verified the events_count here.

Option<Txid>
);
/// The result of a shutdown that should be handled.
pub(crate) struct ShutdownResult {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Suggested change
pub(crate)structShutdownResult{
#[must_use]
pub(crate)structShutdownResult{

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Done.

let (shutdown_msg, mut monitor_update_opt, htlcs, local_shutdown_result) =
chan.get_shutdown(&self.signer_provider, their_features, target_feerate_sats_per_1000_weight, override_shutdown_script)?;
failed_htlcs = htlcs;
shutdown_result = local_shutdown_result;

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Let's debug_assert our assumptions.

Suggested change
shutdown_result = local_shutdown_result;
shutdown_result = local_shutdown_result;
debug_assert_eq!(shutdown_result.is_some(), chan.is_shutdown());

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Added this assertion to all the cooperative closing paths.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Ugh, sorry, this needs rebase due to a silent conflict with #2658.

The check_closed_event function verified closure events against multiple
counterparty nodes, but only a single closure reason and channel
capacity. This commit introduces a check_closed_events function to
verify events against descriptions of each expected event, and refactors
check_closed_event in function of check_closed_events.
This refactors ShutdownResult as follows:
- Makes ShutdownResult a struct instead of a tuple to represent
individual results that need to be handled. This recently also
includes funding batch closure propagations.
- Makes Channel solely responsible for constructing ShutdownResult as
it should own all channel-specific logic.
@wvanlint
wvanlintforce-pushed the batch_funding_fix_up branch from aa8a485 to 316a794CompareOctober 19, 2023 03:52
@wvanlint

Copy link
Copy Markdown
ContributorAuthor

Ugh, sorry, this needs rebase due to a silent conflict with #2658.

No problem! Rebased. :)

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Thanks!

@TheBlueMatt
TheBlueMatt merged commit 8f308f9 into lightningdevkit:mainOct 29, 2023
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.

6 participants

@wvanlint@codecov-commenter@wpaulino@TheBlueMatt@vladimirfomene@benthecarman
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Refactor ShutdownResult type and construction by wvanlint · Pull Request #2613 · lightningdevkit/rust-lightning · GitHub
Skip to content

Refactor ShutdownResult type and construction - #2613

Merged
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
wvanlint:batch_funding_fix_up
Oct 29, 2023
Merged

Refactor ShutdownResult type and construction#2613
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
wvanlint:batch_funding_fix_up

Conversation

@wvanlint

@wvanlintwvanlint commented Sep 28, 2023

Copy link
Copy Markdown
Contributor

As a follow-up to #2486, this PR:

  • Refactors the ShutdownResult type and moves construction to Channel methods.
  • Cleans up typos and unused variables/imports.
  • Refactors check_closed_event to be able to share it for batch funding tests. The current implementation is not usable since there might be multiple ClosureReasons. Let me know if this is not worth it though.

@wvanlintwvanlint mentioned this pull request Sep 28, 2023
@codecov-commenter

codecov-commenter commented Sep 28, 2023

Copy link
Copy Markdown

Codecov Report

Attention: 11 lines in your changes are missing coverage. Please review.

Comparison is base (1852715) 88.92% compared to head (316a794) 88.98%.

❗ Your organization needs to install the Codecov GitHub app to enable full functionality.

Additional details and impacted files
@@ Coverage Diff @@## main #2613 +/- ##
==========================================
+ Coverage 88.92% 88.98% +0.05% 
==========================================
Files 112 112 Lines 87632 87650 +18 Branches 87632 87650 +18 ==========================================
+ Hits 77929 77992 +63 + Misses 7473 7422 -51 - Partials 2230 2236 +6 
FilesCoverage Δ
lightning/src/ln/functional_tests.rs97.25% <100.00%> (+0.01%)⬆️
lightning/src/ln/functional_test_utils.rs91.10% <97.36%> (+0.25%)⬆️
lightning/src/ln/channelmanager.rs81.28% <84.00%> (-0.03%)⬇️
lightning/src/ln/channel.rs88.38% <77.77%> (-0.01%)⬇️

... and 8 files with indirect coverage changes

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

@wpaulino

Copy link
Copy Markdown
Contributor

Any reason this is marked as draft?

pub fn get_shutdown(&mut self, signer_provider: &SP, their_features: &InitFeatures,
target_feerate_sats_per_kw: Option<u32>, override_shutdown_script: Option<ShutdownScript>)
-> Result<(msgs::Shutdown, Option<ChannelMonitorUpdate>, Vec<(HTLCSource, PaymentHash)>), APIError>
-> Result<(msgs::Shutdown, Option<ChannelMonitorUpdate>, Vec<(HTLCSource, PaymentHash)>, Option<ShutdownResult>), APIError>

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I wonder if these Option<ChannelMonitorUpdate>, Vec<(HTLCSource, PaymentHash)> can be collapsed into Option<ShutdownResult> although the use cases are slightly different.

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? I think I'd rather keep them separate though. We'd want to handle the monitor update result on the non-shutdown case.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Right, that was my main hesitation. It seems possible to branch on the update_id of the ChannelMonitorUpdate being equal to CLOSED_CHANNEL_UPDATE_ID, but might not be something we want to unify.

Comment threadlightning/src/ln/channelmanager.rs
@wvanlint
wvanlint marked this pull request as ready for review September 28, 2023 18:09
@wvanlint

Copy link
Copy Markdown
ContributorAuthor

Any reason this is marked as draft?

Took another look, ready for review now. :)

Comment threadlightning/src/ln/channel.rs
@wvanlint
wvanlintforce-pushed the batch_funding_fix_up branch from 9c2ee48 to 6960cb8CompareOctober 2, 2023 17:53

@vladimirfomenevladimirfomene 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.

Just a couple of comments here and there

Comment threadlightning/src/ln/channelmanager.rs Outdated

let (monitor_update_option, mut failed_htlcs, unbroadcasted_batch_funding_txid) = shutdown_res;
log_debug!(self.logger, "Finishing force-closure of channel with {} HTLCs to fail", failed_htlcs.len());
log_debug!(self.logger, "Finishing closure of channel with {} HTLCs to fail", failed_htlcs.len());

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.

Does force here not give more context to anyone reading the logs?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Problem is its not longer just force-closures, its all closures.

pub reason: Option<ClosureReason>,
}

impl Default for ExpectedCloseEvent {

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.

Does it not make sense to derive Default instead of manually implementing it?

@wvanlintwvanlintOct 11, 2023

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Definitely makes sense! Derived instead. :)

Comment threadlightning/src/ln/channel.rs Outdated
let shutdown_result;
let unbroadcasted_batch_funding_txid = self.context.unbroadcasted_batch_funding_txid();
self.context.target_closing_feerate_sats_per_kw = target_feerate_sats_per_kw;
if self.context.channel_state & !STATE_FLAGS < ChannelState::FundingSent as u32 {

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.

Instead of defining shutdown_result on L5645 won't it be better to have this if/else expression return a ShutdownResult and then capture it in the shutdown_result variable.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Done, capturing shutdown_result from if-else expressions in a couple places now.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Can you write more full commit messages that describe what we're doing (not just "refactor", but "refactor to do X") and why we're doing it?

@wvanlint
wvanlintforce-pushed the batch_funding_fix_up branch from 6960cb8 to 39e0b7dCompareOctober 11, 2023 00:22
@wvanlint

wvanlint commented Oct 11, 2023

Copy link
Copy Markdown
ContributorAuthor

Can you write more full commit messages that describe what we're doing (not just "refactor", but "refactor to do X") and why we're doing it?

I've rewritten the commit subjects and added explanations to the bodies following https://cbea.ms/git-commit/, let me know if anything can be reworded there though!

wpaulino
wpaulino previously approved these changes Oct 12, 2023

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM, but I'd rather expand a few assertions and checks cause this is all pretty delicate code.

channel_capacity_sats,
..
} if (
expected_event.channel_id.map(|expected| *channel_id == expected).unwrap_or(true) &&

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Shouldn't these all be unwrap_or(false)? We don't want to match if the caller specified a channel id to match but the event didn't have it.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

The .map function is called on the expected event field, so the unwrap_or(true) call is meant to match if the caller left expectations unspecified. Does that sound correct? A ChannelClosed event will always have a channel_id.

Comment on lines 1509 to 1521
pub fn check_closed_event(node: &Node, _events_count: usize, expected_reason: ClosureReason, is_check_discard_funding: bool,
expected_counterparty_node_ids: &[PublicKey], expected_channel_capacity: u64) {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

?

Suggested change
pubfn check_closed_event(node:&Node,_events_count:usize,expected_reason:ClosureReason,is_check_discard_funding:bool,
expected_counterparty_node_ids:&[PublicKey], expected_channel_capacity:u64){
pubfn check_closed_event(node:&Node,events_count:usize,expected_reason:ClosureReason,is_check_discard_funding:bool,
expected_counterparty_node_ids:&[PublicKey], expected_channel_capacity:u64){
assert_eq!(events_count, expected_counterparty_node_ids.len());

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Needed to account for the DiscardFunding events too but verified the events_count here.

Option<Txid>
);
/// The result of a shutdown that should be handled.
pub(crate) struct ShutdownResult {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Suggested change
pub(crate)structShutdownResult{
#[must_use]
pub(crate)structShutdownResult{

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Done.

let (shutdown_msg, mut monitor_update_opt, htlcs, local_shutdown_result) =
chan.get_shutdown(&self.signer_provider, their_features, target_feerate_sats_per_1000_weight, override_shutdown_script)?;
failed_htlcs = htlcs;
shutdown_result = local_shutdown_result;

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Let's debug_assert our assumptions.

Suggested change
shutdown_result = local_shutdown_result;
shutdown_result = local_shutdown_result;
debug_assert_eq!(shutdown_result.is_some(), chan.is_shutdown());

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Added this assertion to all the cooperative closing paths.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Ugh, sorry, this needs rebase due to a silent conflict with #2658.

The check_closed_event function verified closure events against multiple
counterparty nodes, but only a single closure reason and channel
capacity. This commit introduces a check_closed_events function to
verify events against descriptions of each expected event, and refactors
check_closed_event in function of check_closed_events.
This refactors ShutdownResult as follows:
- Makes ShutdownResult a struct instead of a tuple to represent
individual results that need to be handled. This recently also
includes funding batch closure propagations.
- Makes Channel solely responsible for constructing ShutdownResult as
it should own all channel-specific logic.
@wvanlint
wvanlintforce-pushed the batch_funding_fix_up branch from aa8a485 to 316a794CompareOctober 19, 2023 03:52
@wvanlint

Copy link
Copy Markdown
ContributorAuthor

Ugh, sorry, this needs rebase due to a silent conflict with #2658.

No problem! Rebased. :)

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Thanks!

@TheBlueMatt
TheBlueMatt merged commit 8f308f9 into lightningdevkit:mainOct 29, 2023
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.

6 participants

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

Refactor ShutdownResult type and construction - #2613

Merged
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
wvanlint:batch_funding_fix_up
Oct 29, 2023
Merged

Refactor ShutdownResult type and construction#2613
TheBlueMatt merged 3 commits into
lightningdevkit:mainfrom
wvanlint:batch_funding_fix_up

Conversation

@wvanlint

@wvanlintwvanlint commented Sep 28, 2023

Copy link
Copy Markdown
Contributor

As a follow-up to #2486, this PR:

  • Refactors the ShutdownResult type and moves construction to Channel methods.
  • Cleans up typos and unused variables/imports.
  • Refactors check_closed_event to be able to share it for batch funding tests. The current implementation is not usable since there might be multiple ClosureReasons. Let me know if this is not worth it though.

@wvanlintwvanlint mentioned this pull request Sep 28, 2023
@codecov-commenter

codecov-commenter commented Sep 28, 2023

Copy link
Copy Markdown

Codecov Report

Attention: 11 lines in your changes are missing coverage. Please review.

Comparison is base (1852715) 88.92% compared to head (316a794) 88.98%.

❗ Your organization needs to install the Codecov GitHub app to enable full functionality.

Additional details and impacted files
@@ Coverage Diff @@## main #2613 +/- ##
==========================================
+ Coverage 88.92% 88.98% +0.05% 
==========================================
Files 112 112 Lines 87632 87650 +18 Branches 87632 87650 +18 ==========================================
+ Hits 77929 77992 +63 + Misses 7473 7422 -51 - Partials 2230 2236 +6 
FilesCoverage Δ
lightning/src/ln/functional_tests.rs97.25% <100.00%> (+0.01%)⬆️
lightning/src/ln/functional_test_utils.rs91.10% <97.36%> (+0.25%)⬆️
lightning/src/ln/channelmanager.rs81.28% <84.00%> (-0.03%)⬇️
lightning/src/ln/channel.rs88.38% <77.77%> (-0.01%)⬇️

... and 8 files with indirect coverage changes

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

@wpaulino

Copy link
Copy Markdown
Contributor

Any reason this is marked as draft?

pub fn get_shutdown(&mut self, signer_provider: &SP, their_features: &InitFeatures,
target_feerate_sats_per_kw: Option<u32>, override_shutdown_script: Option<ShutdownScript>)
-> Result<(msgs::Shutdown, Option<ChannelMonitorUpdate>, Vec<(HTLCSource, PaymentHash)>), APIError>
-> Result<(msgs::Shutdown, Option<ChannelMonitorUpdate>, Vec<(HTLCSource, PaymentHash)>, Option<ShutdownResult>), APIError>

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I wonder if these Option<ChannelMonitorUpdate>, Vec<(HTLCSource, PaymentHash)> can be collapsed into Option<ShutdownResult> although the use cases are slightly different.

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? I think I'd rather keep them separate though. We'd want to handle the monitor update result on the non-shutdown case.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Right, that was my main hesitation. It seems possible to branch on the update_id of the ChannelMonitorUpdate being equal to CLOSED_CHANNEL_UPDATE_ID, but might not be something we want to unify.

Comment threadlightning/src/ln/channelmanager.rs
@wvanlint
wvanlint marked this pull request as ready for review September 28, 2023 18:09
@wvanlint

Copy link
Copy Markdown
ContributorAuthor

Any reason this is marked as draft?

Took another look, ready for review now. :)

Comment threadlightning/src/ln/channel.rs
@wvanlint
wvanlintforce-pushed the batch_funding_fix_up branch from 9c2ee48 to 6960cb8CompareOctober 2, 2023 17:53

@vladimirfomenevladimirfomene 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.

Just a couple of comments here and there

Comment threadlightning/src/ln/channelmanager.rs Outdated

let (monitor_update_option, mut failed_htlcs, unbroadcasted_batch_funding_txid) = shutdown_res;
log_debug!(self.logger, "Finishing force-closure of channel with {} HTLCs to fail", failed_htlcs.len());
log_debug!(self.logger, "Finishing closure of channel with {} HTLCs to fail", failed_htlcs.len());

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.

Does force here not give more context to anyone reading the logs?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Problem is its not longer just force-closures, its all closures.

pub reason: Option<ClosureReason>,
}

impl Default for ExpectedCloseEvent {

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.

Does it not make sense to derive Default instead of manually implementing it?

@wvanlintwvanlintOct 11, 2023

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Definitely makes sense! Derived instead. :)

Comment threadlightning/src/ln/channel.rs Outdated
let shutdown_result;
let unbroadcasted_batch_funding_txid = self.context.unbroadcasted_batch_funding_txid();
self.context.target_closing_feerate_sats_per_kw = target_feerate_sats_per_kw;
if self.context.channel_state & !STATE_FLAGS < ChannelState::FundingSent as u32 {

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.

Instead of defining shutdown_result on L5645 won't it be better to have this if/else expression return a ShutdownResult and then capture it in the shutdown_result variable.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Done, capturing shutdown_result from if-else expressions in a couple places now.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Can you write more full commit messages that describe what we're doing (not just "refactor", but "refactor to do X") and why we're doing it?

@wvanlint
wvanlintforce-pushed the batch_funding_fix_up branch from 6960cb8 to 39e0b7dCompareOctober 11, 2023 00:22
@wvanlint

wvanlint commented Oct 11, 2023

Copy link
Copy Markdown
ContributorAuthor

Can you write more full commit messages that describe what we're doing (not just "refactor", but "refactor to do X") and why we're doing it?

I've rewritten the commit subjects and added explanations to the bodies following https://cbea.ms/git-commit/, let me know if anything can be reworded there though!

wpaulino
wpaulino previously approved these changes Oct 12, 2023

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM, but I'd rather expand a few assertions and checks cause this is all pretty delicate code.

channel_capacity_sats,
..
} if (
expected_event.channel_id.map(|expected| *channel_id == expected).unwrap_or(true) &&

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Shouldn't these all be unwrap_or(false)? We don't want to match if the caller specified a channel id to match but the event didn't have it.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

The .map function is called on the expected event field, so the unwrap_or(true) call is meant to match if the caller left expectations unspecified. Does that sound correct? A ChannelClosed event will always have a channel_id.

Comment on lines 1509 to 1521
pub fn check_closed_event(node: &Node, _events_count: usize, expected_reason: ClosureReason, is_check_discard_funding: bool,
expected_counterparty_node_ids: &[PublicKey], expected_channel_capacity: u64) {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

?

Suggested change
pubfn check_closed_event(node:&Node,_events_count:usize,expected_reason:ClosureReason,is_check_discard_funding:bool,
expected_counterparty_node_ids:&[PublicKey], expected_channel_capacity:u64){
pubfn check_closed_event(node:&Node,events_count:usize,expected_reason:ClosureReason,is_check_discard_funding:bool,
expected_counterparty_node_ids:&[PublicKey], expected_channel_capacity:u64){
assert_eq!(events_count, expected_counterparty_node_ids.len());

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Needed to account for the DiscardFunding events too but verified the events_count here.

Option<Txid>
);
/// The result of a shutdown that should be handled.
pub(crate) struct ShutdownResult {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Suggested change
pub(crate)structShutdownResult{
#[must_use]
pub(crate)structShutdownResult{

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Done.

let (shutdown_msg, mut monitor_update_opt, htlcs, local_shutdown_result) =
chan.get_shutdown(&self.signer_provider, their_features, target_feerate_sats_per_1000_weight, override_shutdown_script)?;
failed_htlcs = htlcs;
shutdown_result = local_shutdown_result;

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Let's debug_assert our assumptions.

Suggested change
shutdown_result = local_shutdown_result;
shutdown_result = local_shutdown_result;
debug_assert_eq!(shutdown_result.is_some(), chan.is_shutdown());

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Added this assertion to all the cooperative closing paths.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Ugh, sorry, this needs rebase due to a silent conflict with #2658.

The check_closed_event function verified closure events against multiple
counterparty nodes, but only a single closure reason and channel
capacity. This commit introduces a check_closed_events function to
verify events against descriptions of each expected event, and refactors
check_closed_event in function of check_closed_events.
This refactors ShutdownResult as follows:
- Makes ShutdownResult a struct instead of a tuple to represent
individual results that need to be handled. This recently also
includes funding batch closure propagations.
- Makes Channel solely responsible for constructing ShutdownResult as
it should own all channel-specific logic.
@wvanlint
wvanlintforce-pushed the batch_funding_fix_up branch from aa8a485 to 316a794CompareOctober 19, 2023 03:52
@wvanlint

Copy link
Copy Markdown
ContributorAuthor

Ugh, sorry, this needs rebase due to a silent conflict with #2658.

No problem! Rebased. :)

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Thanks!

@TheBlueMatt
TheBlueMatt merged commit 8f308f9 into lightningdevkit:mainOct 29, 2023
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.

6 participants

@wvanlint@codecov-commenter@wpaulino@TheBlueMatt@vladimirfomene@benthecarman