htlcswitch: attributable errors - #7139

Closed
joostjager wants to merge 6 commits into
lightningnetwork:masterfrom
bottlepay:fat-errors-2022
Closed

htlcswitch: attributable errors#7139
joostjager wants to merge 6 commits into
lightningnetwork:masterfrom
bottlepay:fat-errors-2022

Conversation

@joostjager

@joostjagerjoostjager commented Nov 10, 2022

Copy link
Copy Markdown
Contributor

This PR adds the ability for routing nodes and nodes that are the destination of a payment to generate and relay attributable errors. This capability is signaled through a new feature bit option_attributable_errors.

Sender nodes will examine the route and request attributable errors via the attributable_errors tlv field when each node on the path supports it. There is no preference for attributable error-supporting nodes (yet).

Intermediate and final nodes report the htlc hold time in their failure message payload. The sender node only logs the hold times (Hold times: 2526/1125/0). Updating a node's reputation based on the time they held an htlc is left for a follow-up pr.

Depends on lightningnetwork/lightning-onion#60

Corresponding spec PR: lightning/bolts#1044

By default, attributable errors is only enabled for intermediate and final hops. If requested by the sender through the forward onion, they'll return attributable errors. For the sender node, the user needs to opt-in to use the feature by specifying --routerrpc.attrerrors on the command line.

@joostjager
joostjagerforce-pushed the fat-errors-2022 branch 3 times, most recently from 62e4317 to c80ed73CompareDecember 7, 2022 11:28
@joostjagerjoostjager changed the title build: bump lightning-onion to fat errorshtlcswitch: fat errorsDec 7, 2022
@joostjager
joostjagerforce-pushed the fat-errors-2022 branch 4 times, most recently from 0593312 to b1185f1CompareDecember 8, 2022 13:46
@joostjager
joostjagerforce-pushed the fat-errors-2022 branch 4 times, most recently from ab1fcc2 to 61661dcCompareDecember 14, 2022 14:45
@saubyksaubyk added this to the v0.17.0 milestone Jan 12, 2023
Comment threadlnwire/features.go Outdated
@joostjager
joostjagerforce-pushed the fat-errors-2022 branch 2 times, most recently from 3b423ea to 87a30c9CompareJanuary 16, 2023 11:42
Comment threadhtlcswitch/hop/error_encryptor.go Outdated
Comment threadhtlcswitch/hop/error_encryptor.go Outdated
Comment threadrouting/payment_lifecycle.go Outdated

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.

One case to consider here is that if for some reason one of the nodes had to return InvalidOnionPayload, that node wasn't able to read the resolution format. Instead if will return an old-style error that we're not decoding properly. Not sure if we care because it should only happen in case of a bug?

@joostjager
joostjagerforce-pushed the fat-errors-2022 branch 6 times, most recently from 77f4da8 to 7a9816bCompareJanuary 23, 2023 12:12
@saubyksaubyk added this to the v0.17.1 milestone Jun 16, 2023
@joostjager
joostjagerforce-pushed the fat-errors-2022 branch 6 times, most recently from f25c769 to e4d3c4eCompareJune 19, 2023 19:23

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

Great work! I think it's nice to have everything hard-coded to not reveal any fingerprint vector (except for the signal). Also, the upgrade path looks very reasonable to me, only when a majority of the network has upgraded to attributable errors (and a full attributable error route is likely), we'll request that error type (although some senders may prefer those routers already earlier). This will give a quick transition from zero senders to many senders and therefore a larger anonymity set.
From a routing node's perspective, attributable errors may not be so nice if they know they are slow and could get penalized for it, but if the network should have fast payments this may be needed?

Comment threadhtlcswitch/switch.go Outdated

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.

Is there a reason why log.Errorf is not used?

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.

What extra formatting would you like to see added here? The error itself is already a full sentence. I followed the approach that was already taken in master:

log.Error(err)

Comment threadhtlcswitch/hop/iterator.go Outdated

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.

This error handling seems to not belong here, right?

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.

It is pre-existing. Maybe only ErrInvalidOnionKey is ever returned here. But not sure if we want to change this in this PR?

Comment threadhtlcswitch/hop/error_encryptor.go Outdated
Comment threadhtlcswitch/hop/error_encryptor.go Outdated

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.

Perhaps we could export minPaddedOnionErrorLength and insert it here. So semantically this would tell us that we have a zero message length and zero padding?

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.

We could, although in the rest of the lnd repo we generally calculate that number 260 from lnwire.FailureMessageLength and I aligned this new code with that.

Semantically we'll indeed communicate zero message with zero padding. But it really does not matter what we put here.

As a future step, we could define a new failure code in BOLT 04 for this, but it won't change much about the penalization.

Comment threadhtlcswitch/hop/error_encryptor.go Outdated

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.

What are the incentives for a router to report back honestly and to not to pass on a short error? Will this node be penalized for reporting? If the node does not get penalized for reporting, any relayer could do this to penalize their neighbor?

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.

If they pass the short error, the upstream node will replace it by a proper error and the sender will indeed penalize this node.

Comment threadhtlcswitch/link.go Outdated
Comment threadhtlcswitch/hop/iterator.go Outdated
Comment threadlnwire/features.go Outdated

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.

These flags are advertized by default, is it?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Yes, they are.

Comment threadchanneldb/payments.go Outdated

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.

Out of curiosity, why is this done, to check that all parsed fields have been processed? But it's missing that check

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.

Because right below here, the remaining records are stored as custom records. If we wouldn't delete here, the attr error record would also show up as a custom record.

@joostjager
joostjagerforce-pushed the fat-errors-2022 branch 2 times, most recently from a1cf55e to ef4df36CompareJune 21, 2023 13:39
@joostjager

Copy link
Copy Markdown
ContributorAuthor

From a routing node's perspective, attributable errors may not be so nice if they know they are slow and could get penalized for it, but if the network should have fast payments this may be needed?

I think that ultimately they won't have a choice. At some point, I expect senders to avoid routing nodes that do not support attr errors.

@joostjager
joostjagerforce-pushed the fat-errors-2022 branch 4 times, most recently from 540cb59 to a1d0805CompareJune 22, 2023 09:29
@joostjager

Copy link
Copy Markdown
ContributorAuthor

Added integration test.

@saubyk
saubyk requested a review from Crypt-iQJune 22, 2023 15:22
@saubyksaubyk modified the milestones: High Priority, v0.18.0Aug 4, 2023
Preparation for the instantiation of an attributable error encrypter. This gets rid
of the sphinx encrypter instantiation in OnionProcessor. This would
otherwise be problematic when an attributable encrypter would need to be
created there without having access to the error structure.
@joostjager

Copy link
Copy Markdown
ContributorAuthor

Updated lightning-onion dependency after adding updated test vector.

@joostjager

Copy link
Copy Markdown
ContributorAuthor

Updated feature bit to 36/37

Comment threadhtlcswitch/link.go
// encryption parameters.
// encryption parameters. Don't assume attributable errors,
// because first the resolution format needs to be decoded from
// the onion payload.

@joostjagerjoostjagerNov 6, 2023

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Fallback to legacy format is probably fine. If this happens to be an attributable error route, the upstream node will substitute with an attributable error?

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

This should be added to the spec.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

error messagesonion routingP1MUST be fixed or reviewed

Projects

None yet

Development

Successfully merging this pull request may close these issues.

9 participants

@joostjager@litbot-9000@saubyk@positiveblue@halseth@hieblmi@bitromortac@carlaKC@thomash-acinq
, '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" + '
Skip to content

