Skip to content

Implement on-the-fly funding based on splicing and liquidity ads - #2861

Merged
t-bast merged 9 commits into
masterfrom
on-the-fly-funding
Sep 25, 2024
Merged

Implement on-the-fly funding based on splicing and liquidity ads#2861
t-bast merged 9 commits into
masterfrom
on-the-fly-funding

Conversation

@t-bast

@t-bastt-bast commented Jun 7, 2024

Copy link
Copy Markdown
Member

Implement the on-the-fly funding protocol specified in lightning/blips#36: when a payment cannot be relayed because of a liquidity issue, we notify our peer that we'd like to trigger on-the-fly funding if available. If available, we send a funding proposal (will_add_htlc) and keep track of its status.

Once a matching funding transaction is signed, we persist this funding attempt and wait for the additional liquidity to be available (once the channel is ready or the splice locked). We will then frequently try to relay the payment to get paid our liquidity fees. If the payment keeps getting rejected, or we cannot connect to our peer, we abandon the
payment when it reaches its CLTV expiry, which ensures that the upstream channels are not at risk.

When using on-the-fly funding, we use a single channel with our peer. If they try to open another channel while one is available, we reject their request and expect a splice instead.

This is best reviewed commit-by-commit: the bulk of the implementation is in the last commit, which contains some subtleties to correctly handle all edge cases (covered by the various unit tests).

@t-bast
t-bastforce-pushed the on-the-fly-funding branch 4 times, most recently from 789eef8 to 9d8eb99CompareJune 14, 2024 11:26
@t-bast
t-bastforce-pushed the on-the-fly-funding branch 5 times, most recently from 16a5191 to b340247CompareJune 25, 2024 07:00
@t-bast
t-bastforce-pushed the on-the-fly-funding branch 4 times, most recently from 55558aa to ce1d166CompareJuly 2, 2024 08:29
@t-bast
t-bastforce-pushed the on-the-fly-funding branch from ce1d166 to 64e447fCompareJuly 2, 2024 16:07
@pm47
pm47 self-requested a review July 4, 2024 14:06
@t-bast
t-bastforce-pushed the on-the-fly-funding branch 2 times, most recently from e704f28 to b95e3a1CompareJuly 8, 2024 09:56
@t-bast
t-bast marked this pull request as ready for review July 8, 2024 14:57
@t-bast
t-bastforce-pushed the on-the-fly-funding branch 2 times, most recently from 231f450 to 7dd2086CompareJuly 9, 2024 10:10
@t-bast
t-bastforce-pushed the on-the-fly-funding branch from 7dd2086 to 4312da7CompareJuly 9, 2024 15:04
@t-bast
t-bastforce-pushed the on-the-fly-funding branch from 4312da7 to 881bd40CompareJuly 17, 2024 13:37
@t-bast
t-bastforce-pushed the on-the-fly-funding branch from 881bd40 to 6d35c43CompareJuly 22, 2024 09:21
@t-bast
t-bastforce-pushed the on-the-fly-funding branch from 6d35c43 to 81ef78fCompareAugust 1, 2024 07:55
@t-bast
t-bastforce-pushed the on-the-fly-funding branch 5 times, most recently from f2973ad to 9f1ace1CompareSeptember 9, 2024 10:08
@t-bast
t-bastforce-pushed the on-the-fly-funding branch 5 times, most recently from 3f0c56d to 69014d2CompareSeptember 16, 2024 11:55
Comment threadeclair-core/src/main/scala/fr/acinq/eclair/io/Peer.scala Outdated
Comment threadeclair-core/src/main/scala/fr/acinq/eclair/payment/relay/NodeRelay.scala Outdated
Comment threadeclair-core/src/main/scala/fr/acinq/eclair/payment/relay/NodeRelay.scala Outdated
Add the (disabled by default) `on_the_fly_funding` feature bit and
codecs for the corresponding messages:
- `will_add_htlc`
- `will_fail_htlc`
- `will_fail_malformed_htlc`
- `cancel_on_the_fly_funding`
We also add a TLV to `update_add_htlc` to notify the recipient that we
relayed less data than what the onion encodes, in exchange for the fees
of the specified funding transaction.
We add a non-standard channel flag to `open_channel2` to allow wallets
to ask their peer to pay the commit tx fees, even when they're not the
channel opener. This is necessary for on-the-fly funding, until we can
move to 0-fee commit txs which will make it obsolete.
When an interactive-tx session is created for a liquidity purchase that
uses future HTLCs to pay fees, the initiator may not have enough funds
to honor the target feerate. We allow the transaction anyway, because
we want to get paid for the liquidity we're providing. If the feerate
is too low and the transaction doesn't confirm, we can double-spend it
if we need that liquidity elsewhere.
This commit adds the funding fee field to HTLCs, but never sets it.
We update a lot of test files, but there is no functional change.
Implement the on-the-fly funding protocol: when a payment cannot be
relayed because of a liquidity issue, we notify the `Peer` actor that
we'd like to trigger on-the-fly funding if available. If available, we
we send a funding proposal to our peer and keep track of its status.
Once a matching funding transaction is signed, we persist this funding
attempt and wait for the additional liquidity to be available (once the
channel is ready or the splice locked). We will then frequently try to
relay the payment to get paid our liquidity fees. If the payment keeps
getting rejected, or we cannot connect to our peer, we abandon the
payment when it reaches its CLTV expiry, which ensures that the upstream
channels are not at risk.
When using on-the-fly funding, we use a single channel with our peer.
If they try to open another channel while one is available, we reject
their request and expect a splice instead.
Similar to #2461 but for the non-initiator of a channel open.
We check the remote features before initiating an on-the-fly funding
attempt: it doesn't make sense to initiate it if our peer has not
activated the feature.
Instead of handling command responses and settlement in parallel (which
is a bit confusing), we stash settlements, process all command
responses, and then preocess all settlements.
This makes the flow a bit more strict (as modifications to tests show),
but it's easier to follow what the fsm does.
@t-bast
t-bast merged commit de42c8a into masterSep 25, 2024
@t-bast
t-bast deleted the on-the-fly-funding branch September 25, 2024 11:01
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@t-bast@pm47
, '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" + '
Implement on-the-fly funding based on splicing and liquidity ads by t-bast · Pull Request #2861 · ACINQ/eclair · GitHub
Skip to content

