Remove Channel's ChannelMonitor copy - #667

Merged
TheBlueMatt merged 2 commits into
lightningdevkit:masterfrom
valentinewallace:remove-channels-chanmon
Aug 25, 2020
Merged

Remove Channel's ChannelMonitor copy#667
TheBlueMatt merged 2 commits into
lightningdevkit:masterfrom
valentinewallace:remove-channels-chanmon

Conversation

@valentinewallace

@valentinewallacevalentinewallace commented Aug 10, 2020

Copy link
Copy Markdown
Contributor

In service to the larger refactor of removing the Channel's reference
to its ChannelMonitor.

This also allows us to remove the Channel's channel_monitor() function. Next we can remove all of the Channel's logic for keeping its channel monitor up to date, as well as the update_monitor_ooo logic in ChannelMonitor.

Partially resolvesCloses#657

@codecov

codecovBot commented Aug 10, 2020

Copy link
Copy Markdown

Codecov Report

Merging #667 into master will increase coverage by 0.10%.
The diff coverage is 92.47%.

Impacted file tree graph

@@ Coverage Diff @@## master #667 +/- ##
==========================================
+ Coverage 91.36% 91.46% +0.10% 
==========================================
Files 35 35 Lines 21703 21888 +185 ==========================================
+ Hits 19828 20019 +191 + Misses 1875 1869 -6 
Impacted FilesCoverage Δ
lightning/src/ln/channel.rs87.17% <ø> (-0.04%)⬇️
lightning/src/ln/reorg_tests.rs98.94% <ø> (ø)
lightning/src/ln/functional_tests.rs97.15% <88.23%> (+0.14%)⬆️
lightning/src/ln/channelmonitor.rs95.56% <90.24%> (-0.15%)⬇️
lightning/src/ln/channelmanager.rs85.26% <96.96%> (+<0.01%)⬆️
lightning/src/util/test_utils.rs86.13% <100.00%> (ø)
lightning/src/ln/onchaintx.rs93.75% <0.00%> (-0.20%)⬇️
lightning/src/routing/router.rs97.39% <0.00%> (+0.80%)⬆️

Continue to review full report at Codecov.

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

@valentinewallace

Copy link
Copy Markdown
ContributorAuthor

Oops, broke build -- will fix in a bit

@valentinewallace

Copy link
Copy Markdown
ContributorAuthor

I looked into extracting some common HTLC selection functionality between monitor_would_broadcast and build_commitment_transaction but they're pretty different, they want different HTLCs, and monitor_would_broadcast needs local and remote HTLCs, and idk. Let me know if I'm missing something and it's definitely a good idea.

@valentinewallacevalentinewallace changed the title Add would_broadcast_at_height functionality to ChannelRemove Channel's ChannelMonitor copyAug 13, 2020
@valentinewallace

Copy link
Copy Markdown
ContributorAuthor

Hmm, fuzzing seems slow still. Looking into it.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
@valentinewallacevalentinewallace mentioned this pull request Aug 19, 2020
@valentinewallacevalentinewallace mentioned this pull request Aug 19, 2020
@valentinewallace
valentinewallaceforce-pushed the remove-channels-chanmon branch 2 times, most recently from 684dba8 to 70c58d9CompareAugust 19, 2020 21:01
Comment threadlightning/src/ln/channel.rs Outdated
@@ -908,7 +969,7 @@ impl<ChanSigner: ChannelKeys> Channel<ChanSigner> {
InboundHTLCState::AwaitingRemoteRevokeToAnnounce(_) => (!generated_by_local, "AwaitingRemoteRevokeToAnnounce"),

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.

not so much related to this diff in particular, but is the string literal the most elegant way to get the state name?

@valentinewallacevalentinewallaceAug 25, 2020

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.

Open to other options 😄 (for a future PR)

Comment threadlightning/src/ln/channelmonitor.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channelmonitor.rs Outdated

@ariardariard left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

I'm all in to remove Channel's ChannelMonitor copy but I think there is a easier way than dc9ef2c. If I understand new would_broadcast_at_height_functionality well, its purpose is only to verify that ChannelMonitor accomplish its job well and broadcast channel update accordingly.

I'm not sure if it's a great approach, in the future if we add new conditions in ChannelMonitor to force-close channel we would need to access them too. Like in case of mempools-congestion, preemptively close channel at risk.

Another way to solve this would be a) pass a reference to ChainWatchInterface to ChannelManager b) at funding_tx detection, return its output to watch c) monitor commitment transaction broadcast. Parsing positively commitment transaction is easy to do due to transaction pattern (one-input), LN commitment number watermark and overall funding outpoint spending. It's more robust also as we shouldn't assume that our ChannelManager and ChannelMonitor are running on the same block provider and thus may have block view latency.

I know that's already the current model to query ChannelMonitor to decide if we should shutdown and broadcast channel update, but I think it's fine to wait a bit for channel update broadcast. Shutdown/broadcast will happen either sooner after any attempt to unsuccessfully update monitors. Or latter after block processing.

If you still want to be quick in term of updating global network view of our channel maybe we can ChannelMonitor signal broadcast with a boolean and us periodically querying it like we're doing for get_and_clear_pending_htlcs_updated ?

Overall, I may miss some onchain/offchain coupling assumptions but it feels like we can short-cut some complexity ?

Comment threadlightning/src/ln/channel.rs Outdated
@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Ooooo, right, so I think that's true - would_broadcast_at_height is only used to close a channel and we could happily have the ChannelMonitor handle that (though currently Channel[Manager] handles that fully). My knee-jerk reaction was that there would be a race condition where we'd continue updating a channel state after its been closed (and the latest local commitment broadcast), but I think we could not even bother notifying the ChannelManager that we're closing the channel and wait for provide_latest_local_commitment_tx_info to return an Err because local_tx_signed is set to close the channel, so there's no race.

@valentinewallace
valentinewallaceforce-pushed the remove-channels-chanmon branch 2 times, most recently from 905dbe2 to df55910CompareAugust 23, 2020 02:35
Comment threadlightning/src/ln/channelmonitor.rs Outdated

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

I had to admit I'm somewhat surprised that's the only test changes you need, but looks good.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmonitor.rs Outdated
@valentinewallace
valentinewallaceforce-pushed the remove-channels-chanmon branch 2 times, most recently from 2b86ba7 to 8b5502bCompareAugust 24, 2020 23:05
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmonitor.rs Outdated

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

Aside from the one clarifying change I suggested and the two comment nits, looks good!


/// An event to be processed by the ChannelManager.
#[derive(PartialEq)]
pub enum MonitorEvent {

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.

Out of curiosity, how do we decide which events are monitor events? For example, why is HTLCEvent for claiming one, but forwarding offered HTLCs isn't?

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.

In this context, its basically "a thing which we detected on-chain which has an impact on our understanding of a channel's state" (ie, basically, "channel has been closed on chain" or "transaction on-chain resolved an HTLC which was outstanding when we went on chain").

Comment threadlightning/src/ln/onchaintx.rs Outdated
Comment threadlightning/src/ln/channelmonitor.rs Outdated
Comment threadlightning/src/ln/channelmonitor.rs Outdated
Comment threadlightning/src/ln/channelmonitor.rs Outdated
0 => MonitorEvent::HTLCEvent(Readable::read(reader)?),
1 => MonitorEvent::CommitmentTxBroadcasted(funding_info.0),
_ => return Err(DecodeError::InvalidValue)
};

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.

One day we'll have versioning for reads lol :)

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.

Indeed lol

