Skip to content

Introduce lightning-htlc-scorer crate as a jamming mitigation strategy - #1848

Closed
ariard wants to merge 11 commits into
lightningdevkit:mainfrom
ariard:2022-11-jamming-mitigation
Closed

Introduce lightning-htlc-scorer crate as a jamming mitigation strategy#1848
ariard wants to merge 11 commits into
lightningdevkit:mainfrom
ariard:2022-11-jamming-mitigation

Conversation

@ariard

@ariardariard commented Nov 14, 2022

Copy link
Copy Markdown

This PR introduces a HTLCScorer, a new module to mitigate against channel jamming attacks and to allow a routing node to control its incoming liquidity flows. The strategy is an experimental implementation of previous channel jamming research ideas ("the Channel Jamming book" and "Unjamming Lightning: A Systematic Approach").

The HTLCScorer consumes the new Event::PaymentIntercept from #1835 (dependent on generic interception followups) and apply additional routing checks defined by a RoutingPolicy. Notably, this routing policy quotes a credential_to_liquidity_unit, i.e the number of credentials we require from a HTLC forward request to grant corresponding outbound channel liquidity. The credentials (SignedCredentials) are attached in the HTLC onion payload (NonFinalNodeAndCredentials) and stored until HTLC settlement (process_htlc_backward()). In function of the HTLC settlement result (either update_add_htlc / update_fail_htlc), we send back new counter-signed credentials.