Implement on-the-fly funding based on splicing and liquidity ads - #2861

Merged
t-bast merged 9 commits into
masterfrom
on-the-fly-funding
Sep 25, 2024
Merged

Implement on-the-fly funding based on splicing and liquidity ads#2861
t-bast merged 9 commits into
masterfrom
on-the-fly-funding

Conversation

@t-bast

@t-bastt-bast commented Jun 7, 2024

Copy link
Copy Markdown
Member

Implement the on-the-fly funding protocol specified in lightning/blips#36: when a payment cannot be relayed because of a liquidity issue, we notify our peer that we'd like to trigger on-the-fly funding if available. If available, we send a funding proposal (will_add_htlc) and keep track of its status.

Once a matching funding transaction is signed, we persist this funding attempt and wait for the additional liquidity to be available (once the channel is ready or the splice locked). We will then frequently try to relay the payment to get paid our liquidity fees. If the payment keeps getting rejected, or we cannot connect to our peer, we abandon the
payment when it reaches its CLTV expiry, which ensures that the upstream channels are not at risk.

When using on-the-fly funding, we use a single channel with our peer. If they try to open another channel while one is available, we reject their request and expect a splice instead.

This is best reviewed commit-by-commit: the bulk of the implementation is in the last commit, which contains some subtleties to correctly handle all edge cases (covered by the various unit tests).

@t-bast
t-bastforce-pushed the on-the-fly-funding branch 4 times, most recently from 789eef8 to 9d8eb99CompareJune 14, 2024 11:26
@t-bast
t-bastforce-pushed the on-the-fly-funding branch 5 times, most recently from 16a5191 to b340247CompareJune 25, 2024 07:00
@t-bast
t-bastforce-pushed the on-the-fly-funding branch 4 times, most recently from 55558aa to ce1d166CompareJuly 2, 2024 08:29
@t-bast
t-bastforce-pushed the on-the-fly-funding branch from ce1d166 to 64e447fCompareJuly 2, 2024 16:07
@pm47
pm47 self-requested a review July 4, 2024 14:06
@t-bast
t-bastforce-pushed the on-the-fly-funding branch 2 times, most recently from e704f28 to b95e3a1CompareJuly 8, 2024 09:56
@t-bast
t-bast marked this pull request as ready for review July 8, 2024 14:57
@t-bast
t-bastforce-pushed the on-the-fly-funding branch 2 times, most recently from 231f450 to 7dd2086CompareJuly 9, 2024 10:10
@t-bast
t-bastforce-pushed the on-the-fly-funding branch from 7dd2086 to 4312da7CompareJuly 9, 2024 15:04
@t-bast
t-bastforce-pushed the on-the-fly-funding branch from 4312da7 to 881bd40CompareJuly 17, 2024 13:37
@t-bast
t-bastforce-pushed the on-the-fly-funding branch from 881bd40 to 6d35c43CompareJuly 22, 2024 09:21
@t-bast
t-bastforce-pushed the on-the-fly-funding branch from 6d35c43 to 81ef78fCompareAugust 1, 2024 07:55
@t-bast
t-bastforce-pushed the on-the-fly-funding branch 5 times, most recently from f2973ad to 9f1ace1CompareSeptember 9, 2024 10:08
@t-bast
t-bastforce-pushed the on-the-fly-funding branch 5 times, most recently from 3f0c56d to 69014d2CompareSeptember 16, 2024 11:55
Comment threadeclair-core/src/main/scala/fr/acinq/eclair/io/Peer.scala Outdated
Comment threadeclair-core/src/main/scala/fr/acinq/eclair/payment/relay/NodeRelay.scala Outdated
Comment threadeclair-core/src/main/scala/fr/acinq/eclair/payment/relay/NodeRelay.scala Outdated
Add the (disabled by default) `on_the_fly_funding` feature bit and
codecs for the corresponding messages:
- `will_add_htlc`
- `will_fail_htlc`
- `will_fail_malformed_htlc`
- `cancel_on_the_fly_funding`
We also add a TLV to `update_add_htlc` to notify the recipient that we
relayed less data than what the onion encodes, in exchange for the fees
of the specified funding transaction.
We add a non-standard channel flag to `open_channel2` to allow wallets
to ask their peer to pay the commit tx fees, even when they're not the
channel opener. This is necessary for on-the-fly funding, until we can
move to 0-fee commit txs which will make it obsolete.
When an interactive-tx session is created for a liquidity purchase that
uses future HTLCs to pay fees, the initiator may not have enough funds
to honor the target feerate. We allow the transaction anyway, because
we want to get paid for the liquidity we're providing. If the feerate
is too low and the transaction doesn't confirm, we can double-spend it
if we need that liquidity elsewhere.
This commit adds the funding fee field to HTLCs, but never sets it.
We update a lot of test files, but there is no functional change.
Implement the on-the-fly funding protocol: when a payment cannot be
relayed because of a liquidity issue, we notify the `Peer` actor that
we'd like to trigger on-the-fly funding if available. If available, we
we send a funding proposal to our peer and keep track of its status.
Once a matching funding transaction is signed, we persist this funding
attempt and wait for the additional liquidity to be available (once the
channel is ready or the splice locked). We will then frequently try to
relay the payment to get paid our liquidity fees. If the payment keeps
getting rejected, or we cannot connect to our peer, we abandon the
payment when it reaches its CLTV expiry, which ensures that the upstream
channels are not at risk.
When using on-the-fly funding, we use a single channel with our peer.
If they try to open another channel while one is available, we reject
their request and expect a splice instead.
Similar to #2461 but for the non-initiator of a channel open.
We check the remote features before initiating an on-the-fly funding
attempt: it doesn't make sense to initiate it if our peer has not
activated the feature.
Instead of handling command responses and settlement in parallel (which
is a bit confusing), we stash settlements, process all command
responses, and then preocess all settlements.
This makes the flow a bit more strict (as modifications to tests show),
but it's easier to follow what the fsm does.
@t-bast
t-bast merged commit de42c8a into masterSep 25, 2024
@t-bast
t-bast deleted the on-the-fly-funding branch September 25, 2024 11:01
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@t-bast@pm47
, '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('^' + ".*" + ' Implement on-the-fly funding based on splicing and liquidity ads by t-bast · Pull Request #2861 · ACINQ/eclair · GitHub
Skip to content

