Re-derive signers instead of persisting them - #1867

Merged
TheBlueMatt merged 7 commits into
lightningdevkit:mainfrom
wpaulino:remove-signer-persistence
Dec 6, 2022
Merged

Re-derive signers instead of persisting them#1867
TheBlueMatt merged 7 commits into
lightningdevkit:mainfrom
wpaulino:remove-signer-persistence

Conversation

@wpaulino

Copy link
Copy Markdown
Contributor

Fixes#1209.

@wpaulino
wpaulino marked this pull request as ready for review November 21, 2022 21:37
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/chain/keysinterface.rs Outdated
Comment threadlightning/src/ln/channel.rs
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/chain/onchaintx.rs
@codecov-commenter

codecov-commenter commented Nov 22, 2022

Copy link
Copy Markdown

Codecov Report

Base: 90.69% // Head: 90.54% // Decreases project coverage by -0.14%⚠️

Coverage data is based on head (444fce7) compared to base (52edb35).
Patch coverage: 89.55% of modified lines in pull request are covered.

Additional details and impacted files
@@ Coverage Diff @@## main #1867 +/- ##
==========================================
- Coverage 90.69% 90.54% -0.15% 
==========================================
Files 91 91 Lines 48408 48401 -7 Branches 48408 48401 -7 ==========================================
- Hits 43902 43825 -77 - Misses 4506 4576 +70 
Impacted FilesCoverage Δ
lightning/src/chain/package.rs92.84% <ø> (ø)
lightning/src/util/byte_utils.rs100.00% <ø> (ø)
lightning/src/util/test_utils.rs73.50% <71.42%> (-3.56%)⬇️
lightning/src/ln/channelmanager.rs86.30% <80.00%> (+0.01%)⬆️
lightning/src/ln/channel.rs88.70% <80.43%> (-0.14%)⬇️
lightning/src/chain/channelmonitor.rs90.88% <92.85%> (+0.14%)⬆️
lightning/src/chain/keysinterface.rs83.14% <100.00%> (-7.82%)⬇️
lightning/src/chain/onchaintx.rs95.13% <100.00%> (-0.17%)⬇️
lightning/src/ln/chan_utils.rs93.62% <100.00%> (+<0.01%)⬆️
lightning/src/ln/chanmon_update_fail_tests.rs97.59% <100.00%> (ø)
... and 14 more

Help us with your feedback. Take ten seconds to tell us how you rate us. Have a feature suggestion? Share it here.

☔ View full report at Codecov.
📢 Do you have feedback about the report comment? Let us know in this issue.

@wpaulino
wpaulinoforce-pushed the remove-signer-persistence branch from f139370 to 5defb92CompareNovember 22, 2022 19:47
@wpaulino

Copy link
Copy Markdown
ContributorAuthor

Pushed a new update that allows downgrading and replaces get_channel_signer with derive_channel_signer.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Hmmmmm, now that I think about it we really need to pass the user_channel_id through to the new-signer function. We could do that by passing an enum that either has a keys_id or a user_id to the method, but given the two methods are likely to do very different things (read state vs persist new state) I'm very unconvinced that they need to be merged.

@arik-so

Copy link
Copy Markdown
Contributor

Hm, yeah, I can see how that can be helpful, though imo that's only necessary prior to a channel_keys_id existing to identify the channel. Perhaps the derive method should take an enum of either a user_channel_id or a channel_keys_id?

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Right, if we want a single derive method we'd probably want to do that, but that also makes me thinking we dont want to merge the methods.

@arik-so

Copy link
Copy Markdown
Contributor

I disagree. I feel very strongly wr shouldn't have both get and derive. However, I think I have a better idea. Stay tuned lol

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Why not? They do two fundamentally different things - one loads an instance from disk, one constructs a new instance (and presumably writes it to disk).

@arik-so

Copy link
Copy Markdown
Contributor

Because the entire point of this exercise is a) to obviate this distinction and b) to start phasing out disk I/O altogether.

@wpaulino
wpaulinoforce-pushed the remove-signer-persistence branch from 5defb92 to 224dbd3CompareNovember 22, 2022 23:20
Comment threadlightning/src/chain/keysinterface.rs Outdated
Comment threadlightning/src/chain/keysinterface.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated

let holder_selected_contest_delay = config.channel_handshake_config.our_to_self_delay;
let holder_signer = keys_provider.get_channel_signer(false, channel_value_satoshis);
let channel_keys_id = keys_provider.generate_channel_keys_id(user_id);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

completely unrelated to this PR, but that variable really shouldn't be called user_id

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

obviously, user_provided_channel_id is a bit verbose, but at least it's accurate

Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/util/byte_utils.rs Outdated
Comment threadlightning/src/ln/channel.rs
@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Because the entire point of this exercise is a) to obviate this distinction and b) to start phasing out disk I/O altogether.

No? We cannot remove the I/O for a signer - an enforcing signer absolutely must do IO for every action. What doesn't make sense is the I/O being done "for" a user - they have to do it inline during the signing operations themselves.

@arik-so

Copy link
Copy Markdown
Contributor

Sorry, I meant I/O done by us.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Right, I don't see how that's relevant to whether we combine the new-signer and the derive-preexisting-signer methods?

Comment threadlightning/src/chain/keysinterface.rs Outdated
Comment threadlightning/src/chain/onchaintx.rs Outdated
Comment threadlightning/src/ln/channel.rs
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/chain/keysinterface.rs
Comment threadlightning/src/chain/keysinterface.rs Outdated
@wpaulino
wpaulinoforce-pushed the remove-signer-persistence branch from 224dbd3 to cda514cCompareNovember 29, 2022 17:20

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Okay, I think we're basically on the same page, one note about further code we can remove but otherwise looks good.

Comment threadlightning/src/chain/keysinterface.rs Outdated
Comment threadlightning/src/chain/keysinterface.rs
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/util/byte_utils.rs Outdated
Comment threadlightning/src/ln/channel.rs
Comment threadlightning/src/ln/channel.rs
Comment threadlightning/src/ln/channel.rs
Comment threadlightning/src/chain/onchaintx.rs
Comment threadlightning/src/ln/channel.rs Outdated
@wpaulino
wpaulinoforce-pushed the remove-signer-persistence branch from cda514c to 8e2a89fCompareNovember 30, 2022 23:05
@tnulltnull mentioned this pull request Dec 1, 2022
@TheBlueMattTheBlueMatt added this to the 0.0.113 milestone Dec 1, 2022
@wpaulino
wpaulinoforce-pushed the remove-signer-persistence branch from 8e2a89f to a079946CompareDecember 1, 2022 18:52
Comment threadlightning/src/util/byte_utils.rs Outdated
Comment threadlightning/src/chain/keysinterface.rs Outdated
Comment threadlightning/src/chain/keysinterface.rs
Comment threadlightning/src/chain/onchaintx.rs
Comment threadlightning/src/ln/channel.rs Outdated
@wpaulino
wpaulinoforce-pushed the remove-signer-persistence branch from a079946 to 1141cbbCompareDecember 1, 2022 22:58
@wpaulino

Copy link
Copy Markdown
ContributorAuthor

Had to rebase on latest to address a conflict.

Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/chain/keysinterface.rs
@wpaulino
wpaulinoforce-pushed the remove-signer-persistence branch from 840cf90 to 0572c77CompareDecember 2, 2022 01:42
TheBlueMatt
TheBlueMatt previously approved these changes Dec 2, 2022
@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Needs #1867 (comment) addressed.

arik-so
arik-so previously approved these changes Dec 2, 2022
Comment threadlightning/src/chain/keysinterface.rs Outdated
@wpaulino
wpaulinoforce-pushed the remove-signer-persistence branch from 4501bff to 9acf5f0CompareDecember 5, 2022 20:08
`get_channel_signer` previously had two different responsibilites:
generating unique `channel_keys_id` and using said ID to derive channel
keys. We decide to split it into two methods `generate_channel_keys_id`
and `derive_channel_signer`, such that we can use the latter to fulfill
our goal of re-deriving signers instead of persisting them. There's no
point in storing data that can be easily re-derived.
Now that ready_channel is also called on startup upon deserializing
channels, we opt to rename it to a more indicative name.
We also derive `PartialEq` on ChannelTransactionParameters to allow
implementations to determine whether `provide_channel_parameters` calls
are idempotent after the channel parameters have already been provided.
To do so, we introduce a new serialization version that doesn't store a
channel's signer, and instead stores its signer's `channel_keys_id`.
This is a unique identifier that can be provided to our `KeysInterface`
to re-derive all private key material for said channel.
We choose to not upgrade the minimum compatible serialization version
until a later time, which will also remove any signer serialization
logic on implementations of `KeysInterface` and `Sign`.
Similar to the previous commit, we introduce a new serialization version
that doesn't store a monitor's signer. Since the monitor already knows
of a channel's `channel_keys_id`, there's no need to store any new data
to re-derive all private key material for said channel.
Since `ChannelMonitor`s will now re-derive signers rather than
persisting them, we can no longer use the OnlyReadsKeysInterface
concrete implementation.
Now that we opt to always re-derive channel secrets whenever required,
we can drop the Clone requirement from Sign.
Now that to_be_bytes is available under our current MSRV of 1.41, we
can use it instead of our own version.
@wpaulino
wpaulinoforce-pushed the remove-signer-persistence branch from 9acf5f0 to 444fce7CompareDecember 5, 2022 20:11
@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Would like an ACK from @devrandom

node_secret: SecretKey,
inbound_payment_key: KeyMaterial,
counter: AtomicU64,
signer_state: RefCell<HashMap<u8, (bool, Arc<Mutex<EnforcementState>>)>>

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I know it's internal only, but a comment here would be extremely helpful. I think a comment above counter would be helpful, too. What are we counting, right?

Comment threadlightning/src/chain/keysinterface.rs

@arik-soarik-so left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

It's ready.

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Will open a followup.

/// they MUST NOT be allowed to change to different values once set.
/// counterparty_selected/holder_selected_contest_delay and funding outpoint. Since these are
/// static channel data, they MUST NOT be allowed to change to different values once set, as LDK
/// may call this method more than once.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Huh? LDK will absolutely not call this method more than once (for a given instance).

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

well, for a disk-backed signer that returns a shared reference to derive_* (which is how VLS works internally), it effectively does that. the instances are indexed by the channel keys ID.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

or another way to look at it - an enforcing signer must return a shared reference so that it can keep track of a unique signer state

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Right, my point is that for a given instance of the trait we won't call it more than once. From the perspective of something that exists as multiple instances of the trait its different. Anyway, we can continue this discussion on #1903

@TheBlueMatt
TheBlueMatt merged commit 5588eeb into lightningdevkit:mainDec 6, 2022
@wpaulino
wpaulino deleted the remove-signer-persistence branch December 6, 2022 19:09
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.

Do not default to storing InMemoryChannelKeys keys on disk

6 participants

@wpaulino@codecov-commenter@TheBlueMatt@arik-so@devrandom@ariard
, '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