To do this, we replace get_and_clear_pending_htlcs_updated with
get_and_clear_pending_monitor_events, and which still transmits HTLCUpdates
as before, but now also transmits a new MonitorEvent::CommitmentTxBroadcasted
event when a channel's commitment transaction is broadcasted.
@TheBlueMatt
TheBlueMatt merged commit 501974d into lightningdevkit:masterAug 25, 2020
if should_broadcast {
self.pending_monitor_events.push(MonitorEvent::CommitmentTxBroadcasted(self.funding_info.0));
if let Some(commitment_tx) = self.onchain_tx_handler.get_fully_signed_local_tx(&self.funding_redeemscript) {
self.local_tx_signed = true;

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

@valentinewallace

I think this is breaking one of the property of our distributed watchtower infrastructure as documented here : https://github.com/rust-bitcoin/rust-lightning/blob/3defcc896266f3d67848ce28981a756e971a3f0c/lightning/src/ln/channelmonitor.rs#L1174

AFAICT, by adding logs flag is true beyond updating local view with latest local state.

I'll fix it and add coverage for this.

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.

Logs flag? Ok I think I see what you mean though, thanks for catching this!

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.

We're discussing on IRC still, but I don't think this change is correct - we should refuse to accept updates after we've signed a local tx irrespective of why we signed it.

@ariardariardAug 28, 2020

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Sorry, after discussion on IRC and testing I realized that the alleged property was only supported in my mind. In fact #667 makes it easy to actually implement it, so did so in #679 with test coverage.

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.

Get rid of unnecessary ChannelMonitor in Channel

4 participants

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

Remove Channel's ChannelMonitor copy - #667

Merged
TheBlueMatt merged 2 commits into
lightningdevkit:masterfrom
valentinewallace:remove-channels-chanmon
Aug 25, 2020
Merged

Remove Channel's ChannelMonitor copy#667
TheBlueMatt merged 2 commits into
lightningdevkit:masterfrom
valentinewallace:remove-channels-chanmon

Conversation

@valentinewallace

@valentinewallacevalentinewallace commented Aug 10, 2020

Copy link
Copy Markdown
Contributor

In service to the larger refactor of removing the Channel's reference
to its ChannelMonitor.

This also allows us to remove the Channel's channel_monitor() function. Next we can remove all of the Channel's logic for keeping its channel monitor up to date, as well as the update_monitor_ooo logic in ChannelMonitor.

Partially resolvesCloses#657

@codecov

codecovBot commented Aug 10, 2020

Copy link
Copy Markdown

Codecov Report

Merging #667 into master will increase coverage by 0.10%.
The diff coverage is 92.47%.

Impacted file tree graph

@@ Coverage Diff @@## master #667 +/- ##
==========================================
+ Coverage 91.36% 91.46% +0.10% 
==========================================
Files 35 35 Lines 21703 21888 +185 ==========================================
+ Hits 19828 20019 +191 + Misses 1875 1869 -6 
Impacted FilesCoverage Δ
lightning/src/ln/channel.rs87.17% <ø> (-0.04%)⬇️
lightning/src/ln/reorg_tests.rs98.94% <ø> (ø)
lightning/src/ln/functional_tests.rs97.15% <88.23%> (+0.14%)⬆️
lightning/src/ln/channelmonitor.rs95.56% <90.24%> (-0.15%)⬇️
lightning/src/ln/channelmanager.rs85.26% <96.96%> (+<0.01%)⬆️
lightning/src/util/test_utils.rs86.13% <100.00%> (ø)
lightning/src/ln/onchaintx.rs93.75% <0.00%> (-0.20%)⬇️
lightning/src/routing/router.rs97.39% <0.00%> (+0.80%)⬆️

Continue to review full report at Codecov.

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

@valentinewallace

Copy link
Copy Markdown
ContributorAuthor

Oops, broke build -- will fix in a bit

@valentinewallace

Copy link
Copy Markdown
ContributorAuthor

I looked into extracting some common HTLC selection functionality between monitor_would_broadcast and build_commitment_transaction but they're pretty different, they want different HTLCs, and monitor_would_broadcast needs local and remote HTLCs, and idk. Let me know if I'm missing something and it's definitely a good idea.

@valentinewallacevalentinewallace changed the title Add would_broadcast_at_height functionality to ChannelRemove Channel's ChannelMonitor copyAug 13, 2020
@valentinewallace

Copy link
Copy Markdown
ContributorAuthor

Hmm, fuzzing seems slow still. Looking into it.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
@valentinewallacevalentinewallace mentioned this pull request Aug 19, 2020
@valentinewallacevalentinewallace mentioned this pull request Aug 19, 2020
@valentinewallace
valentinewallaceforce-pushed the remove-channels-chanmon branch 2 times, most recently from 684dba8 to 70c58d9CompareAugust 19, 2020 21:01
Comment threadlightning/src/ln/channel.rs Outdated
@@ -908,7 +969,7 @@ impl<ChanSigner: ChannelKeys> Channel<ChanSigner> {
InboundHTLCState::AwaitingRemoteRevokeToAnnounce(_) => (!generated_by_local, "AwaitingRemoteRevokeToAnnounce"),

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.

not so much related to this diff in particular, but is the string literal the most elegant way to get the state name?

@valentinewallacevalentinewallaceAug 25, 2020

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.

Open to other options 😄 (for a future PR)

Comment threadlightning/src/ln/channelmonitor.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channelmonitor.rs Outdated

@ariardariard left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

I'm all in to remove Channel's ChannelMonitor copy but I think there is a easier way than dc9ef2c. If I understand new would_broadcast_at_height_functionality well, its purpose is only to verify that ChannelMonitor accomplish its job well and broadcast channel update accordingly.

I'm not sure if it's a great approach, in the future if we add new conditions in ChannelMonitor to force-close channel we would need to access them too. Like in case of mempools-congestion, preemptively close channel at risk.

Another way to solve this would be a) pass a reference to ChainWatchInterface to ChannelManager b) at funding_tx detection, return its output to watch c) monitor commitment transaction broadcast. Parsing positively commitment transaction is easy to do due to transaction pattern (one-input), LN commitment number watermark and overall funding outpoint spending. It's more robust also as we shouldn't assume that our ChannelManager and ChannelMonitor are running on the same block provider and thus may have block view latency.

I know that's already the current model to query ChannelMonitor to decide if we should shutdown and broadcast channel update, but I think it's fine to wait a bit for channel update broadcast. Shutdown/broadcast will happen either sooner after any attempt to unsuccessfully update monitors. Or latter after block processing.

If you still want to be quick in term of updating global network view of our channel maybe we can ChannelMonitor signal broadcast with a boolean and us periodically querying it like we're doing for get_and_clear_pending_htlcs_updated ?

Overall, I may miss some onchain/offchain coupling assumptions but it feels like we can short-cut some complexity ?

Comment threadlightning/src/ln/channel.rs Outdated
@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Ooooo, right, so I think that's true - would_broadcast_at_height is only used to close a channel and we could happily have the ChannelMonitor handle that (though currently Channel[Manager] handles that fully). My knee-jerk reaction was that there would be a race condition where we'd continue updating a channel state after its been closed (and the latest local commitment broadcast), but I think we could not even bother notifying the ChannelManager that we're closing the channel and wait for provide_latest_local_commitment_tx_info to return an Err because local_tx_signed is set to close the channel, so there's no race.

@valentinewallace
valentinewallaceforce-pushed the remove-channels-chanmon branch 2 times, most recently from 905dbe2 to df55910CompareAugust 23, 2020 02:35
Comment threadlightning/src/ln/channelmonitor.rs Outdated

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

I had to admit I'm somewhat surprised that's the only test changes you need, but looks good.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmonitor.rs Outdated
@valentinewallace
valentinewallaceforce-pushed the remove-channels-chanmon branch 2 times, most recently from 2b86ba7 to 8b5502bCompareAugust 24, 2020 23:05
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmonitor.rs Outdated

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

Aside from the one clarifying change I suggested and the two comment nits, looks good!


/// An event to be processed by the ChannelManager.
#[derive(PartialEq)]
pub enum MonitorEvent {

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.

Out of curiosity, how do we decide which events are monitor events? For example, why is HTLCEvent for claiming one, but forwarding offered HTLCs isn't?

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.

In this context, its basically "a thing which we detected on-chain which has an impact on our understanding of a channel's state" (ie, basically, "channel has been closed on chain" or "transaction on-chain resolved an HTLC which was outstanding when we went on chain").

Comment threadlightning/src/ln/onchaintx.rs Outdated
Comment threadlightning/src/ln/channelmonitor.rs Outdated
Comment threadlightning/src/ln/channelmonitor.rs Outdated
Comment threadlightning/src/ln/channelmonitor.rs Outdated
0 => MonitorEvent::HTLCEvent(Readable::read(reader)?),
1 => MonitorEvent::CommitmentTxBroadcasted(funding_info.0),
_ => return Err(DecodeError::InvalidValue)
};

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.

One day we'll have versioning for reads lol :)

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.

Indeed lol