htlcswitch: attributable errors - #7139

Closed
joostjager wants to merge 6 commits into
lightningnetwork:masterfrom
bottlepay:fat-errors-2022
Closed

htlcswitch: attributable errors#7139
joostjager wants to merge 6 commits into
lightningnetwork:masterfrom
bottlepay:fat-errors-2022

Conversation

@joostjager

@joostjagerjoostjager commented Nov 10, 2022

Copy link
Copy Markdown
Contributor

This PR adds the ability for routing nodes and nodes that are the destination of a payment to generate and relay attributable errors. This capability is signaled through a new feature bit option_attributable_errors.

Sender nodes will examine the route and request attributable errors via the attributable_errors tlv field when each node on the path supports it. There is no preference for attributable error-supporting nodes (yet).

Intermediate and final nodes report the htlc hold time in their failure message payload. The sender node only logs the hold times (Hold times: 2526/1125/0). Updating a node's reputation based on the time they held an htlc is left for a follow-up pr.

Depends on lightningnetwork/lightning-onion#60

Corresponding spec PR: lightning/bolts#1044

By default, attributable errors is only enabled for intermediate and final hops. If requested by the sender through the forward onion, they'll return attributable errors. For the sender node, the user needs to opt-in to use the feature by specifying --routerrpc.attrerrors on the command line.

@joostjager
joostjagerforce-pushed the fat-errors-2022 branch 3 times, most recently from 62e4317 to c80ed73CompareDecember 7, 2022 11:28
@joostjagerjoostjager changed the title build: bump lightning-onion to fat errorshtlcswitch: fat errorsDec 7, 2022
@joostjager
joostjagerforce-pushed the fat-errors-2022 branch 4 times, most recently from 0593312 to b1185f1CompareDecember 8, 2022 13:46
@joostjager
joostjagerforce-pushed the fat-errors-2022 branch 4 times, most recently from ab1fcc2 to 61661dcCompareDecember 14, 2022 14:45
@saubyksaubyk added this to the v0.17.0 milestone Jan 12, 2023
Comment threadlnwire/features.go Outdated
@joostjager
joostjagerforce-pushed the fat-errors-2022 branch 2 times, most recently from 3b423ea to 87a30c9CompareJanuary 16, 2023 11:42
Comment threadhtlcswitch/hop/error_encryptor.go Outdated
Comment threadhtlcswitch/hop/error_encryptor.go Outdated
Comment threadrouting/payment_lifecycle.go Outdated

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.

One case to consider here is that if for some reason one of the nodes had to return InvalidOnionPayload, that node wasn't able to read the resolution format. Instead if will return an old-style error that we're not decoding properly. Not sure if we care because it should only happen in case of a bug?

@joostjager
joostjagerforce-pushed the fat-errors-2022 branch 6 times, most recently from 77f4da8 to 7a9816bCompareJanuary 23, 2023 12:12
@saubyksaubyk added this to the v0.17.1 milestone Jun 16, 2023
@joostjager
joostjagerforce-pushed the fat-errors-2022 branch 6 times, most recently from f25c769 to e4d3c4eCompareJune 19, 2023 19:23

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

Great work! I think it's nice to have everything hard-coded to not reveal any fingerprint vector (except for the signal). Also, the upgrade path looks very reasonable to me, only when a majority of the network has upgraded to attributable errors (and a full attributable error route is likely), we'll request that error type (although some senders may prefer those routers already earlier). This will give a quick transition from zero senders to many senders and therefore a larger anonymity set.
From a routing node's perspective, attributable errors may not be so nice if they know they are slow and could get penalized for it, but if the network should have fast payments this may be needed?

Comment threadhtlcswitch/switch.go Outdated

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.

Is there a reason why log.Errorf is not used?

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.

What extra formatting would you like to see added here? The error itself is already a full sentence. I followed the approach that was already taken in master:

log.Error(err)

Comment threadhtlcswitch/hop/iterator.go Outdated

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.

This error handling seems to not belong here, right?

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.

It is pre-existing. Maybe only ErrInvalidOnionKey is ever returned here. But not sure if we want to change this in this PR?

Comment threadhtlcswitch/hop/error_encryptor.go Outdated
Comment threadhtlcswitch/hop/error_encryptor.go Outdated

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.

Perhaps we could export minPaddedOnionErrorLength and insert it here. So semantically this would tell us that we have a zero message length and zero padding?

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.

We could, although in the rest of the lnd repo we generally calculate that number 260 from lnwire.FailureMessageLength and I aligned this new code with that.

Semantically we'll indeed communicate zero message with zero padding. But it really does not matter what we put here.

As a future step, we could define a new failure code in BOLT 04 for this, but it won't change much about the penalization.

Comment threadhtlcswitch/hop/error_encryptor.go Outdated

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.

What are the incentives for a router to report back honestly and to not to pass on a short error? Will this node be penalized for reporting? If the node does not get penalized for reporting, any relayer could do this to penalize their neighbor?

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.

If they pass the short error, the upstream node will replace it by a proper error and the sender will indeed penalize this node.

Comment threadhtlcswitch/link.go Outdated
Comment threadhtlcswitch/hop/iterator.go Outdated
Comment threadlnwire/features.go Outdated

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.

These flags are advertized by default, is it?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Yes, they are.

Comment threadchanneldb/payments.go Outdated

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.

Out of curiosity, why is this done, to check that all parsed fields have been processed? But it's missing that check

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.

Because right below here, the remaining records are stored as custom records. If we wouldn't delete here, the attr error record would also show up as a custom record.

@joostjager
joostjagerforce-pushed the fat-errors-2022 branch 2 times, most recently from a1cf55e to ef4df36CompareJune 21, 2023 13:39
@joostjager

Copy link
Copy Markdown
ContributorAuthor

From a routing node's perspective, attributable errors may not be so nice if they know they are slow and could get penalized for it, but if the network should have fast payments this may be needed?

I think that ultimately they won't have a choice. At some point, I expect senders to avoid routing nodes that do not support attr errors.

@joostjager
joostjagerforce-pushed the fat-errors-2022 branch 4 times, most recently from 540cb59 to a1d0805CompareJune 22, 2023 09:29
@joostjager

Copy link
Copy Markdown
ContributorAuthor

Added integration test.

@saubyk
saubyk requested a review from Crypt-iQJune 22, 2023 15:22
@saubyksaubyk modified the milestones: High Priority, v0.18.0Aug 4, 2023
Preparation for the instantiation of an attributable error encrypter. This gets rid
of the sphinx encrypter instantiation in OnionProcessor. This would
otherwise be problematic when an attributable encrypter would need to be
created there without having access to the error structure.
@joostjager

Copy link
Copy Markdown
ContributorAuthor

Updated lightning-onion dependency after adding updated test vector.

@joostjager

Copy link
Copy Markdown
ContributorAuthor

Updated feature bit to 36/37

Comment threadhtlcswitch/link.go
// encryption parameters.
// encryption parameters. Don't assume attributable errors,
// because first the resolution format needs to be decoded from
// the onion payload.

@joostjagerjoostjagerNov 6, 2023

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Fallback to legacy format is probably fine. If this happens to be an attributable error route, the upstream node will substitute with an attributable error?

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

This should be added to the spec.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

error messagesonion routingP1MUST be fixed or reviewed

Projects

None yet

Development

Successfully merging this pull request may close these issues.

9 participants

@joostjager@litbot-9000@saubyk@positiveblue@halseth@hieblmi@bitromortac@carlaKC@thomash-acinq
, '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('^' + ".*" + '
Skip to content