Re-derive signers instead of persisting them - #1867

Merged
TheBlueMatt merged 7 commits into
lightningdevkit:mainfrom
wpaulino:remove-signer-persistence
Dec 6, 2022
Merged

Re-derive signers instead of persisting them#1867
TheBlueMatt merged 7 commits into
lightningdevkit:mainfrom
wpaulino:remove-signer-persistence

Conversation

@wpaulino

Copy link
Copy Markdown
Contributor

Fixes#1209.

@wpaulino
wpaulino marked this pull request as ready for review November 21, 2022 21:37
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/chain/keysinterface.rs Outdated
Comment threadlightning/src/ln/channel.rs
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/chain/onchaintx.rs
@codecov-commenter

codecov-commenter commented Nov 22, 2022

Copy link
Copy Markdown

Codecov Report

Base: 90.69% // Head: 90.54% // Decreases project coverage by -0.14%⚠️

Coverage data is based on head (444fce7) compared to base (52edb35).
Patch coverage: 89.55% of modified lines in pull request are covered.

Additional details and impacted files
@@ Coverage Diff @@## main #1867 +/- ##
==========================================
- Coverage 90.69% 90.54% -0.15% 
==========================================
Files 91 91 Lines 48408 48401 -7 Branches 48408 48401 -7 ==========================================
- Hits 43902 43825 -77 - Misses 4506 4576 +70 
Impacted FilesCoverage Δ
lightning/src/chain/package.rs92.84% <ø> (ø)
lightning/src/util/byte_utils.rs100.00% <ø> (ø)
lightning/src/util/test_utils.rs73.50% <71.42%> (-3.56%)⬇️
lightning/src/ln/channelmanager.rs86.30% <80.00%> (+0.01%)⬆️
lightning/src/ln/channel.rs88.70% <80.43%> (-0.14%)⬇️
lightning/src/chain/channelmonitor.rs90.88% <92.85%> (+0.14%)⬆️
lightning/src/chain/keysinterface.rs83.14% <100.00%> (-7.82%)⬇️
lightning/src/chain/onchaintx.rs95.13% <100.00%> (-0.17%)⬇️
lightning/src/ln/chan_utils.rs93.62% <100.00%> (+<0.01%)⬆️
lightning/src/ln/chanmon_update_fail_tests.rs97.59% <100.00%> (ø)
... and 14 more

Help us with your feedback. Take ten seconds to tell us how you rate us. Have a feature suggestion? Share it here.

☔ View full report at Codecov.
📢 Do you have feedback about the report comment? Let us know in this issue.

@wpaulino
wpaulinoforce-pushed the remove-signer-persistence branch from f139370 to 5defb92CompareNovember 22, 2022 19:47
@wpaulino

Copy link
Copy Markdown
ContributorAuthor

Pushed a new update that allows downgrading and replaces get_channel_signer with derive_channel_signer.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Hmmmmm, now that I think about it we really need to pass the user_channel_id through to the new-signer function. We could do that by passing an enum that either has a keys_id or a user_id to the method, but given the two methods are likely to do very different things (read state vs persist new state) I'm very unconvinced that they need to be merged.

@arik-so

Copy link
Copy Markdown
Contributor

Hm, yeah, I can see how that can be helpful, though imo that's only necessary prior to a channel_keys_id existing to identify the channel. Perhaps the derive method should take an enum of either a user_channel_id or a channel_keys_id?

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Right, if we want a single derive method we'd probably want to do that, but that also makes me thinking we dont want to merge the methods.

@arik-so

Copy link
Copy Markdown
Contributor

I disagree. I feel very strongly wr shouldn't have both get and derive. However, I think I have a better idea. Stay tuned lol

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Why not? They do two fundamentally different things - one loads an instance from disk, one constructs a new instance (and presumably writes it to disk).

@arik-so

Copy link
Copy Markdown
Contributor

Because the entire point of this exercise is a) to obviate this distinction and b) to start phasing out disk I/O altogether.

@wpaulino
wpaulinoforce-pushed the remove-signer-persistence branch from 5defb92 to 224dbd3CompareNovember 22, 2022 23:20
Comment threadlightning/src/chain/keysinterface.rs Outdated
Comment threadlightning/src/chain/keysinterface.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated

let holder_selected_contest_delay = config.channel_handshake_config.our_to_self_delay;
let holder_signer = keys_provider.get_channel_signer(false, channel_value_satoshis);
let channel_keys_id = keys_provider.generate_channel_keys_id(user_id);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

completely unrelated to this PR, but that variable really shouldn't be called user_id

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

obviously, user_provided_channel_id is a bit verbose, but at least it's accurate

Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/util/byte_utils.rs Outdated
Comment threadlightning/src/ln/channel.rs
@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Because the entire point of this exercise is a) to obviate this distinction and b) to start phasing out disk I/O altogether.

No? We cannot remove the I/O for a signer - an enforcing signer absolutely must do IO for every action. What doesn't make sense is the I/O being done "for" a user - they have to do it inline during the signing operations themselves.

@arik-so

Copy link
Copy Markdown
Contributor

Sorry, I meant I/O done by us.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Right, I don't see how that's relevant to whether we combine the new-signer and the derive-preexisting-signer methods?

Comment threadlightning/src/chain/keysinterface.rs Outdated
Comment threadlightning/src/chain/onchaintx.rs Outdated
Comment threadlightning/src/ln/channel.rs
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/chain/keysinterface.rs
Comment threadlightning/src/chain/keysinterface.rs Outdated
@wpaulino
wpaulinoforce-pushed the remove-signer-persistence branch from 224dbd3 to cda514cCompareNovember 29, 2022 17:20

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Okay, I think we're basically on the same page, one note about further code we can remove but otherwise looks good.

Comment threadlightning/src/chain/keysinterface.rs Outdated
Comment threadlightning/src/chain/keysinterface.rs
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/util/byte_utils.rs Outdated
Comment threadlightning/src/ln/channel.rs
Comment threadlightning/src/ln/channel.rs
Comment threadlightning/src/ln/channel.rs
Comment threadlightning/src/chain/onchaintx.rs
Comment threadlightning/src/ln/channel.rs Outdated
@wpaulino
wpaulinoforce-pushed the remove-signer-persistence branch from cda514c to 8e2a89fCompareNovember 30, 2022 23:05
@tnulltnull mentioned this pull request Dec 1, 2022
@TheBlueMattTheBlueMatt added this to the 0.0.113 milestone Dec 1, 2022
@wpaulino
wpaulinoforce-pushed the remove-signer-persistence branch from 8e2a89f to a079946CompareDecember 1, 2022 18:52
Comment threadlightning/src/util/byte_utils.rs Outdated
Comment threadlightning/src/chain/keysinterface.rs Outdated
Comment threadlightning/src/chain/keysinterface.rs
Comment threadlightning/src/chain/onchaintx.rs
Comment threadlightning/src/ln/channel.rs Outdated
@wpaulino
wpaulinoforce-pushed the remove-signer-persistence branch from a079946 to 1141cbbCompareDecember 1, 2022 22:58
@wpaulino

Copy link
Copy Markdown
ContributorAuthor

Had to rebase on latest to address a conflict.

Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/chain/keysinterface.rs
@wpaulino
wpaulinoforce-pushed the remove-signer-persistence branch from 840cf90 to 0572c77CompareDecember 2, 2022 01:42
TheBlueMatt
TheBlueMatt previously approved these changes Dec 2, 2022
@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Needs #1867 (comment) addressed.

arik-so
arik-so previously approved these changes Dec 2, 2022
Comment threadlightning/src/chain/keysinterface.rs Outdated
@wpaulino
wpaulinoforce-pushed the remove-signer-persistence branch from 4501bff to 9acf5f0CompareDecember 5, 2022 20:08
`get_channel_signer` previously had two different responsibilites:
generating unique `channel_keys_id` and using said ID to derive channel
keys. We decide to split it into two methods `generate_channel_keys_id`
and `derive_channel_signer`, such that we can use the latter to fulfill
our goal of re-deriving signers instead of persisting them. There's no
point in storing data that can be easily re-derived.
Now that ready_channel is also called on startup upon deserializing
channels, we opt to rename it to a more indicative name.
We also derive `PartialEq` on ChannelTransactionParameters to allow
implementations to determine whether `provide_channel_parameters` calls
are idempotent after the channel parameters have already been provided.
To do so, we introduce a new serialization version that doesn't store a
channel's signer, and instead stores its signer's `channel_keys_id`.
This is a unique identifier that can be provided to our `KeysInterface`
to re-derive all private key material for said channel.
We choose to not upgrade the minimum compatible serialization version
until a later time, which will also remove any signer serialization
logic on implementations of `KeysInterface` and `Sign`.
Similar to the previous commit, we introduce a new serialization version
that doesn't store a monitor's signer. Since the monitor already knows
of a channel's `channel_keys_id`, there's no need to store any new data
to re-derive all private key material for said channel.
Since `ChannelMonitor`s will now re-derive signers rather than
persisting them, we can no longer use the OnlyReadsKeysInterface
concrete implementation.
Now that we opt to always re-derive channel secrets whenever required,
we can drop the Clone requirement from Sign.
Now that to_be_bytes is available under our current MSRV of 1.41, we
can use it instead of our own version.
@wpaulino
wpaulinoforce-pushed the remove-signer-persistence branch from 9acf5f0 to 444fce7CompareDecember 5, 2022 20:11
@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Would like an ACK from @devrandom

node_secret: SecretKey,
inbound_payment_key: KeyMaterial,
counter: AtomicU64,
signer_state: RefCell<HashMap<u8, (bool, Arc<Mutex<EnforcementState>>)>>

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I know it's internal only, but a comment here would be extremely helpful. I think a comment above counter would be helpful, too. What are we counting, right?

Comment threadlightning/src/chain/keysinterface.rs

@arik-soarik-so left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

It's ready.

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Will open a followup.

/// they MUST NOT be allowed to change to different values once set.
/// counterparty_selected/holder_selected_contest_delay and funding outpoint. Since these are
/// static channel data, they MUST NOT be allowed to change to different values once set, as LDK
/// may call this method more than once.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Huh? LDK will absolutely not call this method more than once (for a given instance).

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

well, for a disk-backed signer that returns a shared reference to derive_* (which is how VLS works internally), it effectively does that. the instances are indexed by the channel keys ID.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

or another way to look at it - an enforcing signer must return a shared reference so that it can keep track of a unique signer state

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Right, my point is that for a given instance of the trait we won't call it more than once. From the perspective of something that exists as multiple instances of the trait its different. Anyway, we can continue this discussion on #1903

@TheBlueMatt
TheBlueMatt merged commit 5588eeb into lightningdevkit:mainDec 6, 2022
@wpaulino
wpaulino deleted the remove-signer-persistence branch December 6, 2022 19:09
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.

Do not default to storing InMemoryChannelKeys keys on disk

6 participants

@wpaulino@codecov-commenter@TheBlueMatt@arik-so@devrandom@ariard
, '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