To do this, we replace get_and_clear_pending_htlcs_updated with
get_and_clear_pending_monitor_events, and which still transmits HTLCUpdates
as before, but now also transmits a new MonitorEvent::CommitmentTxBroadcasted
event when a channel's commitment transaction is broadcasted.
@TheBlueMatt
TheBlueMatt merged commit 501974d into lightningdevkit:masterAug 25, 2020
if should_broadcast {
self.pending_monitor_events.push(MonitorEvent::CommitmentTxBroadcasted(self.funding_info.0));
if let Some(commitment_tx) = self.onchain_tx_handler.get_fully_signed_local_tx(&self.funding_redeemscript) {
self.local_tx_signed = true;

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

@valentinewallace

I think this is breaking one of the property of our distributed watchtower infrastructure as documented here : https://github.com/rust-bitcoin/rust-lightning/blob/3defcc896266f3d67848ce28981a756e971a3f0c/lightning/src/ln/channelmonitor.rs#L1174

AFAICT, by adding logs flag is true beyond updating local view with latest local state.

I'll fix it and add coverage for this.

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.

Logs flag? Ok I think I see what you mean though, thanks for catching this!

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.

We're discussing on IRC still, but I don't think this change is correct - we should refuse to accept updates after we've signed a local tx irrespective of why we signed it.

@ariardariardAug 28, 2020

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Sorry, after discussion on IRC and testing I realized that the alleged property was only supported in my mind. In fact #667 makes it easy to actually implement it, so did so in #679 with test coverage.

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.

Get rid of unnecessary ChannelMonitor in Channel

4 participants

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

Remove Channel's ChannelMonitor copy - #667

Merged
TheBlueMatt merged 2 commits into
lightningdevkit:masterfrom
valentinewallace:remove-channels-chanmon
Aug 25, 2020
Merged

Remove Channel's ChannelMonitor copy#667
TheBlueMatt merged 2 commits into
lightningdevkit:masterfrom
valentinewallace:remove-channels-chanmon

Conversation

@valentinewallace

@valentinewallacevalentinewallace commented Aug 10, 2020

Copy link
Copy Markdown
Contributor

In service to the larger refactor of removing the Channel's reference
to its ChannelMonitor.

This also allows us to remove the Channel's channel_monitor() function. Next we can remove all of the Channel's logic for keeping its channel monitor up to date, as well as the update_monitor_ooo logic in ChannelMonitor.

Partially resolvesCloses#657

@codecov

codecovBot commented Aug 10, 2020

Copy link
Copy Markdown

Codecov Report

Merging #667 into master will increase coverage by 0.10%.
The diff coverage is 92.47%.

Impacted file tree graph

@@ Coverage Diff @@## master #667 +/- ##
==========================================
+ Coverage 91.36% 91.46% +0.10% 
==========================================
Files 35 35 Lines 21703 21888 +185 ==========================================
+ Hits 19828 20019 +191 + Misses 1875 1869 -6 
Impacted FilesCoverage Δ
lightning/src/ln/channel.rs87.17% <ø> (-0.04%)⬇️
lightning/src/ln/reorg_tests.rs98.94% <ø> (ø)
lightning/src/ln/functional_tests.rs97.15% <88.23%> (+0.14%)⬆️
lightning/src/ln/channelmonitor.rs95.56% <90.24%> (-0.15%)⬇️
lightning/src/ln/channelmanager.rs85.26% <96.96%> (+<0.01%)⬆️
lightning/src/util/test_utils.rs86.13% <100.00%> (ø)
lightning/src/ln/onchaintx.rs93.75% <0.00%> (-0.20%)⬇️
lightning/src/routing/router.rs97.39% <0.00%> (+0.80%)⬆️

Continue to review full report at Codecov.

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

@valentinewallace

Copy link
Copy Markdown
ContributorAuthor

Oops, broke build -- will fix in a bit

@valentinewallace

Copy link
Copy Markdown
ContributorAuthor

I looked into extracting some common HTLC selection functionality between monitor_would_broadcast and build_commitment_transaction but they're pretty different, they want different HTLCs, and monitor_would_broadcast needs local and remote HTLCs, and idk. Let me know if I'm missing something and it's definitely a good idea.

@valentinewallacevalentinewallace changed the title Add would_broadcast_at_height functionality to ChannelRemove Channel's ChannelMonitor copyAug 13, 2020
@valentinewallace

Copy link
Copy Markdown
ContributorAuthor

Hmm, fuzzing seems slow still. Looking into it.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
@valentinewallacevalentinewallace mentioned this pull request Aug 19, 2020
@valentinewallacevalentinewallace mentioned this pull request Aug 19, 2020
@valentinewallace
valentinewallaceforce-pushed the remove-channels-chanmon branch 2 times, most recently from 684dba8 to 70c58d9CompareAugust 19, 2020 21:01
Comment threadlightning/src/ln/channel.rs Outdated
@@ -908,7 +969,7 @@ impl<ChanSigner: ChannelKeys> Channel<ChanSigner> {
InboundHTLCState::AwaitingRemoteRevokeToAnnounce(_) => (!generated_by_local, "AwaitingRemoteRevokeToAnnounce"),

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.

not so much related to this diff in particular, but is the string literal the most elegant way to get the state name?

@valentinewallacevalentinewallaceAug 25, 2020

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.

Open to other options 😄 (for a future PR)

Comment threadlightning/src/ln/channelmonitor.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channelmonitor.rs Outdated

@ariardariard left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

I'm all in to remove Channel's ChannelMonitor copy but I think there is a easier way than dc9ef2c. If I understand new would_broadcast_at_height_functionality well, its purpose is only to verify that ChannelMonitor accomplish its job well and broadcast channel update accordingly.

I'm not sure if it's a great approach, in the future if we add new conditions in ChannelMonitor to force-close channel we would need to access them too. Like in case of mempools-congestion, preemptively close channel at risk.

Another way to solve this would be a) pass a reference to ChainWatchInterface to ChannelManager b) at funding_tx detection, return its output to watch c) monitor commitment transaction broadcast. Parsing positively commitment transaction is easy to do due to transaction pattern (one-input), LN commitment number watermark and overall funding outpoint spending. It's more robust also as we shouldn't assume that our ChannelManager and ChannelMonitor are running on the same block provider and thus may have block view latency.

I know that's already the current model to query ChannelMonitor to decide if we should shutdown and broadcast channel update, but I think it's fine to wait a bit for channel update broadcast. Shutdown/broadcast will happen either sooner after any attempt to unsuccessfully update monitors. Or latter after block processing.

If you still want to be quick in term of updating global network view of our channel maybe we can ChannelMonitor signal broadcast with a boolean and us periodically querying it like we're doing for get_and_clear_pending_htlcs_updated ?

Overall, I may miss some onchain/offchain coupling assumptions but it feels like we can short-cut some complexity ?

Comment threadlightning/src/ln/channel.rs Outdated
@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Ooooo, right, so I think that's true - would_broadcast_at_height is only used to close a channel and we could happily have the ChannelMonitor handle that (though currently Channel[Manager] handles that fully). My knee-jerk reaction was that there would be a race condition where we'd continue updating a channel state after its been closed (and the latest local commitment broadcast), but I think we could not even bother notifying the ChannelManager that we're closing the channel and wait for provide_latest_local_commitment_tx_info to return an Err because local_tx_signed is set to close the channel, so there's no race.

@valentinewallace
valentinewallaceforce-pushed the remove-channels-chanmon branch 2 times, most recently from 905dbe2 to df55910CompareAugust 23, 2020 02:35
Comment threadlightning/src/ln/channelmonitor.rs Outdated

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

I had to admit I'm somewhat surprised that's the only test changes you need, but looks good.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmonitor.rs Outdated
@valentinewallace
valentinewallaceforce-pushed the remove-channels-chanmon branch 2 times, most recently from 2b86ba7 to 8b5502bCompareAugust 24, 2020 23:05
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmonitor.rs Outdated

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

Aside from the one clarifying change I suggested and the two comment nits, looks good!


/// An event to be processed by the ChannelManager.
#[derive(PartialEq)]
pub enum MonitorEvent {

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.

Out of curiosity, how do we decide which events are monitor events? For example, why is HTLCEvent for claiming one, but forwarding offered HTLCs isn't?

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.

In this context, its basically "a thing which we detected on-chain which has an impact on our understanding of a channel's state" (ie, basically, "channel has been closed on chain" or "transaction on-chain resolved an HTLC which was outstanding when we went on chain").

Comment threadlightning/src/ln/onchaintx.rs Outdated
Comment threadlightning/src/ln/channelmonitor.rs Outdated
Comment threadlightning/src/ln/channelmonitor.rs Outdated
Comment threadlightning/src/ln/channelmonitor.rs Outdated
0 => MonitorEvent::HTLCEvent(Readable::read(reader)?),
1 => MonitorEvent::CommitmentTxBroadcasted(funding_info.0),
_ => return Err(DecodeError::InvalidValue)
};

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.

One day we'll have versioning for reads lol :)

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.

Indeed lol