htlcswitch: attributable errors - #7139

Closed
joostjager wants to merge 6 commits into
lightningnetwork:masterfrom
bottlepay:fat-errors-2022
Closed

htlcswitch: attributable errors#7139
joostjager wants to merge 6 commits into
lightningnetwork:masterfrom
bottlepay:fat-errors-2022

Conversation

@joostjager

@joostjagerjoostjager commented Nov 10, 2022

Copy link
Copy Markdown
Contributor

This PR adds the ability for routing nodes and nodes that are the destination of a payment to generate and relay attributable errors. This capability is signaled through a new feature bit option_attributable_errors.

Sender nodes will examine the route and request attributable errors via the attributable_errors tlv field when each node on the path supports it. There is no preference for attributable error-supporting nodes (yet).

Intermediate and final nodes report the htlc hold time in their failure message payload. The sender node only logs the hold times (Hold times: 2526/1125/0). Updating a node's reputation based on the time they held an htlc is left for a follow-up pr.

Depends on lightningnetwork/lightning-onion#60

Corresponding spec PR: lightning/bolts#1044

By default, attributable errors is only enabled for intermediate and final hops. If requested by the sender through the forward onion, they'll return attributable errors. For the sender node, the user needs to opt-in to use the feature by specifying --routerrpc.attrerrors on the command line.

@joostjager
joostjagerforce-pushed the fat-errors-2022 branch 3 times, most recently from 62e4317 to c80ed73CompareDecember 7, 2022 11:28
@joostjagerjoostjager changed the title build: bump lightning-onion to fat errorshtlcswitch: fat errorsDec 7, 2022
@joostjager
joostjagerforce-pushed the fat-errors-2022 branch 4 times, most recently from 0593312 to b1185f1CompareDecember 8, 2022 13:46
@joostjager
joostjagerforce-pushed the fat-errors-2022 branch 4 times, most recently from ab1fcc2 to 61661dcCompareDecember 14, 2022 14:45
@saubyksaubyk added this to the v0.17.0 milestone Jan 12, 2023
Comment threadlnwire/features.go Outdated
@joostjager
joostjagerforce-pushed the fat-errors-2022 branch 2 times, most recently from 3b423ea to 87a30c9CompareJanuary 16, 2023 11:42
Comment threadhtlcswitch/hop/error_encryptor.go Outdated
Comment threadhtlcswitch/hop/error_encryptor.go Outdated
Comment threadrouting/payment_lifecycle.go Outdated

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.

One case to consider here is that if for some reason one of the nodes had to return InvalidOnionPayload, that node wasn't able to read the resolution format. Instead if will return an old-style error that we're not decoding properly. Not sure if we care because it should only happen in case of a bug?

@joostjager
joostjagerforce-pushed the fat-errors-2022 branch 6 times, most recently from 77f4da8 to 7a9816bCompareJanuary 23, 2023 12:12
@saubyksaubyk added this to the v0.17.1 milestone Jun 16, 2023
@joostjager
joostjagerforce-pushed the fat-errors-2022 branch 6 times, most recently from f25c769 to e4d3c4eCompareJune 19, 2023 19:23

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

Great work! I think it's nice to have everything hard-coded to not reveal any fingerprint vector (except for the signal). Also, the upgrade path looks very reasonable to me, only when a majority of the network has upgraded to attributable errors (and a full attributable error route is likely), we'll request that error type (although some senders may prefer those routers already earlier). This will give a quick transition from zero senders to many senders and therefore a larger anonymity set.
From a routing node's perspective, attributable errors may not be so nice if they know they are slow and could get penalized for it, but if the network should have fast payments this may be needed?

Comment threadhtlcswitch/switch.go Outdated

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.

Is there a reason why log.Errorf is not used?

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.

What extra formatting would you like to see added here? The error itself is already a full sentence. I followed the approach that was already taken in master:

log.Error(err)

Comment threadhtlcswitch/hop/iterator.go Outdated

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.

This error handling seems to not belong here, right?

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.

It is pre-existing. Maybe only ErrInvalidOnionKey is ever returned here. But not sure if we want to change this in this PR?

Comment threadhtlcswitch/hop/error_encryptor.go Outdated
Comment threadhtlcswitch/hop/error_encryptor.go Outdated

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.

Perhaps we could export minPaddedOnionErrorLength and insert it here. So semantically this would tell us that we have a zero message length and zero padding?

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.

We could, although in the rest of the lnd repo we generally calculate that number 260 from lnwire.FailureMessageLength and I aligned this new code with that.

Semantically we'll indeed communicate zero message with zero padding. But it really does not matter what we put here.

As a future step, we could define a new failure code in BOLT 04 for this, but it won't change much about the penalization.

Comment threadhtlcswitch/hop/error_encryptor.go Outdated

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.

What are the incentives for a router to report back honestly and to not to pass on a short error? Will this node be penalized for reporting? If the node does not get penalized for reporting, any relayer could do this to penalize their neighbor?

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.

If they pass the short error, the upstream node will replace it by a proper error and the sender will indeed penalize this node.

Comment threadhtlcswitch/link.go Outdated
Comment threadhtlcswitch/hop/iterator.go Outdated
Comment threadlnwire/features.go Outdated

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.

These flags are advertized by default, is it?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Yes, they are.

Comment threadchanneldb/payments.go Outdated

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.

Out of curiosity, why is this done, to check that all parsed fields have been processed? But it's missing that check

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.

Because right below here, the remaining records are stored as custom records. If we wouldn't delete here, the attr error record would also show up as a custom record.

@joostjager
joostjagerforce-pushed the fat-errors-2022 branch 2 times, most recently from a1cf55e to ef4df36CompareJune 21, 2023 13:39
@joostjager

Copy link
Copy Markdown
ContributorAuthor

From a routing node's perspective, attributable errors may not be so nice if they know they are slow and could get penalized for it, but if the network should have fast payments this may be needed?

I think that ultimately they won't have a choice. At some point, I expect senders to avoid routing nodes that do not support attr errors.

@joostjager
joostjagerforce-pushed the fat-errors-2022 branch 4 times, most recently from 540cb59 to a1d0805CompareJune 22, 2023 09:29
@joostjager

Copy link
Copy Markdown
ContributorAuthor

Added integration test.

@saubyk
saubyk requested a review from Crypt-iQJune 22, 2023 15:22
@saubyksaubyk modified the milestones: High Priority, v0.18.0Aug 4, 2023
Preparation for the instantiation of an attributable error encrypter. This gets rid
of the sphinx encrypter instantiation in OnionProcessor. This would
otherwise be problematic when an attributable encrypter would need to be
created there without having access to the error structure.
@joostjager

Copy link
Copy Markdown
ContributorAuthor

Updated lightning-onion dependency after adding updated test vector.

@joostjager

Copy link
Copy Markdown
ContributorAuthor

Updated feature bit to 36/37

Comment threadhtlcswitch/link.go
// encryption parameters.
// encryption parameters. Don't assume attributable errors,
// because first the resolution format needs to be decoded from
// the onion payload.

@joostjagerjoostjagerNov 6, 2023

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Fallback to legacy format is probably fine. If this happens to be an attributable error route, the upstream node will substitute with an attributable error?

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

This should be added to the spec.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

error messagesonion routingP1MUST be fixed or reviewed

Projects

None yet

Development

Successfully merging this pull request may close these issues.

9 participants

@joostjager@litbot-9000@saubyk@positiveblue@halseth@hieblmi@bitromortac@carlaKC@thomash-acinq
, '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('^' + ".*" + '
Skip to content