Implement on-the-fly funding based on splicing and liquidity ads - #2861

Merged
t-bast merged 9 commits into
masterfrom
on-the-fly-funding
Sep 25, 2024
Merged

Implement on-the-fly funding based on splicing and liquidity ads#2861
t-bast merged 9 commits into
masterfrom
on-the-fly-funding

Conversation

@t-bast

@t-bastt-bast commented Jun 7, 2024

Copy link
Copy Markdown
Member

Implement the on-the-fly funding protocol specified in lightning/blips#36: when a payment cannot be relayed because of a liquidity issue, we notify our peer that we'd like to trigger on-the-fly funding if available. If available, we send a funding proposal (will_add_htlc) and keep track of its status.

Once a matching funding transaction is signed, we persist this funding attempt and wait for the additional liquidity to be available (once the channel is ready or the splice locked). We will then frequently try to relay the payment to get paid our liquidity fees. If the payment keeps getting rejected, or we cannot connect to our peer, we abandon the
payment when it reaches its CLTV expiry, which ensures that the upstream channels are not at risk.

When using on-the-fly funding, we use a single channel with our peer. If they try to open another channel while one is available, we reject their request and expect a splice instead.

This is best reviewed commit-by-commit: the bulk of the implementation is in the last commit, which contains some subtleties to correctly handle all edge cases (covered by the various unit tests).

@t-bast
t-bastforce-pushed the on-the-fly-funding branch 4 times, most recently from 789eef8 to 9d8eb99CompareJune 14, 2024 11:26
@t-bast
t-bastforce-pushed the on-the-fly-funding branch 5 times, most recently from 16a5191 to b340247CompareJune 25, 2024 07:00
@t-bast
t-bastforce-pushed the on-the-fly-funding branch 4 times, most recently from 55558aa to ce1d166CompareJuly 2, 2024 08:29
@t-bast
t-bastforce-pushed the on-the-fly-funding branch from ce1d166 to 64e447fCompareJuly 2, 2024 16:07
@pm47
pm47 self-requested a review July 4, 2024 14:06
@t-bast
t-bastforce-pushed the on-the-fly-funding branch 2 times, most recently from e704f28 to b95e3a1CompareJuly 8, 2024 09:56
@t-bast
t-bast marked this pull request as ready for review July 8, 2024 14:57
@t-bast
t-bastforce-pushed the on-the-fly-funding branch 2 times, most recently from 231f450 to 7dd2086CompareJuly 9, 2024 10:10
@t-bast
t-bastforce-pushed the on-the-fly-funding branch from 7dd2086 to 4312da7CompareJuly 9, 2024 15:04
@t-bast
t-bastforce-pushed the on-the-fly-funding branch from 4312da7 to 881bd40CompareJuly 17, 2024 13:37
@t-bast
t-bastforce-pushed the on-the-fly-funding branch from 881bd40 to 6d35c43CompareJuly 22, 2024 09:21
@t-bast
t-bastforce-pushed the on-the-fly-funding branch from 6d35c43 to 81ef78fCompareAugust 1, 2024 07:55
@t-bast
t-bastforce-pushed the on-the-fly-funding branch 5 times, most recently from f2973ad to 9f1ace1CompareSeptember 9, 2024 10:08
@t-bast
t-bastforce-pushed the on-the-fly-funding branch 5 times, most recently from 3f0c56d to 69014d2CompareSeptember 16, 2024 11:55
Comment threadeclair-core/src/main/scala/fr/acinq/eclair/io/Peer.scala Outdated
Comment threadeclair-core/src/main/scala/fr/acinq/eclair/payment/relay/NodeRelay.scala Outdated
Comment threadeclair-core/src/main/scala/fr/acinq/eclair/payment/relay/NodeRelay.scala Outdated
Add the (disabled by default) `on_the_fly_funding` feature bit and
codecs for the corresponding messages:
- `will_add_htlc`
- `will_fail_htlc`
- `will_fail_malformed_htlc`
- `cancel_on_the_fly_funding`
We also add a TLV to `update_add_htlc` to notify the recipient that we
relayed less data than what the onion encodes, in exchange for the fees
of the specified funding transaction.
We add a non-standard channel flag to `open_channel2` to allow wallets
to ask their peer to pay the commit tx fees, even when they're not the
channel opener. This is necessary for on-the-fly funding, until we can
move to 0-fee commit txs which will make it obsolete.
When an interactive-tx session is created for a liquidity purchase that
uses future HTLCs to pay fees, the initiator may not have enough funds
to honor the target feerate. We allow the transaction anyway, because
we want to get paid for the liquidity we're providing. If the feerate
is too low and the transaction doesn't confirm, we can double-spend it
if we need that liquidity elsewhere.
This commit adds the funding fee field to HTLCs, but never sets it.
We update a lot of test files, but there is no functional change.
Implement the on-the-fly funding protocol: when a payment cannot be
relayed because of a liquidity issue, we notify the `Peer` actor that
we'd like to trigger on-the-fly funding if available. If available, we
we send a funding proposal to our peer and keep track of its status.
Once a matching funding transaction is signed, we persist this funding
attempt and wait for the additional liquidity to be available (once the
channel is ready or the splice locked). We will then frequently try to
relay the payment to get paid our liquidity fees. If the payment keeps
getting rejected, or we cannot connect to our peer, we abandon the
payment when it reaches its CLTV expiry, which ensures that the upstream
channels are not at risk.
When using on-the-fly funding, we use a single channel with our peer.
If they try to open another channel while one is available, we reject
their request and expect a splice instead.
Similar to #2461 but for the non-initiator of a channel open.
We check the remote features before initiating an on-the-fly funding
attempt: it doesn't make sense to initiate it if our peer has not
activated the feature.
Instead of handling command responses and settlement in parallel (which
is a bit confusing), we stash settlements, process all command
responses, and then preocess all settlements.
This makes the flow a bit more strict (as modifications to tests show),
but it's easier to follow what the fsm does.
@t-bast
t-bast merged commit de42c8a into masterSep 25, 2024
@t-bast
t-bast deleted the on-the-fly-funding branch September 25, 2024 11:01
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@t-bast@pm47
, '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('^' + ".*" + ' Implement on-the-fly funding based on splicing and liquidity ads by t-bast · Pull Request #2861 · ACINQ/eclair · GitHub
Skip to content