Re-derive signers instead of persisting them - #1867

Merged
TheBlueMatt merged 7 commits into
lightningdevkit:mainfrom
wpaulino:remove-signer-persistence
Dec 6, 2022
Merged

Re-derive signers instead of persisting them#1867
TheBlueMatt merged 7 commits into
lightningdevkit:mainfrom
wpaulino:remove-signer-persistence

Conversation

@wpaulino

Copy link
Copy Markdown
Contributor

Fixes#1209.

@wpaulino
wpaulino marked this pull request as ready for review November 21, 2022 21:37
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/chain/keysinterface.rs Outdated
Comment threadlightning/src/ln/channel.rs
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/chain/onchaintx.rs
@codecov-commenter

codecov-commenter commented Nov 22, 2022

Copy link
Copy Markdown

Codecov Report

Base: 90.69% // Head: 90.54% // Decreases project coverage by -0.14%⚠️

Coverage data is based on head (444fce7) compared to base (52edb35).
Patch coverage: 89.55% of modified lines in pull request are covered.

Additional details and impacted files
@@ Coverage Diff @@## main #1867 +/- ##
==========================================
- Coverage 90.69% 90.54% -0.15% 
==========================================
Files 91 91 Lines 48408 48401 -7 Branches 48408 48401 -7 ==========================================
- Hits 43902 43825 -77 - Misses 4506 4576 +70 
Impacted FilesCoverage Δ
lightning/src/chain/package.rs92.84% <ø> (ø)
lightning/src/util/byte_utils.rs100.00% <ø> (ø)
lightning/src/util/test_utils.rs73.50% <71.42%> (-3.56%)⬇️
lightning/src/ln/channelmanager.rs86.30% <80.00%> (+0.01%)⬆️
lightning/src/ln/channel.rs88.70% <80.43%> (-0.14%)⬇️
lightning/src/chain/channelmonitor.rs90.88% <92.85%> (+0.14%)⬆️
lightning/src/chain/keysinterface.rs83.14% <100.00%> (-7.82%)⬇️
lightning/src/chain/onchaintx.rs95.13% <100.00%> (-0.17%)⬇️
lightning/src/ln/chan_utils.rs93.62% <100.00%> (+<0.01%)⬆️
lightning/src/ln/chanmon_update_fail_tests.rs97.59% <100.00%> (ø)
... and 14 more

Help us with your feedback. Take ten seconds to tell us how you rate us. Have a feature suggestion? Share it here.

☔ View full report at Codecov.
📢 Do you have feedback about the report comment? Let us know in this issue.

@wpaulino
wpaulinoforce-pushed the remove-signer-persistence branch from f139370 to 5defb92CompareNovember 22, 2022 19:47
@wpaulino

Copy link
Copy Markdown
ContributorAuthor

Pushed a new update that allows downgrading and replaces get_channel_signer with derive_channel_signer.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Hmmmmm, now that I think about it we really need to pass the user_channel_id through to the new-signer function. We could do that by passing an enum that either has a keys_id or a user_id to the method, but given the two methods are likely to do very different things (read state vs persist new state) I'm very unconvinced that they need to be merged.

@arik-so

Copy link
Copy Markdown
Contributor

Hm, yeah, I can see how that can be helpful, though imo that's only necessary prior to a channel_keys_id existing to identify the channel. Perhaps the derive method should take an enum of either a user_channel_id or a channel_keys_id?

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Right, if we want a single derive method we'd probably want to do that, but that also makes me thinking we dont want to merge the methods.

@arik-so

Copy link
Copy Markdown
Contributor

I disagree. I feel very strongly wr shouldn't have both get and derive. However, I think I have a better idea. Stay tuned lol

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Why not? They do two fundamentally different things - one loads an instance from disk, one constructs a new instance (and presumably writes it to disk).

@arik-so

Copy link
Copy Markdown
Contributor

Because the entire point of this exercise is a) to obviate this distinction and b) to start phasing out disk I/O altogether.

@wpaulino
wpaulinoforce-pushed the remove-signer-persistence branch from 5defb92 to 224dbd3CompareNovember 22, 2022 23:20
Comment threadlightning/src/chain/keysinterface.rs Outdated
Comment threadlightning/src/chain/keysinterface.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated

let holder_selected_contest_delay = config.channel_handshake_config.our_to_self_delay;
let holder_signer = keys_provider.get_channel_signer(false, channel_value_satoshis);
let channel_keys_id = keys_provider.generate_channel_keys_id(user_id);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

completely unrelated to this PR, but that variable really shouldn't be called user_id

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

obviously, user_provided_channel_id is a bit verbose, but at least it's accurate

Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/util/byte_utils.rs Outdated
Comment threadlightning/src/ln/channel.rs
@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Because the entire point of this exercise is a) to obviate this distinction and b) to start phasing out disk I/O altogether.

No? We cannot remove the I/O for a signer - an enforcing signer absolutely must do IO for every action. What doesn't make sense is the I/O being done "for" a user - they have to do it inline during the signing operations themselves.

@arik-so

Copy link
Copy Markdown
Contributor

Sorry, I meant I/O done by us.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Right, I don't see how that's relevant to whether we combine the new-signer and the derive-preexisting-signer methods?

Comment threadlightning/src/chain/keysinterface.rs Outdated
Comment threadlightning/src/chain/onchaintx.rs Outdated
Comment threadlightning/src/ln/channel.rs
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/chain/keysinterface.rs
Comment threadlightning/src/chain/keysinterface.rs Outdated
@wpaulino
wpaulinoforce-pushed the remove-signer-persistence branch from 224dbd3 to cda514cCompareNovember 29, 2022 17:20

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Okay, I think we're basically on the same page, one note about further code we can remove but otherwise looks good.

Comment threadlightning/src/chain/keysinterface.rs Outdated
Comment threadlightning/src/chain/keysinterface.rs
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/util/byte_utils.rs Outdated
Comment threadlightning/src/ln/channel.rs
Comment threadlightning/src/ln/channel.rs
Comment threadlightning/src/ln/channel.rs
Comment threadlightning/src/chain/onchaintx.rs
Comment threadlightning/src/ln/channel.rs Outdated
@wpaulino
wpaulinoforce-pushed the remove-signer-persistence branch from cda514c to 8e2a89fCompareNovember 30, 2022 23:05
@tnulltnull mentioned this pull request Dec 1, 2022
@TheBlueMattTheBlueMatt added this to the 0.0.113 milestone Dec 1, 2022
@wpaulino
wpaulinoforce-pushed the remove-signer-persistence branch from 8e2a89f to a079946CompareDecember 1, 2022 18:52
Comment threadlightning/src/util/byte_utils.rs Outdated
Comment threadlightning/src/chain/keysinterface.rs Outdated
Comment threadlightning/src/chain/keysinterface.rs
Comment threadlightning/src/chain/onchaintx.rs
Comment threadlightning/src/ln/channel.rs Outdated
@wpaulino
wpaulinoforce-pushed the remove-signer-persistence branch from a079946 to 1141cbbCompareDecember 1, 2022 22:58
@wpaulino

Copy link
Copy Markdown
ContributorAuthor

Had to rebase on latest to address a conflict.

Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/chain/keysinterface.rs
@wpaulino
wpaulinoforce-pushed the remove-signer-persistence branch from 840cf90 to 0572c77CompareDecember 2, 2022 01:42
TheBlueMatt
TheBlueMatt previously approved these changes Dec 2, 2022
@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Needs #1867 (comment) addressed.

arik-so
arik-so previously approved these changes Dec 2, 2022
Comment threadlightning/src/chain/keysinterface.rs Outdated
@wpaulino
wpaulinoforce-pushed the remove-signer-persistence branch from 4501bff to 9acf5f0CompareDecember 5, 2022 20:08
`get_channel_signer` previously had two different responsibilites:
generating unique `channel_keys_id` and using said ID to derive channel
keys. We decide to split it into two methods `generate_channel_keys_id`
and `derive_channel_signer`, such that we can use the latter to fulfill
our goal of re-deriving signers instead of persisting them. There's no
point in storing data that can be easily re-derived.
Now that ready_channel is also called on startup upon deserializing
channels, we opt to rename it to a more indicative name.
We also derive `PartialEq` on ChannelTransactionParameters to allow
implementations to determine whether `provide_channel_parameters` calls
are idempotent after the channel parameters have already been provided.
To do so, we introduce a new serialization version that doesn't store a
channel's signer, and instead stores its signer's `channel_keys_id`.
This is a unique identifier that can be provided to our `KeysInterface`
to re-derive all private key material for said channel.
We choose to not upgrade the minimum compatible serialization version
until a later time, which will also remove any signer serialization
logic on implementations of `KeysInterface` and `Sign`.
Similar to the previous commit, we introduce a new serialization version
that doesn't store a monitor's signer. Since the monitor already knows
of a channel's `channel_keys_id`, there's no need to store any new data
to re-derive all private key material for said channel.
Since `ChannelMonitor`s will now re-derive signers rather than
persisting them, we can no longer use the OnlyReadsKeysInterface
concrete implementation.
Now that we opt to always re-derive channel secrets whenever required,
we can drop the Clone requirement from Sign.
Now that to_be_bytes is available under our current MSRV of 1.41, we
can use it instead of our own version.
@wpaulino
wpaulinoforce-pushed the remove-signer-persistence branch from 9acf5f0 to 444fce7CompareDecember 5, 2022 20:11
@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Would like an ACK from @devrandom

node_secret: SecretKey,
inbound_payment_key: KeyMaterial,
counter: AtomicU64,
signer_state: RefCell<HashMap<u8, (bool, Arc<Mutex<EnforcementState>>)>>

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I know it's internal only, but a comment here would be extremely helpful. I think a comment above counter would be helpful, too. What are we counting, right?

Comment threadlightning/src/chain/keysinterface.rs

@arik-soarik-so left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

It's ready.

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Will open a followup.

/// they MUST NOT be allowed to change to different values once set.
/// counterparty_selected/holder_selected_contest_delay and funding outpoint. Since these are
/// static channel data, they MUST NOT be allowed to change to different values once set, as LDK
/// may call this method more than once.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Huh? LDK will absolutely not call this method more than once (for a given instance).

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

well, for a disk-backed signer that returns a shared reference to derive_* (which is how VLS works internally), it effectively does that. the instances are indexed by the channel keys ID.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

or another way to look at it - an enforcing signer must return a shared reference so that it can keep track of a unique signer state

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Right, my point is that for a given instance of the trait we won't call it more than once. From the perspective of something that exists as multiple instances of the trait its different. Anyway, we can continue this discussion on #1903

@TheBlueMatt
TheBlueMatt merged commit 5588eeb into lightningdevkit:mainDec 6, 2022
@wpaulino
wpaulino deleted the remove-signer-persistence branch December 6, 2022 19:09
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.

Do not default to storing InMemoryChannelKeys keys on disk

6 participants

@wpaulino@codecov-commenter@TheBlueMatt@arik-so@devrandom@ariard
, '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

