Let ChannelSigner set to_remote, to_local, htlc tx scriptpubkeys - #3454

Closed
tankyleo wants to merge 6 commits into
lightningdevkit:mainfrom
tankyleo:2024-12-signer-spks
Closed

Let ChannelSigner set to_remote, to_local, htlc tx scriptpubkeys#3454
tankyleo wants to merge 6 commits into
lightningdevkit:mainfrom
tankyleo:2024-12-signer-spks

Conversation

@tankyleo

@tankyleotankyleo commented Dec 10, 2024

Copy link
Copy Markdown
Contributor

See commit message for a description of this specific commit.

This begins work on allowing the customization of different outputs of the commitment transaction, in preparation for taproot channels and also to allow people to set the outputs to arbitrary scripts if they don't require compatibility with the formal LN spec.

This PR begins with the to_remote output, with the goal of illustrating the approach taken with a simple example.

If this approach is ok, I will next work on StaticPaymentOutputDescriptor, as it would need to be updated to handle the taproot / arbitrary scripts used in this output. I can do this work in this PR, or in a follow-up depending on your preference.

My approach is to ask the channel signers to do more work (but not more than that of most hardware wallets):

  • Set the appropriate SPK's for the different outputs of the commitment transaction.
  • Return the full witness to spend such an output (not just the signature); this is not shown here, but is the current plan for the to_local outputs in a justice scenario.

By putting scriptpubkey and witness construction behind the signer trait, we can have some parts of LDK be implemented in terms of scriptpubkeys and witnesses, and these parts can then remain the same across segwit, taproot, and arbitrary scripts.

Let me know what you think, thank you for your input.

cc @arik-so@TheBlueMatt

EDIT 2024-12-13

In cbac0e7 I apply the same approach to the to_local output of the commit tx, and in 72ca0a9 same approach to the htlc tx output.

EDIT 2024-12-15

In the last two commits, I apply the same approach to the to_local output of the commit tx, and to the htlc tx output.

I also apply the same approach to the to_local output of the commit tx, and to the htlc tx output later in the same patchset.

Instead of returning only the witness when punishing a revokeable output, I instead choose to ask the ChannelSigner to return a full transaction with the specified input finalized to punish the corresponding previous output. This is primarily to leave the possibility of a signer to customize how the sequence field of the input is set.