To do this, we replace get_and_clear_pending_htlcs_updated with
get_and_clear_pending_monitor_events, and which still transmits HTLCUpdates
as before, but now also transmits a new MonitorEvent::CommitmentTxBroadcasted
event when a channel's commitment transaction is broadcasted.
@TheBlueMatt
TheBlueMatt merged commit 501974d into lightningdevkit:masterAug 25, 2020
if should_broadcast {
self.pending_monitor_events.push(MonitorEvent::CommitmentTxBroadcasted(self.funding_info.0));
if let Some(commitment_tx) = self.onchain_tx_handler.get_fully_signed_local_tx(&self.funding_redeemscript) {
self.local_tx_signed = true;

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

@valentinewallace

I think this is breaking one of the property of our distributed watchtower infrastructure as documented here : https://github.com/rust-bitcoin/rust-lightning/blob/3defcc896266f3d67848ce28981a756e971a3f0c/lightning/src/ln/channelmonitor.rs#L1174

AFAICT, by adding logs flag is true beyond updating local view with latest local state.

I'll fix it and add coverage for this.

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.

Logs flag? Ok I think I see what you mean though, thanks for catching this!

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.

We're discussing on IRC still, but I don't think this change is correct - we should refuse to accept updates after we've signed a local tx irrespective of why we signed it.

@ariardariardAug 28, 2020

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Sorry, after discussion on IRC and testing I realized that the alleged property was only supported in my mind. In fact #667 makes it easy to actually implement it, so did so in #679 with test coverage.

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.

Get rid of unnecessary ChannelMonitor in Channel

4 participants

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

Remove Channel's ChannelMonitor copy - #667

Merged
TheBlueMatt merged 2 commits into
lightningdevkit:masterfrom
valentinewallace:remove-channels-chanmon
Aug 25, 2020
Merged

Remove Channel's ChannelMonitor copy#667
TheBlueMatt merged 2 commits into
lightningdevkit:masterfrom
valentinewallace:remove-channels-chanmon

Conversation

@valentinewallace

@valentinewallacevalentinewallace commented Aug 10, 2020

Copy link
Copy Markdown
Contributor

In service to the larger refactor of removing the Channel's reference
to its ChannelMonitor.

This also allows us to remove the Channel's channel_monitor() function. Next we can remove all of the Channel's logic for keeping its channel monitor up to date, as well as the update_monitor_ooo logic in ChannelMonitor.

Partially resolvesCloses#657

@codecov

codecovBot commented Aug 10, 2020

Copy link
Copy Markdown

Codecov Report

Merging #667 into master will increase coverage by 0.10%.
The diff coverage is 92.47%.

Impacted file tree graph

@@ Coverage Diff @@## master #667 +/- ##
==========================================
+ Coverage 91.36% 91.46% +0.10% 
==========================================
Files 35 35 Lines 21703 21888 +185 ==========================================
+ Hits 19828 20019 +191 + Misses 1875 1869 -6 
Impacted FilesCoverage Δ
lightning/src/ln/channel.rs87.17% <ø> (-0.04%)⬇️
lightning/src/ln/reorg_tests.rs98.94% <ø> (ø)
lightning/src/ln/functional_tests.rs97.15% <88.23%> (+0.14%)⬆️
lightning/src/ln/channelmonitor.rs95.56% <90.24%> (-0.15%)⬇️
lightning/src/ln/channelmanager.rs85.26% <96.96%> (+<0.01%)⬆️
lightning/src/util/test_utils.rs86.13% <100.00%> (ø)
lightning/src/ln/onchaintx.rs93.75% <0.00%> (-0.20%)⬇️
lightning/src/routing/router.rs97.39% <0.00%> (+0.80%)⬆️

Continue to review full report at Codecov.

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

@valentinewallace

Copy link
Copy Markdown
ContributorAuthor

Oops, broke build -- will fix in a bit

@valentinewallace

Copy link
Copy Markdown
ContributorAuthor

I looked into extracting some common HTLC selection functionality between monitor_would_broadcast and build_commitment_transaction but they're pretty different, they want different HTLCs, and monitor_would_broadcast needs local and remote HTLCs, and idk. Let me know if I'm missing something and it's definitely a good idea.

@valentinewallacevalentinewallace changed the title Add would_broadcast_at_height functionality to ChannelRemove Channel's ChannelMonitor copyAug 13, 2020
@valentinewallace

Copy link
Copy Markdown
ContributorAuthor

Hmm, fuzzing seems slow still. Looking into it.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
@valentinewallacevalentinewallace mentioned this pull request Aug 19, 2020
@valentinewallacevalentinewallace mentioned this pull request Aug 19, 2020
@valentinewallace
valentinewallaceforce-pushed the remove-channels-chanmon branch 2 times, most recently from 684dba8 to 70c58d9CompareAugust 19, 2020 21:01
Comment threadlightning/src/ln/channel.rs Outdated
@@ -908,7 +969,7 @@ impl<ChanSigner: ChannelKeys> Channel<ChanSigner> {
InboundHTLCState::AwaitingRemoteRevokeToAnnounce(_) => (!generated_by_local, "AwaitingRemoteRevokeToAnnounce"),

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.

not so much related to this diff in particular, but is the string literal the most elegant way to get the state name?

@valentinewallacevalentinewallaceAug 25, 2020

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.

Open to other options 😄 (for a future PR)

Comment threadlightning/src/ln/channelmonitor.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channelmonitor.rs Outdated

@ariardariard left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

I'm all in to remove Channel's ChannelMonitor copy but I think there is a easier way than dc9ef2c. If I understand new would_broadcast_at_height_functionality well, its purpose is only to verify that ChannelMonitor accomplish its job well and broadcast channel update accordingly.

I'm not sure if it's a great approach, in the future if we add new conditions in ChannelMonitor to force-close channel we would need to access them too. Like in case of mempools-congestion, preemptively close channel at risk.

Another way to solve this would be a) pass a reference to ChainWatchInterface to ChannelManager b) at funding_tx detection, return its output to watch c) monitor commitment transaction broadcast. Parsing positively commitment transaction is easy to do due to transaction pattern (one-input), LN commitment number watermark and overall funding outpoint spending. It's more robust also as we shouldn't assume that our ChannelManager and ChannelMonitor are running on the same block provider and thus may have block view latency.

I know that's already the current model to query ChannelMonitor to decide if we should shutdown and broadcast channel update, but I think it's fine to wait a bit for channel update broadcast. Shutdown/broadcast will happen either sooner after any attempt to unsuccessfully update monitors. Or latter after block processing.

If you still want to be quick in term of updating global network view of our channel maybe we can ChannelMonitor signal broadcast with a boolean and us periodically querying it like we're doing for get_and_clear_pending_htlcs_updated ?

Overall, I may miss some onchain/offchain coupling assumptions but it feels like we can short-cut some complexity ?

Comment threadlightning/src/ln/channel.rs Outdated
@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Ooooo, right, so I think that's true - would_broadcast_at_height is only used to close a channel and we could happily have the ChannelMonitor handle that (though currently Channel[Manager] handles that fully). My knee-jerk reaction was that there would be a race condition where we'd continue updating a channel state after its been closed (and the latest local commitment broadcast), but I think we could not even bother notifying the ChannelManager that we're closing the channel and wait for provide_latest_local_commitment_tx_info to return an Err because local_tx_signed is set to close the channel, so there's no race.

@valentinewallace
valentinewallaceforce-pushed the remove-channels-chanmon branch 2 times, most recently from 905dbe2 to df55910CompareAugust 23, 2020 02:35
Comment threadlightning/src/ln/channelmonitor.rs Outdated

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

I had to admit I'm somewhat surprised that's the only test changes you need, but looks good.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmonitor.rs Outdated
@valentinewallace
valentinewallaceforce-pushed the remove-channels-chanmon branch 2 times, most recently from 2b86ba7 to 8b5502bCompareAugust 24, 2020 23:05
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmonitor.rs Outdated

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

Aside from the one clarifying change I suggested and the two comment nits, looks good!


/// An event to be processed by the ChannelManager.
#[derive(PartialEq)]
pub enum MonitorEvent {

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.

Out of curiosity, how do we decide which events are monitor events? For example, why is HTLCEvent for claiming one, but forwarding offered HTLCs isn't?

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.

In this context, its basically "a thing which we detected on-chain which has an impact on our understanding of a channel's state" (ie, basically, "channel has been closed on chain" or "transaction on-chain resolved an HTLC which was outstanding when we went on chain").

Comment threadlightning/src/ln/onchaintx.rs Outdated
Comment threadlightning/src/ln/channelmonitor.rs Outdated
Comment threadlightning/src/ln/channelmonitor.rs Outdated
Comment threadlightning/src/ln/channelmonitor.rs Outdated
0 => MonitorEvent::HTLCEvent(Readable::read(reader)?),
1 => MonitorEvent::CommitmentTxBroadcasted(funding_info.0),
_ => return Err(DecodeError::InvalidValue)
};

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.

One day we'll have versioning for reads lol :)

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.

Indeed lol