Re-derive signers instead of persisting them - #1867

Merged
TheBlueMatt merged 7 commits into
lightningdevkit:mainfrom
wpaulino:remove-signer-persistence
Dec 6, 2022
Merged

Re-derive signers instead of persisting them#1867
TheBlueMatt merged 7 commits into
lightningdevkit:mainfrom
wpaulino:remove-signer-persistence

Conversation

@wpaulino

Copy link
Copy Markdown
Contributor

Fixes#1209.

@wpaulino
wpaulino marked this pull request as ready for review November 21, 2022 21:37
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/chain/keysinterface.rs Outdated
Comment threadlightning/src/ln/channel.rs
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/chain/onchaintx.rs
@codecov-commenter

codecov-commenter commented Nov 22, 2022

Copy link
Copy Markdown

Codecov Report

Base: 90.69% // Head: 90.54% // Decreases project coverage by -0.14%⚠️

Coverage data is based on head (444fce7) compared to base (52edb35).
Patch coverage: 89.55% of modified lines in pull request are covered.

Additional details and impacted files
@@ Coverage Diff @@## main #1867 +/- ##
==========================================
- Coverage 90.69% 90.54% -0.15% 
==========================================
Files 91 91 Lines 48408 48401 -7 Branches 48408 48401 -7 ==========================================
- Hits 43902 43825 -77 - Misses 4506 4576 +70 
Impacted FilesCoverage Δ
lightning/src/chain/package.rs92.84% <ø> (ø)
lightning/src/util/byte_utils.rs100.00% <ø> (ø)
lightning/src/util/test_utils.rs73.50% <71.42%> (-3.56%)⬇️
lightning/src/ln/channelmanager.rs86.30% <80.00%> (+0.01%)⬆️
lightning/src/ln/channel.rs88.70% <80.43%> (-0.14%)⬇️
lightning/src/chain/channelmonitor.rs90.88% <92.85%> (+0.14%)⬆️
lightning/src/chain/keysinterface.rs83.14% <100.00%> (-7.82%)⬇️
lightning/src/chain/onchaintx.rs95.13% <100.00%> (-0.17%)⬇️
lightning/src/ln/chan_utils.rs93.62% <100.00%> (+<0.01%)⬆️
lightning/src/ln/chanmon_update_fail_tests.rs97.59% <100.00%> (ø)
... and 14 more

Help us with your feedback. Take ten seconds to tell us how you rate us. Have a feature suggestion? Share it here.

☔ View full report at Codecov.
📢 Do you have feedback about the report comment? Let us know in this issue.

@wpaulino
wpaulinoforce-pushed the remove-signer-persistence branch from f139370 to 5defb92CompareNovember 22, 2022 19:47
@wpaulino

Copy link
Copy Markdown
ContributorAuthor

Pushed a new update that allows downgrading and replaces get_channel_signer with derive_channel_signer.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Hmmmmm, now that I think about it we really need to pass the user_channel_id through to the new-signer function. We could do that by passing an enum that either has a keys_id or a user_id to the method, but given the two methods are likely to do very different things (read state vs persist new state) I'm very unconvinced that they need to be merged.

@arik-so

Copy link
Copy Markdown
Contributor

Hm, yeah, I can see how that can be helpful, though imo that's only necessary prior to a channel_keys_id existing to identify the channel. Perhaps the derive method should take an enum of either a user_channel_id or a channel_keys_id?

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Right, if we want a single derive method we'd probably want to do that, but that also makes me thinking we dont want to merge the methods.

@arik-so

Copy link
Copy Markdown
Contributor

I disagree. I feel very strongly wr shouldn't have both get and derive. However, I think I have a better idea. Stay tuned lol

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Why not? They do two fundamentally different things - one loads an instance from disk, one constructs a new instance (and presumably writes it to disk).

@arik-so

Copy link
Copy Markdown
Contributor

Because the entire point of this exercise is a) to obviate this distinction and b) to start phasing out disk I/O altogether.

@wpaulino
wpaulinoforce-pushed the remove-signer-persistence branch from 5defb92 to 224dbd3CompareNovember 22, 2022 23:20
Comment threadlightning/src/chain/keysinterface.rs Outdated
Comment threadlightning/src/chain/keysinterface.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated

let holder_selected_contest_delay = config.channel_handshake_config.our_to_self_delay;
let holder_signer = keys_provider.get_channel_signer(false, channel_value_satoshis);
let channel_keys_id = keys_provider.generate_channel_keys_id(user_id);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

completely unrelated to this PR, but that variable really shouldn't be called user_id

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

obviously, user_provided_channel_id is a bit verbose, but at least it's accurate

Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/util/byte_utils.rs Outdated
Comment threadlightning/src/ln/channel.rs
@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Because the entire point of this exercise is a) to obviate this distinction and b) to start phasing out disk I/O altogether.

No? We cannot remove the I/O for a signer - an enforcing signer absolutely must do IO for every action. What doesn't make sense is the I/O being done "for" a user - they have to do it inline during the signing operations themselves.

@arik-so

Copy link
Copy Markdown
Contributor

Sorry, I meant I/O done by us.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Right, I don't see how that's relevant to whether we combine the new-signer and the derive-preexisting-signer methods?

Comment threadlightning/src/chain/keysinterface.rs Outdated
Comment threadlightning/src/chain/onchaintx.rs Outdated
Comment threadlightning/src/ln/channel.rs
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/chain/keysinterface.rs
Comment threadlightning/src/chain/keysinterface.rs Outdated
@wpaulino
wpaulinoforce-pushed the remove-signer-persistence branch from 224dbd3 to cda514cCompareNovember 29, 2022 17:20

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Okay, I think we're basically on the same page, one note about further code we can remove but otherwise looks good.

Comment threadlightning/src/chain/keysinterface.rs Outdated
Comment threadlightning/src/chain/keysinterface.rs
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/util/byte_utils.rs Outdated
Comment threadlightning/src/ln/channel.rs
Comment threadlightning/src/ln/channel.rs
Comment threadlightning/src/ln/channel.rs
Comment threadlightning/src/chain/onchaintx.rs
Comment threadlightning/src/ln/channel.rs Outdated
@wpaulino
wpaulinoforce-pushed the remove-signer-persistence branch from cda514c to 8e2a89fCompareNovember 30, 2022 23:05
@tnulltnull mentioned this pull request Dec 1, 2022
@TheBlueMattTheBlueMatt added this to the 0.0.113 milestone Dec 1, 2022
@wpaulino
wpaulinoforce-pushed the remove-signer-persistence branch from 8e2a89f to a079946CompareDecember 1, 2022 18:52
Comment threadlightning/src/util/byte_utils.rs Outdated
Comment threadlightning/src/chain/keysinterface.rs Outdated
Comment threadlightning/src/chain/keysinterface.rs
Comment threadlightning/src/chain/onchaintx.rs
Comment threadlightning/src/ln/channel.rs Outdated
@wpaulino
wpaulinoforce-pushed the remove-signer-persistence branch from a079946 to 1141cbbCompareDecember 1, 2022 22:58
@wpaulino

Copy link
Copy Markdown
ContributorAuthor

Had to rebase on latest to address a conflict.

Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/chain/keysinterface.rs
@wpaulino
wpaulinoforce-pushed the remove-signer-persistence branch from 840cf90 to 0572c77CompareDecember 2, 2022 01:42
TheBlueMatt
TheBlueMatt previously approved these changes Dec 2, 2022
@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Needs #1867 (comment) addressed.

arik-so
arik-so previously approved these changes Dec 2, 2022
Comment threadlightning/src/chain/keysinterface.rs Outdated
@wpaulino
wpaulinoforce-pushed the remove-signer-persistence branch from 4501bff to 9acf5f0CompareDecember 5, 2022 20:08
`get_channel_signer` previously had two different responsibilites:
generating unique `channel_keys_id` and using said ID to derive channel
keys. We decide to split it into two methods `generate_channel_keys_id`
and `derive_channel_signer`, such that we can use the latter to fulfill
our goal of re-deriving signers instead of persisting them. There's no
point in storing data that can be easily re-derived.
Now that ready_channel is also called on startup upon deserializing
channels, we opt to rename it to a more indicative name.
We also derive `PartialEq` on ChannelTransactionParameters to allow
implementations to determine whether `provide_channel_parameters` calls
are idempotent after the channel parameters have already been provided.
To do so, we introduce a new serialization version that doesn't store a
channel's signer, and instead stores its signer's `channel_keys_id`.
This is a unique identifier that can be provided to our `KeysInterface`
to re-derive all private key material for said channel.
We choose to not upgrade the minimum compatible serialization version
until a later time, which will also remove any signer serialization
logic on implementations of `KeysInterface` and `Sign`.
Similar to the previous commit, we introduce a new serialization version
that doesn't store a monitor's signer. Since the monitor already knows
of a channel's `channel_keys_id`, there's no need to store any new data
to re-derive all private key material for said channel.
Since `ChannelMonitor`s will now re-derive signers rather than
persisting them, we can no longer use the OnlyReadsKeysInterface
concrete implementation.
Now that we opt to always re-derive channel secrets whenever required,
we can drop the Clone requirement from Sign.
Now that to_be_bytes is available under our current MSRV of 1.41, we
can use it instead of our own version.
@wpaulino
wpaulinoforce-pushed the remove-signer-persistence branch from 9acf5f0 to 444fce7CompareDecember 5, 2022 20:11
@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Would like an ACK from @devrandom

node_secret: SecretKey,
inbound_payment_key: KeyMaterial,
counter: AtomicU64,
signer_state: RefCell<HashMap<u8, (bool, Arc<Mutex<EnforcementState>>)>>

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I know it's internal only, but a comment here would be extremely helpful. I think a comment above counter would be helpful, too. What are we counting, right?

Comment threadlightning/src/chain/keysinterface.rs

@arik-soarik-so left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

It's ready.

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Will open a followup.

/// they MUST NOT be allowed to change to different values once set.
/// counterparty_selected/holder_selected_contest_delay and funding outpoint. Since these are
/// static channel data, they MUST NOT be allowed to change to different values once set, as LDK
/// may call this method more than once.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Huh? LDK will absolutely not call this method more than once (for a given instance).

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

well, for a disk-backed signer that returns a shared reference to derive_* (which is how VLS works internally), it effectively does that. the instances are indexed by the channel keys ID.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

or another way to look at it - an enforcing signer must return a shared reference so that it can keep track of a unique signer state

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Right, my point is that for a given instance of the trait we won't call it more than once. From the perspective of something that exists as multiple instances of the trait its different. Anyway, we can continue this discussion on #1903

@TheBlueMatt
TheBlueMatt merged commit 5588eeb into lightningdevkit:mainDec 6, 2022
@wpaulino
wpaulino deleted the remove-signer-persistence branch December 6, 2022 19:09
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.

Do not default to storing InMemoryChannelKeys keys on disk

6 participants

@wpaulino@codecov-commenter@TheBlueMatt@arik-so@devrandom@ariard
, '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