htlcswitch: attributable errors - #7139

Closed
joostjager wants to merge 6 commits into
lightningnetwork:masterfrom
bottlepay:fat-errors-2022
Closed

htlcswitch: attributable errors#7139
joostjager wants to merge 6 commits into
lightningnetwork:masterfrom
bottlepay:fat-errors-2022

Conversation

@joostjager

@joostjagerjoostjager commented Nov 10, 2022

Copy link
Copy Markdown
Contributor

This PR adds the ability for routing nodes and nodes that are the destination of a payment to generate and relay attributable errors. This capability is signaled through a new feature bit option_attributable_errors.

Sender nodes will examine the route and request attributable errors via the attributable_errors tlv field when each node on the path supports it. There is no preference for attributable error-supporting nodes (yet).

Intermediate and final nodes report the htlc hold time in their failure message payload. The sender node only logs the hold times (Hold times: 2526/1125/0). Updating a node's reputation based on the time they held an htlc is left for a follow-up pr.

Depends on lightningnetwork/lightning-onion#60

Corresponding spec PR: lightning/bolts#1044

By default, attributable errors is only enabled for intermediate and final hops. If requested by the sender through the forward onion, they'll return attributable errors. For the sender node, the user needs to opt-in to use the feature by specifying --routerrpc.attrerrors on the command line.

@joostjager
joostjagerforce-pushed the fat-errors-2022 branch 3 times, most recently from 62e4317 to c80ed73CompareDecember 7, 2022 11:28
@joostjagerjoostjager changed the title build: bump lightning-onion to fat errorshtlcswitch: fat errorsDec 7, 2022
@joostjager
joostjagerforce-pushed the fat-errors-2022 branch 4 times, most recently from 0593312 to b1185f1CompareDecember 8, 2022 13:46
@joostjager
joostjagerforce-pushed the fat-errors-2022 branch 4 times, most recently from ab1fcc2 to 61661dcCompareDecember 14, 2022 14:45
@saubyksaubyk added this to the v0.17.0 milestone Jan 12, 2023
Comment threadlnwire/features.go Outdated
@joostjager
joostjagerforce-pushed the fat-errors-2022 branch 2 times, most recently from 3b423ea to 87a30c9CompareJanuary 16, 2023 11:42
Comment threadhtlcswitch/hop/error_encryptor.go Outdated
Comment threadhtlcswitch/hop/error_encryptor.go Outdated
Comment threadrouting/payment_lifecycle.go Outdated

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.

One case to consider here is that if for some reason one of the nodes had to return InvalidOnionPayload, that node wasn't able to read the resolution format. Instead if will return an old-style error that we're not decoding properly. Not sure if we care because it should only happen in case of a bug?

@joostjager
joostjagerforce-pushed the fat-errors-2022 branch 6 times, most recently from 77f4da8 to 7a9816bCompareJanuary 23, 2023 12:12
@saubyksaubyk added this to the v0.17.1 milestone Jun 16, 2023
@joostjager
joostjagerforce-pushed the fat-errors-2022 branch 6 times, most recently from f25c769 to e4d3c4eCompareJune 19, 2023 19:23

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

Great work! I think it's nice to have everything hard-coded to not reveal any fingerprint vector (except for the signal). Also, the upgrade path looks very reasonable to me, only when a majority of the network has upgraded to attributable errors (and a full attributable error route is likely), we'll request that error type (although some senders may prefer those routers already earlier). This will give a quick transition from zero senders to many senders and therefore a larger anonymity set.
From a routing node's perspective, attributable errors may not be so nice if they know they are slow and could get penalized for it, but if the network should have fast payments this may be needed?

Comment threadhtlcswitch/switch.go Outdated

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.

Is there a reason why log.Errorf is not used?

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.

What extra formatting would you like to see added here? The error itself is already a full sentence. I followed the approach that was already taken in master:

log.Error(err)

Comment threadhtlcswitch/hop/iterator.go Outdated

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.

This error handling seems to not belong here, right?

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.

It is pre-existing. Maybe only ErrInvalidOnionKey is ever returned here. But not sure if we want to change this in this PR?

Comment threadhtlcswitch/hop/error_encryptor.go Outdated
Comment threadhtlcswitch/hop/error_encryptor.go Outdated

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.

Perhaps we could export minPaddedOnionErrorLength and insert it here. So semantically this would tell us that we have a zero message length and zero padding?

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.

We could, although in the rest of the lnd repo we generally calculate that number 260 from lnwire.FailureMessageLength and I aligned this new code with that.

Semantically we'll indeed communicate zero message with zero padding. But it really does not matter what we put here.

As a future step, we could define a new failure code in BOLT 04 for this, but it won't change much about the penalization.

Comment threadhtlcswitch/hop/error_encryptor.go Outdated

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.

What are the incentives for a router to report back honestly and to not to pass on a short error? Will this node be penalized for reporting? If the node does not get penalized for reporting, any relayer could do this to penalize their neighbor?

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.

If they pass the short error, the upstream node will replace it by a proper error and the sender will indeed penalize this node.

Comment threadhtlcswitch/link.go Outdated
Comment threadhtlcswitch/hop/iterator.go Outdated
Comment threadlnwire/features.go Outdated

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.

These flags are advertized by default, is it?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Yes, they are.

Comment threadchanneldb/payments.go Outdated

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.

Out of curiosity, why is this done, to check that all parsed fields have been processed? But it's missing that check

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.

Because right below here, the remaining records are stored as custom records. If we wouldn't delete here, the attr error record would also show up as a custom record.

@joostjager
joostjagerforce-pushed the fat-errors-2022 branch 2 times, most recently from a1cf55e to ef4df36CompareJune 21, 2023 13:39
@joostjager

Copy link
Copy Markdown
ContributorAuthor

From a routing node's perspective, attributable errors may not be so nice if they know they are slow and could get penalized for it, but if the network should have fast payments this may be needed?

I think that ultimately they won't have a choice. At some point, I expect senders to avoid routing nodes that do not support attr errors.

@joostjager
joostjagerforce-pushed the fat-errors-2022 branch 4 times, most recently from 540cb59 to a1d0805CompareJune 22, 2023 09:29
@joostjager

Copy link
Copy Markdown
ContributorAuthor

Added integration test.

@saubyk
saubyk requested a review from Crypt-iQJune 22, 2023 15:22
@saubyksaubyk modified the milestones: High Priority, v0.18.0Aug 4, 2023
Preparation for the instantiation of an attributable error encrypter. This gets rid
of the sphinx encrypter instantiation in OnionProcessor. This would
otherwise be problematic when an attributable encrypter would need to be
created there without having access to the error structure.
@joostjager

Copy link
Copy Markdown
ContributorAuthor

Updated lightning-onion dependency after adding updated test vector.

@joostjager

Copy link
Copy Markdown
ContributorAuthor

Updated feature bit to 36/37

Comment threadhtlcswitch/link.go
// encryption parameters.
// encryption parameters. Don't assume attributable errors,
// because first the resolution format needs to be decoded from
// the onion payload.

@joostjagerjoostjagerNov 6, 2023

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Fallback to legacy format is probably fine. If this happens to be an attributable error route, the upstream node will substitute with an attributable error?

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

This should be added to the spec.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

error messagesonion routingP1MUST be fixed or reviewed

Projects

None yet

Development

Successfully merging this pull request may close these issues.

9 participants

@joostjager@litbot-9000@saubyk@positiveblue@halseth@hieblmi@bitromortac@carlaKC@thomash-acinq
, '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" + '
Skip to content