To do this, we replace get_and_clear_pending_htlcs_updated with
get_and_clear_pending_monitor_events, and which still transmits HTLCUpdates
as before, but now also transmits a new MonitorEvent::CommitmentTxBroadcasted
event when a channel's commitment transaction is broadcasted.
@TheBlueMatt
TheBlueMatt merged commit 501974d into lightningdevkit:masterAug 25, 2020
if should_broadcast {
self.pending_monitor_events.push(MonitorEvent::CommitmentTxBroadcasted(self.funding_info.0));
if let Some(commitment_tx) = self.onchain_tx_handler.get_fully_signed_local_tx(&self.funding_redeemscript) {
self.local_tx_signed = true;

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

@valentinewallace

I think this is breaking one of the property of our distributed watchtower infrastructure as documented here : https://github.com/rust-bitcoin/rust-lightning/blob/3defcc896266f3d67848ce28981a756e971a3f0c/lightning/src/ln/channelmonitor.rs#L1174

AFAICT, by adding logs flag is true beyond updating local view with latest local state.

I'll fix it and add coverage for this.

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.

Logs flag? Ok I think I see what you mean though, thanks for catching this!

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.

We're discussing on IRC still, but I don't think this change is correct - we should refuse to accept updates after we've signed a local tx irrespective of why we signed it.

@ariardariardAug 28, 2020

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Sorry, after discussion on IRC and testing I realized that the alleged property was only supported in my mind. In fact #667 makes it easy to actually implement it, so did so in #679 with test coverage.

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.

Get rid of unnecessary ChannelMonitor in Channel

4 participants

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

Remove Channel's ChannelMonitor copy - #667

Merged
TheBlueMatt merged 2 commits into
lightningdevkit:masterfrom
valentinewallace:remove-channels-chanmon
Aug 25, 2020
Merged

Remove Channel's ChannelMonitor copy#667
TheBlueMatt merged 2 commits into
lightningdevkit:masterfrom
valentinewallace:remove-channels-chanmon

Conversation

@valentinewallace

@valentinewallacevalentinewallace commented Aug 10, 2020

Copy link
Copy Markdown
Contributor

In service to the larger refactor of removing the Channel's reference
to its ChannelMonitor.

This also allows us to remove the Channel's channel_monitor() function. Next we can remove all of the Channel's logic for keeping its channel monitor up to date, as well as the update_monitor_ooo logic in ChannelMonitor.

Partially resolvesCloses#657

@codecov

codecovBot commented Aug 10, 2020

Copy link
Copy Markdown

Codecov Report

Merging #667 into master will increase coverage by 0.10%.
The diff coverage is 92.47%.

Impacted file tree graph

@@ Coverage Diff @@## master #667 +/- ##
==========================================
+ Coverage 91.36% 91.46% +0.10% 
==========================================
Files 35 35 Lines 21703 21888 +185 ==========================================
+ Hits 19828 20019 +191 + Misses 1875 1869 -6 
Impacted FilesCoverage Δ
lightning/src/ln/channel.rs87.17% <ø> (-0.04%)⬇️
lightning/src/ln/reorg_tests.rs98.94% <ø> (ø)
lightning/src/ln/functional_tests.rs97.15% <88.23%> (+0.14%)⬆️
lightning/src/ln/channelmonitor.rs95.56% <90.24%> (-0.15%)⬇️
lightning/src/ln/channelmanager.rs85.26% <96.96%> (+<0.01%)⬆️
lightning/src/util/test_utils.rs86.13% <100.00%> (ø)
lightning/src/ln/onchaintx.rs93.75% <0.00%> (-0.20%)⬇️
lightning/src/routing/router.rs97.39% <0.00%> (+0.80%)⬆️

Continue to review full report at Codecov.

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

@valentinewallace

Copy link
Copy Markdown
ContributorAuthor

Oops, broke build -- will fix in a bit

@valentinewallace

Copy link
Copy Markdown
ContributorAuthor

I looked into extracting some common HTLC selection functionality between monitor_would_broadcast and build_commitment_transaction but they're pretty different, they want different HTLCs, and monitor_would_broadcast needs local and remote HTLCs, and idk. Let me know if I'm missing something and it's definitely a good idea.

@valentinewallacevalentinewallace changed the title Add would_broadcast_at_height functionality to ChannelRemove Channel's ChannelMonitor copyAug 13, 2020
@valentinewallace

Copy link
Copy Markdown
ContributorAuthor

Hmm, fuzzing seems slow still. Looking into it.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
@valentinewallacevalentinewallace mentioned this pull request Aug 19, 2020
@valentinewallacevalentinewallace mentioned this pull request Aug 19, 2020
@valentinewallace
valentinewallaceforce-pushed the remove-channels-chanmon branch 2 times, most recently from 684dba8 to 70c58d9CompareAugust 19, 2020 21:01
Comment threadlightning/src/ln/channel.rs Outdated
@@ -908,7 +969,7 @@ impl<ChanSigner: ChannelKeys> Channel<ChanSigner> {
InboundHTLCState::AwaitingRemoteRevokeToAnnounce(_) => (!generated_by_local, "AwaitingRemoteRevokeToAnnounce"),

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.

not so much related to this diff in particular, but is the string literal the most elegant way to get the state name?

@valentinewallacevalentinewallaceAug 25, 2020

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.

Open to other options 😄 (for a future PR)

Comment threadlightning/src/ln/channelmonitor.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channelmonitor.rs Outdated

@ariardariard left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

I'm all in to remove Channel's ChannelMonitor copy but I think there is a easier way than dc9ef2c. If I understand new would_broadcast_at_height_functionality well, its purpose is only to verify that ChannelMonitor accomplish its job well and broadcast channel update accordingly.

I'm not sure if it's a great approach, in the future if we add new conditions in ChannelMonitor to force-close channel we would need to access them too. Like in case of mempools-congestion, preemptively close channel at risk.

Another way to solve this would be a) pass a reference to ChainWatchInterface to ChannelManager b) at funding_tx detection, return its output to watch c) monitor commitment transaction broadcast. Parsing positively commitment transaction is easy to do due to transaction pattern (one-input), LN commitment number watermark and overall funding outpoint spending. It's more robust also as we shouldn't assume that our ChannelManager and ChannelMonitor are running on the same block provider and thus may have block view latency.

I know that's already the current model to query ChannelMonitor to decide if we should shutdown and broadcast channel update, but I think it's fine to wait a bit for channel update broadcast. Shutdown/broadcast will happen either sooner after any attempt to unsuccessfully update monitors. Or latter after block processing.

If you still want to be quick in term of updating global network view of our channel maybe we can ChannelMonitor signal broadcast with a boolean and us periodically querying it like we're doing for get_and_clear_pending_htlcs_updated ?

Overall, I may miss some onchain/offchain coupling assumptions but it feels like we can short-cut some complexity ?

Comment threadlightning/src/ln/channel.rs Outdated
@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Ooooo, right, so I think that's true - would_broadcast_at_height is only used to close a channel and we could happily have the ChannelMonitor handle that (though currently Channel[Manager] handles that fully). My knee-jerk reaction was that there would be a race condition where we'd continue updating a channel state after its been closed (and the latest local commitment broadcast), but I think we could not even bother notifying the ChannelManager that we're closing the channel and wait for provide_latest_local_commitment_tx_info to return an Err because local_tx_signed is set to close the channel, so there's no race.

@valentinewallace
valentinewallaceforce-pushed the remove-channels-chanmon branch 2 times, most recently from 905dbe2 to df55910CompareAugust 23, 2020 02:35
Comment threadlightning/src/ln/channelmonitor.rs Outdated

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

I had to admit I'm somewhat surprised that's the only test changes you need, but looks good.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmonitor.rs Outdated
@valentinewallace
valentinewallaceforce-pushed the remove-channels-chanmon branch 2 times, most recently from 2b86ba7 to 8b5502bCompareAugust 24, 2020 23:05
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmonitor.rs Outdated

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

Aside from the one clarifying change I suggested and the two comment nits, looks good!


/// An event to be processed by the ChannelManager.
#[derive(PartialEq)]
pub enum MonitorEvent {

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.

Out of curiosity, how do we decide which events are monitor events? For example, why is HTLCEvent for claiming one, but forwarding offered HTLCs isn't?

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.

In this context, its basically "a thing which we detected on-chain which has an impact on our understanding of a channel's state" (ie, basically, "channel has been closed on chain" or "transaction on-chain resolved an HTLC which was outstanding when we went on chain").

Comment threadlightning/src/ln/onchaintx.rs Outdated
Comment threadlightning/src/ln/channelmonitor.rs Outdated
Comment threadlightning/src/ln/channelmonitor.rs Outdated
Comment threadlightning/src/ln/channelmonitor.rs Outdated
0 => MonitorEvent::HTLCEvent(Readable::read(reader)?),
1 => MonitorEvent::CommitmentTxBroadcasted(funding_info.0),
_ => return Err(DecodeError::InvalidValue)
};

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.

One day we'll have versioning for reads lol :)

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.

Indeed lol