Re-derive signers instead of persisting them - #1867

Merged
TheBlueMatt merged 7 commits into
lightningdevkit:mainfrom
wpaulino:remove-signer-persistence
Dec 6, 2022
Merged

Re-derive signers instead of persisting them#1867
TheBlueMatt merged 7 commits into
lightningdevkit:mainfrom
wpaulino:remove-signer-persistence

Conversation

@wpaulino

Copy link
Copy Markdown
Contributor

Fixes#1209.

@wpaulino
wpaulino marked this pull request as ready for review November 21, 2022 21:37
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/chain/keysinterface.rs Outdated
Comment threadlightning/src/ln/channel.rs
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/chain/onchaintx.rs
@codecov-commenter

codecov-commenter commented Nov 22, 2022

Copy link
Copy Markdown

Codecov Report

Base: 90.69% // Head: 90.54% // Decreases project coverage by -0.14%⚠️

Coverage data is based on head (444fce7) compared to base (52edb35).
Patch coverage: 89.55% of modified lines in pull request are covered.

Additional details and impacted files
@@ Coverage Diff @@## main #1867 +/- ##
==========================================
- Coverage 90.69% 90.54% -0.15% 
==========================================
Files 91 91 Lines 48408 48401 -7 Branches 48408 48401 -7 ==========================================
- Hits 43902 43825 -77 - Misses 4506 4576 +70 
Impacted FilesCoverage Δ
lightning/src/chain/package.rs92.84% <ø> (ø)
lightning/src/util/byte_utils.rs100.00% <ø> (ø)
lightning/src/util/test_utils.rs73.50% <71.42%> (-3.56%)⬇️
lightning/src/ln/channelmanager.rs86.30% <80.00%> (+0.01%)⬆️
lightning/src/ln/channel.rs88.70% <80.43%> (-0.14%)⬇️
lightning/src/chain/channelmonitor.rs90.88% <92.85%> (+0.14%)⬆️
lightning/src/chain/keysinterface.rs83.14% <100.00%> (-7.82%)⬇️
lightning/src/chain/onchaintx.rs95.13% <100.00%> (-0.17%)⬇️
lightning/src/ln/chan_utils.rs93.62% <100.00%> (+<0.01%)⬆️
lightning/src/ln/chanmon_update_fail_tests.rs97.59% <100.00%> (ø)
... and 14 more

Help us with your feedback. Take ten seconds to tell us how you rate us. Have a feature suggestion? Share it here.

☔ View full report at Codecov.
📢 Do you have feedback about the report comment? Let us know in this issue.

@wpaulino
wpaulinoforce-pushed the remove-signer-persistence branch from f139370 to 5defb92CompareNovember 22, 2022 19:47
@wpaulino

Copy link
Copy Markdown
ContributorAuthor

Pushed a new update that allows downgrading and replaces get_channel_signer with derive_channel_signer.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Hmmmmm, now that I think about it we really need to pass the user_channel_id through to the new-signer function. We could do that by passing an enum that either has a keys_id or a user_id to the method, but given the two methods are likely to do very different things (read state vs persist new state) I'm very unconvinced that they need to be merged.

@arik-so

Copy link
Copy Markdown
Contributor

Hm, yeah, I can see how that can be helpful, though imo that's only necessary prior to a channel_keys_id existing to identify the channel. Perhaps the derive method should take an enum of either a user_channel_id or a channel_keys_id?

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Right, if we want a single derive method we'd probably want to do that, but that also makes me thinking we dont want to merge the methods.

@arik-so

Copy link
Copy Markdown
Contributor

I disagree. I feel very strongly wr shouldn't have both get and derive. However, I think I have a better idea. Stay tuned lol

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Why not? They do two fundamentally different things - one loads an instance from disk, one constructs a new instance (and presumably writes it to disk).

@arik-so

Copy link
Copy Markdown
Contributor

Because the entire point of this exercise is a) to obviate this distinction and b) to start phasing out disk I/O altogether.

@wpaulino
wpaulinoforce-pushed the remove-signer-persistence branch from 5defb92 to 224dbd3CompareNovember 22, 2022 23:20
Comment threadlightning/src/chain/keysinterface.rs Outdated
Comment threadlightning/src/chain/keysinterface.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated

let holder_selected_contest_delay = config.channel_handshake_config.our_to_self_delay;
let holder_signer = keys_provider.get_channel_signer(false, channel_value_satoshis);
let channel_keys_id = keys_provider.generate_channel_keys_id(user_id);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

completely unrelated to this PR, but that variable really shouldn't be called user_id

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

obviously, user_provided_channel_id is a bit verbose, but at least it's accurate

Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/util/byte_utils.rs Outdated
Comment threadlightning/src/ln/channel.rs
@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Because the entire point of this exercise is a) to obviate this distinction and b) to start phasing out disk I/O altogether.

No? We cannot remove the I/O for a signer - an enforcing signer absolutely must do IO for every action. What doesn't make sense is the I/O being done "for" a user - they have to do it inline during the signing operations themselves.

@arik-so

Copy link
Copy Markdown
Contributor

Sorry, I meant I/O done by us.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Right, I don't see how that's relevant to whether we combine the new-signer and the derive-preexisting-signer methods?

Comment threadlightning/src/chain/keysinterface.rs Outdated
Comment threadlightning/src/chain/onchaintx.rs Outdated
Comment threadlightning/src/ln/channel.rs
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/chain/keysinterface.rs
Comment threadlightning/src/chain/keysinterface.rs Outdated
@wpaulino
wpaulinoforce-pushed the remove-signer-persistence branch from 224dbd3 to cda514cCompareNovember 29, 2022 17:20

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Okay, I think we're basically on the same page, one note about further code we can remove but otherwise looks good.

Comment threadlightning/src/chain/keysinterface.rs Outdated
Comment threadlightning/src/chain/keysinterface.rs
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/util/byte_utils.rs Outdated
Comment threadlightning/src/ln/channel.rs
Comment threadlightning/src/ln/channel.rs
Comment threadlightning/src/ln/channel.rs
Comment threadlightning/src/chain/onchaintx.rs
Comment threadlightning/src/ln/channel.rs Outdated
@wpaulino
wpaulinoforce-pushed the remove-signer-persistence branch from cda514c to 8e2a89fCompareNovember 30, 2022 23:05
@tnulltnull mentioned this pull request Dec 1, 2022
@TheBlueMattTheBlueMatt added this to the 0.0.113 milestone Dec 1, 2022
@wpaulino
wpaulinoforce-pushed the remove-signer-persistence branch from 8e2a89f to a079946CompareDecember 1, 2022 18:52
Comment threadlightning/src/util/byte_utils.rs Outdated
Comment threadlightning/src/chain/keysinterface.rs Outdated
Comment threadlightning/src/chain/keysinterface.rs
Comment threadlightning/src/chain/onchaintx.rs
Comment threadlightning/src/ln/channel.rs Outdated
@wpaulino
wpaulinoforce-pushed the remove-signer-persistence branch from a079946 to 1141cbbCompareDecember 1, 2022 22:58
@wpaulino

Copy link
Copy Markdown
ContributorAuthor

Had to rebase on latest to address a conflict.

Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/chain/keysinterface.rs
@wpaulino
wpaulinoforce-pushed the remove-signer-persistence branch from 840cf90 to 0572c77CompareDecember 2, 2022 01:42
TheBlueMatt
TheBlueMatt previously approved these changes Dec 2, 2022
@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Needs #1867 (comment) addressed.

arik-so
arik-so previously approved these changes Dec 2, 2022
Comment threadlightning/src/chain/keysinterface.rs Outdated
@wpaulino
wpaulinoforce-pushed the remove-signer-persistence branch from 4501bff to 9acf5f0CompareDecember 5, 2022 20:08
`get_channel_signer` previously had two different responsibilites:
generating unique `channel_keys_id` and using said ID to derive channel
keys. We decide to split it into two methods `generate_channel_keys_id`
and `derive_channel_signer`, such that we can use the latter to fulfill
our goal of re-deriving signers instead of persisting them. There's no
point in storing data that can be easily re-derived.
Now that ready_channel is also called on startup upon deserializing
channels, we opt to rename it to a more indicative name.
We also derive `PartialEq` on ChannelTransactionParameters to allow
implementations to determine whether `provide_channel_parameters` calls
are idempotent after the channel parameters have already been provided.
To do so, we introduce a new serialization version that doesn't store a
channel's signer, and instead stores its signer's `channel_keys_id`.
This is a unique identifier that can be provided to our `KeysInterface`
to re-derive all private key material for said channel.
We choose to not upgrade the minimum compatible serialization version
until a later time, which will also remove any signer serialization
logic on implementations of `KeysInterface` and `Sign`.
Similar to the previous commit, we introduce a new serialization version
that doesn't store a monitor's signer. Since the monitor already knows
of a channel's `channel_keys_id`, there's no need to store any new data
to re-derive all private key material for said channel.
Since `ChannelMonitor`s will now re-derive signers rather than
persisting them, we can no longer use the OnlyReadsKeysInterface
concrete implementation.
Now that we opt to always re-derive channel secrets whenever required,
we can drop the Clone requirement from Sign.
Now that to_be_bytes is available under our current MSRV of 1.41, we
can use it instead of our own version.
@wpaulino
wpaulinoforce-pushed the remove-signer-persistence branch from 9acf5f0 to 444fce7CompareDecember 5, 2022 20:11
@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Would like an ACK from @devrandom

node_secret: SecretKey,
inbound_payment_key: KeyMaterial,
counter: AtomicU64,
signer_state: RefCell<HashMap<u8, (bool, Arc<Mutex<EnforcementState>>)>>

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I know it's internal only, but a comment here would be extremely helpful. I think a comment above counter would be helpful, too. What are we counting, right?

Comment threadlightning/src/chain/keysinterface.rs

@arik-soarik-so left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

It's ready.

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Will open a followup.

/// they MUST NOT be allowed to change to different values once set.
/// counterparty_selected/holder_selected_contest_delay and funding outpoint. Since these are
/// static channel data, they MUST NOT be allowed to change to different values once set, as LDK
/// may call this method more than once.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Huh? LDK will absolutely not call this method more than once (for a given instance).

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

well, for a disk-backed signer that returns a shared reference to derive_* (which is how VLS works internally), it effectively does that. the instances are indexed by the channel keys ID.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

or another way to look at it - an enforcing signer must return a shared reference so that it can keep track of a unique signer state

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Right, my point is that for a given instance of the trait we won't call it more than once. From the perspective of something that exists as multiple instances of the trait its different. Anyway, we can continue this discussion on #1903

@TheBlueMatt
TheBlueMatt merged commit 5588eeb into lightningdevkit:mainDec 6, 2022
@wpaulino
wpaulino deleted the remove-signer-persistence branch December 6, 2022 19:09
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.

Do not default to storing InMemoryChannelKeys keys on disk

6 participants

@wpaulino@codecov-commenter@TheBlueMatt@arik-so@devrandom@ariard
, '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