htlcswitch: attributable errors - #7139

Closed
joostjager wants to merge 6 commits into
lightningnetwork:masterfrom
bottlepay:fat-errors-2022
Closed

htlcswitch: attributable errors#7139
joostjager wants to merge 6 commits into
lightningnetwork:masterfrom
bottlepay:fat-errors-2022

Conversation

@joostjager

@joostjagerjoostjager commented Nov 10, 2022

Copy link
Copy Markdown
Contributor

This PR adds the ability for routing nodes and nodes that are the destination of a payment to generate and relay attributable errors. This capability is signaled through a new feature bit option_attributable_errors.

Sender nodes will examine the route and request attributable errors via the attributable_errors tlv field when each node on the path supports it. There is no preference for attributable error-supporting nodes (yet).

Intermediate and final nodes report the htlc hold time in their failure message payload. The sender node only logs the hold times (Hold times: 2526/1125/0). Updating a node's reputation based on the time they held an htlc is left for a follow-up pr.

Depends on lightningnetwork/lightning-onion#60

Corresponding spec PR: lightning/bolts#1044

By default, attributable errors is only enabled for intermediate and final hops. If requested by the sender through the forward onion, they'll return attributable errors. For the sender node, the user needs to opt-in to use the feature by specifying --routerrpc.attrerrors on the command line.

@joostjager
joostjagerforce-pushed the fat-errors-2022 branch 3 times, most recently from 62e4317 to c80ed73CompareDecember 7, 2022 11:28
@joostjagerjoostjager changed the title build: bump lightning-onion to fat errorshtlcswitch: fat errorsDec 7, 2022
@joostjager
joostjagerforce-pushed the fat-errors-2022 branch 4 times, most recently from 0593312 to b1185f1CompareDecember 8, 2022 13:46
@joostjager
joostjagerforce-pushed the fat-errors-2022 branch 4 times, most recently from ab1fcc2 to 61661dcCompareDecember 14, 2022 14:45
@saubyksaubyk added this to the v0.17.0 milestone Jan 12, 2023
Comment threadlnwire/features.go Outdated
@joostjager
joostjagerforce-pushed the fat-errors-2022 branch 2 times, most recently from 3b423ea to 87a30c9CompareJanuary 16, 2023 11:42
Comment threadhtlcswitch/hop/error_encryptor.go Outdated
Comment threadhtlcswitch/hop/error_encryptor.go Outdated
Comment threadrouting/payment_lifecycle.go Outdated

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.

One case to consider here is that if for some reason one of the nodes had to return InvalidOnionPayload, that node wasn't able to read the resolution format. Instead if will return an old-style error that we're not decoding properly. Not sure if we care because it should only happen in case of a bug?

@joostjager
joostjagerforce-pushed the fat-errors-2022 branch 6 times, most recently from 77f4da8 to 7a9816bCompareJanuary 23, 2023 12:12
@saubyksaubyk added this to the v0.17.1 milestone Jun 16, 2023
@joostjager
joostjagerforce-pushed the fat-errors-2022 branch 6 times, most recently from f25c769 to e4d3c4eCompareJune 19, 2023 19:23

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

Great work! I think it's nice to have everything hard-coded to not reveal any fingerprint vector (except for the signal). Also, the upgrade path looks very reasonable to me, only when a majority of the network has upgraded to attributable errors (and a full attributable error route is likely), we'll request that error type (although some senders may prefer those routers already earlier). This will give a quick transition from zero senders to many senders and therefore a larger anonymity set.
From a routing node's perspective, attributable errors may not be so nice if they know they are slow and could get penalized for it, but if the network should have fast payments this may be needed?

Comment threadhtlcswitch/switch.go Outdated

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.

Is there a reason why log.Errorf is not used?

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.

What extra formatting would you like to see added here? The error itself is already a full sentence. I followed the approach that was already taken in master:

log.Error(err)

Comment threadhtlcswitch/hop/iterator.go Outdated

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.

This error handling seems to not belong here, right?

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.

It is pre-existing. Maybe only ErrInvalidOnionKey is ever returned here. But not sure if we want to change this in this PR?

Comment threadhtlcswitch/hop/error_encryptor.go Outdated
Comment threadhtlcswitch/hop/error_encryptor.go Outdated

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.

Perhaps we could export minPaddedOnionErrorLength and insert it here. So semantically this would tell us that we have a zero message length and zero padding?

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.

We could, although in the rest of the lnd repo we generally calculate that number 260 from lnwire.FailureMessageLength and I aligned this new code with that.

Semantically we'll indeed communicate zero message with zero padding. But it really does not matter what we put here.

As a future step, we could define a new failure code in BOLT 04 for this, but it won't change much about the penalization.

Comment threadhtlcswitch/hop/error_encryptor.go Outdated

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.

What are the incentives for a router to report back honestly and to not to pass on a short error? Will this node be penalized for reporting? If the node does not get penalized for reporting, any relayer could do this to penalize their neighbor?

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.

If they pass the short error, the upstream node will replace it by a proper error and the sender will indeed penalize this node.

Comment threadhtlcswitch/link.go Outdated
Comment threadhtlcswitch/hop/iterator.go Outdated
Comment threadlnwire/features.go Outdated

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.

These flags are advertized by default, is it?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Yes, they are.

Comment threadchanneldb/payments.go Outdated

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.

Out of curiosity, why is this done, to check that all parsed fields have been processed? But it's missing that check

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.

Because right below here, the remaining records are stored as custom records. If we wouldn't delete here, the attr error record would also show up as a custom record.

@joostjager
joostjagerforce-pushed the fat-errors-2022 branch 2 times, most recently from a1cf55e to ef4df36CompareJune 21, 2023 13:39
@joostjager

Copy link
Copy Markdown
ContributorAuthor

From a routing node's perspective, attributable errors may not be so nice if they know they are slow and could get penalized for it, but if the network should have fast payments this may be needed?

I think that ultimately they won't have a choice. At some point, I expect senders to avoid routing nodes that do not support attr errors.

@joostjager
joostjagerforce-pushed the fat-errors-2022 branch 4 times, most recently from 540cb59 to a1d0805CompareJune 22, 2023 09:29
@joostjager

Copy link
Copy Markdown
ContributorAuthor

Added integration test.

@saubyk
saubyk requested a review from Crypt-iQJune 22, 2023 15:22
@saubyksaubyk modified the milestones: High Priority, v0.18.0Aug 4, 2023
Preparation for the instantiation of an attributable error encrypter. This gets rid
of the sphinx encrypter instantiation in OnionProcessor. This would
otherwise be problematic when an attributable encrypter would need to be
created there without having access to the error structure.
@joostjager

Copy link
Copy Markdown
ContributorAuthor

Updated lightning-onion dependency after adding updated test vector.

@joostjager

Copy link
Copy Markdown
ContributorAuthor

Updated feature bit to 36/37

Comment threadhtlcswitch/link.go
// encryption parameters.
// encryption parameters. Don't assume attributable errors,
// because first the resolution format needs to be decoded from
// the onion payload.

@joostjagerjoostjagerNov 6, 2023

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Fallback to legacy format is probably fine. If this happens to be an attributable error route, the upstream node will substitute with an attributable error?

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

This should be added to the spec.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

error messagesonion routingP1MUST be fixed or reviewed

Projects

None yet

Development

Successfully merging this pull request may close these issues.

9 participants

@joostjager@litbot-9000@saubyk@positiveblue@halseth@hieblmi@bitromortac@carlaKC@thomash-acinq
, '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('^' + ".*" + '
Skip to content