Credentials redemption should be anonymized to maintain confidentiality of the payer from a routing hop viewpoint. The payer should be able to receive a significant amount of credentials for each challenge they solve without the routing hop being able to link the credential to a persistent identity (in this direction e.g IETF's Privacy Pass).

The original dissemination of the reputation credentials can be based on the payment of unconditional fees/upfront fees to the routing hops during an initial bootstrapping phase.

Working on BOLT extensions to define the credential data format, the routing policy fields, new BOLT error messages and new onion TLV records.

This PR is open as an experiment only, mostly to illustrate how a reputation-based channel jamming would architecturally plug with our current Event interfaces.

valentinewallaceand others added 11 commits November 7, 2022 11:42
This is useful for LSPs who wish to create a just-in-time channel for end users
receiving a lightning payment. These fake scids will be encoded into route
hints in end user invoices, and signal to LDK to create an event triggering the
JIT channel, after which the payment will be received.
Co-authored-by: John Cantrell <johncantrell97@gmail.com>
Co-authored-by: Valentine Wallace <vwallace@protonmail.com>
In upcoming commit(s), we'll want to store intercepted payments in
ChannelManager before the user signals that they should be forwarded. It
wouldn't make sense to store a HTLCForwardInfo as-is because the FailHTLC
variant doesn't make sense, so we refactor out the ::AddHTLC contents into its
own struct for storage.
Co-authored-by: John Cantrell <johncantrell97@gmail.com>
Co-authored-by: Valentine Wallace <vwallace@protonmail.com>
Used in upcoming commit(s) when we generate the PaymentIntercepted event for
intercepted payments.
Co-authored-by: John Cantrell <johncantrell97@gmail.com>
Co-authored-by: Valentine Wallace <vwallace@protonmail.com>
No intercepted payments are generated yet, that will be added in upcoming
commit(s)
Co-authored-by: John Cantrell <johncantrell97@gmail.com>
Co-authored-by: Valentine Wallace <vwallace@protonmail.com>
Used in upcoming commit(s) so users can intercept forwarded payments
Co-authored-by: John Cantrell <johncantrell97@gmail.com>
Co-authored-by: Valentine Wallace <vwallace@protonmail.com>
And store the pending intercepted HTLC in pending_intercepted_payments
Co-authored-by: John Cantrell <johncantrell97@gmail.com>
Co-authored-by: Valentine Wallace <vwallace@protonmail.com>
See ChannelManager::forward_intercepted_payment and
ChannelManager::get_intercept_scid for details
Co-authored-by: John Cantrell <johncantrell97@gmail.com>
Co-authored-by: Valentine Wallace <vwallace@protonmail.com>
Co-authored-by: John Cantrell <johncantrell97@gmail.com>
Co-authored-by: Valentine Wallace <vwallace@protonmail.com>
cargo bench was able to find an scid of 0 as a valid intercept id
This module introduces a HTLCScorer component, processing
PaymentIntercepted event from ChannelManager. This component verifies
the authenticy of the HTLC credentials, the satisfaction of the routing
policy, and store the backward credentials for HTLC settlement time.
This experiments the implementation of a reputation mechanism to
mitigate channel jamming.
@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Thanks for tackling this! Needs rebase now that #1835 has landed. Also, this needs to intercept all HTLCs, right? So we'll need to go ahead and extend #1835 to have a config knob for intercepting all HTLCs.

@ariard

Copy link
Copy Markdown
Author

Addressing review comments received on the mailing list to work out a simplified proposal first. For sure, we'll need to intercept all the HTLCs without user signaling like current intercept scid! As simple as a intercept_all_htlcs knob checked in ChannelManager::forward_htlcs.

@ariard

Copy link
Copy Markdown
Author

I'll pursue the development of this module in its own repository: https://github.com/ariard/lightning-risk-engine

Firstly, while I aim to target in priority compatibility with the Lightning Dev Kit architecture, it should still be a low-engineering bar for the module to be integrated with other Lightning nodes, assuming a bit of standardization of the HTLC intercepting APIs. I still would have to land changes to make HTLCIntercepted more generic and combine a CredentialsScorer with the existent ProbabilisticScorer.

Secondly, I would like to avoid the project slowly arriving to the same monorepo mess than Bitcoin Core where critical components (the p2p stack, the mempool, the validation engine, the script interpreter) are bundled with far far less critical components like the server indexes or the GUI code. Monorepo, once the project is mature with a sound review process, just slows down to death the development pace of complex new subsystems, requesting a bit of "whiteboardy" iterations.

Lastly, even if this jamming mitigation strategy sounds the most economically-efficient have been able to come up with after years of research, I still think there might not be a standard economically optimal jamming strategy, whatever your type of Lightning node or topology. Even if we do a lot of economic simulations (and I look forward to it once the specification is more mature!), from my experience taking part to mempool policy rules design, deploying mainet with real incentives at play can be the only way to corroborate designs with strong economic engineering factors in Bitcoin.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

That makes sense, looking forward to seeing the PR to add full HTLC interception and further work here!

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@ariard@TheBlueMatt@valentinewallace
, '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" + '
Introduce `lightning-htlc-scorer` crate as a jamming mitigation strategy by ariard · Pull Request #1848 · lightningdevkit/rust-lightning · GitHub
Skip to content

Introduce lightning-htlc-scorer crate as a jamming mitigation strategy - #1848

Closed
ariard wants to merge 11 commits into
lightningdevkit:mainfrom
ariard:2022-11-jamming-mitigation
Closed

Introduce lightning-htlc-scorer crate as a jamming mitigation strategy#1848
ariard wants to merge 11 commits into
lightningdevkit:mainfrom
ariard:2022-11-jamming-mitigation

Conversation

@ariard

@ariardariard commented Nov 14, 2022

Copy link
Copy Markdown

This PR introduces a HTLCScorer, a new module to mitigate against channel jamming attacks and to allow a routing node to control its incoming liquidity flows. The strategy is an experimental implementation of previous channel jamming research ideas ("the Channel Jamming book" and "Unjamming Lightning: A Systematic Approach").

The HTLCScorer consumes the new Event::PaymentIntercept from #1835 (dependent on generic interception followups) and apply additional routing checks defined by a RoutingPolicy. Notably, this routing policy quotes a credential_to_liquidity_unit, i.e the number of credentials we require from a HTLC forward request to grant corresponding outbound channel liquidity. The credentials (SignedCredentials) are attached in the HTLC onion payload (NonFinalNodeAndCredentials) and stored until HTLC settlement (process_htlc_backward()). In function of the HTLC settlement result (either update_add_htlc / update_fail_htlc), we send back new counter-signed credentials.

Credentials redemption should be anonymized to maintain confidentiality of the payer from a routing hop viewpoint. The payer should be able to receive a significant amount of credentials for each challenge they solve without the routing hop being able to link the credential to a persistent identity (in this direction e.g IETF's Privacy Pass).

The original dissemination of the reputation credentials can be based on the payment of unconditional fees/upfront fees to the routing hops during an initial bootstrapping phase.

Working on BOLT extensions to define the credential data format, the routing policy fields, new BOLT error messages and new onion TLV records.

This PR is open as an experiment only, mostly to illustrate how a reputation-based channel jamming would architecturally plug with our current Event interfaces.

valentinewallaceand others added 11 commits November 7, 2022 11:42
This is useful for LSPs who wish to create a just-in-time channel for end users
receiving a lightning payment. These fake scids will be encoded into route
hints in end user invoices, and signal to LDK to create an event triggering the
JIT channel, after which the payment will be received.
Co-authored-by: John Cantrell <johncantrell97@gmail.com>
Co-authored-by: Valentine Wallace <vwallace@protonmail.com>
In upcoming commit(s), we'll want to store intercepted payments in
ChannelManager before the user signals that they should be forwarded. It
wouldn't make sense to store a HTLCForwardInfo as-is because the FailHTLC
variant doesn't make sense, so we refactor out the ::AddHTLC contents into its
own struct for storage.
Co-authored-by: John Cantrell <johncantrell97@gmail.com>
Co-authored-by: Valentine Wallace <vwallace@protonmail.com>
Used in upcoming commit(s) when we generate the PaymentIntercepted event for
intercepted payments.
Co-authored-by: John Cantrell <johncantrell97@gmail.com>
Co-authored-by: Valentine Wallace <vwallace@protonmail.com>
No intercepted payments are generated yet, that will be added in upcoming
commit(s)
Co-authored-by: John Cantrell <johncantrell97@gmail.com>
Co-authored-by: Valentine Wallace <vwallace@protonmail.com>
Used in upcoming commit(s) so users can intercept forwarded payments
Co-authored-by: John Cantrell <johncantrell97@gmail.com>
Co-authored-by: Valentine Wallace <vwallace@protonmail.com>
And store the pending intercepted HTLC in pending_intercepted_payments
Co-authored-by: John Cantrell <johncantrell97@gmail.com>
Co-authored-by: Valentine Wallace <vwallace@protonmail.com>
See ChannelManager::forward_intercepted_payment and
ChannelManager::get_intercept_scid for details
Co-authored-by: John Cantrell <johncantrell97@gmail.com>
Co-authored-by: Valentine Wallace <vwallace@protonmail.com>
Co-authored-by: John Cantrell <johncantrell97@gmail.com>
Co-authored-by: Valentine Wallace <vwallace@protonmail.com>
cargo bench was able to find an scid of 0 as a valid intercept id
This module introduces a HTLCScorer component, processing
PaymentIntercepted event from ChannelManager. This component verifies
the authenticy of the HTLC credentials, the satisfaction of the routing
policy, and store the backward credentials for HTLC settlement time.
This experiments the implementation of a reputation mechanism to
mitigate channel jamming.
@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Thanks for tackling this! Needs rebase now that #1835 has landed. Also, this needs to intercept all HTLCs, right? So we'll need to go ahead and extend #1835 to have a config knob for intercepting all HTLCs.

@ariard

Copy link
Copy Markdown
Author

Addressing review comments received on the mailing list to work out a simplified proposal first. For sure, we'll need to intercept all the HTLCs without user signaling like current intercept scid! As simple as a intercept_all_htlcs knob checked in ChannelManager::forward_htlcs.

@ariard

Copy link
Copy Markdown
Author

I'll pursue the development of this module in its own repository: https://github.com/ariard/lightning-risk-engine

Firstly, while I aim to target in priority compatibility with the Lightning Dev Kit architecture, it should still be a low-engineering bar for the module to be integrated with other Lightning nodes, assuming a bit of standardization of the HTLC intercepting APIs. I still would have to land changes to make HTLCIntercepted more generic and combine a CredentialsScorer with the existent ProbabilisticScorer.

Secondly, I would like to avoid the project slowly arriving to the same monorepo mess than Bitcoin Core where critical components (the p2p stack, the mempool, the validation engine, the script interpreter) are bundled with far far less critical components like the server indexes or the GUI code. Monorepo, once the project is mature with a sound review process, just slows down to death the development pace of complex new subsystems, requesting a bit of "whiteboardy" iterations.

Lastly, even if this jamming mitigation strategy sounds the most economically-efficient have been able to come up with after years of research, I still think there might not be a standard economically optimal jamming strategy, whatever your type of Lightning node or topology. Even if we do a lot of economic simulations (and I look forward to it once the specification is more mature!), from my experience taking part to mempool policy rules design, deploying mainet with real incentives at play can be the only way to corroborate designs with strong economic engineering factors in Bitcoin.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

That makes sense, looking forward to seeing the PR to add full HTLC interception and further work here!

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@ariard@TheBlueMatt@valentinewallace
, '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('^' + ".*" + ' Introduce `lightning-htlc-scorer` crate as a jamming mitigation strategy by ariard · Pull Request #1848 · lightningdevkit/rust-lightning · GitHub
Skip to content

Introduce lightning-htlc-scorer crate as a jamming mitigation strategy - #1848

Closed
ariard wants to merge 11 commits into
lightningdevkit:mainfrom
ariard:2022-11-jamming-mitigation
Closed

Introduce lightning-htlc-scorer crate as a jamming mitigation strategy#1848
ariard wants to merge 11 commits into
lightningdevkit:mainfrom
ariard:2022-11-jamming-mitigation

Conversation

@ariard

@ariardariard commented Nov 14, 2022

Copy link
Copy Markdown

This PR introduces a HTLCScorer, a new module to mitigate against channel jamming attacks and to allow a routing node to control its incoming liquidity flows. The strategy is an experimental implementation of previous channel jamming research ideas ("the Channel Jamming book" and "Unjamming Lightning: A Systematic Approach").

The HTLCScorer consumes the new Event::PaymentIntercept from #1835 (dependent on generic interception followups) and apply additional routing checks defined by a RoutingPolicy. Notably, this routing policy quotes a credential_to_liquidity_unit, i.e the number of credentials we require from a HTLC forward request to grant corresponding outbound channel liquidity. The credentials (SignedCredentials) are attached in the HTLC onion payload (NonFinalNodeAndCredentials) and stored until HTLC settlement (process_htlc_backward()). In function of the HTLC settlement result (either update_add_htlc / update_fail_htlc), we send back new counter-signed credentials.

Credentials redemption should be anonymized to maintain confidentiality of the payer from a routing hop viewpoint. The payer should be able to receive a significant amount of credentials for each challenge they solve without the routing hop being able to link the credential to a persistent identity (in this direction e.g IETF's Privacy Pass).

The original dissemination of the reputation credentials can be based on the payment of unconditional fees/upfront fees to the routing hops during an initial bootstrapping phase.

Working on BOLT extensions to define the credential data format, the routing policy fields, new BOLT error messages and new onion TLV records.

This PR is open as an experiment only, mostly to illustrate how a reputation-based channel jamming would architecturally plug with our current Event interfaces.

valentinewallaceand others added 11 commits November 7, 2022 11:42
This is useful for LSPs who wish to create a just-in-time channel for end users
receiving a lightning payment. These fake scids will be encoded into route
hints in end user invoices, and signal to LDK to create an event triggering the
JIT channel, after which the payment will be received.
Co-authored-by: John Cantrell <johncantrell97@gmail.com>
Co-authored-by: Valentine Wallace <vwallace@protonmail.com>
In upcoming commit(s), we'll want to store intercepted payments in
ChannelManager before the user signals that they should be forwarded. It
wouldn't make sense to store a HTLCForwardInfo as-is because the FailHTLC
variant doesn't make sense, so we refactor out the ::AddHTLC contents into its
own struct for storage.
Co-authored-by: John Cantrell <johncantrell97@gmail.com>
Co-authored-by: Valentine Wallace <vwallace@protonmail.com>
Used in upcoming commit(s) when we generate the PaymentIntercepted event for
intercepted payments.
Co-authored-by: John Cantrell <johncantrell97@gmail.com>
Co-authored-by: Valentine Wallace <vwallace@protonmail.com>
No intercepted payments are generated yet, that will be added in upcoming
commit(s)
Co-authored-by: John Cantrell <johncantrell97@gmail.com>
Co-authored-by: Valentine Wallace <vwallace@protonmail.com>
Used in upcoming commit(s) so users can intercept forwarded payments
Co-authored-by: John Cantrell <johncantrell97@gmail.com>
Co-authored-by: Valentine Wallace <vwallace@protonmail.com>
And store the pending intercepted HTLC in pending_intercepted_payments
Co-authored-by: John Cantrell <johncantrell97@gmail.com>
Co-authored-by: Valentine Wallace <vwallace@protonmail.com>
See ChannelManager::forward_intercepted_payment and
ChannelManager::get_intercept_scid for details
Co-authored-by: John Cantrell <johncantrell97@gmail.com>
Co-authored-by: Valentine Wallace <vwallace@protonmail.com>
Co-authored-by: John Cantrell <johncantrell97@gmail.com>
Co-authored-by: Valentine Wallace <vwallace@protonmail.com>
cargo bench was able to find an scid of 0 as a valid intercept id
This module introduces a HTLCScorer component, processing
PaymentIntercepted event from ChannelManager. This component verifies
the authenticy of the HTLC credentials, the satisfaction of the routing
policy, and store the backward credentials for HTLC settlement time.
This experiments the implementation of a reputation mechanism to
mitigate channel jamming.
@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Thanks for tackling this! Needs rebase now that #1835 has landed. Also, this needs to intercept all HTLCs, right? So we'll need to go ahead and extend #1835 to have a config knob for intercepting all HTLCs.

@ariard

Copy link
Copy Markdown
Author

Addressing review comments received on the mailing list to work out a simplified proposal first. For sure, we'll need to intercept all the HTLCs without user signaling like current intercept scid! As simple as a intercept_all_htlcs knob checked in ChannelManager::forward_htlcs.

@ariard

Copy link
Copy Markdown
Author

I'll pursue the development of this module in its own repository: https://github.com/ariard/lightning-risk-engine

Firstly, while I aim to target in priority compatibility with the Lightning Dev Kit architecture, it should still be a low-engineering bar for the module to be integrated with other Lightning nodes, assuming a bit of standardization of the HTLC intercepting APIs. I still would have to land changes to make HTLCIntercepted more generic and combine a CredentialsScorer with the existent ProbabilisticScorer.

Secondly, I would like to avoid the project slowly arriving to the same monorepo mess than Bitcoin Core where critical components (the p2p stack, the mempool, the validation engine, the script interpreter) are bundled with far far less critical components like the server indexes or the GUI code. Monorepo, once the project is mature with a sound review process, just slows down to death the development pace of complex new subsystems, requesting a bit of "whiteboardy" iterations.

Lastly, even if this jamming mitigation strategy sounds the most economically-efficient have been able to come up with after years of research, I still think there might not be a standard economically optimal jamming strategy, whatever your type of Lightning node or topology. Even if we do a lot of economic simulations (and I look forward to it once the specification is more mature!), from my experience taking part to mempool policy rules design, deploying mainet with real incentives at play can be the only way to corroborate designs with strong economic engineering factors in Bitcoin.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

That makes sense, looking forward to seeing the PR to add full HTLC interception and further work here!

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@ariard@TheBlueMatt@valentinewallace
, '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('^' + ".*" + ' Introduce `lightning-htlc-scorer` crate as a jamming mitigation strategy by ariard · Pull Request #1848 · lightningdevkit/rust-lightning · GitHub
Skip to content

Introduce lightning-htlc-scorer crate as a jamming mitigation strategy - #1848

Closed
ariard wants to merge 11 commits into
lightningdevkit:mainfrom
ariard:2022-11-jamming-mitigation
Closed

Introduce lightning-htlc-scorer crate as a jamming mitigation strategy#1848
ariard wants to merge 11 commits into
lightningdevkit:mainfrom
ariard:2022-11-jamming-mitigation

Conversation

@ariard

@ariardariard commented Nov 14, 2022

Copy link
Copy Markdown

This PR introduces a HTLCScorer, a new module to mitigate against channel jamming attacks and to allow a routing node to control its incoming liquidity flows. The strategy is an experimental implementation of previous channel jamming research ideas ("the Channel Jamming book" and "Unjamming Lightning: A Systematic Approach").

The HTLCScorer consumes the new Event::PaymentIntercept from #1835 (dependent on generic interception followups) and apply additional routing checks defined by a RoutingPolicy. Notably, this routing policy quotes a credential_to_liquidity_unit, i.e the number of credentials we require from a HTLC forward request to grant corresponding outbound channel liquidity. The credentials (SignedCredentials) are attached in the HTLC onion payload (NonFinalNodeAndCredentials) and stored until HTLC settlement (process_htlc_backward()). In function of the HTLC settlement result (either update_add_htlc / update_fail_htlc), we send back new counter-signed credentials.

Credentials redemption should be anonymized to maintain confidentiality of the payer from a routing hop viewpoint. The payer should be able to receive a significant amount of credentials for each challenge they solve without the routing hop being able to link the credential to a persistent identity (in this direction e.g IETF's Privacy Pass).

The original dissemination of the reputation credentials can be based on the payment of unconditional fees/upfront fees to the routing hops during an initial bootstrapping phase.

Working on BOLT extensions to define the credential data format, the routing policy fields, new BOLT error messages and new onion TLV records.

This PR is open as an experiment only, mostly to illustrate how a reputation-based channel jamming would architecturally plug with our current Event interfaces.

valentinewallaceand others added 11 commits November 7, 2022 11:42
This is useful for LSPs who wish to create a just-in-time channel for end users
receiving a lightning payment. These fake scids will be encoded into route
hints in end user invoices, and signal to LDK to create an event triggering the
JIT channel, after which the payment will be received.
Co-authored-by: John Cantrell <johncantrell97@gmail.com>
Co-authored-by: Valentine Wallace <vwallace@protonmail.com>
In upcoming commit(s), we'll want to store intercepted payments in
ChannelManager before the user signals that they should be forwarded. It
wouldn't make sense to store a HTLCForwardInfo as-is because the FailHTLC
variant doesn't make sense, so we refactor out the ::AddHTLC contents into its
own struct for storage.
Co-authored-by: John Cantrell <johncantrell97@gmail.com>
Co-authored-by: Valentine Wallace <vwallace@protonmail.com>
Used in upcoming commit(s) when we generate the PaymentIntercepted event for
intercepted payments.
Co-authored-by: John Cantrell <johncantrell97@gmail.com>
Co-authored-by: Valentine Wallace <vwallace@protonmail.com>
No intercepted payments are generated yet, that will be added in upcoming
commit(s)
Co-authored-by: John Cantrell <johncantrell97@gmail.com>
Co-authored-by: Valentine Wallace <vwallace@protonmail.com>
Used in upcoming commit(s) so users can intercept forwarded payments
Co-authored-by: John Cantrell <johncantrell97@gmail.com>
Co-authored-by: Valentine Wallace <vwallace@protonmail.com>
And store the pending intercepted HTLC in pending_intercepted_payments
Co-authored-by: John Cantrell <johncantrell97@gmail.com>
Co-authored-by: Valentine Wallace <vwallace@protonmail.com>
See ChannelManager::forward_intercepted_payment and
ChannelManager::get_intercept_scid for details
Co-authored-by: John Cantrell <johncantrell97@gmail.com>
Co-authored-by: Valentine Wallace <vwallace@protonmail.com>
Co-authored-by: John Cantrell <johncantrell97@gmail.com>
Co-authored-by: Valentine Wallace <vwallace@protonmail.com>
cargo bench was able to find an scid of 0 as a valid intercept id
This module introduces a HTLCScorer component, processing
PaymentIntercepted event from ChannelManager. This component verifies
the authenticy of the HTLC credentials, the satisfaction of the routing
policy, and store the backward credentials for HTLC settlement time.
This experiments the implementation of a reputation mechanism to
mitigate channel jamming.
@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Thanks for tackling this! Needs rebase now that #1835 has landed. Also, this needs to intercept all HTLCs, right? So we'll need to go ahead and extend #1835 to have a config knob for intercepting all HTLCs.

@ariard

Copy link
Copy Markdown
Author

Addressing review comments received on the mailing list to work out a simplified proposal first. For sure, we'll need to intercept all the HTLCs without user signaling like current intercept scid! As simple as a intercept_all_htlcs knob checked in ChannelManager::forward_htlcs.

@ariard

Copy link
Copy Markdown
Author

I'll pursue the development of this module in its own repository: https://github.com/ariard/lightning-risk-engine

Firstly, while I aim to target in priority compatibility with the Lightning Dev Kit architecture, it should still be a low-engineering bar for the module to be integrated with other Lightning nodes, assuming a bit of standardization of the HTLC intercepting APIs. I still would have to land changes to make HTLCIntercepted more generic and combine a CredentialsScorer with the existent ProbabilisticScorer.

Secondly, I would like to avoid the project slowly arriving to the same monorepo mess than Bitcoin Core where critical components (the p2p stack, the mempool, the validation engine, the script interpreter) are bundled with far far less critical components like the server indexes or the GUI code. Monorepo, once the project is mature with a sound review process, just slows down to death the development pace of complex new subsystems, requesting a bit of "whiteboardy" iterations.

Lastly, even if this jamming mitigation strategy sounds the most economically-efficient have been able to come up with after years of research, I still think there might not be a standard economically optimal jamming strategy, whatever your type of Lightning node or topology. Even if we do a lot of economic simulations (and I look forward to it once the specification is more mature!), from my experience taking part to mempool policy rules design, deploying mainet with real incentives at play can be the only way to corroborate designs with strong economic engineering factors in Bitcoin.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

That makes sense, looking forward to seeing the PR to add full HTLC interception and further work here!

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@ariard@TheBlueMatt@valentinewallace
, '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" + ' Introduce `lightning-htlc-scorer` crate as a jamming mitigation strategy by ariard · Pull Request #1848 · lightningdevkit/rust-lightning · GitHub
Skip to content

Introduce lightning-htlc-scorer crate as a jamming mitigation strategy - #1848

Closed
ariard wants to merge 11 commits into
lightningdevkit:mainfrom
ariard:2022-11-jamming-mitigation
Closed

Introduce lightning-htlc-scorer crate as a jamming mitigation strategy#1848
ariard wants to merge 11 commits into
lightningdevkit:mainfrom
ariard:2022-11-jamming-mitigation

Conversation

@ariard

@ariardariard commented Nov 14, 2022

Copy link
Copy Markdown

This PR introduces a HTLCScorer, a new module to mitigate against channel jamming attacks and to allow a routing node to control its incoming liquidity flows. The strategy is an experimental implementation of previous channel jamming research ideas ("the Channel Jamming book" and "Unjamming Lightning: A Systematic Approach").

The HTLCScorer consumes the new Event::PaymentIntercept from #1835 (dependent on generic interception followups) and apply additional routing checks defined by a RoutingPolicy. Notably, this routing policy quotes a credential_to_liquidity_unit, i.e the number of credentials we require from a HTLC forward request to grant corresponding outbound channel liquidity. The credentials (SignedCredentials) are attached in the HTLC onion payload (NonFinalNodeAndCredentials) and stored until HTLC settlement (process_htlc_backward()). In function of the HTLC settlement result (either update_add_htlc / update_fail_htlc), we send back new counter-signed credentials.

Credentials redemption should be anonymized to maintain confidentiality of the payer from a routing hop viewpoint. The payer should be able to receive a significant amount of credentials for each challenge they solve without the routing hop being able to link the credential to a persistent identity (in this direction e.g IETF's Privacy Pass).

The original dissemination of the reputation credentials can be based on the payment of unconditional fees/upfront fees to the routing hops during an initial bootstrapping phase.

Working on BOLT extensions to define the credential data format, the routing policy fields, new BOLT error messages and new onion TLV records.

This PR is open as an experiment only, mostly to illustrate how a reputation-based channel jamming would architecturally plug with our current Event interfaces.

valentinewallaceand others added 11 commits November 7, 2022 11:42
This is useful for LSPs who wish to create a just-in-time channel for end users
receiving a lightning payment. These fake scids will be encoded into route
hints in end user invoices, and signal to LDK to create an event triggering the
JIT channel, after which the payment will be received.
Co-authored-by: John Cantrell <johncantrell97@gmail.com>
Co-authored-by: Valentine Wallace <vwallace@protonmail.com>
In upcoming commit(s), we'll want to store intercepted payments in
ChannelManager before the user signals that they should be forwarded. It
wouldn't make sense to store a HTLCForwardInfo as-is because the FailHTLC
variant doesn't make sense, so we refactor out the ::AddHTLC contents into its
own struct for storage.
Co-authored-by: John Cantrell <johncantrell97@gmail.com>
Co-authored-by: Valentine Wallace <vwallace@protonmail.com>
Used in upcoming commit(s) when we generate the PaymentIntercepted event for
intercepted payments.
Co-authored-by: John Cantrell <johncantrell97@gmail.com>
Co-authored-by: Valentine Wallace <vwallace@protonmail.com>
No intercepted payments are generated yet, that will be added in upcoming
commit(s)
Co-authored-by: John Cantrell <johncantrell97@gmail.com>
Co-authored-by: Valentine Wallace <vwallace@protonmail.com>
Used in upcoming commit(s) so users can intercept forwarded payments
Co-authored-by: John Cantrell <johncantrell97@gmail.com>
Co-authored-by: Valentine Wallace <vwallace@protonmail.com>
And store the pending intercepted HTLC in pending_intercepted_payments
Co-authored-by: John Cantrell <johncantrell97@gmail.com>
Co-authored-by: Valentine Wallace <vwallace@protonmail.com>
See ChannelManager::forward_intercepted_payment and
ChannelManager::get_intercept_scid for details
Co-authored-by: John Cantrell <johncantrell97@gmail.com>
Co-authored-by: Valentine Wallace <vwallace@protonmail.com>
Co-authored-by: John Cantrell <johncantrell97@gmail.com>
Co-authored-by: Valentine Wallace <vwallace@protonmail.com>
cargo bench was able to find an scid of 0 as a valid intercept id
This module introduces a HTLCScorer component, processing
PaymentIntercepted event from ChannelManager. This component verifies
the authenticy of the HTLC credentials, the satisfaction of the routing
policy, and store the backward credentials for HTLC settlement time.
This experiments the implementation of a reputation mechanism to
mitigate channel jamming.
@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Thanks for tackling this! Needs rebase now that #1835 has landed. Also, this needs to intercept all HTLCs, right? So we'll need to go ahead and extend #1835 to have a config knob for intercepting all HTLCs.

@ariard

Copy link
Copy Markdown
Author

Addressing review comments received on the mailing list to work out a simplified proposal first. For sure, we'll need to intercept all the HTLCs without user signaling like current intercept scid! As simple as a intercept_all_htlcs knob checked in ChannelManager::forward_htlcs.

@ariard

Copy link
Copy Markdown
Author

I'll pursue the development of this module in its own repository: https://github.com/ariard/lightning-risk-engine

Firstly, while I aim to target in priority compatibility with the Lightning Dev Kit architecture, it should still be a low-engineering bar for the module to be integrated with other Lightning nodes, assuming a bit of standardization of the HTLC intercepting APIs. I still would have to land changes to make HTLCIntercepted more generic and combine a CredentialsScorer with the existent ProbabilisticScorer.

Secondly, I would like to avoid the project slowly arriving to the same monorepo mess than Bitcoin Core where critical components (the p2p stack, the mempool, the validation engine, the script interpreter) are bundled with far far less critical components like the server indexes or the GUI code. Monorepo, once the project is mature with a sound review process, just slows down to death the development pace of complex new subsystems, requesting a bit of "whiteboardy" iterations.

Lastly, even if this jamming mitigation strategy sounds the most economically-efficient have been able to come up with after years of research, I still think there might not be a standard economically optimal jamming strategy, whatever your type of Lightning node or topology. Even if we do a lot of economic simulations (and I look forward to it once the specification is more mature!), from my experience taking part to mempool policy rules design, deploying mainet with real incentives at play can be the only way to corroborate designs with strong economic engineering factors in Bitcoin.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

That makes sense, looking forward to seeing the PR to add full HTLC interception and further work here!

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@ariard@TheBlueMatt@valentinewallace
, '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('^' + ".*" + ' Introduce `lightning-htlc-scorer` crate as a jamming mitigation strategy by ariard · Pull Request #1848 · lightningdevkit/rust-lightning · GitHub
Skip to content

Introduce lightning-htlc-scorer crate as a jamming mitigation strategy - #1848

Closed
ariard wants to merge 11 commits into
lightningdevkit:mainfrom
ariard:2022-11-jamming-mitigation
Closed

Introduce lightning-htlc-scorer crate as a jamming mitigation strategy#1848
ariard wants to merge 11 commits into
lightningdevkit:mainfrom
ariard:2022-11-jamming-mitigation

Conversation

@ariard

@ariardariard commented Nov 14, 2022

Copy link
Copy Markdown

This PR introduces a HTLCScorer, a new module to mitigate against channel jamming attacks and to allow a routing node to control its incoming liquidity flows. The strategy is an experimental implementation of previous channel jamming research ideas ("the Channel Jamming book" and "Unjamming Lightning: A Systematic Approach").

The HTLCScorer consumes the new Event::PaymentIntercept from #1835 (dependent on generic interception followups) and apply additional routing checks defined by a RoutingPolicy. Notably, this routing policy quotes a credential_to_liquidity_unit, i.e the number of credentials we require from a HTLC forward request to grant corresponding outbound channel liquidity. The credentials (SignedCredentials) are attached in the HTLC onion payload (NonFinalNodeAndCredentials) and stored until HTLC settlement (process_htlc_backward()). In function of the HTLC settlement result (either update_add_htlc / update_fail_htlc), we send back new counter-signed credentials.

Credentials redemption should be anonymized to maintain confidentiality of the payer from a routing hop viewpoint. The payer should be able to receive a significant amount of credentials for each challenge they solve without the routing hop being able to link the credential to a persistent identity (in this direction e.g IETF's Privacy Pass).

The original dissemination of the reputation credentials can be based on the payment of unconditional fees/upfront fees to the routing hops during an initial bootstrapping phase.

Working on BOLT extensions to define the credential data format, the routing policy fields, new BOLT error messages and new onion TLV records.

This PR is open as an experiment only, mostly to illustrate how a reputation-based channel jamming would architecturally plug with our current Event interfaces.

valentinewallaceand others added 11 commits November 7, 2022 11:42
This is useful for LSPs who wish to create a just-in-time channel for end users
receiving a lightning payment. These fake scids will be encoded into route
hints in end user invoices, and signal to LDK to create an event triggering the
JIT channel, after which the payment will be received.
Co-authored-by: John Cantrell <johncantrell97@gmail.com>
Co-authored-by: Valentine Wallace <vwallace@protonmail.com>
In upcoming commit(s), we'll want to store intercepted payments in
ChannelManager before the user signals that they should be forwarded. It
wouldn't make sense to store a HTLCForwardInfo as-is because the FailHTLC
variant doesn't make sense, so we refactor out the ::AddHTLC contents into its
own struct for storage.
Co-authored-by: John Cantrell <johncantrell97@gmail.com>
Co-authored-by: Valentine Wallace <vwallace@protonmail.com>
Used in upcoming commit(s) when we generate the PaymentIntercepted event for
intercepted payments.
Co-authored-by: John Cantrell <johncantrell97@gmail.com>
Co-authored-by: Valentine Wallace <vwallace@protonmail.com>
No intercepted payments are generated yet, that will be added in upcoming
commit(s)
Co-authored-by: John Cantrell <johncantrell97@gmail.com>
Co-authored-by: Valentine Wallace <vwallace@protonmail.com>
Used in upcoming commit(s) so users can intercept forwarded payments
Co-authored-by: John Cantrell <johncantrell97@gmail.com>
Co-authored-by: Valentine Wallace <vwallace@protonmail.com>
And store the pending intercepted HTLC in pending_intercepted_payments
Co-authored-by: John Cantrell <johncantrell97@gmail.com>
Co-authored-by: Valentine Wallace <vwallace@protonmail.com>
See ChannelManager::forward_intercepted_payment and
ChannelManager::get_intercept_scid for details
Co-authored-by: John Cantrell <johncantrell97@gmail.com>
Co-authored-by: Valentine Wallace <vwallace@protonmail.com>
Co-authored-by: John Cantrell <johncantrell97@gmail.com>
Co-authored-by: Valentine Wallace <vwallace@protonmail.com>
cargo bench was able to find an scid of 0 as a valid intercept id
This module introduces a HTLCScorer component, processing
PaymentIntercepted event from ChannelManager. This component verifies
the authenticy of the HTLC credentials, the satisfaction of the routing
policy, and store the backward credentials for HTLC settlement time.
This experiments the implementation of a reputation mechanism to
mitigate channel jamming.
@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Thanks for tackling this! Needs rebase now that #1835 has landed. Also, this needs to intercept all HTLCs, right? So we'll need to go ahead and extend #1835 to have a config knob for intercepting all HTLCs.

@ariard

Copy link
Copy Markdown
Author

Addressing review comments received on the mailing list to work out a simplified proposal first. For sure, we'll need to intercept all the HTLCs without user signaling like current intercept scid! As simple as a intercept_all_htlcs knob checked in ChannelManager::forward_htlcs.

@ariard

Copy link
Copy Markdown
Author

I'll pursue the development of this module in its own repository: https://github.com/ariard/lightning-risk-engine

Firstly, while I aim to target in priority compatibility with the Lightning Dev Kit architecture, it should still be a low-engineering bar for the module to be integrated with other Lightning nodes, assuming a bit of standardization of the HTLC intercepting APIs. I still would have to land changes to make HTLCIntercepted more generic and combine a CredentialsScorer with the existent ProbabilisticScorer.

Secondly, I would like to avoid the project slowly arriving to the same monorepo mess than Bitcoin Core where critical components (the p2p stack, the mempool, the validation engine, the script interpreter) are bundled with far far less critical components like the server indexes or the GUI code. Monorepo, once the project is mature with a sound review process, just slows down to death the development pace of complex new subsystems, requesting a bit of "whiteboardy" iterations.

Lastly, even if this jamming mitigation strategy sounds the most economically-efficient have been able to come up with after years of research, I still think there might not be a standard economically optimal jamming strategy, whatever your type of Lightning node or topology. Even if we do a lot of economic simulations (and I look forward to it once the specification is more mature!), from my experience taking part to mempool policy rules design, deploying mainet with real incentives at play can be the only way to corroborate designs with strong economic engineering factors in Bitcoin.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

That makes sense, looking forward to seeing the PR to add full HTLC interception and further work here!

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@ariard@TheBlueMatt@valentinewallace
, '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('^' + ".*" + ' Introduce `lightning-htlc-scorer` crate as a jamming mitigation strategy by ariard · Pull Request #1848 · lightningdevkit/rust-lightning · GitHub
Skip to content

Introduce lightning-htlc-scorer crate as a jamming mitigation strategy - #1848

Closed
ariard wants to merge 11 commits into
lightningdevkit:mainfrom
ariard:2022-11-jamming-mitigation
Closed

Introduce lightning-htlc-scorer crate as a jamming mitigation strategy#1848
ariard wants to merge 11 commits into
lightningdevkit:mainfrom
ariard:2022-11-jamming-mitigation

Conversation

@ariard

@ariardariard commented Nov 14, 2022

Copy link
Copy Markdown

This PR introduces a HTLCScorer, a new module to mitigate against channel jamming attacks and to allow a routing node to control its incoming liquidity flows. The strategy is an experimental implementation of previous channel jamming research ideas ("the Channel Jamming book" and "Unjamming Lightning: A Systematic Approach").

The HTLCScorer consumes the new Event::PaymentIntercept from #1835 (dependent on generic interception followups) and apply additional routing checks defined by a RoutingPolicy. Notably, this routing policy quotes a credential_to_liquidity_unit, i.e the number of credentials we require from a HTLC forward request to grant corresponding outbound channel liquidity. The credentials (SignedCredentials) are attached in the HTLC onion payload (NonFinalNodeAndCredentials) and stored until HTLC settlement (process_htlc_backward()). In function of the HTLC settlement result (either update_add_htlc / update_fail_htlc), we send back new counter-signed credentials.

Credentials redemption should be anonymized to maintain confidentiality of the payer from a routing hop viewpoint. The payer should be able to receive a significant amount of credentials for each challenge they solve without the routing hop being able to link the credential to a persistent identity (in this direction e.g IETF's Privacy Pass).

The original dissemination of the reputation credentials can be based on the payment of unconditional fees/upfront fees to the routing hops during an initial bootstrapping phase.

Working on BOLT extensions to define the credential data format, the routing policy fields, new BOLT error messages and new onion TLV records.

This PR is open as an experiment only, mostly to illustrate how a reputation-based channel jamming would architecturally plug with our current Event interfaces.

valentinewallaceand others added 11 commits November 7, 2022 11:42
This is useful for LSPs who wish to create a just-in-time channel for end users
receiving a lightning payment. These fake scids will be encoded into route
hints in end user invoices, and signal to LDK to create an event triggering the
JIT channel, after which the payment will be received.
Co-authored-by: John Cantrell <johncantrell97@gmail.com>
Co-authored-by: Valentine Wallace <vwallace@protonmail.com>
In upcoming commit(s), we'll want to store intercepted payments in
ChannelManager before the user signals that they should be forwarded. It
wouldn't make sense to store a HTLCForwardInfo as-is because the FailHTLC
variant doesn't make sense, so we refactor out the ::AddHTLC contents into its
own struct for storage.
Co-authored-by: John Cantrell <johncantrell97@gmail.com>
Co-authored-by: Valentine Wallace <vwallace@protonmail.com>
Used in upcoming commit(s) when we generate the PaymentIntercepted event for
intercepted payments.
Co-authored-by: John Cantrell <johncantrell97@gmail.com>
Co-authored-by: Valentine Wallace <vwallace@protonmail.com>
No intercepted payments are generated yet, that will be added in upcoming
commit(s)
Co-authored-by: John Cantrell <johncantrell97@gmail.com>
Co-authored-by: Valentine Wallace <vwallace@protonmail.com>
Used in upcoming commit(s) so users can intercept forwarded payments
Co-authored-by: John Cantrell <johncantrell97@gmail.com>
Co-authored-by: Valentine Wallace <vwallace@protonmail.com>
And store the pending intercepted HTLC in pending_intercepted_payments
Co-authored-by: John Cantrell <johncantrell97@gmail.com>
Co-authored-by: Valentine Wallace <vwallace@protonmail.com>
See ChannelManager::forward_intercepted_payment and
ChannelManager::get_intercept_scid for details
Co-authored-by: John Cantrell <johncantrell97@gmail.com>
Co-authored-by: Valentine Wallace <vwallace@protonmail.com>
Co-authored-by: John Cantrell <johncantrell97@gmail.com>
Co-authored-by: Valentine Wallace <vwallace@protonmail.com>
cargo bench was able to find an scid of 0 as a valid intercept id
This module introduces a HTLCScorer component, processing
PaymentIntercepted event from ChannelManager. This component verifies
the authenticy of the HTLC credentials, the satisfaction of the routing
policy, and store the backward credentials for HTLC settlement time.
This experiments the implementation of a reputation mechanism to
mitigate channel jamming.
@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Thanks for tackling this! Needs rebase now that #1835 has landed. Also, this needs to intercept all HTLCs, right? So we'll need to go ahead and extend #1835 to have a config knob for intercepting all HTLCs.

@ariard

Copy link
Copy Markdown
Author

Addressing review comments received on the mailing list to work out a simplified proposal first. For sure, we'll need to intercept all the HTLCs without user signaling like current intercept scid! As simple as a intercept_all_htlcs knob checked in ChannelManager::forward_htlcs.

@ariard

Copy link
Copy Markdown
Author

I'll pursue the development of this module in its own repository: https://github.com/ariard/lightning-risk-engine

Firstly, while I aim to target in priority compatibility with the Lightning Dev Kit architecture, it should still be a low-engineering bar for the module to be integrated with other Lightning nodes, assuming a bit of standardization of the HTLC intercepting APIs. I still would have to land changes to make HTLCIntercepted more generic and combine a CredentialsScorer with the existent ProbabilisticScorer.

Secondly, I would like to avoid the project slowly arriving to the same monorepo mess than Bitcoin Core where critical components (the p2p stack, the mempool, the validation engine, the script interpreter) are bundled with far far less critical components like the server indexes or the GUI code. Monorepo, once the project is mature with a sound review process, just slows down to death the development pace of complex new subsystems, requesting a bit of "whiteboardy" iterations.

Lastly, even if this jamming mitigation strategy sounds the most economically-efficient have been able to come up with after years of research, I still think there might not be a standard economically optimal jamming strategy, whatever your type of Lightning node or topology. Even if we do a lot of economic simulations (and I look forward to it once the specification is more mature!), from my experience taking part to mempool policy rules design, deploying mainet with real incentives at play can be the only way to corroborate designs with strong economic engineering factors in Bitcoin.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

That makes sense, looking forward to seeing the PR to add full HTLC interception and further work here!

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@ariard@TheBlueMatt@valentinewallace
, '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); } })(); })(); Introduce `lightning-htlc-scorer` crate as a jamming mitigation strategy by ariard · Pull Request #1848 · lightningdevkit/rust-lightning · GitHub
Skip to content

Introduce lightning-htlc-scorer crate as a jamming mitigation strategy - #1848

Closed
ariard wants to merge 11 commits into
lightningdevkit:mainfrom
ariard:2022-11-jamming-mitigation
Closed

Introduce lightning-htlc-scorer crate as a jamming mitigation strategy#1848
ariard wants to merge 11 commits into
lightningdevkit:mainfrom
ariard:2022-11-jamming-mitigation

Conversation

@ariard

@ariardariard commented Nov 14, 2022

Copy link
Copy Markdown

This PR introduces a HTLCScorer, a new module to mitigate against channel jamming attacks and to allow a routing node to control its incoming liquidity flows. The strategy is an experimental implementation of previous channel jamming research ideas ("the Channel Jamming book" and "Unjamming Lightning: A Systematic Approach").

The HTLCScorer consumes the new Event::PaymentIntercept from #1835 (dependent on generic interception followups) and apply additional routing checks defined by a RoutingPolicy. Notably, this routing policy quotes a credential_to_liquidity_unit, i.e the number of credentials we require from a HTLC forward request to grant corresponding outbound channel liquidity. The credentials (SignedCredentials) are attached in the HTLC onion payload (NonFinalNodeAndCredentials) and stored until HTLC settlement (process_htlc_backward()). In function of the HTLC settlement result (either update_add_htlc / update_fail_htlc), we send back new counter-signed credentials.

Credentials redemption should be anonymized to maintain confidentiality of the payer from a routing hop viewpoint. The payer should be able to receive a significant amount of credentials for each challenge they solve without the routing hop being able to link the credential to a persistent identity (in this direction e.g IETF's Privacy Pass).

The original dissemination of the reputation credentials can be based on the payment of unconditional fees/upfront fees to the routing hops during an initial bootstrapping phase.

Working on BOLT extensions to define the credential data format, the routing policy fields, new BOLT error messages and new onion TLV records.

This PR is open as an experiment only, mostly to illustrate how a reputation-based channel jamming would architecturally plug with our current Event interfaces.

valentinewallaceand others added 11 commits November 7, 2022 11:42
This is useful for LSPs who wish to create a just-in-time channel for end users
receiving a lightning payment. These fake scids will be encoded into route
hints in end user invoices, and signal to LDK to create an event triggering the
JIT channel, after which the payment will be received.
Co-authored-by: John Cantrell <johncantrell97@gmail.com>
Co-authored-by: Valentine Wallace <vwallace@protonmail.com>
In upcoming commit(s), we'll want to store intercepted payments in
ChannelManager before the user signals that they should be forwarded. It
wouldn't make sense to store a HTLCForwardInfo as-is because the FailHTLC
variant doesn't make sense, so we refactor out the ::AddHTLC contents into its
own struct for storage.
Co-authored-by: John Cantrell <johncantrell97@gmail.com>
Co-authored-by: Valentine Wallace <vwallace@protonmail.com>
Used in upcoming commit(s) when we generate the PaymentIntercepted event for
intercepted payments.
Co-authored-by: John Cantrell <johncantrell97@gmail.com>
Co-authored-by: Valentine Wallace <vwallace@protonmail.com>
No intercepted payments are generated yet, that will be added in upcoming
commit(s)
Co-authored-by: John Cantrell <johncantrell97@gmail.com>
Co-authored-by: Valentine Wallace <vwallace@protonmail.com>
Used in upcoming commit(s) so users can intercept forwarded payments
Co-authored-by: John Cantrell <johncantrell97@gmail.com>
Co-authored-by: Valentine Wallace <vwallace@protonmail.com>
And store the pending intercepted HTLC in pending_intercepted_payments
Co-authored-by: John Cantrell <johncantrell97@gmail.com>
Co-authored-by: Valentine Wallace <vwallace@protonmail.com>
See ChannelManager::forward_intercepted_payment and
ChannelManager::get_intercept_scid for details
Co-authored-by: John Cantrell <johncantrell97@gmail.com>
Co-authored-by: Valentine Wallace <vwallace@protonmail.com>
Co-authored-by: John Cantrell <johncantrell97@gmail.com>
Co-authored-by: Valentine Wallace <vwallace@protonmail.com>
cargo bench was able to find an scid of 0 as a valid intercept id
This module introduces a HTLCScorer component, processing
PaymentIntercepted event from ChannelManager. This component verifies
the authenticy of the HTLC credentials, the satisfaction of the routing
policy, and store the backward credentials for HTLC settlement time.
This experiments the implementation of a reputation mechanism to
mitigate channel jamming.
@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Thanks for tackling this! Needs rebase now that #1835 has landed. Also, this needs to intercept all HTLCs, right? So we'll need to go ahead and extend #1835 to have a config knob for intercepting all HTLCs.

@ariard

Copy link
Copy Markdown
Author

Addressing review comments received on the mailing list to work out a simplified proposal first. For sure, we'll need to intercept all the HTLCs without user signaling like current intercept scid! As simple as a intercept_all_htlcs knob checked in ChannelManager::forward_htlcs.

@ariard

Copy link
Copy Markdown
Author

I'll pursue the development of this module in its own repository: https://github.com/ariard/lightning-risk-engine

Firstly, while I aim to target in priority compatibility with the Lightning Dev Kit architecture, it should still be a low-engineering bar for the module to be integrated with other Lightning nodes, assuming a bit of standardization of the HTLC intercepting APIs. I still would have to land changes to make HTLCIntercepted more generic and combine a CredentialsScorer with the existent ProbabilisticScorer.

Secondly, I would like to avoid the project slowly arriving to the same monorepo mess than Bitcoin Core where critical components (the p2p stack, the mempool, the validation engine, the script interpreter) are bundled with far far less critical components like the server indexes or the GUI code. Monorepo, once the project is mature with a sound review process, just slows down to death the development pace of complex new subsystems, requesting a bit of "whiteboardy" iterations.

Lastly, even if this jamming mitigation strategy sounds the most economically-efficient have been able to come up with after years of research, I still think there might not be a standard economically optimal jamming strategy, whatever your type of Lightning node or topology. Even if we do a lot of economic simulations (and I look forward to it once the specification is more mature!), from my experience taking part to mempool policy rules design, deploying mainet with real incentives at play can be the only way to corroborate designs with strong economic engineering factors in Bitcoin.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

That makes sense, looking forward to seeing the PR to add full HTLC interception and further work here!

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@ariard@TheBlueMatt@valentinewallace