Re-derive signers instead of persisting them - #1867

Merged
TheBlueMatt merged 7 commits into
lightningdevkit:mainfrom
wpaulino:remove-signer-persistence
Dec 6, 2022
Merged

Re-derive signers instead of persisting them#1867
TheBlueMatt merged 7 commits into
lightningdevkit:mainfrom
wpaulino:remove-signer-persistence

Conversation

@wpaulino

Copy link
Copy Markdown
Contributor

Fixes#1209.

@wpaulino
wpaulino marked this pull request as ready for review November 21, 2022 21:37
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/chain/keysinterface.rs Outdated
Comment threadlightning/src/ln/channel.rs
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/chain/onchaintx.rs
@codecov-commenter

codecov-commenter commented Nov 22, 2022

Copy link
Copy Markdown

Codecov Report

Base: 90.69% // Head: 90.54% // Decreases project coverage by -0.14%⚠️

Coverage data is based on head (444fce7) compared to base (52edb35).
Patch coverage: 89.55% of modified lines in pull request are covered.

Additional details and impacted files
@@ Coverage Diff @@## main #1867 +/- ##
==========================================
- Coverage 90.69% 90.54% -0.15% 
==========================================
Files 91 91 Lines 48408 48401 -7 Branches 48408 48401 -7 ==========================================
- Hits 43902 43825 -77 - Misses 4506 4576 +70 
Impacted FilesCoverage Δ
lightning/src/chain/package.rs92.84% <ø> (ø)
lightning/src/util/byte_utils.rs100.00% <ø> (ø)
lightning/src/util/test_utils.rs73.50% <71.42%> (-3.56%)⬇️
lightning/src/ln/channelmanager.rs86.30% <80.00%> (+0.01%)⬆️
lightning/src/ln/channel.rs88.70% <80.43%> (-0.14%)⬇️
lightning/src/chain/channelmonitor.rs90.88% <92.85%> (+0.14%)⬆️
lightning/src/chain/keysinterface.rs83.14% <100.00%> (-7.82%)⬇️
lightning/src/chain/onchaintx.rs95.13% <100.00%> (-0.17%)⬇️
lightning/src/ln/chan_utils.rs93.62% <100.00%> (+<0.01%)⬆️
lightning/src/ln/chanmon_update_fail_tests.rs97.59% <100.00%> (ø)
... and 14 more

Help us with your feedback. Take ten seconds to tell us how you rate us. Have a feature suggestion? Share it here.

☔ View full report at Codecov.
📢 Do you have feedback about the report comment? Let us know in this issue.

@wpaulino
wpaulinoforce-pushed the remove-signer-persistence branch from f139370 to 5defb92CompareNovember 22, 2022 19:47
@wpaulino

Copy link
Copy Markdown
ContributorAuthor

Pushed a new update that allows downgrading and replaces get_channel_signer with derive_channel_signer.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Hmmmmm, now that I think about it we really need to pass the user_channel_id through to the new-signer function. We could do that by passing an enum that either has a keys_id or a user_id to the method, but given the two methods are likely to do very different things (read state vs persist new state) I'm very unconvinced that they need to be merged.

@arik-so

Copy link
Copy Markdown
Contributor

Hm, yeah, I can see how that can be helpful, though imo that's only necessary prior to a channel_keys_id existing to identify the channel. Perhaps the derive method should take an enum of either a user_channel_id or a channel_keys_id?

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Right, if we want a single derive method we'd probably want to do that, but that also makes me thinking we dont want to merge the methods.

@arik-so

Copy link
Copy Markdown
Contributor

I disagree. I feel very strongly wr shouldn't have both get and derive. However, I think I have a better idea. Stay tuned lol

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Why not? They do two fundamentally different things - one loads an instance from disk, one constructs a new instance (and presumably writes it to disk).

@arik-so

Copy link
Copy Markdown
Contributor

Because the entire point of this exercise is a) to obviate this distinction and b) to start phasing out disk I/O altogether.

@wpaulino
wpaulinoforce-pushed the remove-signer-persistence branch from 5defb92 to 224dbd3CompareNovember 22, 2022 23:20
Comment threadlightning/src/chain/keysinterface.rs Outdated
Comment threadlightning/src/chain/keysinterface.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated

let holder_selected_contest_delay = config.channel_handshake_config.our_to_self_delay;
let holder_signer = keys_provider.get_channel_signer(false, channel_value_satoshis);
let channel_keys_id = keys_provider.generate_channel_keys_id(user_id);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

completely unrelated to this PR, but that variable really shouldn't be called user_id

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

obviously, user_provided_channel_id is a bit verbose, but at least it's accurate

Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/util/byte_utils.rs Outdated
Comment threadlightning/src/ln/channel.rs
@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Because the entire point of this exercise is a) to obviate this distinction and b) to start phasing out disk I/O altogether.

No? We cannot remove the I/O for a signer - an enforcing signer absolutely must do IO for every action. What doesn't make sense is the I/O being done "for" a user - they have to do it inline during the signing operations themselves.

@arik-so

Copy link
Copy Markdown
Contributor

Sorry, I meant I/O done by us.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Right, I don't see how that's relevant to whether we combine the new-signer and the derive-preexisting-signer methods?

Comment threadlightning/src/chain/keysinterface.rs Outdated
Comment threadlightning/src/chain/onchaintx.rs Outdated
Comment threadlightning/src/ln/channel.rs
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/chain/keysinterface.rs
Comment threadlightning/src/chain/keysinterface.rs Outdated
@wpaulino
wpaulinoforce-pushed the remove-signer-persistence branch from 224dbd3 to cda514cCompareNovember 29, 2022 17:20

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Okay, I think we're basically on the same page, one note about further code we can remove but otherwise looks good.

Comment threadlightning/src/chain/keysinterface.rs Outdated
Comment threadlightning/src/chain/keysinterface.rs
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/util/byte_utils.rs Outdated
Comment threadlightning/src/ln/channel.rs
Comment threadlightning/src/ln/channel.rs
Comment threadlightning/src/ln/channel.rs
Comment threadlightning/src/chain/onchaintx.rs
Comment threadlightning/src/ln/channel.rs Outdated
@wpaulino
wpaulinoforce-pushed the remove-signer-persistence branch from cda514c to 8e2a89fCompareNovember 30, 2022 23:05
@tnulltnull mentioned this pull request Dec 1, 2022
@TheBlueMattTheBlueMatt added this to the 0.0.113 milestone Dec 1, 2022
@wpaulino
wpaulinoforce-pushed the remove-signer-persistence branch from 8e2a89f to a079946CompareDecember 1, 2022 18:52
Comment threadlightning/src/util/byte_utils.rs Outdated
Comment threadlightning/src/chain/keysinterface.rs Outdated
Comment threadlightning/src/chain/keysinterface.rs
Comment threadlightning/src/chain/onchaintx.rs
Comment threadlightning/src/ln/channel.rs Outdated
@wpaulino
wpaulinoforce-pushed the remove-signer-persistence branch from a079946 to 1141cbbCompareDecember 1, 2022 22:58
@wpaulino

Copy link
Copy Markdown
ContributorAuthor

Had to rebase on latest to address a conflict.

Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/chain/keysinterface.rs
@wpaulino
wpaulinoforce-pushed the remove-signer-persistence branch from 840cf90 to 0572c77CompareDecember 2, 2022 01:42
TheBlueMatt
TheBlueMatt previously approved these changes Dec 2, 2022
@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Needs #1867 (comment) addressed.

arik-so
arik-so previously approved these changes Dec 2, 2022
Comment threadlightning/src/chain/keysinterface.rs Outdated
@wpaulino
wpaulinoforce-pushed the remove-signer-persistence branch from 4501bff to 9acf5f0CompareDecember 5, 2022 20:08
`get_channel_signer` previously had two different responsibilites:
generating unique `channel_keys_id` and using said ID to derive channel
keys. We decide to split it into two methods `generate_channel_keys_id`
and `derive_channel_signer`, such that we can use the latter to fulfill
our goal of re-deriving signers instead of persisting them. There's no
point in storing data that can be easily re-derived.
Now that ready_channel is also called on startup upon deserializing
channels, we opt to rename it to a more indicative name.
We also derive `PartialEq` on ChannelTransactionParameters to allow
implementations to determine whether `provide_channel_parameters` calls
are idempotent after the channel parameters have already been provided.
To do so, we introduce a new serialization version that doesn't store a
channel's signer, and instead stores its signer's `channel_keys_id`.
This is a unique identifier that can be provided to our `KeysInterface`
to re-derive all private key material for said channel.
We choose to not upgrade the minimum compatible serialization version
until a later time, which will also remove any signer serialization
logic on implementations of `KeysInterface` and `Sign`.
Similar to the previous commit, we introduce a new serialization version
that doesn't store a monitor's signer. Since the monitor already knows
of a channel's `channel_keys_id`, there's no need to store any new data
to re-derive all private key material for said channel.
Since `ChannelMonitor`s will now re-derive signers rather than
persisting them, we can no longer use the OnlyReadsKeysInterface
concrete implementation.
Now that we opt to always re-derive channel secrets whenever required,
we can drop the Clone requirement from Sign.
Now that to_be_bytes is available under our current MSRV of 1.41, we
can use it instead of our own version.
@wpaulino
wpaulinoforce-pushed the remove-signer-persistence branch from 9acf5f0 to 444fce7CompareDecember 5, 2022 20:11
@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Would like an ACK from @devrandom

node_secret: SecretKey,
inbound_payment_key: KeyMaterial,
counter: AtomicU64,
signer_state: RefCell<HashMap<u8, (bool, Arc<Mutex<EnforcementState>>)>>

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I know it's internal only, but a comment here would be extremely helpful. I think a comment above counter would be helpful, too. What are we counting, right?

Comment threadlightning/src/chain/keysinterface.rs

@arik-soarik-so left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

It's ready.

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Will open a followup.

/// they MUST NOT be allowed to change to different values once set.
/// counterparty_selected/holder_selected_contest_delay and funding outpoint. Since these are
/// static channel data, they MUST NOT be allowed to change to different values once set, as LDK
/// may call this method more than once.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Huh? LDK will absolutely not call this method more than once (for a given instance).

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

well, for a disk-backed signer that returns a shared reference to derive_* (which is how VLS works internally), it effectively does that. the instances are indexed by the channel keys ID.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

or another way to look at it - an enforcing signer must return a shared reference so that it can keep track of a unique signer state

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Right, my point is that for a given instance of the trait we won't call it more than once. From the perspective of something that exists as multiple instances of the trait its different. Anyway, we can continue this discussion on #1903

@TheBlueMatt
TheBlueMatt merged commit 5588eeb into lightningdevkit:mainDec 6, 2022
@wpaulino
wpaulino deleted the remove-signer-persistence branch December 6, 2022 19:09
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.

Do not default to storing InMemoryChannelKeys keys on disk

6 participants

@wpaulino@codecov-commenter@TheBlueMatt@arik-so@devrandom@ariard
, '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