htlcswitch: attributable errors - #7139

Closed
joostjager wants to merge 6 commits into
lightningnetwork:masterfrom
bottlepay:fat-errors-2022
Closed

htlcswitch: attributable errors#7139
joostjager wants to merge 6 commits into
lightningnetwork:masterfrom
bottlepay:fat-errors-2022

Conversation

@joostjager

@joostjagerjoostjager commented Nov 10, 2022

Copy link
Copy Markdown
Contributor

This PR adds the ability for routing nodes and nodes that are the destination of a payment to generate and relay attributable errors. This capability is signaled through a new feature bit option_attributable_errors.

Sender nodes will examine the route and request attributable errors via the attributable_errors tlv field when each node on the path supports it. There is no preference for attributable error-supporting nodes (yet).

Intermediate and final nodes report the htlc hold time in their failure message payload. The sender node only logs the hold times (Hold times: 2526/1125/0). Updating a node's reputation based on the time they held an htlc is left for a follow-up pr.

Depends on lightningnetwork/lightning-onion#60

Corresponding spec PR: lightning/bolts#1044

By default, attributable errors is only enabled for intermediate and final hops. If requested by the sender through the forward onion, they'll return attributable errors. For the sender node, the user needs to opt-in to use the feature by specifying --routerrpc.attrerrors on the command line.

@joostjager
joostjagerforce-pushed the fat-errors-2022 branch 3 times, most recently from 62e4317 to c80ed73CompareDecember 7, 2022 11:28
@joostjagerjoostjager changed the title build: bump lightning-onion to fat errorshtlcswitch: fat errorsDec 7, 2022
@joostjager
joostjagerforce-pushed the fat-errors-2022 branch 4 times, most recently from 0593312 to b1185f1CompareDecember 8, 2022 13:46
@joostjager
joostjagerforce-pushed the fat-errors-2022 branch 4 times, most recently from ab1fcc2 to 61661dcCompareDecember 14, 2022 14:45
@saubyksaubyk added this to the v0.17.0 milestone Jan 12, 2023
Comment threadlnwire/features.go Outdated
@joostjager
joostjagerforce-pushed the fat-errors-2022 branch 2 times, most recently from 3b423ea to 87a30c9CompareJanuary 16, 2023 11:42
Comment threadhtlcswitch/hop/error_encryptor.go Outdated
Comment threadhtlcswitch/hop/error_encryptor.go Outdated
Comment threadrouting/payment_lifecycle.go Outdated

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.

One case to consider here is that if for some reason one of the nodes had to return InvalidOnionPayload, that node wasn't able to read the resolution format. Instead if will return an old-style error that we're not decoding properly. Not sure if we care because it should only happen in case of a bug?

@joostjager
joostjagerforce-pushed the fat-errors-2022 branch 6 times, most recently from 77f4da8 to 7a9816bCompareJanuary 23, 2023 12:12
@saubyksaubyk added this to the v0.17.1 milestone Jun 16, 2023
@joostjager
joostjagerforce-pushed the fat-errors-2022 branch 6 times, most recently from f25c769 to e4d3c4eCompareJune 19, 2023 19:23

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

Great work! I think it's nice to have everything hard-coded to not reveal any fingerprint vector (except for the signal). Also, the upgrade path looks very reasonable to me, only when a majority of the network has upgraded to attributable errors (and a full attributable error route is likely), we'll request that error type (although some senders may prefer those routers already earlier). This will give a quick transition from zero senders to many senders and therefore a larger anonymity set.
From a routing node's perspective, attributable errors may not be so nice if they know they are slow and could get penalized for it, but if the network should have fast payments this may be needed?

Comment threadhtlcswitch/switch.go Outdated

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.

Is there a reason why log.Errorf is not used?

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.

What extra formatting would you like to see added here? The error itself is already a full sentence. I followed the approach that was already taken in master:

log.Error(err)

Comment threadhtlcswitch/hop/iterator.go Outdated

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.

This error handling seems to not belong here, right?

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.

It is pre-existing. Maybe only ErrInvalidOnionKey is ever returned here. But not sure if we want to change this in this PR?

Comment threadhtlcswitch/hop/error_encryptor.go Outdated
Comment threadhtlcswitch/hop/error_encryptor.go Outdated

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.

Perhaps we could export minPaddedOnionErrorLength and insert it here. So semantically this would tell us that we have a zero message length and zero padding?

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.

We could, although in the rest of the lnd repo we generally calculate that number 260 from lnwire.FailureMessageLength and I aligned this new code with that.

Semantically we'll indeed communicate zero message with zero padding. But it really does not matter what we put here.

As a future step, we could define a new failure code in BOLT 04 for this, but it won't change much about the penalization.

Comment threadhtlcswitch/hop/error_encryptor.go Outdated

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.

What are the incentives for a router to report back honestly and to not to pass on a short error? Will this node be penalized for reporting? If the node does not get penalized for reporting, any relayer could do this to penalize their neighbor?

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.

If they pass the short error, the upstream node will replace it by a proper error and the sender will indeed penalize this node.

Comment threadhtlcswitch/link.go Outdated
Comment threadhtlcswitch/hop/iterator.go Outdated
Comment threadlnwire/features.go Outdated

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.

These flags are advertized by default, is it?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Yes, they are.

Comment threadchanneldb/payments.go Outdated

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.

Out of curiosity, why is this done, to check that all parsed fields have been processed? But it's missing that check

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.

Because right below here, the remaining records are stored as custom records. If we wouldn't delete here, the attr error record would also show up as a custom record.

@joostjager
joostjagerforce-pushed the fat-errors-2022 branch 2 times, most recently from a1cf55e to ef4df36CompareJune 21, 2023 13:39
@joostjager

Copy link
Copy Markdown
ContributorAuthor

From a routing node's perspective, attributable errors may not be so nice if they know they are slow and could get penalized for it, but if the network should have fast payments this may be needed?

I think that ultimately they won't have a choice. At some point, I expect senders to avoid routing nodes that do not support attr errors.

@joostjager
joostjagerforce-pushed the fat-errors-2022 branch 4 times, most recently from 540cb59 to a1d0805CompareJune 22, 2023 09:29
@joostjager

Copy link
Copy Markdown
ContributorAuthor

Added integration test.

@saubyk
saubyk requested a review from Crypt-iQJune 22, 2023 15:22
@saubyksaubyk modified the milestones: High Priority, v0.18.0Aug 4, 2023
Preparation for the instantiation of an attributable error encrypter. This gets rid
of the sphinx encrypter instantiation in OnionProcessor. This would
otherwise be problematic when an attributable encrypter would need to be
created there without having access to the error structure.
@joostjager

Copy link
Copy Markdown
ContributorAuthor

Updated lightning-onion dependency after adding updated test vector.

@joostjager

Copy link
Copy Markdown
ContributorAuthor

Updated feature bit to 36/37

Comment threadhtlcswitch/link.go
// encryption parameters.
// encryption parameters. Don't assume attributable errors,
// because first the resolution format needs to be decoded from
// the onion payload.

@joostjagerjoostjagerNov 6, 2023

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Fallback to legacy format is probably fine. If this happens to be an attributable error route, the upstream node will substitute with an attributable error?

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

This should be added to the spec.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

error messagesonion routingP1MUST be fixed or reviewed

Projects

None yet

Development

Successfully merging this pull request may close these issues.

9 participants

@joostjager@litbot-9000@saubyk@positiveblue@halseth@hieblmi@bitromortac@carlaKC@thomash-acinq
, '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('^' + ".*" + '
Skip to content

