Skip to content

BOLT07: prune if oldest channel_update is > 2 weeks old - #767

Merged
rustyrussell merged 1 commit into
lightning:masterfrom
cfromknecht:stricter-pruning
Aug 20, 2020
Merged

BOLT07: prune if oldest channel_update is > 2 weeks old#767
rustyrussell merged 1 commit into
lightning:masterfrom
cfromknecht:stricter-pruning

Conversation

@cfromknecht

@cfromknechtcfromknecht commented Apr 13, 2020

Copy link
Copy Markdown
Contributor

This PR modifies the recommended pruning requirements to use the oldest
channel_update's timestamp rather than the latest. The rationale is that
using the latest timestamp inadvertently retrains channels for which only
one side of the channel continues to send fresh channel_updates.

Consider a new node that makes a channel to y'alls, but then disappears.
The current pruning strategy will keep the channel in its routing table
because y'alls continues to send fresh channel_updates, but the channel
is actually unusable because the other party is never online. The new strategy
will remove these low-success nodes/channels from the routing table and
only keep channels where both endpoints have indicated recent activity.

This reduces the number of channels in the public graph by 25% at the time
of writing.

EDIT: updated stats, see relevant network stats

@t-bastt-bast 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.

ACK, this is clearly something we need to do! EDIT: see my next comment, unfortunately the real world doesn't seem to play so nicely with this :/

I ran the same kind of computation last week and just re-ran it, but in my case it's a 25% reduction in the number of channels. Is there another pruning heuristic you added on top to get to 40% (like rejecting some incoming channel_updates)? Otherwise you may be missing 15% of valid channels in the network somehow...

@t-bast

Copy link
Copy Markdown
Collaborator

Consider a new node that makes a channel to y'alls, but then disappears.

By disappear do you mean goes offline or stays online but inactive? If he goes offline, y'alls should not be sending any channel_update so the pruning should happen without any change to the spec.

If you meant stays online but inactive, unfortunately it looks like in practice it's not working correctly.
I'm seeing many channels that are clearly active and shouldn't be pruned for which I get channel_updates for one side less regularly than once every two weeks. I ran this pruning and sorted the pruned channels by capacity, and looked at the top ones. When doing that I see many channels from BlueWallet that don't send a channel_update regularly enough (for example for 611448x1083x1 I didn't receive any update between march 11 and april 9 from the BlueWallet side). I don't know if it's because BlueWallet doesn't send those updates, or if they're not propagated correctly all the way to my node. Could you do the same experiment with your data?

But in any case, I definitely don't want to prune those channels. Maybe a safer spec addition would be to require that in a channel A <-> B, B shouldn't send a channel_update if A hasn't sent one in 14 days? Because if B is the most well-placed to know whether A sent a channel_update or not (whereas remote nodes may simply be unlucky and didn't correctly get the gossip propagated to them for some reason that still eludes me). That means it would take a month to get rid of those inactive channels (instead of 14 days).

Maybe the real issue is a bug that prevents nodes from correctly sending their regular channel_updates, or from having them propagated throughout the network? And once that's fixed we'd see that we would get close to no gain from that extra pruning?

I think many of us need to be testing what channels that proposal would prune on their node, and verify that these are channels that really should be pruned.

@t-bastt-bast mentioned this pull request Apr 24, 2020
17 tasks
@cdecker

Copy link
Copy Markdown
Collaborator

By disappear do you mean goes offline or stays online but inactive? If he goes offline, y'alls should not be sending any channel_update so the pruning should happen without any change to the spec.

This is what I'd expect to happen: channel is unusable, don't update after the last disable message, and cause the channel to slowly be forgotten. Why would yalls continue to send updates?

If the channel becomes active again at a later time, it should send an announcement followed by an update so everybody learns about its existence again. Eagerly pruning around nodes mistakenly sending channel updates seems weird. For example a node may never activate its side of the channel with an update because it doesn't have outgoing capacity, that doesn't mean the channel as a whole is unusable.

@niftynei

Copy link
Copy Markdown
Collaborator

imo 'oldest channel update' is unclear -- do you mean 'either node's most-recent channel_update' is older than 2 weeks?

@t-bastt-bast mentioned this pull request May 11, 2020
17 tasks
@TheBlueMatt

Copy link
Copy Markdown
Collaborator

I dont have super strong feelings about the actual logic, but the text in BOLT 7 needs significant tweaks for this.

"SHOULD base timestamp on a UNIX timestamp." needs to get an additional "MUST set timestamp to a number greater than the time in the median of the last 11 Bitcoin block headers" added. Further, to reduce the risk of time-based issues, I think the thing being changed here should be tweaked to reference MTP as well, instead of wall-clock time, given P2P apps tend to get the Wrong Time all the time.

@cfromknecht

Copy link
Copy Markdown
ContributorAuthor

Further, to reduce the risk of time-based issues, I think the thing being changed here should be tweaked to reference MTP as well, instead of wall-clock time, given P2P apps tend to get the Wrong Time all the time.

I wouldn't be surprised if some of the existing propagation issues are related to poorly synced clocks

@RoasbeefRoasbeef left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM 🗿

@niftynei

Copy link
Copy Markdown
Collaborator

ACK dc43078

@rustyrussell

Copy link
Copy Markdown
Collaborator