To do this, we replace get_and_clear_pending_htlcs_updated with
get_and_clear_pending_monitor_events, and which still transmits HTLCUpdates
as before, but now also transmits a new MonitorEvent::CommitmentTxBroadcasted
event when a channel's commitment transaction is broadcasted.
@TheBlueMatt
TheBlueMatt merged commit 501974d into lightningdevkit:masterAug 25, 2020
if should_broadcast {
self.pending_monitor_events.push(MonitorEvent::CommitmentTxBroadcasted(self.funding_info.0));
if let Some(commitment_tx) = self.onchain_tx_handler.get_fully_signed_local_tx(&self.funding_redeemscript) {
self.local_tx_signed = true;

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

@valentinewallace

I think this is breaking one of the property of our distributed watchtower infrastructure as documented here : https://github.com/rust-bitcoin/rust-lightning/blob/3defcc896266f3d67848ce28981a756e971a3f0c/lightning/src/ln/channelmonitor.rs#L1174

AFAICT, by adding logs flag is true beyond updating local view with latest local state.

I'll fix it and add coverage for this.

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.

Logs flag? Ok I think I see what you mean though, thanks for catching this!

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.

We're discussing on IRC still, but I don't think this change is correct - we should refuse to accept updates after we've signed a local tx irrespective of why we signed it.

@ariardariardAug 28, 2020

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Sorry, after discussion on IRC and testing I realized that the alleged property was only supported in my mind. In fact #667 makes it easy to actually implement it, so did so in #679 with test coverage.

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.

Get rid of unnecessary ChannelMonitor in Channel

4 participants

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

Remove Channel's ChannelMonitor copy - #667

Merged
TheBlueMatt merged 2 commits into
lightningdevkit:masterfrom
valentinewallace:remove-channels-chanmon
Aug 25, 2020
Merged

Remove Channel's ChannelMonitor copy#667
TheBlueMatt merged 2 commits into
lightningdevkit:masterfrom
valentinewallace:remove-channels-chanmon

Conversation

@valentinewallace

@valentinewallacevalentinewallace commented Aug 10, 2020

Copy link
Copy Markdown
Contributor

In service to the larger refactor of removing the Channel's reference
to its ChannelMonitor.

This also allows us to remove the Channel's channel_monitor() function. Next we can remove all of the Channel's logic for keeping its channel monitor up to date, as well as the update_monitor_ooo logic in ChannelMonitor.

Partially resolvesCloses#657

@codecov

codecovBot commented Aug 10, 2020

Copy link
Copy Markdown

Codecov Report

Merging #667 into master will increase coverage by 0.10%.
The diff coverage is 92.47%.

Impacted file tree graph

@@ Coverage Diff @@## master #667 +/- ##
==========================================
+ Coverage 91.36% 91.46% +0.10% 
==========================================
Files 35 35 Lines 21703 21888 +185 ==========================================
+ Hits 19828 20019 +191 + Misses 1875 1869 -6 
Impacted FilesCoverage Δ
lightning/src/ln/channel.rs87.17% <ø> (-0.04%)⬇️
lightning/src/ln/reorg_tests.rs98.94% <ø> (ø)
lightning/src/ln/functional_tests.rs97.15% <88.23%> (+0.14%)⬆️
lightning/src/ln/channelmonitor.rs95.56% <90.24%> (-0.15%)⬇️
lightning/src/ln/channelmanager.rs85.26% <96.96%> (+<0.01%)⬆️
lightning/src/util/test_utils.rs86.13% <100.00%> (ø)
lightning/src/ln/onchaintx.rs93.75% <0.00%> (-0.20%)⬇️
lightning/src/routing/router.rs97.39% <0.00%> (+0.80%)⬆️

Continue to review full report at Codecov.

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

@valentinewallace

Copy link
Copy Markdown
ContributorAuthor

Oops, broke build -- will fix in a bit

@valentinewallace

Copy link
Copy Markdown
ContributorAuthor

I looked into extracting some common HTLC selection functionality between monitor_would_broadcast and build_commitment_transaction but they're pretty different, they want different HTLCs, and monitor_would_broadcast needs local and remote HTLCs, and idk. Let me know if I'm missing something and it's definitely a good idea.

@valentinewallacevalentinewallace changed the title Add would_broadcast_at_height functionality to ChannelRemove Channel's ChannelMonitor copyAug 13, 2020
@valentinewallace

Copy link
Copy Markdown
ContributorAuthor

Hmm, fuzzing seems slow still. Looking into it.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
@valentinewallacevalentinewallace mentioned this pull request Aug 19, 2020
@valentinewallacevalentinewallace mentioned this pull request Aug 19, 2020
@valentinewallace
valentinewallaceforce-pushed the remove-channels-chanmon branch 2 times, most recently from 684dba8 to 70c58d9CompareAugust 19, 2020 21:01
Comment threadlightning/src/ln/channel.rs Outdated
@@ -908,7 +969,7 @@ impl<ChanSigner: ChannelKeys> Channel<ChanSigner> {
InboundHTLCState::AwaitingRemoteRevokeToAnnounce(_) => (!generated_by_local, "AwaitingRemoteRevokeToAnnounce"),

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.

not so much related to this diff in particular, but is the string literal the most elegant way to get the state name?

@valentinewallacevalentinewallaceAug 25, 2020

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.

Open to other options 😄 (for a future PR)

Comment threadlightning/src/ln/channelmonitor.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channelmonitor.rs Outdated

@ariardariard left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

I'm all in to remove Channel's ChannelMonitor copy but I think there is a easier way than dc9ef2c. If I understand new would_broadcast_at_height_functionality well, its purpose is only to verify that ChannelMonitor accomplish its job well and broadcast channel update accordingly.

I'm not sure if it's a great approach, in the future if we add new conditions in ChannelMonitor to force-close channel we would need to access them too. Like in case of mempools-congestion, preemptively close channel at risk.

Another way to solve this would be a) pass a reference to ChainWatchInterface to ChannelManager b) at funding_tx detection, return its output to watch c) monitor commitment transaction broadcast. Parsing positively commitment transaction is easy to do due to transaction pattern (one-input), LN commitment number watermark and overall funding outpoint spending. It's more robust also as we shouldn't assume that our ChannelManager and ChannelMonitor are running on the same block provider and thus may have block view latency.

I know that's already the current model to query ChannelMonitor to decide if we should shutdown and broadcast channel update, but I think it's fine to wait a bit for channel update broadcast. Shutdown/broadcast will happen either sooner after any attempt to unsuccessfully update monitors. Or latter after block processing.

If you still want to be quick in term of updating global network view of our channel maybe we can ChannelMonitor signal broadcast with a boolean and us periodically querying it like we're doing for get_and_clear_pending_htlcs_updated ?

Overall, I may miss some onchain/offchain coupling assumptions but it feels like we can short-cut some complexity ?

Comment threadlightning/src/ln/channel.rs Outdated
@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Ooooo, right, so I think that's true - would_broadcast_at_height is only used to close a channel and we could happily have the ChannelMonitor handle that (though currently Channel[Manager] handles that fully). My knee-jerk reaction was that there would be a race condition where we'd continue updating a channel state after its been closed (and the latest local commitment broadcast), but I think we could not even bother notifying the ChannelManager that we're closing the channel and wait for provide_latest_local_commitment_tx_info to return an Err because local_tx_signed is set to close the channel, so there's no race.

@valentinewallace
valentinewallaceforce-pushed the remove-channels-chanmon branch 2 times, most recently from 905dbe2 to df55910CompareAugust 23, 2020 02:35
Comment threadlightning/src/ln/channelmonitor.rs Outdated

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

I had to admit I'm somewhat surprised that's the only test changes you need, but looks good.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmonitor.rs Outdated
@valentinewallace
valentinewallaceforce-pushed the remove-channels-chanmon branch 2 times, most recently from 2b86ba7 to 8b5502bCompareAugust 24, 2020 23:05
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmonitor.rs Outdated

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

Aside from the one clarifying change I suggested and the two comment nits, looks good!


/// An event to be processed by the ChannelManager.
#[derive(PartialEq)]
pub enum MonitorEvent {

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.

Out of curiosity, how do we decide which events are monitor events? For example, why is HTLCEvent for claiming one, but forwarding offered HTLCs isn't?

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.

In this context, its basically "a thing which we detected on-chain which has an impact on our understanding of a channel's state" (ie, basically, "channel has been closed on chain" or "transaction on-chain resolved an HTLC which was outstanding when we went on chain").

Comment threadlightning/src/ln/onchaintx.rs Outdated
Comment threadlightning/src/ln/channelmonitor.rs Outdated
Comment threadlightning/src/ln/channelmonitor.rs Outdated
Comment threadlightning/src/ln/channelmonitor.rs Outdated
0 => MonitorEvent::HTLCEvent(Readable::read(reader)?),
1 => MonitorEvent::CommitmentTxBroadcasted(funding_info.0),
_ => return Err(DecodeError::InvalidValue)
};

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.

One day we'll have versioning for reads lol :)

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.

Indeed lol