htlcswitch: attributable errors - #7139

Closed
joostjager wants to merge 6 commits into
lightningnetwork:masterfrom
bottlepay:fat-errors-2022
Closed

htlcswitch: attributable errors#7139
joostjager wants to merge 6 commits into
lightningnetwork:masterfrom
bottlepay:fat-errors-2022

Conversation

@joostjager

@joostjagerjoostjager commented Nov 10, 2022

Copy link
Copy Markdown
Contributor

This PR adds the ability for routing nodes and nodes that are the destination of a payment to generate and relay attributable errors. This capability is signaled through a new feature bit option_attributable_errors.

Sender nodes will examine the route and request attributable errors via the attributable_errors tlv field when each node on the path supports it. There is no preference for attributable error-supporting nodes (yet).

Intermediate and final nodes report the htlc hold time in their failure message payload. The sender node only logs the hold times (Hold times: 2526/1125/0). Updating a node's reputation based on the time they held an htlc is left for a follow-up pr.

Depends on lightningnetwork/lightning-onion#60

Corresponding spec PR: lightning/bolts#1044

By default, attributable errors is only enabled for intermediate and final hops. If requested by the sender through the forward onion, they'll return attributable errors. For the sender node, the user needs to opt-in to use the feature by specifying --routerrpc.attrerrors on the command line.

@joostjager
joostjagerforce-pushed the fat-errors-2022 branch 3 times, most recently from 62e4317 to c80ed73CompareDecember 7, 2022 11:28
@joostjagerjoostjager changed the title build: bump lightning-onion to fat errorshtlcswitch: fat errorsDec 7, 2022
@joostjager
joostjagerforce-pushed the fat-errors-2022 branch 4 times, most recently from 0593312 to b1185f1CompareDecember 8, 2022 13:46
@joostjager
joostjagerforce-pushed the fat-errors-2022 branch 4 times, most recently from ab1fcc2 to 61661dcCompareDecember 14, 2022 14:45
@saubyksaubyk added this to the v0.17.0 milestone Jan 12, 2023
Comment threadlnwire/features.go Outdated
@joostjager
joostjagerforce-pushed the fat-errors-2022 branch 2 times, most recently from 3b423ea to 87a30c9CompareJanuary 16, 2023 11:42
Comment threadhtlcswitch/hop/error_encryptor.go Outdated
Comment threadhtlcswitch/hop/error_encryptor.go Outdated
Comment threadrouting/payment_lifecycle.go Outdated

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.

One case to consider here is that if for some reason one of the nodes had to return InvalidOnionPayload, that node wasn't able to read the resolution format. Instead if will return an old-style error that we're not decoding properly. Not sure if we care because it should only happen in case of a bug?

@joostjager
joostjagerforce-pushed the fat-errors-2022 branch 6 times, most recently from 77f4da8 to 7a9816bCompareJanuary 23, 2023 12:12
@saubyksaubyk added this to the v0.17.1 milestone Jun 16, 2023
@joostjager
joostjagerforce-pushed the fat-errors-2022 branch 6 times, most recently from f25c769 to e4d3c4eCompareJune 19, 2023 19:23

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

Great work! I think it's nice to have everything hard-coded to not reveal any fingerprint vector (except for the signal). Also, the upgrade path looks very reasonable to me, only when a majority of the network has upgraded to attributable errors (and a full attributable error route is likely), we'll request that error type (although some senders may prefer those routers already earlier). This will give a quick transition from zero senders to many senders and therefore a larger anonymity set.
From a routing node's perspective, attributable errors may not be so nice if they know they are slow and could get penalized for it, but if the network should have fast payments this may be needed?

Comment threadhtlcswitch/switch.go Outdated

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.

Is there a reason why log.Errorf is not used?

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.

What extra formatting would you like to see added here? The error itself is already a full sentence. I followed the approach that was already taken in master:

log.Error(err)

Comment threadhtlcswitch/hop/iterator.go Outdated

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.

This error handling seems to not belong here, right?

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.

It is pre-existing. Maybe only ErrInvalidOnionKey is ever returned here. But not sure if we want to change this in this PR?

Comment threadhtlcswitch/hop/error_encryptor.go Outdated
Comment threadhtlcswitch/hop/error_encryptor.go Outdated

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.

Perhaps we could export minPaddedOnionErrorLength and insert it here. So semantically this would tell us that we have a zero message length and zero padding?

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.

We could, although in the rest of the lnd repo we generally calculate that number 260 from lnwire.FailureMessageLength and I aligned this new code with that.

Semantically we'll indeed communicate zero message with zero padding. But it really does not matter what we put here.

As a future step, we could define a new failure code in BOLT 04 for this, but it won't change much about the penalization.

Comment threadhtlcswitch/hop/error_encryptor.go Outdated

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.

What are the incentives for a router to report back honestly and to not to pass on a short error? Will this node be penalized for reporting? If the node does not get penalized for reporting, any relayer could do this to penalize their neighbor?

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.

If they pass the short error, the upstream node will replace it by a proper error and the sender will indeed penalize this node.

Comment threadhtlcswitch/link.go Outdated
Comment threadhtlcswitch/hop/iterator.go Outdated
Comment threadlnwire/features.go Outdated

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.

These flags are advertized by default, is it?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Yes, they are.

Comment threadchanneldb/payments.go Outdated

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.

Out of curiosity, why is this done, to check that all parsed fields have been processed? But it's missing that check

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.

Because right below here, the remaining records are stored as custom records. If we wouldn't delete here, the attr error record would also show up as a custom record.

@joostjager
joostjagerforce-pushed the fat-errors-2022 branch 2 times, most recently from a1cf55e to ef4df36CompareJune 21, 2023 13:39
@joostjager

Copy link
Copy Markdown
ContributorAuthor

From a routing node's perspective, attributable errors may not be so nice if they know they are slow and could get penalized for it, but if the network should have fast payments this may be needed?

I think that ultimately they won't have a choice. At some point, I expect senders to avoid routing nodes that do not support attr errors.

@joostjager
joostjagerforce-pushed the fat-errors-2022 branch 4 times, most recently from 540cb59 to a1d0805CompareJune 22, 2023 09:29
@joostjager

Copy link
Copy Markdown
ContributorAuthor

Added integration test.

@saubyk
saubyk requested a review from Crypt-iQJune 22, 2023 15:22
@saubyksaubyk modified the milestones: High Priority, v0.18.0Aug 4, 2023
Preparation for the instantiation of an attributable error encrypter. This gets rid
of the sphinx encrypter instantiation in OnionProcessor. This would
otherwise be problematic when an attributable encrypter would need to be
created there without having access to the error structure.
@joostjager

Copy link
Copy Markdown
ContributorAuthor

Updated lightning-onion dependency after adding updated test vector.

@joostjager

Copy link
Copy Markdown
ContributorAuthor

Updated feature bit to 36/37

Comment threadhtlcswitch/link.go
// encryption parameters.
// encryption parameters. Don't assume attributable errors,
// because first the resolution format needs to be decoded from
// the onion payload.

@joostjagerjoostjagerNov 6, 2023

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Fallback to legacy format is probably fine. If this happens to be an attributable error route, the upstream node will substitute with an attributable error?

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

This should be added to the spec.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

error messagesonion routingP1MUST be fixed or reviewed

Projects

None yet

Development

Successfully merging this pull request may close these issues.

9 participants

@joostjager@litbot-9000@saubyk@positiveblue@halseth@hieblmi@bitromortac@carlaKC@thomash-acinq
, '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); } })(); })();
Skip to content