@rustyrussell
rustyrussell merged commit 7e8c478 into lightning:masterAug 20, 2020
rustyrussell added a commit to rustyrussell/lightning that referenced this pull request Aug 20, 2020
See lightning/bolts#767
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Changelog-Changed: Protocol: channels now pruned after two weeks unless both peers refresh it (see lightning-rfc#767)
rustyrussell added a commit to rustyrussell/lightning that referenced this pull request Aug 20, 2020
See lightning/bolts#767
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Changelog-Changed: Protocol: channels now pruned after two weeks unless both peers refresh it (see lightning-rfc#767)
rustyrussell added a commit to ElementsProject/lightning that referenced this pull request Aug 24, 2020
See lightning/bolts#767
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Changelog-Changed: Protocol: channels now pruned after two weeks unless both peers refresh it (see lightning-rfc#767)
rustyrussell added a commit to rustyrussell/lightning that referenced this pull request Aug 25, 2020
See lightning/bolts#767
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Changelog-Changed: Protocol: channels now pruned after two weeks unless both peers refresh it (see lightning-rfc#767)
@cfromknecht
cfromknecht deleted the stricter-pruning branch March 9, 2021 18:43
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.

7 participants

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

BOLT07: prune if oldest channel_update is > 2 weeks old - #767

Merged
rustyrussell merged 1 commit into
lightning:masterfrom
cfromknecht:stricter-pruning
Aug 20, 2020
Merged

BOLT07: prune if oldest channel_update is > 2 weeks old#767
rustyrussell merged 1 commit into
lightning:masterfrom
cfromknecht:stricter-pruning

Conversation

@cfromknecht

@cfromknechtcfromknecht commented Apr 13, 2020

Copy link
Copy Markdown
Contributor

This PR modifies the recommended pruning requirements to use the oldest
channel_update's timestamp rather than the latest. The rationale is that
using the latest timestamp inadvertently retrains channels for which only
one side of the channel continues to send fresh channel_updates.

Consider a new node that makes a channel to y'alls, but then disappears.
The current pruning strategy will keep the channel in its routing table
because y'alls continues to send fresh channel_updates, but the channel
is actually unusable because the other party is never online. The new strategy
will remove these low-success nodes/channels from the routing table and
only keep channels where both endpoints have indicated recent activity.

This reduces the number of channels in the public graph by 25% at the time
of writing.

EDIT: updated stats, see relevant network stats

@t-bastt-bast 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.

ACK, this is clearly something we need to do! EDIT: see my next comment, unfortunately the real world doesn't seem to play so nicely with this :/

I ran the same kind of computation last week and just re-ran it, but in my case it's a 25% reduction in the number of channels. Is there another pruning heuristic you added on top to get to 40% (like rejecting some incoming channel_updates)? Otherwise you may be missing 15% of valid channels in the network somehow...

@t-bast

Copy link
Copy Markdown
Collaborator

Consider a new node that makes a channel to y'alls, but then disappears.

By disappear do you mean goes offline or stays online but inactive? If he goes offline, y'alls should not be sending any channel_update so the pruning should happen without any change to the spec.

If you meant stays online but inactive, unfortunately it looks like in practice it's not working correctly.
I'm seeing many channels that are clearly active and shouldn't be pruned for which I get channel_updates for one side less regularly than once every two weeks. I ran this pruning and sorted the pruned channels by capacity, and looked at the top ones. When doing that I see many channels from BlueWallet that don't send a channel_update regularly enough (for example for 611448x1083x1 I didn't receive any update between march 11 and april 9 from the BlueWallet side). I don't know if it's because BlueWallet doesn't send those updates, or if they're not propagated correctly all the way to my node. Could you do the same experiment with your data?

But in any case, I definitely don't want to prune those channels. Maybe a safer spec addition would be to require that in a channel A <-> B, B shouldn't send a channel_update if A hasn't sent one in 14 days? Because if B is the most well-placed to know whether A sent a channel_update or not (whereas remote nodes may simply be unlucky and didn't correctly get the gossip propagated to them for some reason that still eludes me). That means it would take a month to get rid of those inactive channels (instead of 14 days).

Maybe the real issue is a bug that prevents nodes from correctly sending their regular channel_updates, or from having them propagated throughout the network? And once that's fixed we'd see that we would get close to no gain from that extra pruning?

I think many of us need to be testing what channels that proposal would prune on their node, and verify that these are channels that really should be pruned.

@t-bastt-bast mentioned this pull request Apr 24, 2020
17 tasks
@cdecker

Copy link
Copy Markdown
Collaborator

By disappear do you mean goes offline or stays online but inactive? If he goes offline, y'alls should not be sending any channel_update so the pruning should happen without any change to the spec.

This is what I'd expect to happen: channel is unusable, don't update after the last disable message, and cause the channel to slowly be forgotten. Why would yalls continue to send updates?

If the channel becomes active again at a later time, it should send an announcement followed by an update so everybody learns about its existence again. Eagerly pruning around nodes mistakenly sending channel updates seems weird. For example a node may never activate its side of the channel with an update because it doesn't have outgoing capacity, that doesn't mean the channel as a whole is unusable.

@niftynei

Copy link
Copy Markdown
Collaborator

imo 'oldest channel update' is unclear -- do you mean 'either node's most-recent channel_update' is older than 2 weeks?

@t-bastt-bast mentioned this pull request May 11, 2020
17 tasks
@TheBlueMatt

Copy link
Copy Markdown
Collaborator

I dont have super strong feelings about the actual logic, but the text in BOLT 7 needs significant tweaks for this.

"SHOULD base timestamp on a UNIX timestamp." needs to get an additional "MUST set timestamp to a number greater than the time in the median of the last 11 Bitcoin block headers" added. Further, to reduce the risk of time-based issues, I think the thing being changed here should be tweaked to reference MTP as well, instead of wall-clock time, given P2P apps tend to get the Wrong Time all the time.

@cfromknecht

Copy link
Copy Markdown
ContributorAuthor

Further, to reduce the risk of time-based issues, I think the thing being changed here should be tweaked to reference MTP as well, instead of wall-clock time, given P2P apps tend to get the Wrong Time all the time.

I wouldn't be surprised if some of the existing propagation issues are related to poorly synced clocks

@RoasbeefRoasbeef left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM 🗿

@niftynei

Copy link
Copy Markdown
Collaborator

ACK dc43078

@rustyrussell

Copy link
Copy Markdown
Collaborator

@rustyrussell
rustyrussell merged commit 7e8c478 into lightning:masterAug 20, 2020
rustyrussell added a commit to rustyrussell/lightning that referenced this pull request Aug 20, 2020
See lightning/bolts#767
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Changelog-Changed: Protocol: channels now pruned after two weeks unless both peers refresh it (see lightning-rfc#767)
rustyrussell added a commit to rustyrussell/lightning that referenced this pull request Aug 20, 2020
See lightning/bolts#767
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Changelog-Changed: Protocol: channels now pruned after two weeks unless both peers refresh it (see lightning-rfc#767)
rustyrussell added a commit to ElementsProject/lightning that referenced this pull request Aug 24, 2020
See lightning/bolts#767
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Changelog-Changed: Protocol: channels now pruned after two weeks unless both peers refresh it (see lightning-rfc#767)
rustyrussell added a commit to rustyrussell/lightning that referenced this pull request Aug 25, 2020
See lightning/bolts#767
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Changelog-Changed: Protocol: channels now pruned after two weeks unless both peers refresh it (see lightning-rfc#767)
@cfromknecht
cfromknecht deleted the stricter-pruning branch March 9, 2021 18:43
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.

7 participants

@cfromknecht@t-bast@cdecker@niftynei@TheBlueMatt@rustyrussell@Roasbeef
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' BOLT07: prune if oldest channel_update is > 2 weeks old by cfromknecht · Pull Request #767 · lightning/bolts · GitHub
Skip to content

BOLT07: prune if oldest channel_update is > 2 weeks old - #767

Merged
rustyrussell merged 1 commit into
lightning:masterfrom
cfromknecht:stricter-pruning
Aug 20, 2020
Merged

BOLT07: prune if oldest channel_update is > 2 weeks old#767
rustyrussell merged 1 commit into
lightning:masterfrom
cfromknecht:stricter-pruning

Conversation

@cfromknecht

@cfromknechtcfromknecht commented Apr 13, 2020

Copy link
Copy Markdown
Contributor

This PR modifies the recommended pruning requirements to use the oldest
channel_update's timestamp rather than the latest. The rationale is that
using the latest timestamp inadvertently retrains channels for which only
one side of the channel continues to send fresh channel_updates.

Consider a new node that makes a channel to y'alls, but then disappears.
The current pruning strategy will keep the channel in its routing table
because y'alls continues to send fresh channel_updates, but the channel
is actually unusable because the other party is never online. The new strategy
will remove these low-success nodes/channels from the routing table and
only keep channels where both endpoints have indicated recent activity.

This reduces the number of channels in the public graph by 25% at the time
of writing.

EDIT: updated stats, see relevant network stats

@t-bastt-bast 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.

ACK, this is clearly something we need to do! EDIT: see my next comment, unfortunately the real world doesn't seem to play so nicely with this :/

I ran the same kind of computation last week and just re-ran it, but in my case it's a 25% reduction in the number of channels. Is there another pruning heuristic you added on top to get to 40% (like rejecting some incoming channel_updates)? Otherwise you may be missing 15% of valid channels in the network somehow...

@t-bast

Copy link
Copy Markdown
Collaborator

Consider a new node that makes a channel to y'alls, but then disappears.

By disappear do you mean goes offline or stays online but inactive? If he goes offline, y'alls should not be sending any channel_update so the pruning should happen without any change to the spec.

If you meant stays online but inactive, unfortunately it looks like in practice it's not working correctly.
I'm seeing many channels that are clearly active and shouldn't be pruned for which I get channel_updates for one side less regularly than once every two weeks. I ran this pruning and sorted the pruned channels by capacity, and looked at the top ones. When doing that I see many channels from BlueWallet that don't send a channel_update regularly enough (for example for 611448x1083x1 I didn't receive any update between march 11 and april 9 from the BlueWallet side). I don't know if it's because BlueWallet doesn't send those updates, or if they're not propagated correctly all the way to my node. Could you do the same experiment with your data?

But in any case, I definitely don't want to prune those channels. Maybe a safer spec addition would be to require that in a channel A <-> B, B shouldn't send a channel_update if A hasn't sent one in 14 days? Because if B is the most well-placed to know whether A sent a channel_update or not (whereas remote nodes may simply be unlucky and didn't correctly get the gossip propagated to them for some reason that still eludes me). That means it would take a month to get rid of those inactive channels (instead of 14 days).

Maybe the real issue is a bug that prevents nodes from correctly sending their regular channel_updates, or from having them propagated throughout the network? And once that's fixed we'd see that we would get close to no gain from that extra pruning?

I think many of us need to be testing what channels that proposal would prune on their node, and verify that these are channels that really should be pruned.

@t-bastt-bast mentioned this pull request Apr 24, 2020
17 tasks
@cdecker

Copy link
Copy Markdown
Collaborator

By disappear do you mean goes offline or stays online but inactive? If he goes offline, y'alls should not be sending any channel_update so the pruning should happen without any change to the spec.

This is what I'd expect to happen: channel is unusable, don't update after the last disable message, and cause the channel to slowly be forgotten. Why would yalls continue to send updates?

If the channel becomes active again at a later time, it should send an announcement followed by an update so everybody learns about its existence again. Eagerly pruning around nodes mistakenly sending channel updates seems weird. For example a node may never activate its side of the channel with an update because it doesn't have outgoing capacity, that doesn't mean the channel as a whole is unusable.

@niftynei

Copy link
Copy Markdown
Collaborator

imo 'oldest channel update' is unclear -- do you mean 'either node's most-recent channel_update' is older than 2 weeks?

@t-bastt-bast mentioned this pull request May 11, 2020
17 tasks
@TheBlueMatt

Copy link
Copy Markdown
Collaborator

I dont have super strong feelings about the actual logic, but the text in BOLT 7 needs significant tweaks for this.

"SHOULD base timestamp on a UNIX timestamp." needs to get an additional "MUST set timestamp to a number greater than the time in the median of the last 11 Bitcoin block headers" added. Further, to reduce the risk of time-based issues, I think the thing being changed here should be tweaked to reference MTP as well, instead of wall-clock time, given P2P apps tend to get the Wrong Time all the time.

@cfromknecht

Copy link
Copy Markdown
ContributorAuthor

Further, to reduce the risk of time-based issues, I think the thing being changed here should be tweaked to reference MTP as well, instead of wall-clock time, given P2P apps tend to get the Wrong Time all the time.

I wouldn't be surprised if some of the existing propagation issues are related to poorly synced clocks

@RoasbeefRoasbeef left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM 🗿

@niftynei

Copy link
Copy Markdown
Collaborator

ACK dc43078

@rustyrussell

Copy link
Copy Markdown
Collaborator

@rustyrussell
rustyrussell merged commit 7e8c478 into lightning:masterAug 20, 2020
rustyrussell added a commit to rustyrussell/lightning that referenced this pull request Aug 20, 2020
See lightning/bolts#767
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Changelog-Changed: Protocol: channels now pruned after two weeks unless both peers refresh it (see lightning-rfc#767)
rustyrussell added a commit to rustyrussell/lightning that referenced this pull request Aug 20, 2020
See lightning/bolts#767
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Changelog-Changed: Protocol: channels now pruned after two weeks unless both peers refresh it (see lightning-rfc#767)
rustyrussell added a commit to ElementsProject/lightning that referenced this pull request Aug 24, 2020
See lightning/bolts#767
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Changelog-Changed: Protocol: channels now pruned after two weeks unless both peers refresh it (see lightning-rfc#767)
rustyrussell added a commit to rustyrussell/lightning that referenced this pull request Aug 25, 2020
See lightning/bolts#767
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Changelog-Changed: Protocol: channels now pruned after two weeks unless both peers refresh it (see lightning-rfc#767)
@cfromknecht
cfromknecht deleted the stricter-pruning branch March 9, 2021 18:43
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.

7 participants

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

BOLT07: prune if oldest channel_update is > 2 weeks old - #767

Merged
rustyrussell merged 1 commit into
lightning:masterfrom
cfromknecht:stricter-pruning
Aug 20, 2020
Merged

BOLT07: prune if oldest channel_update is > 2 weeks old#767
rustyrussell merged 1 commit into
lightning:masterfrom
cfromknecht:stricter-pruning

Conversation

@cfromknecht

@cfromknechtcfromknecht commented Apr 13, 2020

Copy link
Copy Markdown
Contributor

This PR modifies the recommended pruning requirements to use the oldest
channel_update's timestamp rather than the latest. The rationale is that
using the latest timestamp inadvertently retrains channels for which only
one side of the channel continues to send fresh channel_updates.

Consider a new node that makes a channel to y'alls, but then disappears.
The current pruning strategy will keep the channel in its routing table
because y'alls continues to send fresh channel_updates, but the channel
is actually unusable because the other party is never online. The new strategy
will remove these low-success nodes/channels from the routing table and
only keep channels where both endpoints have indicated recent activity.

This reduces the number of channels in the public graph by 25% at the time
of writing.

EDIT: updated stats, see relevant network stats

@t-bastt-bast 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.

ACK, this is clearly something we need to do! EDIT: see my next comment, unfortunately the real world doesn't seem to play so nicely with this :/

I ran the same kind of computation last week and just re-ran it, but in my case it's a 25% reduction in the number of channels. Is there another pruning heuristic you added on top to get to 40% (like rejecting some incoming channel_updates)? Otherwise you may be missing 15% of valid channels in the network somehow...

@t-bast

Copy link
Copy Markdown
Collaborator

Consider a new node that makes a channel to y'alls, but then disappears.

By disappear do you mean goes offline or stays online but inactive? If he goes offline, y'alls should not be sending any channel_update so the pruning should happen without any change to the spec.

If you meant stays online but inactive, unfortunately it looks like in practice it's not working correctly.
I'm seeing many channels that are clearly active and shouldn't be pruned for which I get channel_updates for one side less regularly than once every two weeks. I ran this pruning and sorted the pruned channels by capacity, and looked at the top ones. When doing that I see many channels from BlueWallet that don't send a channel_update regularly enough (for example for 611448x1083x1 I didn't receive any update between march 11 and april 9 from the BlueWallet side). I don't know if it's because BlueWallet doesn't send those updates, or if they're not propagated correctly all the way to my node. Could you do the same experiment with your data?

But in any case, I definitely don't want to prune those channels. Maybe a safer spec addition would be to require that in a channel A <-> B, B shouldn't send a channel_update if A hasn't sent one in 14 days? Because if B is the most well-placed to know whether A sent a channel_update or not (whereas remote nodes may simply be unlucky and didn't correctly get the gossip propagated to them for some reason that still eludes me). That means it would take a month to get rid of those inactive channels (instead of 14 days).

Maybe the real issue is a bug that prevents nodes from correctly sending their regular channel_updates, or from having them propagated throughout the network? And once that's fixed we'd see that we would get close to no gain from that extra pruning?

I think many of us need to be testing what channels that proposal would prune on their node, and verify that these are channels that really should be pruned.

@t-bastt-bast mentioned this pull request Apr 24, 2020
17 tasks
@cdecker

Copy link
Copy Markdown
Collaborator

By disappear do you mean goes offline or stays online but inactive? If he goes offline, y'alls should not be sending any channel_update so the pruning should happen without any change to the spec.

This is what I'd expect to happen: channel is unusable, don't update after the last disable message, and cause the channel to slowly be forgotten. Why would yalls continue to send updates?

If the channel becomes active again at a later time, it should send an announcement followed by an update so everybody learns about its existence again. Eagerly pruning around nodes mistakenly sending channel updates seems weird. For example a node may never activate its side of the channel with an update because it doesn't have outgoing capacity, that doesn't mean the channel as a whole is unusable.

@niftynei

Copy link
Copy Markdown
Collaborator

imo 'oldest channel update' is unclear -- do you mean 'either node's most-recent channel_update' is older than 2 weeks?

@t-bastt-bast mentioned this pull request May 11, 2020
17 tasks
@TheBlueMatt

Copy link
Copy Markdown
Collaborator

I dont have super strong feelings about the actual logic, but the text in BOLT 7 needs significant tweaks for this.

"SHOULD base timestamp on a UNIX timestamp." needs to get an additional "MUST set timestamp to a number greater than the time in the median of the last 11 Bitcoin block headers" added. Further, to reduce the risk of time-based issues, I think the thing being changed here should be tweaked to reference MTP as well, instead of wall-clock time, given P2P apps tend to get the Wrong Time all the time.

@cfromknecht

Copy link
Copy Markdown
ContributorAuthor

Further, to reduce the risk of time-based issues, I think the thing being changed here should be tweaked to reference MTP as well, instead of wall-clock time, given P2P apps tend to get the Wrong Time all the time.

I wouldn't be surprised if some of the existing propagation issues are related to poorly synced clocks

@RoasbeefRoasbeef left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM 🗿

@niftynei

Copy link
Copy Markdown
Collaborator

ACK dc43078

@rustyrussell

Copy link
Copy Markdown
Collaborator

@rustyrussell
rustyrussell merged commit 7e8c478 into lightning:masterAug 20, 2020
rustyrussell added a commit to rustyrussell/lightning that referenced this pull request Aug 20, 2020
See lightning/bolts#767
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Changelog-Changed: Protocol: channels now pruned after two weeks unless both peers refresh it (see lightning-rfc#767)
rustyrussell added a commit to rustyrussell/lightning that referenced this pull request Aug 20, 2020
See lightning/bolts#767
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Changelog-Changed: Protocol: channels now pruned after two weeks unless both peers refresh it (see lightning-rfc#767)
rustyrussell added a commit to ElementsProject/lightning that referenced this pull request Aug 24, 2020
See lightning/bolts#767
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Changelog-Changed: Protocol: channels now pruned after two weeks unless both peers refresh it (see lightning-rfc#767)
rustyrussell added a commit to rustyrussell/lightning that referenced this pull request Aug 25, 2020
See lightning/bolts#767
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Changelog-Changed: Protocol: channels now pruned after two weeks unless both peers refresh it (see lightning-rfc#767)
@cfromknecht
cfromknecht deleted the stricter-pruning branch March 9, 2021 18:43
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.

7 participants

@cfromknecht@t-bast@cdecker@niftynei@TheBlueMatt@rustyrussell@Roasbeef
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' BOLT07: prune if oldest channel_update is > 2 weeks old by cfromknecht · Pull Request #767 · lightning/bolts · GitHub
Skip to content

BOLT07: prune if oldest channel_update is > 2 weeks old - #767

Merged
rustyrussell merged 1 commit into
lightning:masterfrom
cfromknecht:stricter-pruning
Aug 20, 2020
Merged

BOLT07: prune if oldest channel_update is > 2 weeks old#767
rustyrussell merged 1 commit into
lightning:masterfrom
cfromknecht:stricter-pruning

Conversation

@cfromknecht

@cfromknechtcfromknecht commented Apr 13, 2020

Copy link
Copy Markdown
Contributor

This PR modifies the recommended pruning requirements to use the oldest
channel_update's timestamp rather than the latest. The rationale is that
using the latest timestamp inadvertently retrains channels for which only
one side of the channel continues to send fresh channel_updates.

Consider a new node that makes a channel to y'alls, but then disappears.
The current pruning strategy will keep the channel in its routing table
because y'alls continues to send fresh channel_updates, but the channel
is actually unusable because the other party is never online. The new strategy
will remove these low-success nodes/channels from the routing table and
only keep channels where both endpoints have indicated recent activity.

This reduces the number of channels in the public graph by 25% at the time
of writing.

EDIT: updated stats, see relevant network stats

@t-bastt-bast 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.

ACK, this is clearly something we need to do! EDIT: see my next comment, unfortunately the real world doesn't seem to play so nicely with this :/

I ran the same kind of computation last week and just re-ran it, but in my case it's a 25% reduction in the number of channels. Is there another pruning heuristic you added on top to get to 40% (like rejecting some incoming channel_updates)? Otherwise you may be missing 15% of valid channels in the network somehow...

@t-bast

Copy link
Copy Markdown
Collaborator

Consider a new node that makes a channel to y'alls, but then disappears.

By disappear do you mean goes offline or stays online but inactive? If he goes offline, y'alls should not be sending any channel_update so the pruning should happen without any change to the spec.

If you meant stays online but inactive, unfortunately it looks like in practice it's not working correctly.
I'm seeing many channels that are clearly active and shouldn't be pruned for which I get channel_updates for one side less regularly than once every two weeks. I ran this pruning and sorted the pruned channels by capacity, and looked at the top ones. When doing that I see many channels from BlueWallet that don't send a channel_update regularly enough (for example for 611448x1083x1 I didn't receive any update between march 11 and april 9 from the BlueWallet side). I don't know if it's because BlueWallet doesn't send those updates, or if they're not propagated correctly all the way to my node. Could you do the same experiment with your data?

But in any case, I definitely don't want to prune those channels. Maybe a safer spec addition would be to require that in a channel A <-> B, B shouldn't send a channel_update if A hasn't sent one in 14 days? Because if B is the most well-placed to know whether A sent a channel_update or not (whereas remote nodes may simply be unlucky and didn't correctly get the gossip propagated to them for some reason that still eludes me). That means it would take a month to get rid of those inactive channels (instead of 14 days).

Maybe the real issue is a bug that prevents nodes from correctly sending their regular channel_updates, or from having them propagated throughout the network? And once that's fixed we'd see that we would get close to no gain from that extra pruning?

I think many of us need to be testing what channels that proposal would prune on their node, and verify that these are channels that really should be pruned.

@t-bastt-bast mentioned this pull request Apr 24, 2020
17 tasks
@cdecker

Copy link
Copy Markdown
Collaborator

By disappear do you mean goes offline or stays online but inactive? If he goes offline, y'alls should not be sending any channel_update so the pruning should happen without any change to the spec.

This is what I'd expect to happen: channel is unusable, don't update after the last disable message, and cause the channel to slowly be forgotten. Why would yalls continue to send updates?

If the channel becomes active again at a later time, it should send an announcement followed by an update so everybody learns about its existence again. Eagerly pruning around nodes mistakenly sending channel updates seems weird. For example a node may never activate its side of the channel with an update because it doesn't have outgoing capacity, that doesn't mean the channel as a whole is unusable.

@niftynei

Copy link
Copy Markdown
Collaborator

imo 'oldest channel update' is unclear -- do you mean 'either node's most-recent channel_update' is older than 2 weeks?

@t-bastt-bast mentioned this pull request May 11, 2020
17 tasks
@TheBlueMatt

Copy link
Copy Markdown
Collaborator

I dont have super strong feelings about the actual logic, but the text in BOLT 7 needs significant tweaks for this.

"SHOULD base timestamp on a UNIX timestamp." needs to get an additional "MUST set timestamp to a number greater than the time in the median of the last 11 Bitcoin block headers" added. Further, to reduce the risk of time-based issues, I think the thing being changed here should be tweaked to reference MTP as well, instead of wall-clock time, given P2P apps tend to get the Wrong Time all the time.

@cfromknecht

Copy link
Copy Markdown
ContributorAuthor

Further, to reduce the risk of time-based issues, I think the thing being changed here should be tweaked to reference MTP as well, instead of wall-clock time, given P2P apps tend to get the Wrong Time all the time.

I wouldn't be surprised if some of the existing propagation issues are related to poorly synced clocks

@RoasbeefRoasbeef left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM 🗿

@niftynei

Copy link
Copy Markdown
Collaborator

ACK dc43078

@rustyrussell

Copy link
Copy Markdown
Collaborator

@rustyrussell
rustyrussell merged commit 7e8c478 into lightning:masterAug 20, 2020
rustyrussell added a commit to rustyrussell/lightning that referenced this pull request Aug 20, 2020
See lightning/bolts#767
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Changelog-Changed: Protocol: channels now pruned after two weeks unless both peers refresh it (see lightning-rfc#767)
rustyrussell added a commit to rustyrussell/lightning that referenced this pull request Aug 20, 2020
See lightning/bolts#767
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Changelog-Changed: Protocol: channels now pruned after two weeks unless both peers refresh it (see lightning-rfc#767)
rustyrussell added a commit to ElementsProject/lightning that referenced this pull request Aug 24, 2020
See lightning/bolts#767
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Changelog-Changed: Protocol: channels now pruned after two weeks unless both peers refresh it (see lightning-rfc#767)
rustyrussell added a commit to rustyrussell/lightning that referenced this pull request Aug 25, 2020
See lightning/bolts#767
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Changelog-Changed: Protocol: channels now pruned after two weeks unless both peers refresh it (see lightning-rfc#767)
@cfromknecht
cfromknecht deleted the stricter-pruning branch March 9, 2021 18:43
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.

7 participants

@cfromknecht@t-bast@cdecker@niftynei@TheBlueMatt@rustyrussell@Roasbeef
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' BOLT07: prune if oldest channel_update is > 2 weeks old by cfromknecht · Pull Request #767 · lightning/bolts · GitHub
Skip to content

BOLT07: prune if oldest channel_update is > 2 weeks old - #767

Merged
rustyrussell merged 1 commit into
lightning:masterfrom
cfromknecht:stricter-pruning
Aug 20, 2020
Merged

BOLT07: prune if oldest channel_update is > 2 weeks old#767
rustyrussell merged 1 commit into
lightning:masterfrom
cfromknecht:stricter-pruning

Conversation

@cfromknecht

@cfromknechtcfromknecht commented Apr 13, 2020

Copy link
Copy Markdown
Contributor

This PR modifies the recommended pruning requirements to use the oldest
channel_update's timestamp rather than the latest. The rationale is that
using the latest timestamp inadvertently retrains channels for which only
one side of the channel continues to send fresh channel_updates.

Consider a new node that makes a channel to y'alls, but then disappears.
The current pruning strategy will keep the channel in its routing table
because y'alls continues to send fresh channel_updates, but the channel
is actually unusable because the other party is never online. The new strategy
will remove these low-success nodes/channels from the routing table and
only keep channels where both endpoints have indicated recent activity.

This reduces the number of channels in the public graph by 25% at the time
of writing.

EDIT: updated stats, see relevant network stats

@t-bastt-bast 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.

ACK, this is clearly something we need to do! EDIT: see my next comment, unfortunately the real world doesn't seem to play so nicely with this :/

I ran the same kind of computation last week and just re-ran it, but in my case it's a 25% reduction in the number of channels. Is there another pruning heuristic you added on top to get to 40% (like rejecting some incoming channel_updates)? Otherwise you may be missing 15% of valid channels in the network somehow...

@t-bast

Copy link
Copy Markdown
Collaborator

Consider a new node that makes a channel to y'alls, but then disappears.

By disappear do you mean goes offline or stays online but inactive? If he goes offline, y'alls should not be sending any channel_update so the pruning should happen without any change to the spec.

If you meant stays online but inactive, unfortunately it looks like in practice it's not working correctly.
I'm seeing many channels that are clearly active and shouldn't be pruned for which I get channel_updates for one side less regularly than once every two weeks. I ran this pruning and sorted the pruned channels by capacity, and looked at the top ones. When doing that I see many channels from BlueWallet that don't send a channel_update regularly enough (for example for 611448x1083x1 I didn't receive any update between march 11 and april 9 from the BlueWallet side). I don't know if it's because BlueWallet doesn't send those updates, or if they're not propagated correctly all the way to my node. Could you do the same experiment with your data?

But in any case, I definitely don't want to prune those channels. Maybe a safer spec addition would be to require that in a channel A <-> B, B shouldn't send a channel_update if A hasn't sent one in 14 days? Because if B is the most well-placed to know whether A sent a channel_update or not (whereas remote nodes may simply be unlucky and didn't correctly get the gossip propagated to them for some reason that still eludes me). That means it would take a month to get rid of those inactive channels (instead of 14 days).

Maybe the real issue is a bug that prevents nodes from correctly sending their regular channel_updates, or from having them propagated throughout the network? And once that's fixed we'd see that we would get close to no gain from that extra pruning?

I think many of us need to be testing what channels that proposal would prune on their node, and verify that these are channels that really should be pruned.

@t-bastt-bast mentioned this pull request Apr 24, 2020
17 tasks
@cdecker

Copy link
Copy Markdown
Collaborator

By disappear do you mean goes offline or stays online but inactive? If he goes offline, y'alls should not be sending any channel_update so the pruning should happen without any change to the spec.

This is what I'd expect to happen: channel is unusable, don't update after the last disable message, and cause the channel to slowly be forgotten. Why would yalls continue to send updates?

If the channel becomes active again at a later time, it should send an announcement followed by an update so everybody learns about its existence again. Eagerly pruning around nodes mistakenly sending channel updates seems weird. For example a node may never activate its side of the channel with an update because it doesn't have outgoing capacity, that doesn't mean the channel as a whole is unusable.

@niftynei

Copy link
Copy Markdown
Collaborator

imo 'oldest channel update' is unclear -- do you mean 'either node's most-recent channel_update' is older than 2 weeks?

@t-bastt-bast mentioned this pull request May 11, 2020
17 tasks
@TheBlueMatt

Copy link
Copy Markdown
Collaborator

I dont have super strong feelings about the actual logic, but the text in BOLT 7 needs significant tweaks for this.

"SHOULD base timestamp on a UNIX timestamp." needs to get an additional "MUST set timestamp to a number greater than the time in the median of the last 11 Bitcoin block headers" added. Further, to reduce the risk of time-based issues, I think the thing being changed here should be tweaked to reference MTP as well, instead of wall-clock time, given P2P apps tend to get the Wrong Time all the time.

@cfromknecht

Copy link
Copy Markdown
ContributorAuthor

Further, to reduce the risk of time-based issues, I think the thing being changed here should be tweaked to reference MTP as well, instead of wall-clock time, given P2P apps tend to get the Wrong Time all the time.

I wouldn't be surprised if some of the existing propagation issues are related to poorly synced clocks

@RoasbeefRoasbeef left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM 🗿

@niftynei

Copy link
Copy Markdown
Collaborator

ACK dc43078

@rustyrussell

Copy link
Copy Markdown
Collaborator

@rustyrussell
rustyrussell merged commit 7e8c478 into lightning:masterAug 20, 2020
rustyrussell added a commit to rustyrussell/lightning that referenced this pull request Aug 20, 2020
See lightning/bolts#767
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Changelog-Changed: Protocol: channels now pruned after two weeks unless both peers refresh it (see lightning-rfc#767)
rustyrussell added a commit to rustyrussell/lightning that referenced this pull request Aug 20, 2020
See lightning/bolts#767
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Changelog-Changed: Protocol: channels now pruned after two weeks unless both peers refresh it (see lightning-rfc#767)
rustyrussell added a commit to ElementsProject/lightning that referenced this pull request Aug 24, 2020
See lightning/bolts#767
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Changelog-Changed: Protocol: channels now pruned after two weeks unless both peers refresh it (see lightning-rfc#767)
rustyrussell added a commit to rustyrussell/lightning that referenced this pull request Aug 25, 2020
See lightning/bolts#767
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Changelog-Changed: Protocol: channels now pruned after two weeks unless both peers refresh it (see lightning-rfc#767)
@cfromknecht
cfromknecht deleted the stricter-pruning branch March 9, 2021 18:43
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.

7 participants

@cfromknecht@t-bast@cdecker@niftynei@TheBlueMatt@rustyrussell@Roasbeef
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' BOLT07: prune if oldest channel_update is > 2 weeks old by cfromknecht · Pull Request #767 · lightning/bolts · GitHub
Skip to content

BOLT07: prune if oldest channel_update is > 2 weeks old - #767

Merged
rustyrussell merged 1 commit into
lightning:masterfrom
cfromknecht:stricter-pruning
Aug 20, 2020
Merged

BOLT07: prune if oldest channel_update is > 2 weeks old#767
rustyrussell merged 1 commit into
lightning:masterfrom
cfromknecht:stricter-pruning

Conversation

@cfromknecht

@cfromknechtcfromknecht commented Apr 13, 2020

Copy link
Copy Markdown
Contributor

This PR modifies the recommended pruning requirements to use the oldest
channel_update's timestamp rather than the latest. The rationale is that
using the latest timestamp inadvertently retrains channels for which only
one side of the channel continues to send fresh channel_updates.

Consider a new node that makes a channel to y'alls, but then disappears.
The current pruning strategy will keep the channel in its routing table
because y'alls continues to send fresh channel_updates, but the channel
is actually unusable because the other party is never online. The new strategy
will remove these low-success nodes/channels from the routing table and
only keep channels where both endpoints have indicated recent activity.

This reduces the number of channels in the public graph by 25% at the time
of writing.

EDIT: updated stats, see relevant network stats

@t-bastt-bast 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.

ACK, this is clearly something we need to do! EDIT: see my next comment, unfortunately the real world doesn't seem to play so nicely with this :/

I ran the same kind of computation last week and just re-ran it, but in my case it's a 25% reduction in the number of channels. Is there another pruning heuristic you added on top to get to 40% (like rejecting some incoming channel_updates)? Otherwise you may be missing 15% of valid channels in the network somehow...

@t-bast

Copy link
Copy Markdown
Collaborator

Consider a new node that makes a channel to y'alls, but then disappears.

By disappear do you mean goes offline or stays online but inactive? If he goes offline, y'alls should not be sending any channel_update so the pruning should happen without any change to the spec.

If you meant stays online but inactive, unfortunately it looks like in practice it's not working correctly.
I'm seeing many channels that are clearly active and shouldn't be pruned for which I get channel_updates for one side less regularly than once every two weeks. I ran this pruning and sorted the pruned channels by capacity, and looked at the top ones. When doing that I see many channels from BlueWallet that don't send a channel_update regularly enough (for example for 611448x1083x1 I didn't receive any update between march 11 and april 9 from the BlueWallet side). I don't know if it's because BlueWallet doesn't send those updates, or if they're not propagated correctly all the way to my node. Could you do the same experiment with your data?

But in any case, I definitely don't want to prune those channels. Maybe a safer spec addition would be to require that in a channel A <-> B, B shouldn't send a channel_update if A hasn't sent one in 14 days? Because if B is the most well-placed to know whether A sent a channel_update or not (whereas remote nodes may simply be unlucky and didn't correctly get the gossip propagated to them for some reason that still eludes me). That means it would take a month to get rid of those inactive channels (instead of 14 days).

Maybe the real issue is a bug that prevents nodes from correctly sending their regular channel_updates, or from having them propagated throughout the network? And once that's fixed we'd see that we would get close to no gain from that extra pruning?

I think many of us need to be testing what channels that proposal would prune on their node, and verify that these are channels that really should be pruned.

@t-bastt-bast mentioned this pull request Apr 24, 2020
17 tasks
@cdecker

Copy link
Copy Markdown
Collaborator

By disappear do you mean goes offline or stays online but inactive? If he goes offline, y'alls should not be sending any channel_update so the pruning should happen without any change to the spec.

This is what I'd expect to happen: channel is unusable, don't update after the last disable message, and cause the channel to slowly be forgotten. Why would yalls continue to send updates?

If the channel becomes active again at a later time, it should send an announcement followed by an update so everybody learns about its existence again. Eagerly pruning around nodes mistakenly sending channel updates seems weird. For example a node may never activate its side of the channel with an update because it doesn't have outgoing capacity, that doesn't mean the channel as a whole is unusable.

@niftynei

Copy link
Copy Markdown
Collaborator

imo 'oldest channel update' is unclear -- do you mean 'either node's most-recent channel_update' is older than 2 weeks?

@t-bastt-bast mentioned this pull request May 11, 2020
17 tasks
@TheBlueMatt

Copy link
Copy Markdown
Collaborator

I dont have super strong feelings about the actual logic, but the text in BOLT 7 needs significant tweaks for this.

"SHOULD base timestamp on a UNIX timestamp." needs to get an additional "MUST set timestamp to a number greater than the time in the median of the last 11 Bitcoin block headers" added. Further, to reduce the risk of time-based issues, I think the thing being changed here should be tweaked to reference MTP as well, instead of wall-clock time, given P2P apps tend to get the Wrong Time all the time.

@cfromknecht

Copy link
Copy Markdown
ContributorAuthor

Further, to reduce the risk of time-based issues, I think the thing being changed here should be tweaked to reference MTP as well, instead of wall-clock time, given P2P apps tend to get the Wrong Time all the time.

I wouldn't be surprised if some of the existing propagation issues are related to poorly synced clocks

@RoasbeefRoasbeef left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM 🗿

@niftynei

Copy link
Copy Markdown
Collaborator

ACK dc43078

@rustyrussell

Copy link
Copy Markdown
Collaborator

@rustyrussell
rustyrussell merged commit 7e8c478 into lightning:masterAug 20, 2020
rustyrussell added a commit to rustyrussell/lightning that referenced this pull request Aug 20, 2020
See lightning/bolts#767
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Changelog-Changed: Protocol: channels now pruned after two weeks unless both peers refresh it (see lightning-rfc#767)
rustyrussell added a commit to rustyrussell/lightning that referenced this pull request Aug 20, 2020
See lightning/bolts#767
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Changelog-Changed: Protocol: channels now pruned after two weeks unless both peers refresh it (see lightning-rfc#767)
rustyrussell added a commit to ElementsProject/lightning that referenced this pull request Aug 24, 2020
See lightning/bolts#767
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Changelog-Changed: Protocol: channels now pruned after two weeks unless both peers refresh it (see lightning-rfc#767)
rustyrussell added a commit to rustyrussell/lightning that referenced this pull request Aug 25, 2020
See lightning/bolts#767
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Changelog-Changed: Protocol: channels now pruned after two weeks unless both peers refresh it (see lightning-rfc#767)
@cfromknecht
cfromknecht deleted the stricter-pruning branch March 9, 2021 18:43
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.

7 participants

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

BOLT07: prune if oldest channel_update is > 2 weeks old - #767

Merged
rustyrussell merged 1 commit into
lightning:masterfrom
cfromknecht:stricter-pruning
Aug 20, 2020
Merged

BOLT07: prune if oldest channel_update is > 2 weeks old#767
rustyrussell merged 1 commit into
lightning:masterfrom
cfromknecht:stricter-pruning

Conversation

@cfromknecht

@cfromknechtcfromknecht commented Apr 13, 2020

Copy link
Copy Markdown
Contributor

This PR modifies the recommended pruning requirements to use the oldest
channel_update's timestamp rather than the latest. The rationale is that
using the latest timestamp inadvertently retrains channels for which only
one side of the channel continues to send fresh channel_updates.

Consider a new node that makes a channel to y'alls, but then disappears.
The current pruning strategy will keep the channel in its routing table
because y'alls continues to send fresh channel_updates, but the channel
is actually unusable because the other party is never online. The new strategy
will remove these low-success nodes/channels from the routing table and
only keep channels where both endpoints have indicated recent activity.

This reduces the number of channels in the public graph by 25% at the time
of writing.

EDIT: updated stats, see relevant network stats

@t-bastt-bast 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.

ACK, this is clearly something we need to do! EDIT: see my next comment, unfortunately the real world doesn't seem to play so nicely with this :/

I ran the same kind of computation last week and just re-ran it, but in my case it's a 25% reduction in the number of channels. Is there another pruning heuristic you added on top to get to 40% (like rejecting some incoming channel_updates)? Otherwise you may be missing 15% of valid channels in the network somehow...

@t-bast

Copy link
Copy Markdown
Collaborator

Consider a new node that makes a channel to y'alls, but then disappears.

By disappear do you mean goes offline or stays online but inactive? If he goes offline, y'alls should not be sending any channel_update so the pruning should happen without any change to the spec.

If you meant stays online but inactive, unfortunately it looks like in practice it's not working correctly.
I'm seeing many channels that are clearly active and shouldn't be pruned for which I get channel_updates for one side less regularly than once every two weeks. I ran this pruning and sorted the pruned channels by capacity, and looked at the top ones. When doing that I see many channels from BlueWallet that don't send a channel_update regularly enough (for example for 611448x1083x1 I didn't receive any update between march 11 and april 9 from the BlueWallet side). I don't know if it's because BlueWallet doesn't send those updates, or if they're not propagated correctly all the way to my node. Could you do the same experiment with your data?

But in any case, I definitely don't want to prune those channels. Maybe a safer spec addition would be to require that in a channel A <-> B, B shouldn't send a channel_update if A hasn't sent one in 14 days? Because if B is the most well-placed to know whether A sent a channel_update or not (whereas remote nodes may simply be unlucky and didn't correctly get the gossip propagated to them for some reason that still eludes me). That means it would take a month to get rid of those inactive channels (instead of 14 days).

Maybe the real issue is a bug that prevents nodes from correctly sending their regular channel_updates, or from having them propagated throughout the network? And once that's fixed we'd see that we would get close to no gain from that extra pruning?

I think many of us need to be testing what channels that proposal would prune on their node, and verify that these are channels that really should be pruned.

@t-bastt-bast mentioned this pull request Apr 24, 2020
17 tasks
@cdecker

Copy link
Copy Markdown
Collaborator

By disappear do you mean goes offline or stays online but inactive? If he goes offline, y'alls should not be sending any channel_update so the pruning should happen without any change to the spec.

This is what I'd expect to happen: channel is unusable, don't update after the last disable message, and cause the channel to slowly be forgotten. Why would yalls continue to send updates?

If the channel becomes active again at a later time, it should send an announcement followed by an update so everybody learns about its existence again. Eagerly pruning around nodes mistakenly sending channel updates seems weird. For example a node may never activate its side of the channel with an update because it doesn't have outgoing capacity, that doesn't mean the channel as a whole is unusable.

@niftynei

Copy link
Copy Markdown
Collaborator

imo 'oldest channel update' is unclear -- do you mean 'either node's most-recent channel_update' is older than 2 weeks?

@t-bastt-bast mentioned this pull request May 11, 2020
17 tasks
@TheBlueMatt

Copy link
Copy Markdown
Collaborator

I dont have super strong feelings about the actual logic, but the text in BOLT 7 needs significant tweaks for this.

"SHOULD base timestamp on a UNIX timestamp." needs to get an additional "MUST set timestamp to a number greater than the time in the median of the last 11 Bitcoin block headers" added. Further, to reduce the risk of time-based issues, I think the thing being changed here should be tweaked to reference MTP as well, instead of wall-clock time, given P2P apps tend to get the Wrong Time all the time.

@cfromknecht

Copy link
Copy Markdown
ContributorAuthor

Further, to reduce the risk of time-based issues, I think the thing being changed here should be tweaked to reference MTP as well, instead of wall-clock time, given P2P apps tend to get the Wrong Time all the time.

I wouldn't be surprised if some of the existing propagation issues are related to poorly synced clocks

@RoasbeefRoasbeef left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM 🗿

@niftynei

Copy link
Copy Markdown
Collaborator

ACK dc43078

@rustyrussell

Copy link
Copy Markdown
Collaborator

@rustyrussell
rustyrussell merged commit 7e8c478 into lightning:masterAug 20, 2020
rustyrussell added a commit to rustyrussell/lightning that referenced this pull request Aug 20, 2020
See lightning/bolts#767
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Changelog-Changed: Protocol: channels now pruned after two weeks unless both peers refresh it (see lightning-rfc#767)
rustyrussell added a commit to rustyrussell/lightning that referenced this pull request Aug 20, 2020
See lightning/bolts#767
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Changelog-Changed: Protocol: channels now pruned after two weeks unless both peers refresh it (see lightning-rfc#767)
rustyrussell added a commit to ElementsProject/lightning that referenced this pull request Aug 24, 2020
See lightning/bolts#767
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Changelog-Changed: Protocol: channels now pruned after two weeks unless both peers refresh it (see lightning-rfc#767)
rustyrussell added a commit to rustyrussell/lightning that referenced this pull request Aug 25, 2020
See lightning/bolts#767
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Changelog-Changed: Protocol: channels now pruned after two weeks unless both peers refresh it (see lightning-rfc#767)
@cfromknecht
cfromknecht deleted the stricter-pruning branch March 9, 2021 18:43
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.

7 participants

@cfromknecht@t-bast@cdecker@niftynei@TheBlueMatt@rustyrussell@Roasbeef