Implement on-the-fly funding based on splicing and liquidity ads - #2861

Merged
t-bast merged 9 commits into
masterfrom
on-the-fly-funding
Sep 25, 2024
Merged

Implement on-the-fly funding based on splicing and liquidity ads#2861
t-bast merged 9 commits into
masterfrom
on-the-fly-funding

Conversation

@t-bast

@t-bastt-bast commented Jun 7, 2024

Copy link
Copy Markdown
Member

Implement the on-the-fly funding protocol specified in lightning/blips#36: when a payment cannot be relayed because of a liquidity issue, we notify our peer that we'd like to trigger on-the-fly funding if available. If available, we send a funding proposal (will_add_htlc) and keep track of its status.

Once a matching funding transaction is signed, we persist this funding attempt and wait for the additional liquidity to be available (once the channel is ready or the splice locked). We will then frequently try to relay the payment to get paid our liquidity fees. If the payment keeps getting rejected, or we cannot connect to our peer, we abandon the
payment when it reaches its CLTV expiry, which ensures that the upstream channels are not at risk.

When using on-the-fly funding, we use a single channel with our peer. If they try to open another channel while one is available, we reject their request and expect a splice instead.

This is best reviewed commit-by-commit: the bulk of the implementation is in the last commit, which contains some subtleties to correctly handle all edge cases (covered by the various unit tests).

@t-bast
t-bastforce-pushed the on-the-fly-funding branch 4 times, most recently from 789eef8 to 9d8eb99CompareJune 14, 2024 11:26
@t-bast
t-bastforce-pushed the on-the-fly-funding branch 5 times, most recently from 16a5191 to b340247CompareJune 25, 2024 07:00
@t-bast
t-bastforce-pushed the on-the-fly-funding branch 4 times, most recently from 55558aa to ce1d166CompareJuly 2, 2024 08:29
@t-bast
t-bastforce-pushed the on-the-fly-funding branch from ce1d166 to 64e447fCompareJuly 2, 2024 16:07
@pm47
pm47 self-requested a review July 4, 2024 14:06
@t-bast
t-bastforce-pushed the on-the-fly-funding branch 2 times, most recently from e704f28 to b95e3a1CompareJuly 8, 2024 09:56
@t-bast
t-bast marked this pull request as ready for review July 8, 2024 14:57
@t-bast
t-bastforce-pushed the on-the-fly-funding branch 2 times, most recently from 231f450 to 7dd2086CompareJuly 9, 2024 10:10
@t-bast
t-bastforce-pushed the on-the-fly-funding branch from 7dd2086 to 4312da7CompareJuly 9, 2024 15:04
@t-bast
t-bastforce-pushed the on-the-fly-funding branch from 4312da7 to 881bd40CompareJuly 17, 2024 13:37
@t-bast
t-bastforce-pushed the on-the-fly-funding branch from 881bd40 to 6d35c43CompareJuly 22, 2024 09:21
@t-bast
t-bastforce-pushed the on-the-fly-funding branch from 6d35c43 to 81ef78fCompareAugust 1, 2024 07:55
@t-bast
t-bastforce-pushed the on-the-fly-funding branch 5 times, most recently from f2973ad to 9f1ace1CompareSeptember 9, 2024 10:08
@t-bast
t-bastforce-pushed the on-the-fly-funding branch 5 times, most recently from 3f0c56d to 69014d2CompareSeptember 16, 2024 11:55
Comment threadeclair-core/src/main/scala/fr/acinq/eclair/io/Peer.scala Outdated
Comment threadeclair-core/src/main/scala/fr/acinq/eclair/payment/relay/NodeRelay.scala Outdated
Comment threadeclair-core/src/main/scala/fr/acinq/eclair/payment/relay/NodeRelay.scala Outdated
Add the (disabled by default) `on_the_fly_funding` feature bit and
codecs for the corresponding messages:
- `will_add_htlc`
- `will_fail_htlc`
- `will_fail_malformed_htlc`
- `cancel_on_the_fly_funding`
We also add a TLV to `update_add_htlc` to notify the recipient that we
relayed less data than what the onion encodes, in exchange for the fees
of the specified funding transaction.
We add a non-standard channel flag to `open_channel2` to allow wallets
to ask their peer to pay the commit tx fees, even when they're not the
channel opener. This is necessary for on-the-fly funding, until we can
move to 0-fee commit txs which will make it obsolete.
When an interactive-tx session is created for a liquidity purchase that
uses future HTLCs to pay fees, the initiator may not have enough funds
to honor the target feerate. We allow the transaction anyway, because
we want to get paid for the liquidity we're providing. If the feerate
is too low and the transaction doesn't confirm, we can double-spend it
if we need that liquidity elsewhere.
This commit adds the funding fee field to HTLCs, but never sets it.
We update a lot of test files, but there is no functional change.
Implement the on-the-fly funding protocol: when a payment cannot be
relayed because of a liquidity issue, we notify the `Peer` actor that
we'd like to trigger on-the-fly funding if available. If available, we
we send a funding proposal to our peer and keep track of its status.
Once a matching funding transaction is signed, we persist this funding
attempt and wait for the additional liquidity to be available (once the
channel is ready or the splice locked). We will then frequently try to
relay the payment to get paid our liquidity fees. If the payment keeps
getting rejected, or we cannot connect to our peer, we abandon the
payment when it reaches its CLTV expiry, which ensures that the upstream
channels are not at risk.
When using on-the-fly funding, we use a single channel with our peer.
If they try to open another channel while one is available, we reject
their request and expect a splice instead.
Similar to #2461 but for the non-initiator of a channel open.
We check the remote features before initiating an on-the-fly funding
attempt: it doesn't make sense to initiate it if our peer has not
activated the feature.
Instead of handling command responses and settlement in parallel (which
is a bit confusing), we stash settlements, process all command
responses, and then preocess all settlements.
This makes the flow a bit more strict (as modifications to tests show),
but it's easier to follow what the fsm does.
@t-bast
t-bast merged commit de42c8a into masterSep 25, 2024
@t-bast
t-bast deleted the on-the-fly-funding branch September 25, 2024 11:01
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@t-bast@pm47
, '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" + ' Implement on-the-fly funding based on splicing and liquidity ads by t-bast · Pull Request #2861 · ACINQ/eclair · GitHub
Skip to content