Re-derive signers instead of persisting them - #1867

Merged
TheBlueMatt merged 7 commits into
lightningdevkit:mainfrom
wpaulino:remove-signer-persistence
Dec 6, 2022
Merged

Re-derive signers instead of persisting them#1867
TheBlueMatt merged 7 commits into
lightningdevkit:mainfrom
wpaulino:remove-signer-persistence

Conversation

@wpaulino

Copy link
Copy Markdown
Contributor

Fixes#1209.

@wpaulino
wpaulino marked this pull request as ready for review November 21, 2022 21:37
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/chain/keysinterface.rs Outdated
Comment threadlightning/src/ln/channel.rs
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/chain/onchaintx.rs
@codecov-commenter

codecov-commenter commented Nov 22, 2022

Copy link
Copy Markdown

Codecov Report

Base: 90.69% // Head: 90.54% // Decreases project coverage by -0.14%⚠️

Coverage data is based on head (444fce7) compared to base (52edb35).
Patch coverage: 89.55% of modified lines in pull request are covered.

Additional details and impacted files
@@ Coverage Diff @@## main #1867 +/- ##
==========================================
- Coverage 90.69% 90.54% -0.15% 
==========================================
Files 91 91 Lines 48408 48401 -7 Branches 48408 48401 -7 ==========================================
- Hits 43902 43825 -77 - Misses 4506 4576 +70 
Impacted FilesCoverage Δ
lightning/src/chain/package.rs92.84% <ø> (ø)
lightning/src/util/byte_utils.rs100.00% <ø> (ø)
lightning/src/util/test_utils.rs73.50% <71.42%> (-3.56%)⬇️
lightning/src/ln/channelmanager.rs86.30% <80.00%> (+0.01%)⬆️
lightning/src/ln/channel.rs88.70% <80.43%> (-0.14%)⬇️
lightning/src/chain/channelmonitor.rs90.88% <92.85%> (+0.14%)⬆️
lightning/src/chain/keysinterface.rs83.14% <100.00%> (-7.82%)⬇️
lightning/src/chain/onchaintx.rs95.13% <100.00%> (-0.17%)⬇️
lightning/src/ln/chan_utils.rs93.62% <100.00%> (+<0.01%)⬆️
lightning/src/ln/chanmon_update_fail_tests.rs97.59% <100.00%> (ø)
... and 14 more

Help us with your feedback. Take ten seconds to tell us how you rate us. Have a feature suggestion? Share it here.

☔ View full report at Codecov.
📢 Do you have feedback about the report comment? Let us know in this issue.

@wpaulino
wpaulinoforce-pushed the remove-signer-persistence branch from f139370 to 5defb92CompareNovember 22, 2022 19:47
@wpaulino

Copy link
Copy Markdown
ContributorAuthor

Pushed a new update that allows downgrading and replaces get_channel_signer with derive_channel_signer.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Hmmmmm, now that I think about it we really need to pass the user_channel_id through to the new-signer function. We could do that by passing an enum that either has a keys_id or a user_id to the method, but given the two methods are likely to do very different things (read state vs persist new state) I'm very unconvinced that they need to be merged.

@arik-so

Copy link
Copy Markdown
Contributor

Hm, yeah, I can see how that can be helpful, though imo that's only necessary prior to a channel_keys_id existing to identify the channel. Perhaps the derive method should take an enum of either a user_channel_id or a channel_keys_id?

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Right, if we want a single derive method we'd probably want to do that, but that also makes me thinking we dont want to merge the methods.

@arik-so

Copy link
Copy Markdown
Contributor

I disagree. I feel very strongly wr shouldn't have both get and derive. However, I think I have a better idea. Stay tuned lol

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Why not? They do two fundamentally different things - one loads an instance from disk, one constructs a new instance (and presumably writes it to disk).

@arik-so

Copy link
Copy Markdown
Contributor

Because the entire point of this exercise is a) to obviate this distinction and b) to start phasing out disk I/O altogether.

@wpaulino
wpaulinoforce-pushed the remove-signer-persistence branch from 5defb92 to 224dbd3CompareNovember 22, 2022 23:20
Comment threadlightning/src/chain/keysinterface.rs Outdated
Comment threadlightning/src/chain/keysinterface.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated

let holder_selected_contest_delay = config.channel_handshake_config.our_to_self_delay;
let holder_signer = keys_provider.get_channel_signer(false, channel_value_satoshis);
let channel_keys_id = keys_provider.generate_channel_keys_id(user_id);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

completely unrelated to this PR, but that variable really shouldn't be called user_id

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

obviously, user_provided_channel_id is a bit verbose, but at least it's accurate

Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/util/byte_utils.rs Outdated
Comment threadlightning/src/ln/channel.rs
@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Because the entire point of this exercise is a) to obviate this distinction and b) to start phasing out disk I/O altogether.

No? We cannot remove the I/O for a signer - an enforcing signer absolutely must do IO for every action. What doesn't make sense is the I/O being done "for" a user - they have to do it inline during the signing operations themselves.

@arik-so

Copy link
Copy Markdown
Contributor

Sorry, I meant I/O done by us.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Right, I don't see how that's relevant to whether we combine the new-signer and the derive-preexisting-signer methods?

Comment threadlightning/src/chain/keysinterface.rs Outdated
Comment threadlightning/src/chain/onchaintx.rs Outdated
Comment threadlightning/src/ln/channel.rs
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/chain/keysinterface.rs
Comment threadlightning/src/chain/keysinterface.rs Outdated
@wpaulino
wpaulinoforce-pushed the remove-signer-persistence branch from 224dbd3 to cda514cCompareNovember 29, 2022 17:20

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Okay, I think we're basically on the same page, one note about further code we can remove but otherwise looks good.

Comment threadlightning/src/chain/keysinterface.rs Outdated
Comment threadlightning/src/chain/keysinterface.rs
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/util/byte_utils.rs Outdated
Comment threadlightning/src/ln/channel.rs
Comment threadlightning/src/ln/channel.rs
Comment threadlightning/src/ln/channel.rs
Comment threadlightning/src/chain/onchaintx.rs
Comment threadlightning/src/ln/channel.rs Outdated
@wpaulino
wpaulinoforce-pushed the remove-signer-persistence branch from cda514c to 8e2a89fCompareNovember 30, 2022 23:05
@tnulltnull mentioned this pull request Dec 1, 2022
@TheBlueMattTheBlueMatt added this to the 0.0.113 milestone Dec 1, 2022
@wpaulino
wpaulinoforce-pushed the remove-signer-persistence branch from 8e2a89f to a079946CompareDecember 1, 2022 18:52
Comment threadlightning/src/util/byte_utils.rs Outdated
Comment threadlightning/src/chain/keysinterface.rs Outdated
Comment threadlightning/src/chain/keysinterface.rs
Comment threadlightning/src/chain/onchaintx.rs
Comment threadlightning/src/ln/channel.rs Outdated
@wpaulino
wpaulinoforce-pushed the remove-signer-persistence branch from a079946 to 1141cbbCompareDecember 1, 2022 22:58
@wpaulino

Copy link
Copy Markdown
ContributorAuthor

Had to rebase on latest to address a conflict.

Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/chain/keysinterface.rs
@wpaulino
wpaulinoforce-pushed the remove-signer-persistence branch from 840cf90 to 0572c77CompareDecember 2, 2022 01:42
TheBlueMatt
TheBlueMatt previously approved these changes Dec 2, 2022
@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Needs #1867 (comment) addressed.

arik-so
arik-so previously approved these changes Dec 2, 2022
Comment threadlightning/src/chain/keysinterface.rs Outdated
@wpaulino
wpaulinoforce-pushed the remove-signer-persistence branch from 4501bff to 9acf5f0CompareDecember 5, 2022 20:08
`get_channel_signer` previously had two different responsibilites:
generating unique `channel_keys_id` and using said ID to derive channel
keys. We decide to split it into two methods `generate_channel_keys_id`
and `derive_channel_signer`, such that we can use the latter to fulfill
our goal of re-deriving signers instead of persisting them. There's no
point in storing data that can be easily re-derived.
Now that ready_channel is also called on startup upon deserializing
channels, we opt to rename it to a more indicative name.
We also derive `PartialEq` on ChannelTransactionParameters to allow
implementations to determine whether `provide_channel_parameters` calls
are idempotent after the channel parameters have already been provided.
To do so, we introduce a new serialization version that doesn't store a
channel's signer, and instead stores its signer's `channel_keys_id`.
This is a unique identifier that can be provided to our `KeysInterface`
to re-derive all private key material for said channel.
We choose to not upgrade the minimum compatible serialization version
until a later time, which will also remove any signer serialization
logic on implementations of `KeysInterface` and `Sign`.
Similar to the previous commit, we introduce a new serialization version
that doesn't store a monitor's signer. Since the monitor already knows
of a channel's `channel_keys_id`, there's no need to store any new data
to re-derive all private key material for said channel.
Since `ChannelMonitor`s will now re-derive signers rather than
persisting them, we can no longer use the OnlyReadsKeysInterface
concrete implementation.
Now that we opt to always re-derive channel secrets whenever required,
we can drop the Clone requirement from Sign.
Now that to_be_bytes is available under our current MSRV of 1.41, we
can use it instead of our own version.
@wpaulino
wpaulinoforce-pushed the remove-signer-persistence branch from 9acf5f0 to 444fce7CompareDecember 5, 2022 20:11
@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Would like an ACK from @devrandom

node_secret: SecretKey,
inbound_payment_key: KeyMaterial,
counter: AtomicU64,
signer_state: RefCell<HashMap<u8, (bool, Arc<Mutex<EnforcementState>>)>>

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I know it's internal only, but a comment here would be extremely helpful. I think a comment above counter would be helpful, too. What are we counting, right?

Comment threadlightning/src/chain/keysinterface.rs

@arik-soarik-so left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

It's ready.

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Will open a followup.

/// they MUST NOT be allowed to change to different values once set.
/// counterparty_selected/holder_selected_contest_delay and funding outpoint. Since these are
/// static channel data, they MUST NOT be allowed to change to different values once set, as LDK
/// may call this method more than once.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Huh? LDK will absolutely not call this method more than once (for a given instance).

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

well, for a disk-backed signer that returns a shared reference to derive_* (which is how VLS works internally), it effectively does that. the instances are indexed by the channel keys ID.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

or another way to look at it - an enforcing signer must return a shared reference so that it can keep track of a unique signer state

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Right, my point is that for a given instance of the trait we won't call it more than once. From the perspective of something that exists as multiple instances of the trait its different. Anyway, we can continue this discussion on #1903

@TheBlueMatt
TheBlueMatt merged commit 5588eeb into lightningdevkit:mainDec 6, 2022
@wpaulino
wpaulino deleted the remove-signer-persistence branch December 6, 2022 19:09
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.

Do not default to storing InMemoryChannelKeys keys on disk

6 participants

@wpaulino@codecov-commenter@TheBlueMatt@arik-so@devrandom@ariard
, '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