best_block: BestBlock, counterparty_node_id: PublicKey, channel_id: ChannelId,
) -> ChannelMonitor<Signer> {

keys.provide_channel_parameters(channel_parameters);

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I move the provide_channel_parameters call to here because there were some tests that built a ChannelMonitor without first calling provide_channel_parameters on the keys: Signer.

Further below in initial_commitment_signed, I delete the provide_channel_parameters call, as it is now called here.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

We now need to call provide_channel_parameters before ChannelMonitor::new because ChannelSigner::get_counterparty_payment_script assumes that provide_channel_parameters has already been called - see the doc for ChannelSigner::get_counterparty_payment_script.

let shutdown_script = context.shutdown_scriptpubkey.clone().map(|script| script.into_inner());
let mut monitor_signer = signer_provider.derive_channel_signer(context.channel_value_satoshis, context.channel_keys_id);
monitor_signer.provide_channel_parameters(&context.channel_transaction_parameters);
let monitor_signer = signer_provider.derive_channel_signer(context.channel_value_satoshis, context.channel_keys_id);

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

provide_channel_parameters is now called in ChannelMonitor::new, see reasoning above.

Comment threadlightning/src/ln/channel.rs Outdated
@tankyleo
tankyleoforce-pushed the 2024-12-signer-spks branch 2 times, most recently from 8dd569b to 9633310CompareDecember 11, 2024 02:28
@codecov

codecovBot commented Dec 11, 2024

Copy link
Copy Markdown

Codecov Report

Attention: Patch coverage is 97.61905% with 7 lines in your changes missing coverage. Please review.

Project coverage is 89.73%. Comparing base (1a8bf62) to head (0f0560a).
Report is 68 commits behind head on main.

Files with missing linesPatch %Lines
lightning/src/ln/chan_utils.rs95.45%2 Missing and 2 partials ⚠️
lightning/src/sign/mod.rs97.40%0 Missing and 2 partials ⚠️
lightning/src/chain/channelmonitor.rs97.22%1 Missing ⚠️
Additional details and impacted files
@@ Coverage Diff @@## main #3454 +/- ##
==========================================
- Coverage 89.74% 89.73% -0.02% 
==========================================
Files 130 130 Lines 107793 107909 +116 Branches 107793 107909 +116 ==========================================
+ Hits 96743 96836 +93 - Misses 8651 8672 +21 - Partials 2399 2401 +2 

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

@tankyleo
tankyleoforce-pushed the 2024-12-signer-spks branch 2 times, most recently from ccbcf98 to e12c3e8CompareDecember 11, 2024 03:22
@tnull

Copy link
Copy Markdown
Contributor

I'll have to review this more closely, but want to note that this will very likely conflict with (the currently stale) #3391, which we're in the process of rewriting. We should coordinate to see how to resolve this, i.e., which approach we should take (first) so you can lean on it for follow-up work.

@tankyleo

Copy link
Copy Markdown
ContributorAuthor

I'll have to review this more closely, but want to note that this will very likely conflict with (the currently stale) #3391, which we're in the process of rewriting. We should coordinate to see how to resolve this, i.e., which approach we should take (first) so you can lean on it for follow-up work.

Thank you for taking a look - I've made a first pass on 3391, and currently do not see any conflicts.

@tankyleotankyleo changed the title Let ChannelSigner set to_remote scriptpubkeyLet ChannelSigner set to_remote, to_local, htlc tx scriptpubkeysDec 14, 2024
This allows the `to_remote` output to easily be changed according to the
features of the channel, or the evolution of the LN specification.
`to_remote` could even be set to completely arbitrary scripts if
compatibility with the formal LN spec is not required.
Builders of `CommitmentTransaction` now ask a `ChannelSigner` for the
appropriate `to_remote` script to use, and then pass the script to the
`CommitmentTransaction` constructor.
External signers now provide the expected `to_remote` script to the
`verify` call of `CommitmentTransaction`.
Builds of `CommitmentTransaction` now query a `ChannelSigner` for the
script pubkey to use in the `to_remote` output of the commitment
transaction. So we need to overwrite the `ChannelTransactionParameters`
of a `ChannelSigner` anytime we want to build a new commitment
transaction with a different set of features.
This is feature is only used in tests, so we cfg-gate it behind the
test flag.
This allows the `to_local` output to easily be changed according to the
features of the channel, or the evolution of the LN specification.
`to_local` could even be set to completely arbitrary scripts if
compatibility with the formal LN spec is not required.
Builders of `CommitmentTransaction` now ask a `ChannelSigner` for the
appropriate `to_local` script pubkey to use, and then pass it to the
`CommitmentTransaction` constructor.
External signers now provide the expected `to_local` script pubkey to
the `verify` call of `CommitmentTransaction`.
This allows the htlc tx output to easily be changed according to the
features of the channel, or the evolution of the LN specification.
The output could even be set to completely arbitrary scripts if
compatibility with the formal LN spec is not required.
Builders of htlc transactions now ask a `ChannelSigner` for the
appropriate revokeable script pubkey to use, and then pass it to the
htlc transaction constructors.
All LN-Penalty channel signers need to be able to punish the
counterparty in case they broadcast an old state. In this commit, we
ask implementers of `ChannelSigner` to produce the full transaction with
the given input finalized to punish the corresponding previous output.
Consumers of the `ChannelSigner` trait can now be agnostic to the
specific scripts used in revokeable outputs.
We leave passing to the `ChannelSigner` all the previous `TxOut`'s
needed to produce valid schnorr signatures under BIP 341 spending rules
to a later patch.
@tankyleo

Copy link
Copy Markdown
ContributorAuthor

Close in favor of #3512

@tankyleotankyleo closed this Jan 8, 2025
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.

2 participants

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

Let ChannelSigner set to_remote, to_local, htlc tx scriptpubkeys - #3454

Closed
tankyleo wants to merge 6 commits into
lightningdevkit:mainfrom
tankyleo:2024-12-signer-spks
Closed

Let ChannelSigner set to_remote, to_local, htlc tx scriptpubkeys#3454
tankyleo wants to merge 6 commits into
lightningdevkit:mainfrom
tankyleo:2024-12-signer-spks

Conversation

@tankyleo

@tankyleotankyleo commented Dec 10, 2024

Copy link
Copy Markdown
Contributor

See commit message for a description of this specific commit.

This begins work on allowing the customization of different outputs of the commitment transaction, in preparation for taproot channels and also to allow people to set the outputs to arbitrary scripts if they don't require compatibility with the formal LN spec.

This PR begins with the to_remote output, with the goal of illustrating the approach taken with a simple example.

If this approach is ok, I will next work on StaticPaymentOutputDescriptor, as it would need to be updated to handle the taproot / arbitrary scripts used in this output. I can do this work in this PR, or in a follow-up depending on your preference.

My approach is to ask the channel signers to do more work (but not more than that of most hardware wallets):

  • Set the appropriate SPK's for the different outputs of the commitment transaction.
  • Return the full witness to spend such an output (not just the signature); this is not shown here, but is the current plan for the to_local outputs in a justice scenario.

By putting scriptpubkey and witness construction behind the signer trait, we can have some parts of LDK be implemented in terms of scriptpubkeys and witnesses, and these parts can then remain the same across segwit, taproot, and arbitrary scripts.

Let me know what you think, thank you for your input.

cc @arik-so@TheBlueMatt

EDIT 2024-12-13

In cbac0e7 I apply the same approach to the to_local output of the commit tx, and in 72ca0a9 same approach to the htlc tx output.

EDIT 2024-12-15

In the last two commits, I apply the same approach to the to_local output of the commit tx, and to the htlc tx output.

I also apply the same approach to the to_local output of the commit tx, and to the htlc tx output later in the same patchset.

Instead of returning only the witness when punishing a revokeable output, I instead choose to ask the ChannelSigner to return a full transaction with the specified input finalized to punish the corresponding previous output. This is primarily to leave the possibility of a signer to customize how the sequence field of the input is set.

best_block: BestBlock, counterparty_node_id: PublicKey, channel_id: ChannelId,
) -> ChannelMonitor<Signer> {

keys.provide_channel_parameters(channel_parameters);

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I move the provide_channel_parameters call to here because there were some tests that built a ChannelMonitor without first calling provide_channel_parameters on the keys: Signer.

Further below in initial_commitment_signed, I delete the provide_channel_parameters call, as it is now called here.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

We now need to call provide_channel_parameters before ChannelMonitor::new because ChannelSigner::get_counterparty_payment_script assumes that provide_channel_parameters has already been called - see the doc for ChannelSigner::get_counterparty_payment_script.

let shutdown_script = context.shutdown_scriptpubkey.clone().map(|script| script.into_inner());
let mut monitor_signer = signer_provider.derive_channel_signer(context.channel_value_satoshis, context.channel_keys_id);
monitor_signer.provide_channel_parameters(&context.channel_transaction_parameters);
let monitor_signer = signer_provider.derive_channel_signer(context.channel_value_satoshis, context.channel_keys_id);

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

provide_channel_parameters is now called in ChannelMonitor::new, see reasoning above.

Comment threadlightning/src/ln/channel.rs Outdated
@tankyleo
tankyleoforce-pushed the 2024-12-signer-spks branch 2 times, most recently from 8dd569b to 9633310CompareDecember 11, 2024 02:28
@codecov

codecovBot commented Dec 11, 2024

Copy link
Copy Markdown

Codecov Report

Attention: Patch coverage is 97.61905% with 7 lines in your changes missing coverage. Please review.

Project coverage is 89.73%. Comparing base (1a8bf62) to head (0f0560a).
Report is 68 commits behind head on main.

Files with missing linesPatch %Lines
lightning/src/ln/chan_utils.rs95.45%2 Missing and 2 partials ⚠️
lightning/src/sign/mod.rs97.40%0 Missing and 2 partials ⚠️
lightning/src/chain/channelmonitor.rs97.22%1 Missing ⚠️
Additional details and impacted files
@@ Coverage Diff @@## main #3454 +/- ##
==========================================
- Coverage 89.74% 89.73% -0.02% 
==========================================
Files 130 130 Lines 107793 107909 +116 Branches 107793 107909 +116 ==========================================
+ Hits 96743 96836 +93 - Misses 8651 8672 +21 - Partials 2399 2401 +2 

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

@tankyleo
tankyleoforce-pushed the 2024-12-signer-spks branch 2 times, most recently from ccbcf98 to e12c3e8CompareDecember 11, 2024 03:22
@tnull

Copy link
Copy Markdown
Contributor

I'll have to review this more closely, but want to note that this will very likely conflict with (the currently stale) #3391, which we're in the process of rewriting. We should coordinate to see how to resolve this, i.e., which approach we should take (first) so you can lean on it for follow-up work.

@tankyleo

Copy link
Copy Markdown
ContributorAuthor

I'll have to review this more closely, but want to note that this will very likely conflict with (the currently stale) #3391, which we're in the process of rewriting. We should coordinate to see how to resolve this, i.e., which approach we should take (first) so you can lean on it for follow-up work.

Thank you for taking a look - I've made a first pass on 3391, and currently do not see any conflicts.

@tankyleotankyleo changed the title Let ChannelSigner set to_remote scriptpubkeyLet ChannelSigner set to_remote, to_local, htlc tx scriptpubkeysDec 14, 2024
This allows the `to_remote` output to easily be changed according to the
features of the channel, or the evolution of the LN specification.
`to_remote` could even be set to completely arbitrary scripts if
compatibility with the formal LN spec is not required.
Builders of `CommitmentTransaction` now ask a `ChannelSigner` for the
appropriate `to_remote` script to use, and then pass the script to the
`CommitmentTransaction` constructor.
External signers now provide the expected `to_remote` script to the
`verify` call of `CommitmentTransaction`.
Builds of `CommitmentTransaction` now query a `ChannelSigner` for the
script pubkey to use in the `to_remote` output of the commitment
transaction. So we need to overwrite the `ChannelTransactionParameters`
of a `ChannelSigner` anytime we want to build a new commitment
transaction with a different set of features.
This is feature is only used in tests, so we cfg-gate it behind the
test flag.
This allows the `to_local` output to easily be changed according to the
features of the channel, or the evolution of the LN specification.
`to_local` could even be set to completely arbitrary scripts if
compatibility with the formal LN spec is not required.
Builders of `CommitmentTransaction` now ask a `ChannelSigner` for the
appropriate `to_local` script pubkey to use, and then pass it to the
`CommitmentTransaction` constructor.
External signers now provide the expected `to_local` script pubkey to
the `verify` call of `CommitmentTransaction`.
This allows the htlc tx output to easily be changed according to the
features of the channel, or the evolution of the LN specification.
The output could even be set to completely arbitrary scripts if
compatibility with the formal LN spec is not required.
Builders of htlc transactions now ask a `ChannelSigner` for the
appropriate revokeable script pubkey to use, and then pass it to the
htlc transaction constructors.
All LN-Penalty channel signers need to be able to punish the
counterparty in case they broadcast an old state. In this commit, we
ask implementers of `ChannelSigner` to produce the full transaction with
the given input finalized to punish the corresponding previous output.
Consumers of the `ChannelSigner` trait can now be agnostic to the
specific scripts used in revokeable outputs.
We leave passing to the `ChannelSigner` all the previous `TxOut`'s
needed to produce valid schnorr signatures under BIP 341 spending rules
to a later patch.
@tankyleo

Copy link
Copy Markdown
ContributorAuthor

Close in favor of #3512

@tankyleotankyleo closed this Jan 8, 2025
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.

2 participants

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

Let ChannelSigner set to_remote, to_local, htlc tx scriptpubkeys - #3454

Closed
tankyleo wants to merge 6 commits into
lightningdevkit:mainfrom
tankyleo:2024-12-signer-spks
Closed

Let ChannelSigner set to_remote, to_local, htlc tx scriptpubkeys#3454
tankyleo wants to merge 6 commits into
lightningdevkit:mainfrom
tankyleo:2024-12-signer-spks

Conversation

@tankyleo

@tankyleotankyleo commented Dec 10, 2024

Copy link
Copy Markdown
Contributor

See commit message for a description of this specific commit.

This begins work on allowing the customization of different outputs of the commitment transaction, in preparation for taproot channels and also to allow people to set the outputs to arbitrary scripts if they don't require compatibility with the formal LN spec.

This PR begins with the to_remote output, with the goal of illustrating the approach taken with a simple example.

If this approach is ok, I will next work on StaticPaymentOutputDescriptor, as it would need to be updated to handle the taproot / arbitrary scripts used in this output. I can do this work in this PR, or in a follow-up depending on your preference.

My approach is to ask the channel signers to do more work (but not more than that of most hardware wallets):

  • Set the appropriate SPK's for the different outputs of the commitment transaction.
  • Return the full witness to spend such an output (not just the signature); this is not shown here, but is the current plan for the to_local outputs in a justice scenario.

By putting scriptpubkey and witness construction behind the signer trait, we can have some parts of LDK be implemented in terms of scriptpubkeys and witnesses, and these parts can then remain the same across segwit, taproot, and arbitrary scripts.

Let me know what you think, thank you for your input.

cc @arik-so@TheBlueMatt

EDIT 2024-12-13

In cbac0e7 I apply the same approach to the to_local output of the commit tx, and in 72ca0a9 same approach to the htlc tx output.

EDIT 2024-12-15

In the last two commits, I apply the same approach to the to_local output of the commit tx, and to the htlc tx output.

I also apply the same approach to the to_local output of the commit tx, and to the htlc tx output later in the same patchset.

Instead of returning only the witness when punishing a revokeable output, I instead choose to ask the ChannelSigner to return a full transaction with the specified input finalized to punish the corresponding previous output. This is primarily to leave the possibility of a signer to customize how the sequence field of the input is set.

best_block: BestBlock, counterparty_node_id: PublicKey, channel_id: ChannelId,
) -> ChannelMonitor<Signer> {

keys.provide_channel_parameters(channel_parameters);

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I move the provide_channel_parameters call to here because there were some tests that built a ChannelMonitor without first calling provide_channel_parameters on the keys: Signer.

Further below in initial_commitment_signed, I delete the provide_channel_parameters call, as it is now called here.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

We now need to call provide_channel_parameters before ChannelMonitor::new because ChannelSigner::get_counterparty_payment_script assumes that provide_channel_parameters has already been called - see the doc for ChannelSigner::get_counterparty_payment_script.

let shutdown_script = context.shutdown_scriptpubkey.clone().map(|script| script.into_inner());
let mut monitor_signer = signer_provider.derive_channel_signer(context.channel_value_satoshis, context.channel_keys_id);
monitor_signer.provide_channel_parameters(&context.channel_transaction_parameters);
let monitor_signer = signer_provider.derive_channel_signer(context.channel_value_satoshis, context.channel_keys_id);

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

provide_channel_parameters is now called in ChannelMonitor::new, see reasoning above.

Comment threadlightning/src/ln/channel.rs Outdated
@tankyleo
tankyleoforce-pushed the 2024-12-signer-spks branch 2 times, most recently from 8dd569b to 9633310CompareDecember 11, 2024 02:28
@codecov

codecovBot commented Dec 11, 2024

Copy link
Copy Markdown

Codecov Report

Attention: Patch coverage is 97.61905% with 7 lines in your changes missing coverage. Please review.

Project coverage is 89.73%. Comparing base (1a8bf62) to head (0f0560a).
Report is 68 commits behind head on main.

Files with missing linesPatch %Lines
lightning/src/ln/chan_utils.rs95.45%2 Missing and 2 partials ⚠️
lightning/src/sign/mod.rs97.40%0 Missing and 2 partials ⚠️
lightning/src/chain/channelmonitor.rs97.22%1 Missing ⚠️
Additional details and impacted files
@@ Coverage Diff @@## main #3454 +/- ##
==========================================
- Coverage 89.74% 89.73% -0.02% 
==========================================
Files 130 130 Lines 107793 107909 +116 Branches 107793 107909 +116 ==========================================
+ Hits 96743 96836 +93 - Misses 8651 8672 +21 - Partials 2399 2401 +2 

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

@tankyleo
tankyleoforce-pushed the 2024-12-signer-spks branch 2 times, most recently from ccbcf98 to e12c3e8CompareDecember 11, 2024 03:22
@tnull

Copy link
Copy Markdown
Contributor

I'll have to review this more closely, but want to note that this will very likely conflict with (the currently stale) #3391, which we're in the process of rewriting. We should coordinate to see how to resolve this, i.e., which approach we should take (first) so you can lean on it for follow-up work.

@tankyleo

Copy link
Copy Markdown
ContributorAuthor

I'll have to review this more closely, but want to note that this will very likely conflict with (the currently stale) #3391, which we're in the process of rewriting. We should coordinate to see how to resolve this, i.e., which approach we should take (first) so you can lean on it for follow-up work.

Thank you for taking a look - I've made a first pass on 3391, and currently do not see any conflicts.

@tankyleotankyleo changed the title Let ChannelSigner set to_remote scriptpubkeyLet ChannelSigner set to_remote, to_local, htlc tx scriptpubkeysDec 14, 2024
This allows the `to_remote` output to easily be changed according to the
features of the channel, or the evolution of the LN specification.
`to_remote` could even be set to completely arbitrary scripts if
compatibility with the formal LN spec is not required.
Builders of `CommitmentTransaction` now ask a `ChannelSigner` for the
appropriate `to_remote` script to use, and then pass the script to the
`CommitmentTransaction` constructor.
External signers now provide the expected `to_remote` script to the
`verify` call of `CommitmentTransaction`.
Builds of `CommitmentTransaction` now query a `ChannelSigner` for the
script pubkey to use in the `to_remote` output of the commitment
transaction. So we need to overwrite the `ChannelTransactionParameters`
of a `ChannelSigner` anytime we want to build a new commitment
transaction with a different set of features.
This is feature is only used in tests, so we cfg-gate it behind the
test flag.
This allows the `to_local` output to easily be changed according to the
features of the channel, or the evolution of the LN specification.
`to_local` could even be set to completely arbitrary scripts if
compatibility with the formal LN spec is not required.
Builders of `CommitmentTransaction` now ask a `ChannelSigner` for the
appropriate `to_local` script pubkey to use, and then pass it to the
`CommitmentTransaction` constructor.
External signers now provide the expected `to_local` script pubkey to
the `verify` call of `CommitmentTransaction`.
This allows the htlc tx output to easily be changed according to the
features of the channel, or the evolution of the LN specification.
The output could even be set to completely arbitrary scripts if
compatibility with the formal LN spec is not required.
Builders of htlc transactions now ask a `ChannelSigner` for the
appropriate revokeable script pubkey to use, and then pass it to the
htlc transaction constructors.
All LN-Penalty channel signers need to be able to punish the
counterparty in case they broadcast an old state. In this commit, we
ask implementers of `ChannelSigner` to produce the full transaction with
the given input finalized to punish the corresponding previous output.
Consumers of the `ChannelSigner` trait can now be agnostic to the
specific scripts used in revokeable outputs.
We leave passing to the `ChannelSigner` all the previous `TxOut`'s
needed to produce valid schnorr signatures under BIP 341 spending rules
to a later patch.
@tankyleo

Copy link
Copy Markdown
ContributorAuthor

Close in favor of #3512

@tankyleotankyleo closed this Jan 8, 2025
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.

2 participants

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

Let ChannelSigner set to_remote, to_local, htlc tx scriptpubkeys - #3454

Closed
tankyleo wants to merge 6 commits into
lightningdevkit:mainfrom
tankyleo:2024-12-signer-spks
Closed

Let ChannelSigner set to_remote, to_local, htlc tx scriptpubkeys#3454
tankyleo wants to merge 6 commits into
lightningdevkit:mainfrom
tankyleo:2024-12-signer-spks

Conversation

@tankyleo

@tankyleotankyleo commented Dec 10, 2024

Copy link
Copy Markdown
Contributor

See commit message for a description of this specific commit.

This begins work on allowing the customization of different outputs of the commitment transaction, in preparation for taproot channels and also to allow people to set the outputs to arbitrary scripts if they don't require compatibility with the formal LN spec.

This PR begins with the to_remote output, with the goal of illustrating the approach taken with a simple example.

If this approach is ok, I will next work on StaticPaymentOutputDescriptor, as it would need to be updated to handle the taproot / arbitrary scripts used in this output. I can do this work in this PR, or in a follow-up depending on your preference.

My approach is to ask the channel signers to do more work (but not more than that of most hardware wallets):

  • Set the appropriate SPK's for the different outputs of the commitment transaction.
  • Return the full witness to spend such an output (not just the signature); this is not shown here, but is the current plan for the to_local outputs in a justice scenario.

By putting scriptpubkey and witness construction behind the signer trait, we can have some parts of LDK be implemented in terms of scriptpubkeys and witnesses, and these parts can then remain the same across segwit, taproot, and arbitrary scripts.

Let me know what you think, thank you for your input.

cc @arik-so@TheBlueMatt

EDIT 2024-12-13

In cbac0e7 I apply the same approach to the to_local output of the commit tx, and in 72ca0a9 same approach to the htlc tx output.

EDIT 2024-12-15

In the last two commits, I apply the same approach to the to_local output of the commit tx, and to the htlc tx output.

I also apply the same approach to the to_local output of the commit tx, and to the htlc tx output later in the same patchset.

Instead of returning only the witness when punishing a revokeable output, I instead choose to ask the ChannelSigner to return a full transaction with the specified input finalized to punish the corresponding previous output. This is primarily to leave the possibility of a signer to customize how the sequence field of the input is set.

best_block: BestBlock, counterparty_node_id: PublicKey, channel_id: ChannelId,
) -> ChannelMonitor<Signer> {

keys.provide_channel_parameters(channel_parameters);

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I move the provide_channel_parameters call to here because there were some tests that built a ChannelMonitor without first calling provide_channel_parameters on the keys: Signer.

Further below in initial_commitment_signed, I delete the provide_channel_parameters call, as it is now called here.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

We now need to call provide_channel_parameters before ChannelMonitor::new because ChannelSigner::get_counterparty_payment_script assumes that provide_channel_parameters has already been called - see the doc for ChannelSigner::get_counterparty_payment_script.

let shutdown_script = context.shutdown_scriptpubkey.clone().map(|script| script.into_inner());
let mut monitor_signer = signer_provider.derive_channel_signer(context.channel_value_satoshis, context.channel_keys_id);
monitor_signer.provide_channel_parameters(&context.channel_transaction_parameters);
let monitor_signer = signer_provider.derive_channel_signer(context.channel_value_satoshis, context.channel_keys_id);

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

provide_channel_parameters is now called in ChannelMonitor::new, see reasoning above.

Comment threadlightning/src/ln/channel.rs Outdated
@tankyleo
tankyleoforce-pushed the 2024-12-signer-spks branch 2 times, most recently from 8dd569b to 9633310CompareDecember 11, 2024 02:28
@codecov

codecovBot commented Dec 11, 2024

Copy link
Copy Markdown

Codecov Report

Attention: Patch coverage is 97.61905% with 7 lines in your changes missing coverage. Please review.

Project coverage is 89.73%. Comparing base (1a8bf62) to head (0f0560a).
Report is 68 commits behind head on main.

Files with missing linesPatch %Lines
lightning/src/ln/chan_utils.rs95.45%2 Missing and 2 partials ⚠️
lightning/src/sign/mod.rs97.40%0 Missing and 2 partials ⚠️
lightning/src/chain/channelmonitor.rs97.22%1 Missing ⚠️
Additional details and impacted files
@@ Coverage Diff @@## main #3454 +/- ##
==========================================
- Coverage 89.74% 89.73% -0.02% 
==========================================
Files 130 130 Lines 107793 107909 +116 Branches 107793 107909 +116 ==========================================
+ Hits 96743 96836 +93 - Misses 8651 8672 +21 - Partials 2399 2401 +2 

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

@tankyleo
tankyleoforce-pushed the 2024-12-signer-spks branch 2 times, most recently from ccbcf98 to e12c3e8CompareDecember 11, 2024 03:22
@tnull

Copy link
Copy Markdown
Contributor

I'll have to review this more closely, but want to note that this will very likely conflict with (the currently stale) #3391, which we're in the process of rewriting. We should coordinate to see how to resolve this, i.e., which approach we should take (first) so you can lean on it for follow-up work.

@tankyleo

Copy link
Copy Markdown
ContributorAuthor

I'll have to review this more closely, but want to note that this will very likely conflict with (the currently stale) #3391, which we're in the process of rewriting. We should coordinate to see how to resolve this, i.e., which approach we should take (first) so you can lean on it for follow-up work.

Thank you for taking a look - I've made a first pass on 3391, and currently do not see any conflicts.

@tankyleotankyleo changed the title Let ChannelSigner set to_remote scriptpubkeyLet ChannelSigner set to_remote, to_local, htlc tx scriptpubkeysDec 14, 2024
This allows the `to_remote` output to easily be changed according to the
features of the channel, or the evolution of the LN specification.
`to_remote` could even be set to completely arbitrary scripts if
compatibility with the formal LN spec is not required.
Builders of `CommitmentTransaction` now ask a `ChannelSigner` for the
appropriate `to_remote` script to use, and then pass the script to the
`CommitmentTransaction` constructor.
External signers now provide the expected `to_remote` script to the
`verify` call of `CommitmentTransaction`.
Builds of `CommitmentTransaction` now query a `ChannelSigner` for the
script pubkey to use in the `to_remote` output of the commitment
transaction. So we need to overwrite the `ChannelTransactionParameters`
of a `ChannelSigner` anytime we want to build a new commitment
transaction with a different set of features.
This is feature is only used in tests, so we cfg-gate it behind the
test flag.
This allows the `to_local` output to easily be changed according to the
features of the channel, or the evolution of the LN specification.
`to_local` could even be set to completely arbitrary scripts if
compatibility with the formal LN spec is not required.
Builders of `CommitmentTransaction` now ask a `ChannelSigner` for the
appropriate `to_local` script pubkey to use, and then pass it to the
`CommitmentTransaction` constructor.
External signers now provide the expected `to_local` script pubkey to
the `verify` call of `CommitmentTransaction`.
This allows the htlc tx output to easily be changed according to the
features of the channel, or the evolution of the LN specification.
The output could even be set to completely arbitrary scripts if
compatibility with the formal LN spec is not required.
Builders of htlc transactions now ask a `ChannelSigner` for the
appropriate revokeable script pubkey to use, and then pass it to the
htlc transaction constructors.
All LN-Penalty channel signers need to be able to punish the
counterparty in case they broadcast an old state. In this commit, we
ask implementers of `ChannelSigner` to produce the full transaction with
the given input finalized to punish the corresponding previous output.
Consumers of the `ChannelSigner` trait can now be agnostic to the
specific scripts used in revokeable outputs.
We leave passing to the `ChannelSigner` all the previous `TxOut`'s
needed to produce valid schnorr signatures under BIP 341 spending rules
to a later patch.
@tankyleo

Copy link
Copy Markdown
ContributorAuthor

Close in favor of #3512

@tankyleotankyleo closed this Jan 8, 2025
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.

2 participants

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

Let ChannelSigner set to_remote, to_local, htlc tx scriptpubkeys - #3454

Closed
tankyleo wants to merge 6 commits into
lightningdevkit:mainfrom
tankyleo:2024-12-signer-spks
Closed

Let ChannelSigner set to_remote, to_local, htlc tx scriptpubkeys#3454
tankyleo wants to merge 6 commits into
lightningdevkit:mainfrom
tankyleo:2024-12-signer-spks

Conversation

@tankyleo

@tankyleotankyleo commented Dec 10, 2024

Copy link
Copy Markdown
Contributor

See commit message for a description of this specific commit.

This begins work on allowing the customization of different outputs of the commitment transaction, in preparation for taproot channels and also to allow people to set the outputs to arbitrary scripts if they don't require compatibility with the formal LN spec.

This PR begins with the to_remote output, with the goal of illustrating the approach taken with a simple example.

If this approach is ok, I will next work on StaticPaymentOutputDescriptor, as it would need to be updated to handle the taproot / arbitrary scripts used in this output. I can do this work in this PR, or in a follow-up depending on your preference.

My approach is to ask the channel signers to do more work (but not more than that of most hardware wallets):

  • Set the appropriate SPK's for the different outputs of the commitment transaction.
  • Return the full witness to spend such an output (not just the signature); this is not shown here, but is the current plan for the to_local outputs in a justice scenario.

By putting scriptpubkey and witness construction behind the signer trait, we can have some parts of LDK be implemented in terms of scriptpubkeys and witnesses, and these parts can then remain the same across segwit, taproot, and arbitrary scripts.

Let me know what you think, thank you for your input.

cc @arik-so@TheBlueMatt

EDIT 2024-12-13

In cbac0e7 I apply the same approach to the to_local output of the commit tx, and in 72ca0a9 same approach to the htlc tx output.

EDIT 2024-12-15

In the last two commits, I apply the same approach to the to_local output of the commit tx, and to the htlc tx output.

I also apply the same approach to the to_local output of the commit tx, and to the htlc tx output later in the same patchset.

Instead of returning only the witness when punishing a revokeable output, I instead choose to ask the ChannelSigner to return a full transaction with the specified input finalized to punish the corresponding previous output. This is primarily to leave the possibility of a signer to customize how the sequence field of the input is set.

best_block: BestBlock, counterparty_node_id: PublicKey, channel_id: ChannelId,
) -> ChannelMonitor<Signer> {

keys.provide_channel_parameters(channel_parameters);

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I move the provide_channel_parameters call to here because there were some tests that built a ChannelMonitor without first calling provide_channel_parameters on the keys: Signer.

Further below in initial_commitment_signed, I delete the provide_channel_parameters call, as it is now called here.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

We now need to call provide_channel_parameters before ChannelMonitor::new because ChannelSigner::get_counterparty_payment_script assumes that provide_channel_parameters has already been called - see the doc for ChannelSigner::get_counterparty_payment_script.

let shutdown_script = context.shutdown_scriptpubkey.clone().map(|script| script.into_inner());
let mut monitor_signer = signer_provider.derive_channel_signer(context.channel_value_satoshis, context.channel_keys_id);
monitor_signer.provide_channel_parameters(&context.channel_transaction_parameters);
let monitor_signer = signer_provider.derive_channel_signer(context.channel_value_satoshis, context.channel_keys_id);

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

provide_channel_parameters is now called in ChannelMonitor::new, see reasoning above.

Comment threadlightning/src/ln/channel.rs Outdated
@tankyleo
tankyleoforce-pushed the 2024-12-signer-spks branch 2 times, most recently from 8dd569b to 9633310CompareDecember 11, 2024 02:28
@codecov

codecovBot commented Dec 11, 2024

Copy link
Copy Markdown

Codecov Report

Attention: Patch coverage is 97.61905% with 7 lines in your changes missing coverage. Please review.

Project coverage is 89.73%. Comparing base (1a8bf62) to head (0f0560a).
Report is 68 commits behind head on main.

Files with missing linesPatch %Lines
lightning/src/ln/chan_utils.rs95.45%2 Missing and 2 partials ⚠️
lightning/src/sign/mod.rs97.40%0 Missing and 2 partials ⚠️
lightning/src/chain/channelmonitor.rs97.22%1 Missing ⚠️
Additional details and impacted files
@@ Coverage Diff @@## main #3454 +/- ##
==========================================
- Coverage 89.74% 89.73% -0.02% 
==========================================
Files 130 130 Lines 107793 107909 +116 Branches 107793 107909 +116 ==========================================
+ Hits 96743 96836 +93 - Misses 8651 8672 +21 - Partials 2399 2401 +2 

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

@tankyleo
tankyleoforce-pushed the 2024-12-signer-spks branch 2 times, most recently from ccbcf98 to e12c3e8CompareDecember 11, 2024 03:22
@tnull

Copy link
Copy Markdown
Contributor

I'll have to review this more closely, but want to note that this will very likely conflict with (the currently stale) #3391, which we're in the process of rewriting. We should coordinate to see how to resolve this, i.e., which approach we should take (first) so you can lean on it for follow-up work.

@tankyleo

Copy link
Copy Markdown
ContributorAuthor

I'll have to review this more closely, but want to note that this will very likely conflict with (the currently stale) #3391, which we're in the process of rewriting. We should coordinate to see how to resolve this, i.e., which approach we should take (first) so you can lean on it for follow-up work.

Thank you for taking a look - I've made a first pass on 3391, and currently do not see any conflicts.

@tankyleotankyleo changed the title Let ChannelSigner set to_remote scriptpubkeyLet ChannelSigner set to_remote, to_local, htlc tx scriptpubkeysDec 14, 2024
This allows the `to_remote` output to easily be changed according to the
features of the channel, or the evolution of the LN specification.
`to_remote` could even be set to completely arbitrary scripts if
compatibility with the formal LN spec is not required.
Builders of `CommitmentTransaction` now ask a `ChannelSigner` for the
appropriate `to_remote` script to use, and then pass the script to the
`CommitmentTransaction` constructor.
External signers now provide the expected `to_remote` script to the
`verify` call of `CommitmentTransaction`.
Builds of `CommitmentTransaction` now query a `ChannelSigner` for the
script pubkey to use in the `to_remote` output of the commitment
transaction. So we need to overwrite the `ChannelTransactionParameters`
of a `ChannelSigner` anytime we want to build a new commitment
transaction with a different set of features.
This is feature is only used in tests, so we cfg-gate it behind the
test flag.
This allows the `to_local` output to easily be changed according to the
features of the channel, or the evolution of the LN specification.
`to_local` could even be set to completely arbitrary scripts if
compatibility with the formal LN spec is not required.
Builders of `CommitmentTransaction` now ask a `ChannelSigner` for the
appropriate `to_local` script pubkey to use, and then pass it to the
`CommitmentTransaction` constructor.
External signers now provide the expected `to_local` script pubkey to
the `verify` call of `CommitmentTransaction`.
This allows the htlc tx output to easily be changed according to the
features of the channel, or the evolution of the LN specification.
The output could even be set to completely arbitrary scripts if
compatibility with the formal LN spec is not required.
Builders of htlc transactions now ask a `ChannelSigner` for the
appropriate revokeable script pubkey to use, and then pass it to the
htlc transaction constructors.
All LN-Penalty channel signers need to be able to punish the
counterparty in case they broadcast an old state. In this commit, we
ask implementers of `ChannelSigner` to produce the full transaction with
the given input finalized to punish the corresponding previous output.
Consumers of the `ChannelSigner` trait can now be agnostic to the
specific scripts used in revokeable outputs.
We leave passing to the `ChannelSigner` all the previous `TxOut`'s
needed to produce valid schnorr signatures under BIP 341 spending rules
to a later patch.
@tankyleo

Copy link
Copy Markdown
ContributorAuthor

Close in favor of #3512

@tankyleotankyleo closed this Jan 8, 2025
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.

2 participants

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

Let ChannelSigner set to_remote, to_local, htlc tx scriptpubkeys - #3454

Closed
tankyleo wants to merge 6 commits into
lightningdevkit:mainfrom
tankyleo:2024-12-signer-spks
Closed

Let ChannelSigner set to_remote, to_local, htlc tx scriptpubkeys#3454
tankyleo wants to merge 6 commits into
lightningdevkit:mainfrom
tankyleo:2024-12-signer-spks

Conversation

@tankyleo

@tankyleotankyleo commented Dec 10, 2024

Copy link
Copy Markdown
Contributor

See commit message for a description of this specific commit.

This begins work on allowing the customization of different outputs of the commitment transaction, in preparation for taproot channels and also to allow people to set the outputs to arbitrary scripts if they don't require compatibility with the formal LN spec.

This PR begins with the to_remote output, with the goal of illustrating the approach taken with a simple example.

If this approach is ok, I will next work on StaticPaymentOutputDescriptor, as it would need to be updated to handle the taproot / arbitrary scripts used in this output. I can do this work in this PR, or in a follow-up depending on your preference.

My approach is to ask the channel signers to do more work (but not more than that of most hardware wallets):

  • Set the appropriate SPK's for the different outputs of the commitment transaction.
  • Return the full witness to spend such an output (not just the signature); this is not shown here, but is the current plan for the to_local outputs in a justice scenario.

By putting scriptpubkey and witness construction behind the signer trait, we can have some parts of LDK be implemented in terms of scriptpubkeys and witnesses, and these parts can then remain the same across segwit, taproot, and arbitrary scripts.

Let me know what you think, thank you for your input.

cc @arik-so@TheBlueMatt

EDIT 2024-12-13

In cbac0e7 I apply the same approach to the to_local output of the commit tx, and in 72ca0a9 same approach to the htlc tx output.

EDIT 2024-12-15

In the last two commits, I apply the same approach to the to_local output of the commit tx, and to the htlc tx output.

I also apply the same approach to the to_local output of the commit tx, and to the htlc tx output later in the same patchset.

Instead of returning only the witness when punishing a revokeable output, I instead choose to ask the ChannelSigner to return a full transaction with the specified input finalized to punish the corresponding previous output. This is primarily to leave the possibility of a signer to customize how the sequence field of the input is set.

best_block: BestBlock, counterparty_node_id: PublicKey, channel_id: ChannelId,
) -> ChannelMonitor<Signer> {

keys.provide_channel_parameters(channel_parameters);

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I move the provide_channel_parameters call to here because there were some tests that built a ChannelMonitor without first calling provide_channel_parameters on the keys: Signer.

Further below in initial_commitment_signed, I delete the provide_channel_parameters call, as it is now called here.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

We now need to call provide_channel_parameters before ChannelMonitor::new because ChannelSigner::get_counterparty_payment_script assumes that provide_channel_parameters has already been called - see the doc for ChannelSigner::get_counterparty_payment_script.

let shutdown_script = context.shutdown_scriptpubkey.clone().map(|script| script.into_inner());
let mut monitor_signer = signer_provider.derive_channel_signer(context.channel_value_satoshis, context.channel_keys_id);
monitor_signer.provide_channel_parameters(&context.channel_transaction_parameters);
let monitor_signer = signer_provider.derive_channel_signer(context.channel_value_satoshis, context.channel_keys_id);

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

provide_channel_parameters is now called in ChannelMonitor::new, see reasoning above.

Comment threadlightning/src/ln/channel.rs Outdated
@tankyleo
tankyleoforce-pushed the 2024-12-signer-spks branch 2 times, most recently from 8dd569b to 9633310CompareDecember 11, 2024 02:28
@codecov

codecovBot commented Dec 11, 2024

Copy link
Copy Markdown

Codecov Report

Attention: Patch coverage is 97.61905% with 7 lines in your changes missing coverage. Please review.

Project coverage is 89.73%. Comparing base (1a8bf62) to head (0f0560a).
Report is 68 commits behind head on main.

Files with missing linesPatch %Lines
lightning/src/ln/chan_utils.rs95.45%2 Missing and 2 partials ⚠️
lightning/src/sign/mod.rs97.40%0 Missing and 2 partials ⚠️
lightning/src/chain/channelmonitor.rs97.22%1 Missing ⚠️
Additional details and impacted files
@@ Coverage Diff @@## main #3454 +/- ##
==========================================
- Coverage 89.74% 89.73% -0.02% 
==========================================
Files 130 130 Lines 107793 107909 +116 Branches 107793 107909 +116 ==========================================
+ Hits 96743 96836 +93 - Misses 8651 8672 +21 - Partials 2399 2401 +2 

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

@tankyleo
tankyleoforce-pushed the 2024-12-signer-spks branch 2 times, most recently from ccbcf98 to e12c3e8CompareDecember 11, 2024 03:22
@tnull

Copy link
Copy Markdown
Contributor

I'll have to review this more closely, but want to note that this will very likely conflict with (the currently stale) #3391, which we're in the process of rewriting. We should coordinate to see how to resolve this, i.e., which approach we should take (first) so you can lean on it for follow-up work.

@tankyleo

Copy link
Copy Markdown
ContributorAuthor

I'll have to review this more closely, but want to note that this will very likely conflict with (the currently stale) #3391, which we're in the process of rewriting. We should coordinate to see how to resolve this, i.e., which approach we should take (first) so you can lean on it for follow-up work.

Thank you for taking a look - I've made a first pass on 3391, and currently do not see any conflicts.

@tankyleotankyleo changed the title Let ChannelSigner set to_remote scriptpubkeyLet ChannelSigner set to_remote, to_local, htlc tx scriptpubkeysDec 14, 2024
This allows the `to_remote` output to easily be changed according to the
features of the channel, or the evolution of the LN specification.
`to_remote` could even be set to completely arbitrary scripts if
compatibility with the formal LN spec is not required.
Builders of `CommitmentTransaction` now ask a `ChannelSigner` for the
appropriate `to_remote` script to use, and then pass the script to the
`CommitmentTransaction` constructor.
External signers now provide the expected `to_remote` script to the
`verify` call of `CommitmentTransaction`.
Builds of `CommitmentTransaction` now query a `ChannelSigner` for the
script pubkey to use in the `to_remote` output of the commitment
transaction. So we need to overwrite the `ChannelTransactionParameters`
of a `ChannelSigner` anytime we want to build a new commitment
transaction with a different set of features.
This is feature is only used in tests, so we cfg-gate it behind the
test flag.
This allows the `to_local` output to easily be changed according to the
features of the channel, or the evolution of the LN specification.
`to_local` could even be set to completely arbitrary scripts if
compatibility with the formal LN spec is not required.
Builders of `CommitmentTransaction` now ask a `ChannelSigner` for the
appropriate `to_local` script pubkey to use, and then pass it to the
`CommitmentTransaction` constructor.
External signers now provide the expected `to_local` script pubkey to
the `verify` call of `CommitmentTransaction`.
This allows the htlc tx output to easily be changed according to the
features of the channel, or the evolution of the LN specification.
The output could even be set to completely arbitrary scripts if
compatibility with the formal LN spec is not required.
Builders of htlc transactions now ask a `ChannelSigner` for the
appropriate revokeable script pubkey to use, and then pass it to the
htlc transaction constructors.
All LN-Penalty channel signers need to be able to punish the
counterparty in case they broadcast an old state. In this commit, we
ask implementers of `ChannelSigner` to produce the full transaction with
the given input finalized to punish the corresponding previous output.
Consumers of the `ChannelSigner` trait can now be agnostic to the
specific scripts used in revokeable outputs.
We leave passing to the `ChannelSigner` all the previous `TxOut`'s
needed to produce valid schnorr signatures under BIP 341 spending rules
to a later patch.
@tankyleo

Copy link
Copy Markdown
ContributorAuthor

Close in favor of #3512

@tankyleotankyleo closed this Jan 8, 2025
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.

2 participants

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

Let ChannelSigner set to_remote, to_local, htlc tx scriptpubkeys - #3454

Closed
tankyleo wants to merge 6 commits into
lightningdevkit:mainfrom
tankyleo:2024-12-signer-spks
Closed

Let ChannelSigner set to_remote, to_local, htlc tx scriptpubkeys#3454
tankyleo wants to merge 6 commits into
lightningdevkit:mainfrom
tankyleo:2024-12-signer-spks

Conversation

@tankyleo

@tankyleotankyleo commented Dec 10, 2024

Copy link
Copy Markdown
Contributor

See commit message for a description of this specific commit.

This begins work on allowing the customization of different outputs of the commitment transaction, in preparation for taproot channels and also to allow people to set the outputs to arbitrary scripts if they don't require compatibility with the formal LN spec.

This PR begins with the to_remote output, with the goal of illustrating the approach taken with a simple example.

If this approach is ok, I will next work on StaticPaymentOutputDescriptor, as it would need to be updated to handle the taproot / arbitrary scripts used in this output. I can do this work in this PR, or in a follow-up depending on your preference.

My approach is to ask the channel signers to do more work (but not more than that of most hardware wallets):

  • Set the appropriate SPK's for the different outputs of the commitment transaction.
  • Return the full witness to spend such an output (not just the signature); this is not shown here, but is the current plan for the to_local outputs in a justice scenario.

By putting scriptpubkey and witness construction behind the signer trait, we can have some parts of LDK be implemented in terms of scriptpubkeys and witnesses, and these parts can then remain the same across segwit, taproot, and arbitrary scripts.

Let me know what you think, thank you for your input.

cc @arik-so@TheBlueMatt

EDIT 2024-12-13

In cbac0e7 I apply the same approach to the to_local output of the commit tx, and in 72ca0a9 same approach to the htlc tx output.

EDIT 2024-12-15

In the last two commits, I apply the same approach to the to_local output of the commit tx, and to the htlc tx output.

I also apply the same approach to the to_local output of the commit tx, and to the htlc tx output later in the same patchset.

Instead of returning only the witness when punishing a revokeable output, I instead choose to ask the ChannelSigner to return a full transaction with the specified input finalized to punish the corresponding previous output. This is primarily to leave the possibility of a signer to customize how the sequence field of the input is set.

best_block: BestBlock, counterparty_node_id: PublicKey, channel_id: ChannelId,
) -> ChannelMonitor<Signer> {

keys.provide_channel_parameters(channel_parameters);

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I move the provide_channel_parameters call to here because there were some tests that built a ChannelMonitor without first calling provide_channel_parameters on the keys: Signer.

Further below in initial_commitment_signed, I delete the provide_channel_parameters call, as it is now called here.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

We now need to call provide_channel_parameters before ChannelMonitor::new because ChannelSigner::get_counterparty_payment_script assumes that provide_channel_parameters has already been called - see the doc for ChannelSigner::get_counterparty_payment_script.

let shutdown_script = context.shutdown_scriptpubkey.clone().map(|script| script.into_inner());
let mut monitor_signer = signer_provider.derive_channel_signer(context.channel_value_satoshis, context.channel_keys_id);
monitor_signer.provide_channel_parameters(&context.channel_transaction_parameters);
let monitor_signer = signer_provider.derive_channel_signer(context.channel_value_satoshis, context.channel_keys_id);

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

provide_channel_parameters is now called in ChannelMonitor::new, see reasoning above.

Comment threadlightning/src/ln/channel.rs Outdated
@tankyleo
tankyleoforce-pushed the 2024-12-signer-spks branch 2 times, most recently from 8dd569b to 9633310CompareDecember 11, 2024 02:28
@codecov

codecovBot commented Dec 11, 2024

Copy link
Copy Markdown

Codecov Report

Attention: Patch coverage is 97.61905% with 7 lines in your changes missing coverage. Please review.

Project coverage is 89.73%. Comparing base (1a8bf62) to head (0f0560a).
Report is 68 commits behind head on main.

Files with missing linesPatch %Lines
lightning/src/ln/chan_utils.rs95.45%2 Missing and 2 partials ⚠️
lightning/src/sign/mod.rs97.40%0 Missing and 2 partials ⚠️
lightning/src/chain/channelmonitor.rs97.22%1 Missing ⚠️
Additional details and impacted files
@@ Coverage Diff @@## main #3454 +/- ##
==========================================
- Coverage 89.74% 89.73% -0.02% 
==========================================
Files 130 130 Lines 107793 107909 +116 Branches 107793 107909 +116 ==========================================
+ Hits 96743 96836 +93 - Misses 8651 8672 +21 - Partials 2399 2401 +2 

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

@tankyleo
tankyleoforce-pushed the 2024-12-signer-spks branch 2 times, most recently from ccbcf98 to e12c3e8CompareDecember 11, 2024 03:22
@tnull

Copy link
Copy Markdown
Contributor

I'll have to review this more closely, but want to note that this will very likely conflict with (the currently stale) #3391, which we're in the process of rewriting. We should coordinate to see how to resolve this, i.e., which approach we should take (first) so you can lean on it for follow-up work.

@tankyleo

Copy link
Copy Markdown
ContributorAuthor

I'll have to review this more closely, but want to note that this will very likely conflict with (the currently stale) #3391, which we're in the process of rewriting. We should coordinate to see how to resolve this, i.e., which approach we should take (first) so you can lean on it for follow-up work.

Thank you for taking a look - I've made a first pass on 3391, and currently do not see any conflicts.

@tankyleotankyleo changed the title Let ChannelSigner set to_remote scriptpubkeyLet ChannelSigner set to_remote, to_local, htlc tx scriptpubkeysDec 14, 2024
This allows the `to_remote` output to easily be changed according to the
features of the channel, or the evolution of the LN specification.
`to_remote` could even be set to completely arbitrary scripts if
compatibility with the formal LN spec is not required.
Builders of `CommitmentTransaction` now ask a `ChannelSigner` for the
appropriate `to_remote` script to use, and then pass the script to the
`CommitmentTransaction` constructor.
External signers now provide the expected `to_remote` script to the
`verify` call of `CommitmentTransaction`.
Builds of `CommitmentTransaction` now query a `ChannelSigner` for the
script pubkey to use in the `to_remote` output of the commitment
transaction. So we need to overwrite the `ChannelTransactionParameters`
of a `ChannelSigner` anytime we want to build a new commitment
transaction with a different set of features.
This is feature is only used in tests, so we cfg-gate it behind the
test flag.
This allows the `to_local` output to easily be changed according to the
features of the channel, or the evolution of the LN specification.
`to_local` could even be set to completely arbitrary scripts if
compatibility with the formal LN spec is not required.
Builders of `CommitmentTransaction` now ask a `ChannelSigner` for the
appropriate `to_local` script pubkey to use, and then pass it to the
`CommitmentTransaction` constructor.
External signers now provide the expected `to_local` script pubkey to
the `verify` call of `CommitmentTransaction`.
This allows the htlc tx output to easily be changed according to the
features of the channel, or the evolution of the LN specification.
The output could even be set to completely arbitrary scripts if
compatibility with the formal LN spec is not required.
Builders of htlc transactions now ask a `ChannelSigner` for the
appropriate revokeable script pubkey to use, and then pass it to the
htlc transaction constructors.
All LN-Penalty channel signers need to be able to punish the
counterparty in case they broadcast an old state. In this commit, we
ask implementers of `ChannelSigner` to produce the full transaction with
the given input finalized to punish the corresponding previous output.
Consumers of the `ChannelSigner` trait can now be agnostic to the
specific scripts used in revokeable outputs.
We leave passing to the `ChannelSigner` all the previous `TxOut`'s
needed to produce valid schnorr signatures under BIP 341 spending rules
to a later patch.
@tankyleo

Copy link
Copy Markdown
ContributorAuthor

Close in favor of #3512

@tankyleotankyleo closed this Jan 8, 2025
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.

2 participants

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

Let ChannelSigner set to_remote, to_local, htlc tx scriptpubkeys - #3454

Closed
tankyleo wants to merge 6 commits into
lightningdevkit:mainfrom
tankyleo:2024-12-signer-spks
Closed

Let ChannelSigner set to_remote, to_local, htlc tx scriptpubkeys#3454
tankyleo wants to merge 6 commits into
lightningdevkit:mainfrom
tankyleo:2024-12-signer-spks

Conversation

@tankyleo

@tankyleotankyleo commented Dec 10, 2024

Copy link
Copy Markdown
Contributor

See commit message for a description of this specific commit.

This begins work on allowing the customization of different outputs of the commitment transaction, in preparation for taproot channels and also to allow people to set the outputs to arbitrary scripts if they don't require compatibility with the formal LN spec.

This PR begins with the to_remote output, with the goal of illustrating the approach taken with a simple example.

If this approach is ok, I will next work on StaticPaymentOutputDescriptor, as it would need to be updated to handle the taproot / arbitrary scripts used in this output. I can do this work in this PR, or in a follow-up depending on your preference.

My approach is to ask the channel signers to do more work (but not more than that of most hardware wallets):

  • Set the appropriate SPK's for the different outputs of the commitment transaction.
  • Return the full witness to spend such an output (not just the signature); this is not shown here, but is the current plan for the to_local outputs in a justice scenario.

By putting scriptpubkey and witness construction behind the signer trait, we can have some parts of LDK be implemented in terms of scriptpubkeys and witnesses, and these parts can then remain the same across segwit, taproot, and arbitrary scripts.

Let me know what you think, thank you for your input.

cc @arik-so@TheBlueMatt

EDIT 2024-12-13

In cbac0e7 I apply the same approach to the to_local output of the commit tx, and in 72ca0a9 same approach to the htlc tx output.

EDIT 2024-12-15

In the last two commits, I apply the same approach to the to_local output of the commit tx, and to the htlc tx output.

I also apply the same approach to the to_local output of the commit tx, and to the htlc tx output later in the same patchset.

Instead of returning only the witness when punishing a revokeable output, I instead choose to ask the ChannelSigner to return a full transaction with the specified input finalized to punish the corresponding previous output. This is primarily to leave the possibility of a signer to customize how the sequence field of the input is set.

best_block: BestBlock, counterparty_node_id: PublicKey, channel_id: ChannelId,
) -> ChannelMonitor<Signer> {

keys.provide_channel_parameters(channel_parameters);

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I move the provide_channel_parameters call to here because there were some tests that built a ChannelMonitor without first calling provide_channel_parameters on the keys: Signer.

Further below in initial_commitment_signed, I delete the provide_channel_parameters call, as it is now called here.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

We now need to call provide_channel_parameters before ChannelMonitor::new because ChannelSigner::get_counterparty_payment_script assumes that provide_channel_parameters has already been called - see the doc for ChannelSigner::get_counterparty_payment_script.

let shutdown_script = context.shutdown_scriptpubkey.clone().map(|script| script.into_inner());
let mut monitor_signer = signer_provider.derive_channel_signer(context.channel_value_satoshis, context.channel_keys_id);
monitor_signer.provide_channel_parameters(&context.channel_transaction_parameters);
let monitor_signer = signer_provider.derive_channel_signer(context.channel_value_satoshis, context.channel_keys_id);

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

provide_channel_parameters is now called in ChannelMonitor::new, see reasoning above.

Comment threadlightning/src/ln/channel.rs Outdated
@tankyleo
tankyleoforce-pushed the 2024-12-signer-spks branch 2 times, most recently from 8dd569b to 9633310CompareDecember 11, 2024 02:28
@codecov

codecovBot commented Dec 11, 2024

Copy link
Copy Markdown

Codecov Report

Attention: Patch coverage is 97.61905% with 7 lines in your changes missing coverage. Please review.

Project coverage is 89.73%. Comparing base (1a8bf62) to head (0f0560a).
Report is 68 commits behind head on main.

Files with missing linesPatch %Lines
lightning/src/ln/chan_utils.rs95.45%2 Missing and 2 partials ⚠️
lightning/src/sign/mod.rs97.40%0 Missing and 2 partials ⚠️
lightning/src/chain/channelmonitor.rs97.22%1 Missing ⚠️
Additional details and impacted files
@@ Coverage Diff @@## main #3454 +/- ##
==========================================
- Coverage 89.74% 89.73% -0.02% 
==========================================
Files 130 130 Lines 107793 107909 +116 Branches 107793 107909 +116 ==========================================
+ Hits 96743 96836 +93 - Misses 8651 8672 +21 - Partials 2399 2401 +2 

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

@tankyleo
tankyleoforce-pushed the 2024-12-signer-spks branch 2 times, most recently from ccbcf98 to e12c3e8CompareDecember 11, 2024 03:22
@tnull

Copy link
Copy Markdown
Contributor

I'll have to review this more closely, but want to note that this will very likely conflict with (the currently stale) #3391, which we're in the process of rewriting. We should coordinate to see how to resolve this, i.e., which approach we should take (first) so you can lean on it for follow-up work.

@tankyleo

Copy link
Copy Markdown
ContributorAuthor

I'll have to review this more closely, but want to note that this will very likely conflict with (the currently stale) #3391, which we're in the process of rewriting. We should coordinate to see how to resolve this, i.e., which approach we should take (first) so you can lean on it for follow-up work.

Thank you for taking a look - I've made a first pass on 3391, and currently do not see any conflicts.

@tankyleotankyleo changed the title Let ChannelSigner set to_remote scriptpubkeyLet ChannelSigner set to_remote, to_local, htlc tx scriptpubkeysDec 14, 2024
This allows the `to_remote` output to easily be changed according to the
features of the channel, or the evolution of the LN specification.
`to_remote` could even be set to completely arbitrary scripts if
compatibility with the formal LN spec is not required.
Builders of `CommitmentTransaction` now ask a `ChannelSigner` for the
appropriate `to_remote` script to use, and then pass the script to the
`CommitmentTransaction` constructor.
External signers now provide the expected `to_remote` script to the
`verify` call of `CommitmentTransaction`.
Builds of `CommitmentTransaction` now query a `ChannelSigner` for the
script pubkey to use in the `to_remote` output of the commitment
transaction. So we need to overwrite the `ChannelTransactionParameters`
of a `ChannelSigner` anytime we want to build a new commitment
transaction with a different set of features.
This is feature is only used in tests, so we cfg-gate it behind the
test flag.
This allows the `to_local` output to easily be changed according to the
features of the channel, or the evolution of the LN specification.
`to_local` could even be set to completely arbitrary scripts if
compatibility with the formal LN spec is not required.
Builders of `CommitmentTransaction` now ask a `ChannelSigner` for the
appropriate `to_local` script pubkey to use, and then pass it to the
`CommitmentTransaction` constructor.
External signers now provide the expected `to_local` script pubkey to
the `verify` call of `CommitmentTransaction`.
This allows the htlc tx output to easily be changed according to the
features of the channel, or the evolution of the LN specification.
The output could even be set to completely arbitrary scripts if
compatibility with the formal LN spec is not required.
Builders of htlc transactions now ask a `ChannelSigner` for the
appropriate revokeable script pubkey to use, and then pass it to the
htlc transaction constructors.
All LN-Penalty channel signers need to be able to punish the
counterparty in case they broadcast an old state. In this commit, we
ask implementers of `ChannelSigner` to produce the full transaction with
the given input finalized to punish the corresponding previous output.
Consumers of the `ChannelSigner` trait can now be agnostic to the
specific scripts used in revokeable outputs.
We leave passing to the `ChannelSigner` all the previous `TxOut`'s
needed to produce valid schnorr signatures under BIP 341 spending rules
to a later patch.
@tankyleo

Copy link
Copy Markdown
ContributorAuthor

Close in favor of #3512

@tankyleotankyleo closed this Jan 8, 2025
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.

2 participants

@tankyleo@tnull