Implement on-the-fly funding based on splicing and liquidity ads - #2861

Merged
t-bast merged 9 commits into
masterfrom
on-the-fly-funding
Sep 25, 2024
Merged

Implement on-the-fly funding based on splicing and liquidity ads#2861
t-bast merged 9 commits into
masterfrom
on-the-fly-funding

Conversation

@t-bast

@t-bastt-bast commented Jun 7, 2024

Copy link
Copy Markdown
Member

Implement the on-the-fly funding protocol specified in lightning/blips#36: when a payment cannot be relayed because of a liquidity issue, we notify our peer that we'd like to trigger on-the-fly funding if available. If available, we send a funding proposal (will_add_htlc) and keep track of its status.

Once a matching funding transaction is signed, we persist this funding attempt and wait for the additional liquidity to be available (once the channel is ready or the splice locked). We will then frequently try to relay the payment to get paid our liquidity fees. If the payment keeps getting rejected, or we cannot connect to our peer, we abandon the
payment when it reaches its CLTV expiry, which ensures that the upstream channels are not at risk.

When using on-the-fly funding, we use a single channel with our peer. If they try to open another channel while one is available, we reject their request and expect a splice instead.

This is best reviewed commit-by-commit: the bulk of the implementation is in the last commit, which contains some subtleties to correctly handle all edge cases (covered by the various unit tests).

@t-bast
t-bastforce-pushed the on-the-fly-funding branch 4 times, most recently from 789eef8 to 9d8eb99CompareJune 14, 2024 11:26
@t-bast
t-bastforce-pushed the on-the-fly-funding branch 5 times, most recently from 16a5191 to b340247CompareJune 25, 2024 07:00
@t-bast
t-bastforce-pushed the on-the-fly-funding branch 4 times, most recently from 55558aa to ce1d166CompareJuly 2, 2024 08:29
@t-bast
t-bastforce-pushed the on-the-fly-funding branch from ce1d166 to 64e447fCompareJuly 2, 2024 16:07
@pm47
pm47 self-requested a review July 4, 2024 14:06
@t-bast
t-bastforce-pushed the on-the-fly-funding branch 2 times, most recently from e704f28 to b95e3a1CompareJuly 8, 2024 09:56
@t-bast
t-bast marked this pull request as ready for review July 8, 2024 14:57
@t-bast
t-bastforce-pushed the on-the-fly-funding branch 2 times, most recently from 231f450 to 7dd2086CompareJuly 9, 2024 10:10
@t-bast
t-bastforce-pushed the on-the-fly-funding branch from 7dd2086 to 4312da7CompareJuly 9, 2024 15:04
@t-bast
t-bastforce-pushed the on-the-fly-funding branch from 4312da7 to 881bd40CompareJuly 17, 2024 13:37
@t-bast
t-bastforce-pushed the on-the-fly-funding branch from 881bd40 to 6d35c43CompareJuly 22, 2024 09:21
@t-bast
t-bastforce-pushed the on-the-fly-funding branch from 6d35c43 to 81ef78fCompareAugust 1, 2024 07:55
@t-bast
t-bastforce-pushed the on-the-fly-funding branch 5 times, most recently from f2973ad to 9f1ace1CompareSeptember 9, 2024 10:08
@t-bast
t-bastforce-pushed the on-the-fly-funding branch 5 times, most recently from 3f0c56d to 69014d2CompareSeptember 16, 2024 11:55
Comment threadeclair-core/src/main/scala/fr/acinq/eclair/io/Peer.scala Outdated
Comment threadeclair-core/src/main/scala/fr/acinq/eclair/payment/relay/NodeRelay.scala Outdated
Comment threadeclair-core/src/main/scala/fr/acinq/eclair/payment/relay/NodeRelay.scala Outdated
Add the (disabled by default) `on_the_fly_funding` feature bit and
codecs for the corresponding messages:
- `will_add_htlc`
- `will_fail_htlc`
- `will_fail_malformed_htlc`
- `cancel_on_the_fly_funding`
We also add a TLV to `update_add_htlc` to notify the recipient that we
relayed less data than what the onion encodes, in exchange for the fees
of the specified funding transaction.
We add a non-standard channel flag to `open_channel2` to allow wallets
to ask their peer to pay the commit tx fees, even when they're not the
channel opener. This is necessary for on-the-fly funding, until we can
move to 0-fee commit txs which will make it obsolete.
When an interactive-tx session is created for a liquidity purchase that
uses future HTLCs to pay fees, the initiator may not have enough funds
to honor the target feerate. We allow the transaction anyway, because
we want to get paid for the liquidity we're providing. If the feerate
is too low and the transaction doesn't confirm, we can double-spend it
if we need that liquidity elsewhere.
This commit adds the funding fee field to HTLCs, but never sets it.
We update a lot of test files, but there is no functional change.
Implement the on-the-fly funding protocol: when a payment cannot be
relayed because of a liquidity issue, we notify the `Peer` actor that
we'd like to trigger on-the-fly funding if available. If available, we
we send a funding proposal to our peer and keep track of its status.
Once a matching funding transaction is signed, we persist this funding
attempt and wait for the additional liquidity to be available (once the
channel is ready or the splice locked). We will then frequently try to
relay the payment to get paid our liquidity fees. If the payment keeps
getting rejected, or we cannot connect to our peer, we abandon the
payment when it reaches its CLTV expiry, which ensures that the upstream
channels are not at risk.
When using on-the-fly funding, we use a single channel with our peer.
If they try to open another channel while one is available, we reject
their request and expect a splice instead.
Similar to #2461 but for the non-initiator of a channel open.
We check the remote features before initiating an on-the-fly funding
attempt: it doesn't make sense to initiate it if our peer has not
activated the feature.
Instead of handling command responses and settlement in parallel (which
is a bit confusing), we stash settlements, process all command
responses, and then preocess all settlements.
This makes the flow a bit more strict (as modifications to tests show),
but it's easier to follow what the fsm does.
@t-bast
t-bast merged commit de42c8a into masterSep 25, 2024
@t-bast
t-bast deleted the on-the-fly-funding branch September 25, 2024 11:01
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@t-bast@pm47
, '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('^' + ".*" + ' Implement on-the-fly funding based on splicing and liquidity ads by t-bast · Pull Request #2861 · ACINQ/eclair · GitHub
Skip to content