To do this, we replace get_and_clear_pending_htlcs_updated with
get_and_clear_pending_monitor_events, and which still transmits HTLCUpdates
as before, but now also transmits a new MonitorEvent::CommitmentTxBroadcasted
event when a channel's commitment transaction is broadcasted.
@TheBlueMatt
TheBlueMatt merged commit 501974d into lightningdevkit:masterAug 25, 2020
if should_broadcast {
self.pending_monitor_events.push(MonitorEvent::CommitmentTxBroadcasted(self.funding_info.0));
if let Some(commitment_tx) = self.onchain_tx_handler.get_fully_signed_local_tx(&self.funding_redeemscript) {
self.local_tx_signed = true;

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

@valentinewallace

I think this is breaking one of the property of our distributed watchtower infrastructure as documented here : https://github.com/rust-bitcoin/rust-lightning/blob/3defcc896266f3d67848ce28981a756e971a3f0c/lightning/src/ln/channelmonitor.rs#L1174

AFAICT, by adding logs flag is true beyond updating local view with latest local state.

I'll fix it and add coverage for this.

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.

Logs flag? Ok I think I see what you mean though, thanks for catching this!

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.

We're discussing on IRC still, but I don't think this change is correct - we should refuse to accept updates after we've signed a local tx irrespective of why we signed it.

@ariardariardAug 28, 2020

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Sorry, after discussion on IRC and testing I realized that the alleged property was only supported in my mind. In fact #667 makes it easy to actually implement it, so did so in #679 with test coverage.

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.

Get rid of unnecessary ChannelMonitor in Channel

4 participants

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

Remove Channel's ChannelMonitor copy - #667

Merged
TheBlueMatt merged 2 commits into
lightningdevkit:masterfrom
valentinewallace:remove-channels-chanmon
Aug 25, 2020
Merged

Remove Channel's ChannelMonitor copy#667
TheBlueMatt merged 2 commits into
lightningdevkit:masterfrom
valentinewallace:remove-channels-chanmon

Conversation

@valentinewallace

@valentinewallacevalentinewallace commented Aug 10, 2020

Copy link
Copy Markdown
Contributor

In service to the larger refactor of removing the Channel's reference
to its ChannelMonitor.

This also allows us to remove the Channel's channel_monitor() function. Next we can remove all of the Channel's logic for keeping its channel monitor up to date, as well as the update_monitor_ooo logic in ChannelMonitor.

Partially resolvesCloses#657

@codecov

codecovBot commented Aug 10, 2020

Copy link
Copy Markdown

Codecov Report

Merging #667 into master will increase coverage by 0.10%.
The diff coverage is 92.47%.

Impacted file tree graph

@@ Coverage Diff @@## master #667 +/- ##
==========================================
+ Coverage 91.36% 91.46% +0.10% 
==========================================
Files 35 35 Lines 21703 21888 +185 ==========================================
+ Hits 19828 20019 +191 + Misses 1875 1869 -6 
Impacted FilesCoverage Δ
lightning/src/ln/channel.rs87.17% <ø> (-0.04%)⬇️
lightning/src/ln/reorg_tests.rs98.94% <ø> (ø)
lightning/src/ln/functional_tests.rs97.15% <88.23%> (+0.14%)⬆️
lightning/src/ln/channelmonitor.rs95.56% <90.24%> (-0.15%)⬇️
lightning/src/ln/channelmanager.rs85.26% <96.96%> (+<0.01%)⬆️
lightning/src/util/test_utils.rs86.13% <100.00%> (ø)
lightning/src/ln/onchaintx.rs93.75% <0.00%> (-0.20%)⬇️
lightning/src/routing/router.rs97.39% <0.00%> (+0.80%)⬆️

Continue to review full report at Codecov.

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

@valentinewallace

Copy link
Copy Markdown
ContributorAuthor

Oops, broke build -- will fix in a bit

@valentinewallace

Copy link
Copy Markdown
ContributorAuthor

I looked into extracting some common HTLC selection functionality between monitor_would_broadcast and build_commitment_transaction but they're pretty different, they want different HTLCs, and monitor_would_broadcast needs local and remote HTLCs, and idk. Let me know if I'm missing something and it's definitely a good idea.

@valentinewallacevalentinewallace changed the title Add would_broadcast_at_height functionality to ChannelRemove Channel's ChannelMonitor copyAug 13, 2020
@valentinewallace

Copy link
Copy Markdown
ContributorAuthor

Hmm, fuzzing seems slow still. Looking into it.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
@valentinewallacevalentinewallace mentioned this pull request Aug 19, 2020
@valentinewallacevalentinewallace mentioned this pull request Aug 19, 2020
@valentinewallace
valentinewallaceforce-pushed the remove-channels-chanmon branch 2 times, most recently from 684dba8 to 70c58d9CompareAugust 19, 2020 21:01
Comment threadlightning/src/ln/channel.rs Outdated
@@ -908,7 +969,7 @@ impl<ChanSigner: ChannelKeys> Channel<ChanSigner> {
InboundHTLCState::AwaitingRemoteRevokeToAnnounce(_) => (!generated_by_local, "AwaitingRemoteRevokeToAnnounce"),

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.

not so much related to this diff in particular, but is the string literal the most elegant way to get the state name?

@valentinewallacevalentinewallaceAug 25, 2020

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.

Open to other options 😄 (for a future PR)

Comment threadlightning/src/ln/channelmonitor.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channelmonitor.rs Outdated

@ariardariard left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

I'm all in to remove Channel's ChannelMonitor copy but I think there is a easier way than dc9ef2c. If I understand new would_broadcast_at_height_functionality well, its purpose is only to verify that ChannelMonitor accomplish its job well and broadcast channel update accordingly.

I'm not sure if it's a great approach, in the future if we add new conditions in ChannelMonitor to force-close channel we would need to access them too. Like in case of mempools-congestion, preemptively close channel at risk.

Another way to solve this would be a) pass a reference to ChainWatchInterface to ChannelManager b) at funding_tx detection, return its output to watch c) monitor commitment transaction broadcast. Parsing positively commitment transaction is easy to do due to transaction pattern (one-input), LN commitment number watermark and overall funding outpoint spending. It's more robust also as we shouldn't assume that our ChannelManager and ChannelMonitor are running on the same block provider and thus may have block view latency.

I know that's already the current model to query ChannelMonitor to decide if we should shutdown and broadcast channel update, but I think it's fine to wait a bit for channel update broadcast. Shutdown/broadcast will happen either sooner after any attempt to unsuccessfully update monitors. Or latter after block processing.

If you still want to be quick in term of updating global network view of our channel maybe we can ChannelMonitor signal broadcast with a boolean and us periodically querying it like we're doing for get_and_clear_pending_htlcs_updated ?

Overall, I may miss some onchain/offchain coupling assumptions but it feels like we can short-cut some complexity ?

Comment threadlightning/src/ln/channel.rs Outdated
@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Ooooo, right, so I think that's true - would_broadcast_at_height is only used to close a channel and we could happily have the ChannelMonitor handle that (though currently Channel[Manager] handles that fully). My knee-jerk reaction was that there would be a race condition where we'd continue updating a channel state after its been closed (and the latest local commitment broadcast), but I think we could not even bother notifying the ChannelManager that we're closing the channel and wait for provide_latest_local_commitment_tx_info to return an Err because local_tx_signed is set to close the channel, so there's no race.

@valentinewallace
valentinewallaceforce-pushed the remove-channels-chanmon branch 2 times, most recently from 905dbe2 to df55910CompareAugust 23, 2020 02:35
Comment threadlightning/src/ln/channelmonitor.rs Outdated

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

I had to admit I'm somewhat surprised that's the only test changes you need, but looks good.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmonitor.rs Outdated
@valentinewallace
valentinewallaceforce-pushed the remove-channels-chanmon branch 2 times, most recently from 2b86ba7 to 8b5502bCompareAugust 24, 2020 23:05
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmonitor.rs Outdated

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

Aside from the one clarifying change I suggested and the two comment nits, looks good!


/// An event to be processed by the ChannelManager.
#[derive(PartialEq)]
pub enum MonitorEvent {

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.

Out of curiosity, how do we decide which events are monitor events? For example, why is HTLCEvent for claiming one, but forwarding offered HTLCs isn't?

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.

In this context, its basically "a thing which we detected on-chain which has an impact on our understanding of a channel's state" (ie, basically, "channel has been closed on chain" or "transaction on-chain resolved an HTLC which was outstanding when we went on chain").

Comment threadlightning/src/ln/onchaintx.rs Outdated
Comment threadlightning/src/ln/channelmonitor.rs Outdated
Comment threadlightning/src/ln/channelmonitor.rs Outdated
Comment threadlightning/src/ln/channelmonitor.rs Outdated
0 => MonitorEvent::HTLCEvent(Readable::read(reader)?),
1 => MonitorEvent::CommitmentTxBroadcasted(funding_info.0),
_ => return Err(DecodeError::InvalidValue)
};

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.

One day we'll have versioning for reads lol :)

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.

Indeed lol