Re-derive signers instead of persisting them - #1867

Merged
TheBlueMatt merged 7 commits into
lightningdevkit:mainfrom
wpaulino:remove-signer-persistence
Dec 6, 2022
Merged

Re-derive signers instead of persisting them#1867
TheBlueMatt merged 7 commits into
lightningdevkit:mainfrom
wpaulino:remove-signer-persistence

Conversation

@wpaulino

Copy link
Copy Markdown
Contributor

Fixes#1209.

@wpaulino
wpaulino marked this pull request as ready for review November 21, 2022 21:37
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/chain/keysinterface.rs Outdated
Comment threadlightning/src/ln/channel.rs
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/chain/onchaintx.rs
@codecov-commenter

codecov-commenter commented Nov 22, 2022

Copy link
Copy Markdown

Codecov Report

Base: 90.69% // Head: 90.54% // Decreases project coverage by -0.14%⚠️

Coverage data is based on head (444fce7) compared to base (52edb35).
Patch coverage: 89.55% of modified lines in pull request are covered.

Additional details and impacted files
@@ Coverage Diff @@## main #1867 +/- ##
==========================================
- Coverage 90.69% 90.54% -0.15% 
==========================================
Files 91 91 Lines 48408 48401 -7 Branches 48408 48401 -7 ==========================================
- Hits 43902 43825 -77 - Misses 4506 4576 +70 
Impacted FilesCoverage Δ
lightning/src/chain/package.rs92.84% <ø> (ø)
lightning/src/util/byte_utils.rs100.00% <ø> (ø)
lightning/src/util/test_utils.rs73.50% <71.42%> (-3.56%)⬇️
lightning/src/ln/channelmanager.rs86.30% <80.00%> (+0.01%)⬆️
lightning/src/ln/channel.rs88.70% <80.43%> (-0.14%)⬇️
lightning/src/chain/channelmonitor.rs90.88% <92.85%> (+0.14%)⬆️
lightning/src/chain/keysinterface.rs83.14% <100.00%> (-7.82%)⬇️
lightning/src/chain/onchaintx.rs95.13% <100.00%> (-0.17%)⬇️
lightning/src/ln/chan_utils.rs93.62% <100.00%> (+<0.01%)⬆️
lightning/src/ln/chanmon_update_fail_tests.rs97.59% <100.00%> (ø)
... and 14 more

Help us with your feedback. Take ten seconds to tell us how you rate us. Have a feature suggestion? Share it here.

☔ View full report at Codecov.
📢 Do you have feedback about the report comment? Let us know in this issue.

@wpaulino
wpaulinoforce-pushed the remove-signer-persistence branch from f139370 to 5defb92CompareNovember 22, 2022 19:47
@wpaulino

Copy link
Copy Markdown
ContributorAuthor

Pushed a new update that allows downgrading and replaces get_channel_signer with derive_channel_signer.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Hmmmmm, now that I think about it we really need to pass the user_channel_id through to the new-signer function. We could do that by passing an enum that either has a keys_id or a user_id to the method, but given the two methods are likely to do very different things (read state vs persist new state) I'm very unconvinced that they need to be merged.

@arik-so

Copy link
Copy Markdown
Contributor

Hm, yeah, I can see how that can be helpful, though imo that's only necessary prior to a channel_keys_id existing to identify the channel. Perhaps the derive method should take an enum of either a user_channel_id or a channel_keys_id?

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Right, if we want a single derive method we'd probably want to do that, but that also makes me thinking we dont want to merge the methods.

@arik-so

Copy link
Copy Markdown
Contributor

I disagree. I feel very strongly wr shouldn't have both get and derive. However, I think I have a better idea. Stay tuned lol

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Why not? They do two fundamentally different things - one loads an instance from disk, one constructs a new instance (and presumably writes it to disk).

@arik-so

Copy link
Copy Markdown
Contributor

Because the entire point of this exercise is a) to obviate this distinction and b) to start phasing out disk I/O altogether.

@wpaulino
wpaulinoforce-pushed the remove-signer-persistence branch from 5defb92 to 224dbd3CompareNovember 22, 2022 23:20
Comment threadlightning/src/chain/keysinterface.rs Outdated
Comment threadlightning/src/chain/keysinterface.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated

let holder_selected_contest_delay = config.channel_handshake_config.our_to_self_delay;
let holder_signer = keys_provider.get_channel_signer(false, channel_value_satoshis);
let channel_keys_id = keys_provider.generate_channel_keys_id(user_id);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

completely unrelated to this PR, but that variable really shouldn't be called user_id

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

obviously, user_provided_channel_id is a bit verbose, but at least it's accurate

Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/util/byte_utils.rs Outdated
Comment threadlightning/src/ln/channel.rs
@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Because the entire point of this exercise is a) to obviate this distinction and b) to start phasing out disk I/O altogether.

No? We cannot remove the I/O for a signer - an enforcing signer absolutely must do IO for every action. What doesn't make sense is the I/O being done "for" a user - they have to do it inline during the signing operations themselves.

@arik-so

Copy link
Copy Markdown
Contributor

Sorry, I meant I/O done by us.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Right, I don't see how that's relevant to whether we combine the new-signer and the derive-preexisting-signer methods?

Comment threadlightning/src/chain/keysinterface.rs Outdated
Comment threadlightning/src/chain/onchaintx.rs Outdated
Comment threadlightning/src/ln/channel.rs
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/chain/keysinterface.rs
Comment threadlightning/src/chain/keysinterface.rs Outdated
@wpaulino
wpaulinoforce-pushed the remove-signer-persistence branch from 224dbd3 to cda514cCompareNovember 29, 2022 17:20

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Okay, I think we're basically on the same page, one note about further code we can remove but otherwise looks good.

Comment threadlightning/src/chain/keysinterface.rs Outdated
Comment threadlightning/src/chain/keysinterface.rs
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/util/byte_utils.rs Outdated
Comment threadlightning/src/ln/channel.rs
Comment threadlightning/src/ln/channel.rs
Comment threadlightning/src/ln/channel.rs
Comment threadlightning/src/chain/onchaintx.rs
Comment threadlightning/src/ln/channel.rs Outdated
@wpaulino
wpaulinoforce-pushed the remove-signer-persistence branch from cda514c to 8e2a89fCompareNovember 30, 2022 23:05
@tnulltnull mentioned this pull request Dec 1, 2022
@TheBlueMattTheBlueMatt added this to the 0.0.113 milestone Dec 1, 2022
@wpaulino
wpaulinoforce-pushed the remove-signer-persistence branch from 8e2a89f to a079946CompareDecember 1, 2022 18:52
Comment threadlightning/src/util/byte_utils.rs Outdated
Comment threadlightning/src/chain/keysinterface.rs Outdated
Comment threadlightning/src/chain/keysinterface.rs
Comment threadlightning/src/chain/onchaintx.rs
Comment threadlightning/src/ln/channel.rs Outdated
@wpaulino
wpaulinoforce-pushed the remove-signer-persistence branch from a079946 to 1141cbbCompareDecember 1, 2022 22:58
@wpaulino

Copy link
Copy Markdown
ContributorAuthor

Had to rebase on latest to address a conflict.

Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/chain/keysinterface.rs
@wpaulino
wpaulinoforce-pushed the remove-signer-persistence branch from 840cf90 to 0572c77CompareDecember 2, 2022 01:42
TheBlueMatt
TheBlueMatt previously approved these changes Dec 2, 2022
@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Needs #1867 (comment) addressed.

arik-so
arik-so previously approved these changes Dec 2, 2022
Comment threadlightning/src/chain/keysinterface.rs Outdated
@wpaulino
wpaulinoforce-pushed the remove-signer-persistence branch from 4501bff to 9acf5f0CompareDecember 5, 2022 20:08
`get_channel_signer` previously had two different responsibilites:
generating unique `channel_keys_id` and using said ID to derive channel
keys. We decide to split it into two methods `generate_channel_keys_id`
and `derive_channel_signer`, such that we can use the latter to fulfill
our goal of re-deriving signers instead of persisting them. There's no
point in storing data that can be easily re-derived.
Now that ready_channel is also called on startup upon deserializing
channels, we opt to rename it to a more indicative name.
We also derive `PartialEq` on ChannelTransactionParameters to allow
implementations to determine whether `provide_channel_parameters` calls
are idempotent after the channel parameters have already been provided.
To do so, we introduce a new serialization version that doesn't store a
channel's signer, and instead stores its signer's `channel_keys_id`.
This is a unique identifier that can be provided to our `KeysInterface`
to re-derive all private key material for said channel.
We choose to not upgrade the minimum compatible serialization version
until a later time, which will also remove any signer serialization
logic on implementations of `KeysInterface` and `Sign`.
Similar to the previous commit, we introduce a new serialization version
that doesn't store a monitor's signer. Since the monitor already knows
of a channel's `channel_keys_id`, there's no need to store any new data
to re-derive all private key material for said channel.
Since `ChannelMonitor`s will now re-derive signers rather than
persisting them, we can no longer use the OnlyReadsKeysInterface
concrete implementation.
Now that we opt to always re-derive channel secrets whenever required,
we can drop the Clone requirement from Sign.
Now that to_be_bytes is available under our current MSRV of 1.41, we
can use it instead of our own version.
@wpaulino
wpaulinoforce-pushed the remove-signer-persistence branch from 9acf5f0 to 444fce7CompareDecember 5, 2022 20:11
@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Would like an ACK from @devrandom

node_secret: SecretKey,
inbound_payment_key: KeyMaterial,
counter: AtomicU64,
signer_state: RefCell<HashMap<u8, (bool, Arc<Mutex<EnforcementState>>)>>

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I know it's internal only, but a comment here would be extremely helpful. I think a comment above counter would be helpful, too. What are we counting, right?

Comment threadlightning/src/chain/keysinterface.rs

@arik-soarik-so left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

It's ready.

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Will open a followup.

/// they MUST NOT be allowed to change to different values once set.
/// counterparty_selected/holder_selected_contest_delay and funding outpoint. Since these are
/// static channel data, they MUST NOT be allowed to change to different values once set, as LDK
/// may call this method more than once.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Huh? LDK will absolutely not call this method more than once (for a given instance).

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

well, for a disk-backed signer that returns a shared reference to derive_* (which is how VLS works internally), it effectively does that. the instances are indexed by the channel keys ID.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

or another way to look at it - an enforcing signer must return a shared reference so that it can keep track of a unique signer state

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Right, my point is that for a given instance of the trait we won't call it more than once. From the perspective of something that exists as multiple instances of the trait its different. Anyway, we can continue this discussion on #1903

@TheBlueMatt
TheBlueMatt merged commit 5588eeb into lightningdevkit:mainDec 6, 2022
@wpaulino
wpaulino deleted the remove-signer-persistence branch December 6, 2022 19:09
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.

Do not default to storing InMemoryChannelKeys keys on disk

6 participants

@wpaulino@codecov-commenter@TheBlueMatt@arik-so@devrandom@ariard