Implement on-the-fly funding based on splicing and liquidity ads - #2861

Merged
t-bast merged 9 commits into
masterfrom
on-the-fly-funding
Sep 25, 2024
Merged

Implement on-the-fly funding based on splicing and liquidity ads#2861
t-bast merged 9 commits into
masterfrom
on-the-fly-funding

Conversation

@t-bast

@t-bastt-bast commented Jun 7, 2024

Copy link
Copy Markdown
Member

Implement the on-the-fly funding protocol specified in lightning/blips#36: when a payment cannot be relayed because of a liquidity issue, we notify our peer that we'd like to trigger on-the-fly funding if available. If available, we send a funding proposal (will_add_htlc) and keep track of its status.

Once a matching funding transaction is signed, we persist this funding attempt and wait for the additional liquidity to be available (once the channel is ready or the splice locked). We will then frequently try to relay the payment to get paid our liquidity fees. If the payment keeps getting rejected, or we cannot connect to our peer, we abandon the
payment when it reaches its CLTV expiry, which ensures that the upstream channels are not at risk.

When using on-the-fly funding, we use a single channel with our peer. If they try to open another channel while one is available, we reject their request and expect a splice instead.

This is best reviewed commit-by-commit: the bulk of the implementation is in the last commit, which contains some subtleties to correctly handle all edge cases (covered by the various unit tests).

@t-bast
t-bastforce-pushed the on-the-fly-funding branch 4 times, most recently from 789eef8 to 9d8eb99CompareJune 14, 2024 11:26
@t-bast
t-bastforce-pushed the on-the-fly-funding branch 5 times, most recently from 16a5191 to b340247CompareJune 25, 2024 07:00
@t-bast
t-bastforce-pushed the on-the-fly-funding branch 4 times, most recently from 55558aa to ce1d166CompareJuly 2, 2024 08:29
@t-bast
t-bastforce-pushed the on-the-fly-funding branch from ce1d166 to 64e447fCompareJuly 2, 2024 16:07
@pm47
pm47 self-requested a review July 4, 2024 14:06
@t-bast
t-bastforce-pushed the on-the-fly-funding branch 2 times, most recently from e704f28 to b95e3a1CompareJuly 8, 2024 09:56
@t-bast
t-bast marked this pull request as ready for review July 8, 2024 14:57
@t-bast
t-bastforce-pushed the on-the-fly-funding branch 2 times, most recently from 231f450 to 7dd2086CompareJuly 9, 2024 10:10
@t-bast
t-bastforce-pushed the on-the-fly-funding branch from 7dd2086 to 4312da7CompareJuly 9, 2024 15:04
@t-bast
t-bastforce-pushed the on-the-fly-funding branch from 4312da7 to 881bd40CompareJuly 17, 2024 13:37
@t-bast
t-bastforce-pushed the on-the-fly-funding branch from 881bd40 to 6d35c43CompareJuly 22, 2024 09:21
@t-bast
t-bastforce-pushed the on-the-fly-funding branch from 6d35c43 to 81ef78fCompareAugust 1, 2024 07:55
@t-bast
t-bastforce-pushed the on-the-fly-funding branch 5 times, most recently from f2973ad to 9f1ace1CompareSeptember 9, 2024 10:08
@t-bast
t-bastforce-pushed the on-the-fly-funding branch 5 times, most recently from 3f0c56d to 69014d2CompareSeptember 16, 2024 11:55
Comment threadeclair-core/src/main/scala/fr/acinq/eclair/io/Peer.scala Outdated
Comment threadeclair-core/src/main/scala/fr/acinq/eclair/payment/relay/NodeRelay.scala Outdated
Comment threadeclair-core/src/main/scala/fr/acinq/eclair/payment/relay/NodeRelay.scala Outdated
Add the (disabled by default) `on_the_fly_funding` feature bit and
codecs for the corresponding messages:
- `will_add_htlc`
- `will_fail_htlc`
- `will_fail_malformed_htlc`
- `cancel_on_the_fly_funding`
We also add a TLV to `update_add_htlc` to notify the recipient that we
relayed less data than what the onion encodes, in exchange for the fees
of the specified funding transaction.
We add a non-standard channel flag to `open_channel2` to allow wallets
to ask their peer to pay the commit tx fees, even when they're not the
channel opener. This is necessary for on-the-fly funding, until we can
move to 0-fee commit txs which will make it obsolete.
When an interactive-tx session is created for a liquidity purchase that
uses future HTLCs to pay fees, the initiator may not have enough funds
to honor the target feerate. We allow the transaction anyway, because
we want to get paid for the liquidity we're providing. If the feerate
is too low and the transaction doesn't confirm, we can double-spend it
if we need that liquidity elsewhere.
This commit adds the funding fee field to HTLCs, but never sets it.
We update a lot of test files, but there is no functional change.
Implement the on-the-fly funding protocol: when a payment cannot be
relayed because of a liquidity issue, we notify the `Peer` actor that
we'd like to trigger on-the-fly funding if available. If available, we
we send a funding proposal to our peer and keep track of its status.
Once a matching funding transaction is signed, we persist this funding
attempt and wait for the additional liquidity to be available (once the
channel is ready or the splice locked). We will then frequently try to
relay the payment to get paid our liquidity fees. If the payment keeps
getting rejected, or we cannot connect to our peer, we abandon the
payment when it reaches its CLTV expiry, which ensures that the upstream
channels are not at risk.
When using on-the-fly funding, we use a single channel with our peer.
If they try to open another channel while one is available, we reject
their request and expect a splice instead.
Similar to #2461 but for the non-initiator of a channel open.
We check the remote features before initiating an on-the-fly funding
attempt: it doesn't make sense to initiate it if our peer has not
activated the feature.
Instead of handling command responses and settlement in parallel (which
is a bit confusing), we stash settlements, process all command
responses, and then preocess all settlements.
This makes the flow a bit more strict (as modifications to tests show),
but it's easier to follow what the fsm does.
@t-bast
t-bast merged commit de42c8a into masterSep 25, 2024
@t-bast
t-bast deleted the on-the-fly-funding branch September 25, 2024 11:01
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@t-bast@pm47
, '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('^' + ".*" + ' Implement on-the-fly funding based on splicing and liquidity ads by t-bast · Pull Request #2861 · ACINQ/eclair · GitHub
Skip to content