To do this, we replace get_and_clear_pending_htlcs_updated with
get_and_clear_pending_monitor_events, and which still transmits HTLCUpdates
as before, but now also transmits a new MonitorEvent::CommitmentTxBroadcasted
event when a channel's commitment transaction is broadcasted.
@TheBlueMatt
TheBlueMatt merged commit 501974d into lightningdevkit:masterAug 25, 2020
if should_broadcast {
self.pending_monitor_events.push(MonitorEvent::CommitmentTxBroadcasted(self.funding_info.0));
if let Some(commitment_tx) = self.onchain_tx_handler.get_fully_signed_local_tx(&self.funding_redeemscript) {
self.local_tx_signed = true;

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

@valentinewallace

I think this is breaking one of the property of our distributed watchtower infrastructure as documented here : https://github.com/rust-bitcoin/rust-lightning/blob/3defcc896266f3d67848ce28981a756e971a3f0c/lightning/src/ln/channelmonitor.rs#L1174

AFAICT, by adding logs flag is true beyond updating local view with latest local state.

I'll fix it and add coverage for this.

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.

Logs flag? Ok I think I see what you mean though, thanks for catching this!

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.

We're discussing on IRC still, but I don't think this change is correct - we should refuse to accept updates after we've signed a local tx irrespective of why we signed it.

@ariardariardAug 28, 2020

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Sorry, after discussion on IRC and testing I realized that the alleged property was only supported in my mind. In fact #667 makes it easy to actually implement it, so did so in #679 with test coverage.

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.

Get rid of unnecessary ChannelMonitor in Channel

4 participants

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

Remove Channel's ChannelMonitor copy - #667

Merged
TheBlueMatt merged 2 commits into
lightningdevkit:masterfrom
valentinewallace:remove-channels-chanmon
Aug 25, 2020
Merged

Remove Channel's ChannelMonitor copy#667
TheBlueMatt merged 2 commits into
lightningdevkit:masterfrom
valentinewallace:remove-channels-chanmon

Conversation

@valentinewallace

@valentinewallacevalentinewallace commented Aug 10, 2020

Copy link
Copy Markdown
Contributor

In service to the larger refactor of removing the Channel's reference
to its ChannelMonitor.

This also allows us to remove the Channel's channel_monitor() function. Next we can remove all of the Channel's logic for keeping its channel monitor up to date, as well as the update_monitor_ooo logic in ChannelMonitor.

Partially resolvesCloses#657

@codecov

codecovBot commented Aug 10, 2020

Copy link
Copy Markdown

Codecov Report

Merging #667 into master will increase coverage by 0.10%.
The diff coverage is 92.47%.

Impacted file tree graph

@@ Coverage Diff @@## master #667 +/- ##
==========================================
+ Coverage 91.36% 91.46% +0.10% 
==========================================
Files 35 35 Lines 21703 21888 +185 ==========================================
+ Hits 19828 20019 +191 + Misses 1875 1869 -6 
Impacted FilesCoverage Δ
lightning/src/ln/channel.rs87.17% <ø> (-0.04%)⬇️
lightning/src/ln/reorg_tests.rs98.94% <ø> (ø)
lightning/src/ln/functional_tests.rs97.15% <88.23%> (+0.14%)⬆️
lightning/src/ln/channelmonitor.rs95.56% <90.24%> (-0.15%)⬇️
lightning/src/ln/channelmanager.rs85.26% <96.96%> (+<0.01%)⬆️
lightning/src/util/test_utils.rs86.13% <100.00%> (ø)
lightning/src/ln/onchaintx.rs93.75% <0.00%> (-0.20%)⬇️
lightning/src/routing/router.rs97.39% <0.00%> (+0.80%)⬆️

Continue to review full report at Codecov.

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

@valentinewallace

Copy link
Copy Markdown
ContributorAuthor

Oops, broke build -- will fix in a bit

@valentinewallace

Copy link
Copy Markdown
ContributorAuthor

I looked into extracting some common HTLC selection functionality between monitor_would_broadcast and build_commitment_transaction but they're pretty different, they want different HTLCs, and monitor_would_broadcast needs local and remote HTLCs, and idk. Let me know if I'm missing something and it's definitely a good idea.

@valentinewallacevalentinewallace changed the title Add would_broadcast_at_height functionality to ChannelRemove Channel's ChannelMonitor copyAug 13, 2020
@valentinewallace

Copy link
Copy Markdown
ContributorAuthor

Hmm, fuzzing seems slow still. Looking into it.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
@valentinewallacevalentinewallace mentioned this pull request Aug 19, 2020
@valentinewallacevalentinewallace mentioned this pull request Aug 19, 2020
@valentinewallace
valentinewallaceforce-pushed the remove-channels-chanmon branch 2 times, most recently from 684dba8 to 70c58d9CompareAugust 19, 2020 21:01
Comment threadlightning/src/ln/channel.rs Outdated
@@ -908,7 +969,7 @@ impl<ChanSigner: ChannelKeys> Channel<ChanSigner> {
InboundHTLCState::AwaitingRemoteRevokeToAnnounce(_) => (!generated_by_local, "AwaitingRemoteRevokeToAnnounce"),

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.

not so much related to this diff in particular, but is the string literal the most elegant way to get the state name?

@valentinewallacevalentinewallaceAug 25, 2020

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.

Open to other options 😄 (for a future PR)

Comment threadlightning/src/ln/channelmonitor.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channelmonitor.rs Outdated

@ariardariard left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

I'm all in to remove Channel's ChannelMonitor copy but I think there is a easier way than dc9ef2c. If I understand new would_broadcast_at_height_functionality well, its purpose is only to verify that ChannelMonitor accomplish its job well and broadcast channel update accordingly.

I'm not sure if it's a great approach, in the future if we add new conditions in ChannelMonitor to force-close channel we would need to access them too. Like in case of mempools-congestion, preemptively close channel at risk.

Another way to solve this would be a) pass a reference to ChainWatchInterface to ChannelManager b) at funding_tx detection, return its output to watch c) monitor commitment transaction broadcast. Parsing positively commitment transaction is easy to do due to transaction pattern (one-input), LN commitment number watermark and overall funding outpoint spending. It's more robust also as we shouldn't assume that our ChannelManager and ChannelMonitor are running on the same block provider and thus may have block view latency.

I know that's already the current model to query ChannelMonitor to decide if we should shutdown and broadcast channel update, but I think it's fine to wait a bit for channel update broadcast. Shutdown/broadcast will happen either sooner after any attempt to unsuccessfully update monitors. Or latter after block processing.

If you still want to be quick in term of updating global network view of our channel maybe we can ChannelMonitor signal broadcast with a boolean and us periodically querying it like we're doing for get_and_clear_pending_htlcs_updated ?

Overall, I may miss some onchain/offchain coupling assumptions but it feels like we can short-cut some complexity ?

Comment threadlightning/src/ln/channel.rs Outdated
@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Ooooo, right, so I think that's true - would_broadcast_at_height is only used to close a channel and we could happily have the ChannelMonitor handle that (though currently Channel[Manager] handles that fully). My knee-jerk reaction was that there would be a race condition where we'd continue updating a channel state after its been closed (and the latest local commitment broadcast), but I think we could not even bother notifying the ChannelManager that we're closing the channel and wait for provide_latest_local_commitment_tx_info to return an Err because local_tx_signed is set to close the channel, so there's no race.

@valentinewallace
valentinewallaceforce-pushed the remove-channels-chanmon branch 2 times, most recently from 905dbe2 to df55910CompareAugust 23, 2020 02:35
Comment threadlightning/src/ln/channelmonitor.rs Outdated

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

I had to admit I'm somewhat surprised that's the only test changes you need, but looks good.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmonitor.rs Outdated
@valentinewallace
valentinewallaceforce-pushed the remove-channels-chanmon branch 2 times, most recently from 2b86ba7 to 8b5502bCompareAugust 24, 2020 23:05
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmonitor.rs Outdated

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

Aside from the one clarifying change I suggested and the two comment nits, looks good!


/// An event to be processed by the ChannelManager.
#[derive(PartialEq)]
pub enum MonitorEvent {

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.

Out of curiosity, how do we decide which events are monitor events? For example, why is HTLCEvent for claiming one, but forwarding offered HTLCs isn't?

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.

In this context, its basically "a thing which we detected on-chain which has an impact on our understanding of a channel's state" (ie, basically, "channel has been closed on chain" or "transaction on-chain resolved an HTLC which was outstanding when we went on chain").

Comment threadlightning/src/ln/onchaintx.rs Outdated
Comment threadlightning/src/ln/channelmonitor.rs Outdated
Comment threadlightning/src/ln/channelmonitor.rs Outdated
Comment threadlightning/src/ln/channelmonitor.rs Outdated
0 => MonitorEvent::HTLCEvent(Readable::read(reader)?),
1 => MonitorEvent::CommitmentTxBroadcasted(funding_info.0),
_ => return Err(DecodeError::InvalidValue)
};

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.

One day we'll have versioning for reads lol :)

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.

Indeed lol

To do this, we replace get_and_clear_pending_htlcs_updated with
get_and_clear_pending_monitor_events, and which still transmits HTLCUpdates
as before, but now also transmits a new MonitorEvent::CommitmentTxBroadcasted
event when a channel's commitment transaction is broadcasted.
@TheBlueMatt
TheBlueMatt merged commit 501974d into lightningdevkit:masterAug 25, 2020
if should_broadcast {
self.pending_monitor_events.push(MonitorEvent::CommitmentTxBroadcasted(self.funding_info.0));
if let Some(commitment_tx) = self.onchain_tx_handler.get_fully_signed_local_tx(&self.funding_redeemscript) {
self.local_tx_signed = true;

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

@valentinewallace

I think this is breaking one of the property of our distributed watchtower infrastructure as documented here : https://github.com/rust-bitcoin/rust-lightning/blob/3defcc896266f3d67848ce28981a756e971a3f0c/lightning/src/ln/channelmonitor.rs#L1174

AFAICT, by adding logs flag is true beyond updating local view with latest local state.

I'll fix it and add coverage for this.

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.

Logs flag? Ok I think I see what you mean though, thanks for catching this!

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.

We're discussing on IRC still, but I don't think this change is correct - we should refuse to accept updates after we've signed a local tx irrespective of why we signed it.

@ariardariardAug 28, 2020

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Sorry, after discussion on IRC and testing I realized that the alleged property was only supported in my mind. In fact #667 makes it easy to actually implement it, so did so in #679 with test coverage.

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.

Get rid of unnecessary ChannelMonitor in Channel

4 participants

@valentinewallace@TheBlueMatt@arik-so@ariard