htlcswitch: attributable errors - #7139

Closed
joostjager wants to merge 6 commits into
lightningnetwork:masterfrom
bottlepay:fat-errors-2022
Closed

htlcswitch: attributable errors#7139
joostjager wants to merge 6 commits into
lightningnetwork:masterfrom
bottlepay:fat-errors-2022

Conversation

@joostjager

@joostjagerjoostjager commented Nov 10, 2022

Copy link
Copy Markdown
Contributor

This PR adds the ability for routing nodes and nodes that are the destination of a payment to generate and relay attributable errors. This capability is signaled through a new feature bit option_attributable_errors.

Sender nodes will examine the route and request attributable errors via the attributable_errors tlv field when each node on the path supports it. There is no preference for attributable error-supporting nodes (yet).

Intermediate and final nodes report the htlc hold time in their failure message payload. The sender node only logs the hold times (Hold times: 2526/1125/0). Updating a node's reputation based on the time they held an htlc is left for a follow-up pr.

Depends on lightningnetwork/lightning-onion#60

Corresponding spec PR: lightning/bolts#1044

By default, attributable errors is only enabled for intermediate and final hops. If requested by the sender through the forward onion, they'll return attributable errors. For the sender node, the user needs to opt-in to use the feature by specifying --routerrpc.attrerrors on the command line.

@joostjager
joostjagerforce-pushed the fat-errors-2022 branch 3 times, most recently from 62e4317 to c80ed73CompareDecember 7, 2022 11:28
@joostjagerjoostjager changed the title build: bump lightning-onion to fat errorshtlcswitch: fat errorsDec 7, 2022
@joostjager
joostjagerforce-pushed the fat-errors-2022 branch 4 times, most recently from 0593312 to b1185f1CompareDecember 8, 2022 13:46
@joostjager
joostjagerforce-pushed the fat-errors-2022 branch 4 times, most recently from ab1fcc2 to 61661dcCompareDecember 14, 2022 14:45
@saubyksaubyk added this to the v0.17.0 milestone Jan 12, 2023
Comment threadlnwire/features.go Outdated
@joostjager
joostjagerforce-pushed the fat-errors-2022 branch 2 times, most recently from 3b423ea to 87a30c9CompareJanuary 16, 2023 11:42
Comment threadhtlcswitch/hop/error_encryptor.go Outdated
Comment threadhtlcswitch/hop/error_encryptor.go Outdated
Comment threadrouting/payment_lifecycle.go Outdated

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.

One case to consider here is that if for some reason one of the nodes had to return InvalidOnionPayload, that node wasn't able to read the resolution format. Instead if will return an old-style error that we're not decoding properly. Not sure if we care because it should only happen in case of a bug?

@joostjager
joostjagerforce-pushed the fat-errors-2022 branch 6 times, most recently from 77f4da8 to 7a9816bCompareJanuary 23, 2023 12:12
@saubyksaubyk added this to the v0.17.1 milestone Jun 16, 2023
@joostjager
joostjagerforce-pushed the fat-errors-2022 branch 6 times, most recently from f25c769 to e4d3c4eCompareJune 19, 2023 19:23

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

Great work! I think it's nice to have everything hard-coded to not reveal any fingerprint vector (except for the signal). Also, the upgrade path looks very reasonable to me, only when a majority of the network has upgraded to attributable errors (and a full attributable error route is likely), we'll request that error type (although some senders may prefer those routers already earlier). This will give a quick transition from zero senders to many senders and therefore a larger anonymity set.
From a routing node's perspective, attributable errors may not be so nice if they know they are slow and could get penalized for it, but if the network should have fast payments this may be needed?

Comment threadhtlcswitch/switch.go Outdated

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.

Is there a reason why log.Errorf is not used?

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.

What extra formatting would you like to see added here? The error itself is already a full sentence. I followed the approach that was already taken in master:

log.Error(err)

Comment threadhtlcswitch/hop/iterator.go Outdated

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.

This error handling seems to not belong here, right?

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.

It is pre-existing. Maybe only ErrInvalidOnionKey is ever returned here. But not sure if we want to change this in this PR?

Comment threadhtlcswitch/hop/error_encryptor.go Outdated
Comment threadhtlcswitch/hop/error_encryptor.go Outdated

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.

Perhaps we could export minPaddedOnionErrorLength and insert it here. So semantically this would tell us that we have a zero message length and zero padding?

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.

We could, although in the rest of the lnd repo we generally calculate that number 260 from lnwire.FailureMessageLength and I aligned this new code with that.

Semantically we'll indeed communicate zero message with zero padding. But it really does not matter what we put here.

As a future step, we could define a new failure code in BOLT 04 for this, but it won't change much about the penalization.

Comment threadhtlcswitch/hop/error_encryptor.go Outdated

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.

What are the incentives for a router to report back honestly and to not to pass on a short error? Will this node be penalized for reporting? If the node does not get penalized for reporting, any relayer could do this to penalize their neighbor?

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.

If they pass the short error, the upstream node will replace it by a proper error and the sender will indeed penalize this node.

Comment threadhtlcswitch/link.go Outdated
Comment threadhtlcswitch/hop/iterator.go Outdated
Comment threadlnwire/features.go Outdated

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.

These flags are advertized by default, is it?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Yes, they are.

Comment threadchanneldb/payments.go Outdated

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.

Out of curiosity, why is this done, to check that all parsed fields have been processed? But it's missing that check

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.

Because right below here, the remaining records are stored as custom records. If we wouldn't delete here, the attr error record would also show up as a custom record.

@joostjager
joostjagerforce-pushed the fat-errors-2022 branch 2 times, most recently from a1cf55e to ef4df36CompareJune 21, 2023 13:39
@joostjager

Copy link
Copy Markdown
ContributorAuthor

From a routing node's perspective, attributable errors may not be so nice if they know they are slow and could get penalized for it, but if the network should have fast payments this may be needed?

I think that ultimately they won't have a choice. At some point, I expect senders to avoid routing nodes that do not support attr errors.

@joostjager
joostjagerforce-pushed the fat-errors-2022 branch 4 times, most recently from 540cb59 to a1d0805CompareJune 22, 2023 09:29
@joostjager

Copy link
Copy Markdown
ContributorAuthor

Added integration test.

@saubyk
saubyk requested a review from Crypt-iQJune 22, 2023 15:22
@saubyksaubyk modified the milestones: High Priority, v0.18.0Aug 4, 2023
Preparation for the instantiation of an attributable error encrypter. This gets rid
of the sphinx encrypter instantiation in OnionProcessor. This would
otherwise be problematic when an attributable encrypter would need to be
created there without having access to the error structure.
@joostjager

Copy link
Copy Markdown
ContributorAuthor

Updated lightning-onion dependency after adding updated test vector.

@joostjager

Copy link
Copy Markdown
ContributorAuthor

Updated feature bit to 36/37

Comment threadhtlcswitch/link.go
// encryption parameters.
// encryption parameters. Don't assume attributable errors,
// because first the resolution format needs to be decoded from
// the onion payload.

@joostjagerjoostjagerNov 6, 2023

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Fallback to legacy format is probably fine. If this happens to be an attributable error route, the upstream node will substitute with an attributable error?

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

This should be added to the spec.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

error messagesonion routingP1MUST be fixed or reviewed

Projects

None yet

Development

Successfully merging this pull request may close these issues.

9 participants

@joostjager@litbot-9000@saubyk@positiveblue@halseth@hieblmi@bitromortac@carlaKC@thomash-acinq