Implement on-the-fly funding based on splicing and liquidity ads - #2861

Merged
t-bast merged 9 commits into
masterfrom
on-the-fly-funding
Sep 25, 2024
Merged

Implement on-the-fly funding based on splicing and liquidity ads#2861
t-bast merged 9 commits into
masterfrom
on-the-fly-funding

Conversation

@t-bast

@t-bastt-bast commented Jun 7, 2024

Copy link
Copy Markdown
Member

Implement the on-the-fly funding protocol specified in lightning/blips#36: when a payment cannot be relayed because of a liquidity issue, we notify our peer that we'd like to trigger on-the-fly funding if available. If available, we send a funding proposal (will_add_htlc) and keep track of its status.

Once a matching funding transaction is signed, we persist this funding attempt and wait for the additional liquidity to be available (once the channel is ready or the splice locked). We will then frequently try to relay the payment to get paid our liquidity fees. If the payment keeps getting rejected, or we cannot connect to our peer, we abandon the
payment when it reaches its CLTV expiry, which ensures that the upstream channels are not at risk.

When using on-the-fly funding, we use a single channel with our peer. If they try to open another channel while one is available, we reject their request and expect a splice instead.

This is best reviewed commit-by-commit: the bulk of the implementation is in the last commit, which contains some subtleties to correctly handle all edge cases (covered by the various unit tests).

@t-bast
t-bastforce-pushed the on-the-fly-funding branch 4 times, most recently from 789eef8 to 9d8eb99CompareJune 14, 2024 11:26
@t-bast
t-bastforce-pushed the on-the-fly-funding branch 5 times, most recently from 16a5191 to b340247CompareJune 25, 2024 07:00
@t-bast
t-bastforce-pushed the on-the-fly-funding branch 4 times, most recently from 55558aa to ce1d166CompareJuly 2, 2024 08:29
@t-bast
t-bastforce-pushed the on-the-fly-funding branch from ce1d166 to 64e447fCompareJuly 2, 2024 16:07
@pm47
pm47 self-requested a review July 4, 2024 14:06
@t-bast
t-bastforce-pushed the on-the-fly-funding branch 2 times, most recently from e704f28 to b95e3a1CompareJuly 8, 2024 09:56
@t-bast
t-bast marked this pull request as ready for review July 8, 2024 14:57
@t-bast
t-bastforce-pushed the on-the-fly-funding branch 2 times, most recently from 231f450 to 7dd2086CompareJuly 9, 2024 10:10
@t-bast
t-bastforce-pushed the on-the-fly-funding branch from 7dd2086 to 4312da7CompareJuly 9, 2024 15:04
@t-bast
t-bastforce-pushed the on-the-fly-funding branch from 4312da7 to 881bd40CompareJuly 17, 2024 13:37
@t-bast
t-bastforce-pushed the on-the-fly-funding branch from 881bd40 to 6d35c43CompareJuly 22, 2024 09:21
@t-bast
t-bastforce-pushed the on-the-fly-funding branch from 6d35c43 to 81ef78fCompareAugust 1, 2024 07:55
@t-bast
t-bastforce-pushed the on-the-fly-funding branch 5 times, most recently from f2973ad to 9f1ace1CompareSeptember 9, 2024 10:08
@t-bast
t-bastforce-pushed the on-the-fly-funding branch 5 times, most recently from 3f0c56d to 69014d2CompareSeptember 16, 2024 11:55
Comment threadeclair-core/src/main/scala/fr/acinq/eclair/io/Peer.scala Outdated
Comment threadeclair-core/src/main/scala/fr/acinq/eclair/payment/relay/NodeRelay.scala Outdated
Comment threadeclair-core/src/main/scala/fr/acinq/eclair/payment/relay/NodeRelay.scala Outdated
Add the (disabled by default) `on_the_fly_funding` feature bit and
codecs for the corresponding messages:
- `will_add_htlc`
- `will_fail_htlc`
- `will_fail_malformed_htlc`
- `cancel_on_the_fly_funding`
We also add a TLV to `update_add_htlc` to notify the recipient that we
relayed less data than what the onion encodes, in exchange for the fees
of the specified funding transaction.
We add a non-standard channel flag to `open_channel2` to allow wallets
to ask their peer to pay the commit tx fees, even when they're not the
channel opener. This is necessary for on-the-fly funding, until we can
move to 0-fee commit txs which will make it obsolete.
When an interactive-tx session is created for a liquidity purchase that
uses future HTLCs to pay fees, the initiator may not have enough funds
to honor the target feerate. We allow the transaction anyway, because
we want to get paid for the liquidity we're providing. If the feerate
is too low and the transaction doesn't confirm, we can double-spend it
if we need that liquidity elsewhere.
This commit adds the funding fee field to HTLCs, but never sets it.
We update a lot of test files, but there is no functional change.
Implement the on-the-fly funding protocol: when a payment cannot be
relayed because of a liquidity issue, we notify the `Peer` actor that
we'd like to trigger on-the-fly funding if available. If available, we
we send a funding proposal to our peer and keep track of its status.
Once a matching funding transaction is signed, we persist this funding
attempt and wait for the additional liquidity to be available (once the
channel is ready or the splice locked). We will then frequently try to
relay the payment to get paid our liquidity fees. If the payment keeps
getting rejected, or we cannot connect to our peer, we abandon the
payment when it reaches its CLTV expiry, which ensures that the upstream
channels are not at risk.
When using on-the-fly funding, we use a single channel with our peer.
If they try to open another channel while one is available, we reject
their request and expect a splice instead.
Similar to #2461 but for the non-initiator of a channel open.
We check the remote features before initiating an on-the-fly funding
attempt: it doesn't make sense to initiate it if our peer has not
activated the feature.
Instead of handling command responses and settlement in parallel (which
is a bit confusing), we stash settlements, process all command
responses, and then preocess all settlements.
This makes the flow a bit more strict (as modifications to tests show),
but it's easier to follow what the fsm does.
@t-bast
t-bast merged commit de42c8a into masterSep 25, 2024
@t-bast
t-bast deleted the on-the-fly-funding branch September 25, 2024 11:01
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@t-bast@pm47
, '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); } })(); })(); Implement on-the-fly funding based on splicing and liquidity ads by t-bast · Pull Request #2861 · ACINQ/eclair · GitHub
Skip to content

Implement on-the-fly funding based on splicing and liquidity ads - #2861

Merged
t-bast merged 9 commits into
masterfrom
on-the-fly-funding
Sep 25, 2024
Merged

Implement on-the-fly funding based on splicing and liquidity ads#2861
t-bast merged 9 commits into
masterfrom
on-the-fly-funding

Conversation

@t-bast

@t-bastt-bast commented Jun 7, 2024

Copy link
Copy Markdown
Member

Implement the on-the-fly funding protocol specified in lightning/blips#36: when a payment cannot be relayed because of a liquidity issue, we notify our peer that we'd like to trigger on-the-fly funding if available. If available, we send a funding proposal (will_add_htlc) and keep track of its status.

Once a matching funding transaction is signed, we persist this funding attempt and wait for the additional liquidity to be available (once the channel is ready or the splice locked). We will then frequently try to relay the payment to get paid our liquidity fees. If the payment keeps getting rejected, or we cannot connect to our peer, we abandon the
payment when it reaches its CLTV expiry, which ensures that the upstream channels are not at risk.

When using on-the-fly funding, we use a single channel with our peer. If they try to open another channel while one is available, we reject their request and expect a splice instead.

This is best reviewed commit-by-commit: the bulk of the implementation is in the last commit, which contains some subtleties to correctly handle all edge cases (covered by the various unit tests).

@t-bast
t-bastforce-pushed the on-the-fly-funding branch 4 times, most recently from 789eef8 to 9d8eb99CompareJune 14, 2024 11:26
@t-bast
t-bastforce-pushed the on-the-fly-funding branch 5 times, most recently from 16a5191 to b340247CompareJune 25, 2024 07:00
@t-bast
t-bastforce-pushed the on-the-fly-funding branch 4 times, most recently from 55558aa to ce1d166CompareJuly 2, 2024 08:29
@t-bast
t-bastforce-pushed the on-the-fly-funding branch from ce1d166 to 64e447fCompareJuly 2, 2024 16:07
@pm47
pm47 self-requested a review July 4, 2024 14:06
@t-bast
t-bastforce-pushed the on-the-fly-funding branch 2 times, most recently from e704f28 to b95e3a1CompareJuly 8, 2024 09:56
@t-bast
t-bast marked this pull request as ready for review July 8, 2024 14:57
@t-bast
t-bastforce-pushed the on-the-fly-funding branch 2 times, most recently from 231f450 to 7dd2086CompareJuly 9, 2024 10:10
@t-bast
t-bastforce-pushed the on-the-fly-funding branch from 7dd2086 to 4312da7CompareJuly 9, 2024 15:04
@t-bast
t-bastforce-pushed the on-the-fly-funding branch from 4312da7 to 881bd40CompareJuly 17, 2024 13:37
@t-bast
t-bastforce-pushed the on-the-fly-funding branch from 881bd40 to 6d35c43CompareJuly 22, 2024 09:21
@t-bast
t-bastforce-pushed the on-the-fly-funding branch from 6d35c43 to 81ef78fCompareAugust 1, 2024 07:55
@t-bast
t-bastforce-pushed the on-the-fly-funding branch 5 times, most recently from f2973ad to 9f1ace1CompareSeptember 9, 2024 10:08
@t-bast
t-bastforce-pushed the on-the-fly-funding branch 5 times, most recently from 3f0c56d to 69014d2CompareSeptember 16, 2024 11:55
Comment threadeclair-core/src/main/scala/fr/acinq/eclair/io/Peer.scala Outdated
Comment threadeclair-core/src/main/scala/fr/acinq/eclair/payment/relay/NodeRelay.scala Outdated
Comment threadeclair-core/src/main/scala/fr/acinq/eclair/payment/relay/NodeRelay.scala Outdated
Add the (disabled by default) `on_the_fly_funding` feature bit and
codecs for the corresponding messages:
- `will_add_htlc`
- `will_fail_htlc`
- `will_fail_malformed_htlc`
- `cancel_on_the_fly_funding`
We also add a TLV to `update_add_htlc` to notify the recipient that we
relayed less data than what the onion encodes, in exchange for the fees
of the specified funding transaction.
We add a non-standard channel flag to `open_channel2` to allow wallets
to ask their peer to pay the commit tx fees, even when they're not the
channel opener. This is necessary for on-the-fly funding, until we can
move to 0-fee commit txs which will make it obsolete.
When an interactive-tx session is created for a liquidity purchase that
uses future HTLCs to pay fees, the initiator may not have enough funds
to honor the target feerate. We allow the transaction anyway, because
we want to get paid for the liquidity we're providing. If the feerate
is too low and the transaction doesn't confirm, we can double-spend it
if we need that liquidity elsewhere.
This commit adds the funding fee field to HTLCs, but never sets it.
We update a lot of test files, but there is no functional change.
Implement the on-the-fly funding protocol: when a payment cannot be
relayed because of a liquidity issue, we notify the `Peer` actor that
we'd like to trigger on-the-fly funding if available. If available, we
we send a funding proposal to our peer and keep track of its status.
Once a matching funding transaction is signed, we persist this funding
attempt and wait for the additional liquidity to be available (once the
channel is ready or the splice locked). We will then frequently try to
relay the payment to get paid our liquidity fees. If the payment keeps
getting rejected, or we cannot connect to our peer, we abandon the
payment when it reaches its CLTV expiry, which ensures that the upstream
channels are not at risk.
When using on-the-fly funding, we use a single channel with our peer.
If they try to open another channel while one is available, we reject
their request and expect a splice instead.
Similar to #2461 but for the non-initiator of a channel open.
We check the remote features before initiating an on-the-fly funding
attempt: it doesn't make sense to initiate it if our peer has not
activated the feature.
Instead of handling command responses and settlement in parallel (which
is a bit confusing), we stash settlements, process all command
responses, and then preocess all settlements.
This makes the flow a bit more strict (as modifications to tests show),
but it's easier to follow what the fsm does.
@t-bast
t-bast merged commit de42c8a into masterSep 25, 2024
@t-bast
t-bast deleted the on-the-fly-funding branch September 25, 2024 11:01
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@t-bast@pm47