Skip to content

Move pre-signed channel transactions generation in OnchainTxHandler - #540

Closed
ariard wants to merge 7 commits into
lightningdevkit:masterfrom
ariard:2020-02-move-local-txn
Closed

Move pre-signed channel transactions generation in OnchainTxHandler#540
ariard wants to merge 7 commits into
lightningdevkit:masterfrom
ariard:2020-02-move-local-txn

Conversation

@ariard

Copy link
Copy Markdown

Next step in moving private keys behind an external signer interface, moving pre-signed channel transactions (local commitment, HTLC-Success, HTLC-Timeout) in OnchainTxHandler. There is no bump logic, as without option_simplified_commitment changes we can't CPFP/BYOF them.

After this, code should be ready to move key storage inside OnchainTxHandler and some chan_utils methods in signer. We need also to think about bumping logic, if we make it an interface accessible to the signer.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Note: failed borrowck on 1.22.

@codecov

codecovBot commented Mar 10, 2020

Copy link
Copy Markdown

Codecov Report

Merging #540 into master will decrease coverage by 0.02%.
The diff coverage is 96.01%.

Impacted file tree graph

@@ Coverage Diff @@## master #540 +/- ##
==========================================
- Coverage 90.23% 90.21% -0.03% 
==========================================
Files 34 34 Lines 19182 19120 -62 ==========================================
- Hits 17309 17249 -60 + Misses 1873 1871 -2
Impacted FilesCoverage Δ
lightning/src/ln/channelmonitor.rs92.15% <100%> (+1.89%)⬆️
lightning/src/util/macro_logger.rs87.5% <100%> (+2.71%)⬆️
lightning/src/ln/onchaintx.rs92.99% <90.27%> (+0.17%)⬆️
lightning/src/ln/functional_tests.rs96.26% <97.36%> (-0.08%)⬇️
lightning/src/ln/wire.rs54.54% <0%> (-11.31%)⬇️
lightning/src/ln/msgs.rs88.1% <0%> (-1.62%)⬇️
lightning/src/util/config.rs68.29% <0%> (-0.76%)⬇️
lightning/src/ln/features.rs96.62% <0%> (-0.26%)⬇️
lightning/src/ln/functional_test_utils.rs94.44% <0%> (-0.16%)⬇️
... and 5 more

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 33b7c90...d66011d. Read the comment docs.

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

First round.

Comment threadlightning/src/ln/channelmonitor.rs Outdated
Comment threadlightning/src/ln/onchaintx.rs Outdated
if let Some((new_timer, new_feerate, tx)) = self.generate_claim_tx(height, &claim_material, &*fee_estimator) {
claim_material.height_timer = new_timer;
claim_material.feerate_previous = new_feerate;
if claim_material.height_timer != ::std::u32::MAX {

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.

Please use Option<> instead of a sentinal value.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Yeah, spendable outputs is reworked in next PR, so just temporary but switch to a Option<> ofc

Comment threadlightning/src/ln/channelmonitor.rs Outdated
},
Funding {
local_tx_remote_signed: LocalCommitmentTransaction,
funding_key: SecretKey,

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.

Don't pass the SecretKeys - you can get them out of the ChannelKeys already with ChannelKeys::funding_key() or ChannelKeys::htlc_base_key().

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Hmmmm what do you suggest exactly ? To introduce yet ChannelKeys in OnchainTxHandler ?

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.

Yea, just pass in a reference to the ChannelMonitor ChannelKeys in OnchainTxHandler::block_connected() and pass it down. We can rework it later, but its so awkward to copy private keys around like this.

Antoine Riard added 2 commits March 17, 2020 17:35
Previously, we would regenerate this class of txn twice due to
block-rescan triggered by new watching outputs registered.
This commmit doesn't change behavior, it only tweaks TestBroadcaster
to ensure we modify cleanly tests anticipating next commit
refactor.
Watchtower will be supported through external signer interface
where a watchtower implementation may differ from a local one
by the scope of key access and pre-signed datas.
@ariard

ariard commented Mar 18, 2020

Copy link
Copy Markdown
Author

@TheBlueMatt okay added 2 new commits : one to drop Watchtower mode from Storage, tower support is planned to be implemented as an external signer implem, so remove it from ChannelMonitor which is for detection. The other to move duplicate keys storage in OnchainTxHanndler, to avoid passing back and forth stuff in InputMaterial. Next PRs should keep drying up key usage in ChannelMonitor and pass Storage behind ChanSigner.

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

Note this currently does not build.

assert_eq!(node_txn[3].input.len(), 1);
let witness_script = node_txn[3].input[0].witness.last().unwrap();
assert_eq!(witness_script.len(), OFFERED_HTLC_SCRIPT_WEIGHT); //Spending an offered htlc output
check_spends!(node_txn[3], node_txn[2].clone());

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.

Rebase error - you dont need the clone()s anymore. Also in a few other places.

Antoine Riard added 5 commits March 18, 2020 13:39
Going further between splitting detection and transaction
generation, we endow OnchainTxHandler with keys access.
That way, in latter commits, we may remove keys entirely
from ChannelMonitor.
Local Commitment Transaction can't be bumped without anchor outputs
so their generation is one-time for now. We move them in
OnchainTxHandler for simplifying ChannelMonitor and to prepare
storage of keys material behind one external signer interface.
Some tests break due to change in transaction broadcast order but
number of transactions broadcast should stay the same.
HTLC Transaction can't be bumped without sighash changes
so their gneeration is one-time for nwo. We move them in
OnchainTxHandler for simplifying ChannelMonitor and to prepare
storage of keys material behind one external signer interface.
Some tests break due to change in transaction broadcaster order.
Number of transactions may vary because of temporary anti-duplicata
tweak can't dissociate between 2- broadcast from different
origins (ChannelMonitor, ChannelManager) and 2-broadcast from same
component.
Comment threadlightning/src/ln/functional_tests.rs Outdated
assert_eq!(node_txn.len(), 3);
check_spends!(node_txn[1], node_txn[0]);
check_spends!(node_txn[2], node_txn[0]);
check_spends!(node_txn[0], node_txn[2].clone());

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.

Rebase error - clone is not needed here.

// If would_broadcast_at_height determine this local tx should be broadcast, absolute_timelock is set to current_height,
// because it indicates that this tx confirmation is urgent. It's not going to change anything because we can't bump
// local_commitment before anchor_outputs, should be rethought afterwards
claimable_outpoints.push(ClaimRequest { absolute_timelock: height, aggregable: false, outpoint: BitcoinOutPoint { txid: self.key_storage.funding_info.as_ref().unwrap().0.txid.clone(), vout: self.key_storage.funding_info.as_ref().unwrap().0.index as u32 }, witness_data: InputMaterial::Funding { local_tx_remote_signed: cur_local_tx.tx.clone(), channel_value: self.channel_value_satoshis.unwrap() }});

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.

clone() ing the cur_local_tx wholesale here really sucks. a) you need to drop the add_local_sig line above, since we should now be signing + broadcasting this tx in onchain wholesale, and b) can we take() the cur_local_tx.tx and pass it to OnChainTxHandler? We should never be doing anything with it aside from sign, then broadcast, so can it happen in onchain?

Comment threadlightning/src/ln/functional_tests.rs Outdated

// Check the pair local commitment and HTLC-timeout broadcast due to HTLC expiration
assert_eq!(node_txn[3].input.len(), 1);
check_spends!(node_txn[3], chan_1.3.clone());

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.

Same here - can you do a pass for clone() in check_spends? Seems like you reintroduced a bunch of them.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Needs rebase.

@ariard

Copy link
Copy Markdown
Author

Replaced by #559

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

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

Move pre-signed channel transactions generation in OnchainTxHandler - #540

Closed
ariard wants to merge 7 commits into
lightningdevkit:masterfrom
ariard:2020-02-move-local-txn
Closed

Move pre-signed channel transactions generation in OnchainTxHandler#540
ariard wants to merge 7 commits into
lightningdevkit:masterfrom
ariard:2020-02-move-local-txn

Conversation

@ariard

Copy link
Copy Markdown

Next step in moving private keys behind an external signer interface, moving pre-signed channel transactions (local commitment, HTLC-Success, HTLC-Timeout) in OnchainTxHandler. There is no bump logic, as without option_simplified_commitment changes we can't CPFP/BYOF them.

After this, code should be ready to move key storage inside OnchainTxHandler and some chan_utils methods in signer. We need also to think about bumping logic, if we make it an interface accessible to the signer.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Note: failed borrowck on 1.22.

@codecov

codecovBot commented Mar 10, 2020

Copy link
Copy Markdown

Codecov Report

Merging #540 into master will decrease coverage by 0.02%.
The diff coverage is 96.01%.

Impacted file tree graph

@@ Coverage Diff @@## master #540 +/- ##
==========================================
- Coverage 90.23% 90.21% -0.03% 
==========================================
Files 34 34 Lines 19182 19120 -62 ==========================================
- Hits 17309 17249 -60 + Misses 1873 1871 -2
Impacted FilesCoverage Δ
lightning/src/ln/channelmonitor.rs92.15% <100%> (+1.89%)⬆️
lightning/src/util/macro_logger.rs87.5% <100%> (+2.71%)⬆️
lightning/src/ln/onchaintx.rs92.99% <90.27%> (+0.17%)⬆️
lightning/src/ln/functional_tests.rs96.26% <97.36%> (-0.08%)⬇️
lightning/src/ln/wire.rs54.54% <0%> (-11.31%)⬇️
lightning/src/ln/msgs.rs88.1% <0%> (-1.62%)⬇️
lightning/src/util/config.rs68.29% <0%> (-0.76%)⬇️
lightning/src/ln/features.rs96.62% <0%> (-0.26%)⬇️
lightning/src/ln/functional_test_utils.rs94.44% <0%> (-0.16%)⬇️
... and 5 more

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 33b7c90...d66011d. Read the comment docs.

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

First round.

Comment threadlightning/src/ln/channelmonitor.rs Outdated
Comment threadlightning/src/ln/onchaintx.rs Outdated
if let Some((new_timer, new_feerate, tx)) = self.generate_claim_tx(height, &claim_material, &*fee_estimator) {
claim_material.height_timer = new_timer;
claim_material.feerate_previous = new_feerate;
if claim_material.height_timer != ::std::u32::MAX {

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.

Please use Option<> instead of a sentinal value.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Yeah, spendable outputs is reworked in next PR, so just temporary but switch to a Option<> ofc

Comment threadlightning/src/ln/channelmonitor.rs Outdated
},
Funding {
local_tx_remote_signed: LocalCommitmentTransaction,
funding_key: SecretKey,

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.

Don't pass the SecretKeys - you can get them out of the ChannelKeys already with ChannelKeys::funding_key() or ChannelKeys::htlc_base_key().

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Hmmmm what do you suggest exactly ? To introduce yet ChannelKeys in OnchainTxHandler ?

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.

Yea, just pass in a reference to the ChannelMonitor ChannelKeys in OnchainTxHandler::block_connected() and pass it down. We can rework it later, but its so awkward to copy private keys around like this.

Antoine Riard added 2 commits March 17, 2020 17:35
Previously, we would regenerate this class of txn twice due to
block-rescan triggered by new watching outputs registered.
This commmit doesn't change behavior, it only tweaks TestBroadcaster
to ensure we modify cleanly tests anticipating next commit
refactor.
Watchtower will be supported through external signer interface
where a watchtower implementation may differ from a local one
by the scope of key access and pre-signed datas.
@ariard

ariard commented Mar 18, 2020

Copy link
Copy Markdown
Author

@TheBlueMatt okay added 2 new commits : one to drop Watchtower mode from Storage, tower support is planned to be implemented as an external signer implem, so remove it from ChannelMonitor which is for detection. The other to move duplicate keys storage in OnchainTxHanndler, to avoid passing back and forth stuff in InputMaterial. Next PRs should keep drying up key usage in ChannelMonitor and pass Storage behind ChanSigner.

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

Note this currently does not build.

assert_eq!(node_txn[3].input.len(), 1);
let witness_script = node_txn[3].input[0].witness.last().unwrap();
assert_eq!(witness_script.len(), OFFERED_HTLC_SCRIPT_WEIGHT); //Spending an offered htlc output
check_spends!(node_txn[3], node_txn[2].clone());

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.

Rebase error - you dont need the clone()s anymore. Also in a few other places.

Antoine Riard added 5 commits March 18, 2020 13:39
Going further between splitting detection and transaction
generation, we endow OnchainTxHandler with keys access.
That way, in latter commits, we may remove keys entirely
from ChannelMonitor.
Local Commitment Transaction can't be bumped without anchor outputs
so their generation is one-time for now. We move them in
OnchainTxHandler for simplifying ChannelMonitor and to prepare
storage of keys material behind one external signer interface.
Some tests break due to change in transaction broadcast order but
number of transactions broadcast should stay the same.
HTLC Transaction can't be bumped without sighash changes
so their gneeration is one-time for nwo. We move them in
OnchainTxHandler for simplifying ChannelMonitor and to prepare
storage of keys material behind one external signer interface.
Some tests break due to change in transaction broadcaster order.
Number of transactions may vary because of temporary anti-duplicata
tweak can't dissociate between 2- broadcast from different
origins (ChannelMonitor, ChannelManager) and 2-broadcast from same
component.
Comment threadlightning/src/ln/functional_tests.rs Outdated
assert_eq!(node_txn.len(), 3);
check_spends!(node_txn[1], node_txn[0]);
check_spends!(node_txn[2], node_txn[0]);
check_spends!(node_txn[0], node_txn[2].clone());

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.

Rebase error - clone is not needed here.

// If would_broadcast_at_height determine this local tx should be broadcast, absolute_timelock is set to current_height,
// because it indicates that this tx confirmation is urgent. It's not going to change anything because we can't bump
// local_commitment before anchor_outputs, should be rethought afterwards
claimable_outpoints.push(ClaimRequest { absolute_timelock: height, aggregable: false, outpoint: BitcoinOutPoint { txid: self.key_storage.funding_info.as_ref().unwrap().0.txid.clone(), vout: self.key_storage.funding_info.as_ref().unwrap().0.index as u32 }, witness_data: InputMaterial::Funding { local_tx_remote_signed: cur_local_tx.tx.clone(), channel_value: self.channel_value_satoshis.unwrap() }});

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.

clone() ing the cur_local_tx wholesale here really sucks. a) you need to drop the add_local_sig line above, since we should now be signing + broadcasting this tx in onchain wholesale, and b) can we take() the cur_local_tx.tx and pass it to OnChainTxHandler? We should never be doing anything with it aside from sign, then broadcast, so can it happen in onchain?

Comment threadlightning/src/ln/functional_tests.rs Outdated

// Check the pair local commitment and HTLC-timeout broadcast due to HTLC expiration
assert_eq!(node_txn[3].input.len(), 1);
check_spends!(node_txn[3], chan_1.3.clone());

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.

Same here - can you do a pass for clone() in check_spends? Seems like you reintroduced a bunch of them.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Needs rebase.

@ariard

Copy link
Copy Markdown
Author

Replaced by #559

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@ariard@TheBlueMatt
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Move pre-signed channel transactions generation in OnchainTxHandler by ariard · Pull Request #540 · lightningdevkit/rust-lightning · GitHub
Skip to content

Move pre-signed channel transactions generation in OnchainTxHandler - #540

Closed
ariard wants to merge 7 commits into
lightningdevkit:masterfrom
ariard:2020-02-move-local-txn
Closed

Move pre-signed channel transactions generation in OnchainTxHandler#540
ariard wants to merge 7 commits into
lightningdevkit:masterfrom
ariard:2020-02-move-local-txn

Conversation

@ariard

Copy link
Copy Markdown

Next step in moving private keys behind an external signer interface, moving pre-signed channel transactions (local commitment, HTLC-Success, HTLC-Timeout) in OnchainTxHandler. There is no bump logic, as without option_simplified_commitment changes we can't CPFP/BYOF them.

After this, code should be ready to move key storage inside OnchainTxHandler and some chan_utils methods in signer. We need also to think about bumping logic, if we make it an interface accessible to the signer.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Note: failed borrowck on 1.22.

@codecov

codecovBot commented Mar 10, 2020

Copy link
Copy Markdown

Codecov Report

Merging #540 into master will decrease coverage by 0.02%.
The diff coverage is 96.01%.

Impacted file tree graph

@@ Coverage Diff @@## master #540 +/- ##
==========================================
- Coverage 90.23% 90.21% -0.03% 
==========================================
Files 34 34 Lines 19182 19120 -62 ==========================================
- Hits 17309 17249 -60 + Misses 1873 1871 -2
Impacted FilesCoverage Δ
lightning/src/ln/channelmonitor.rs92.15% <100%> (+1.89%)⬆️
lightning/src/util/macro_logger.rs87.5% <100%> (+2.71%)⬆️
lightning/src/ln/onchaintx.rs92.99% <90.27%> (+0.17%)⬆️
lightning/src/ln/functional_tests.rs96.26% <97.36%> (-0.08%)⬇️
lightning/src/ln/wire.rs54.54% <0%> (-11.31%)⬇️
lightning/src/ln/msgs.rs88.1% <0%> (-1.62%)⬇️
lightning/src/util/config.rs68.29% <0%> (-0.76%)⬇️
lightning/src/ln/features.rs96.62% <0%> (-0.26%)⬇️
lightning/src/ln/functional_test_utils.rs94.44% <0%> (-0.16%)⬇️
... and 5 more

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 33b7c90...d66011d. Read the comment docs.

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

First round.

Comment threadlightning/src/ln/channelmonitor.rs Outdated
Comment threadlightning/src/ln/onchaintx.rs Outdated
if let Some((new_timer, new_feerate, tx)) = self.generate_claim_tx(height, &claim_material, &*fee_estimator) {
claim_material.height_timer = new_timer;
claim_material.feerate_previous = new_feerate;
if claim_material.height_timer != ::std::u32::MAX {

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.

Please use Option<> instead of a sentinal value.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Yeah, spendable outputs is reworked in next PR, so just temporary but switch to a Option<> ofc

Comment threadlightning/src/ln/channelmonitor.rs Outdated
},
Funding {
local_tx_remote_signed: LocalCommitmentTransaction,
funding_key: SecretKey,

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.

Don't pass the SecretKeys - you can get them out of the ChannelKeys already with ChannelKeys::funding_key() or ChannelKeys::htlc_base_key().

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Hmmmm what do you suggest exactly ? To introduce yet ChannelKeys in OnchainTxHandler ?

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.

Yea, just pass in a reference to the ChannelMonitor ChannelKeys in OnchainTxHandler::block_connected() and pass it down. We can rework it later, but its so awkward to copy private keys around like this.

Antoine Riard added 2 commits March 17, 2020 17:35
Previously, we would regenerate this class of txn twice due to
block-rescan triggered by new watching outputs registered.
This commmit doesn't change behavior, it only tweaks TestBroadcaster
to ensure we modify cleanly tests anticipating next commit
refactor.
Watchtower will be supported through external signer interface
where a watchtower implementation may differ from a local one
by the scope of key access and pre-signed datas.
@ariard

ariard commented Mar 18, 2020

Copy link
Copy Markdown
Author

@TheBlueMatt okay added 2 new commits : one to drop Watchtower mode from Storage, tower support is planned to be implemented as an external signer implem, so remove it from ChannelMonitor which is for detection. The other to move duplicate keys storage in OnchainTxHanndler, to avoid passing back and forth stuff in InputMaterial. Next PRs should keep drying up key usage in ChannelMonitor and pass Storage behind ChanSigner.

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

Note this currently does not build.

assert_eq!(node_txn[3].input.len(), 1);
let witness_script = node_txn[3].input[0].witness.last().unwrap();
assert_eq!(witness_script.len(), OFFERED_HTLC_SCRIPT_WEIGHT); //Spending an offered htlc output
check_spends!(node_txn[3], node_txn[2].clone());

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.

Rebase error - you dont need the clone()s anymore. Also in a few other places.

Antoine Riard added 5 commits March 18, 2020 13:39
Going further between splitting detection and transaction
generation, we endow OnchainTxHandler with keys access.
That way, in latter commits, we may remove keys entirely
from ChannelMonitor.
Local Commitment Transaction can't be bumped without anchor outputs
so their generation is one-time for now. We move them in
OnchainTxHandler for simplifying ChannelMonitor and to prepare
storage of keys material behind one external signer interface.
Some tests break due to change in transaction broadcast order but
number of transactions broadcast should stay the same.
HTLC Transaction can't be bumped without sighash changes
so their gneeration is one-time for nwo. We move them in
OnchainTxHandler for simplifying ChannelMonitor and to prepare
storage of keys material behind one external signer interface.
Some tests break due to change in transaction broadcaster order.
Number of transactions may vary because of temporary anti-duplicata
tweak can't dissociate between 2- broadcast from different
origins (ChannelMonitor, ChannelManager) and 2-broadcast from same
component.
Comment threadlightning/src/ln/functional_tests.rs Outdated
assert_eq!(node_txn.len(), 3);
check_spends!(node_txn[1], node_txn[0]);
check_spends!(node_txn[2], node_txn[0]);
check_spends!(node_txn[0], node_txn[2].clone());

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.

Rebase error - clone is not needed here.

// If would_broadcast_at_height determine this local tx should be broadcast, absolute_timelock is set to current_height,
// because it indicates that this tx confirmation is urgent. It's not going to change anything because we can't bump
// local_commitment before anchor_outputs, should be rethought afterwards
claimable_outpoints.push(ClaimRequest { absolute_timelock: height, aggregable: false, outpoint: BitcoinOutPoint { txid: self.key_storage.funding_info.as_ref().unwrap().0.txid.clone(), vout: self.key_storage.funding_info.as_ref().unwrap().0.index as u32 }, witness_data: InputMaterial::Funding { local_tx_remote_signed: cur_local_tx.tx.clone(), channel_value: self.channel_value_satoshis.unwrap() }});

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.

clone() ing the cur_local_tx wholesale here really sucks. a) you need to drop the add_local_sig line above, since we should now be signing + broadcasting this tx in onchain wholesale, and b) can we take() the cur_local_tx.tx and pass it to OnChainTxHandler? We should never be doing anything with it aside from sign, then broadcast, so can it happen in onchain?

Comment threadlightning/src/ln/functional_tests.rs Outdated

// Check the pair local commitment and HTLC-timeout broadcast due to HTLC expiration
assert_eq!(node_txn[3].input.len(), 1);
check_spends!(node_txn[3], chan_1.3.clone());

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.

Same here - can you do a pass for clone() in check_spends? Seems like you reintroduced a bunch of them.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Needs rebase.

@ariard

Copy link
Copy Markdown
Author

Replaced by #559

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

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

Move pre-signed channel transactions generation in OnchainTxHandler - #540

Closed
ariard wants to merge 7 commits into
lightningdevkit:masterfrom
ariard:2020-02-move-local-txn
Closed

Move pre-signed channel transactions generation in OnchainTxHandler#540
ariard wants to merge 7 commits into
lightningdevkit:masterfrom
ariard:2020-02-move-local-txn

Conversation

@ariard

Copy link
Copy Markdown

Next step in moving private keys behind an external signer interface, moving pre-signed channel transactions (local commitment, HTLC-Success, HTLC-Timeout) in OnchainTxHandler. There is no bump logic, as without option_simplified_commitment changes we can't CPFP/BYOF them.

After this, code should be ready to move key storage inside OnchainTxHandler and some chan_utils methods in signer. We need also to think about bumping logic, if we make it an interface accessible to the signer.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Note: failed borrowck on 1.22.

@codecov

codecovBot commented Mar 10, 2020

Copy link
Copy Markdown

Codecov Report

Merging #540 into master will decrease coverage by 0.02%.
The diff coverage is 96.01%.

Impacted file tree graph

@@ Coverage Diff @@## master #540 +/- ##
==========================================
- Coverage 90.23% 90.21% -0.03% 
==========================================
Files 34 34 Lines 19182 19120 -62 ==========================================
- Hits 17309 17249 -60 + Misses 1873 1871 -2
Impacted FilesCoverage Δ
lightning/src/ln/channelmonitor.rs92.15% <100%> (+1.89%)⬆️
lightning/src/util/macro_logger.rs87.5% <100%> (+2.71%)⬆️
lightning/src/ln/onchaintx.rs92.99% <90.27%> (+0.17%)⬆️
lightning/src/ln/functional_tests.rs96.26% <97.36%> (-0.08%)⬇️
lightning/src/ln/wire.rs54.54% <0%> (-11.31%)⬇️
lightning/src/ln/msgs.rs88.1% <0%> (-1.62%)⬇️
lightning/src/util/config.rs68.29% <0%> (-0.76%)⬇️
lightning/src/ln/features.rs96.62% <0%> (-0.26%)⬇️
lightning/src/ln/functional_test_utils.rs94.44% <0%> (-0.16%)⬇️
... and 5 more

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 33b7c90...d66011d. Read the comment docs.

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

First round.

Comment threadlightning/src/ln/channelmonitor.rs Outdated
Comment threadlightning/src/ln/onchaintx.rs Outdated
if let Some((new_timer, new_feerate, tx)) = self.generate_claim_tx(height, &claim_material, &*fee_estimator) {
claim_material.height_timer = new_timer;
claim_material.feerate_previous = new_feerate;
if claim_material.height_timer != ::std::u32::MAX {

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.

Please use Option<> instead of a sentinal value.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Yeah, spendable outputs is reworked in next PR, so just temporary but switch to a Option<> ofc

Comment threadlightning/src/ln/channelmonitor.rs Outdated
},
Funding {
local_tx_remote_signed: LocalCommitmentTransaction,
funding_key: SecretKey,

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.

Don't pass the SecretKeys - you can get them out of the ChannelKeys already with ChannelKeys::funding_key() or ChannelKeys::htlc_base_key().

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Hmmmm what do you suggest exactly ? To introduce yet ChannelKeys in OnchainTxHandler ?

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.

Yea, just pass in a reference to the ChannelMonitor ChannelKeys in OnchainTxHandler::block_connected() and pass it down. We can rework it later, but its so awkward to copy private keys around like this.

Antoine Riard added 2 commits March 17, 2020 17:35
Previously, we would regenerate this class of txn twice due to
block-rescan triggered by new watching outputs registered.
This commmit doesn't change behavior, it only tweaks TestBroadcaster
to ensure we modify cleanly tests anticipating next commit
refactor.
Watchtower will be supported through external signer interface
where a watchtower implementation may differ from a local one
by the scope of key access and pre-signed datas.
@ariard

ariard commented Mar 18, 2020

Copy link
Copy Markdown
Author

@TheBlueMatt okay added 2 new commits : one to drop Watchtower mode from Storage, tower support is planned to be implemented as an external signer implem, so remove it from ChannelMonitor which is for detection. The other to move duplicate keys storage in OnchainTxHanndler, to avoid passing back and forth stuff in InputMaterial. Next PRs should keep drying up key usage in ChannelMonitor and pass Storage behind ChanSigner.

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

Note this currently does not build.

assert_eq!(node_txn[3].input.len(), 1);
let witness_script = node_txn[3].input[0].witness.last().unwrap();
assert_eq!(witness_script.len(), OFFERED_HTLC_SCRIPT_WEIGHT); //Spending an offered htlc output
check_spends!(node_txn[3], node_txn[2].clone());

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.

Rebase error - you dont need the clone()s anymore. Also in a few other places.

Antoine Riard added 5 commits March 18, 2020 13:39
Going further between splitting detection and transaction
generation, we endow OnchainTxHandler with keys access.
That way, in latter commits, we may remove keys entirely
from ChannelMonitor.
Local Commitment Transaction can't be bumped without anchor outputs
so their generation is one-time for now. We move them in
OnchainTxHandler for simplifying ChannelMonitor and to prepare
storage of keys material behind one external signer interface.
Some tests break due to change in transaction broadcast order but
number of transactions broadcast should stay the same.
HTLC Transaction can't be bumped without sighash changes
so their gneeration is one-time for nwo. We move them in
OnchainTxHandler for simplifying ChannelMonitor and to prepare
storage of keys material behind one external signer interface.
Some tests break due to change in transaction broadcaster order.
Number of transactions may vary because of temporary anti-duplicata
tweak can't dissociate between 2- broadcast from different
origins (ChannelMonitor, ChannelManager) and 2-broadcast from same
component.
Comment threadlightning/src/ln/functional_tests.rs Outdated
assert_eq!(node_txn.len(), 3);
check_spends!(node_txn[1], node_txn[0]);
check_spends!(node_txn[2], node_txn[0]);
check_spends!(node_txn[0], node_txn[2].clone());

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.

Rebase error - clone is not needed here.

// If would_broadcast_at_height determine this local tx should be broadcast, absolute_timelock is set to current_height,
// because it indicates that this tx confirmation is urgent. It's not going to change anything because we can't bump
// local_commitment before anchor_outputs, should be rethought afterwards
claimable_outpoints.push(ClaimRequest { absolute_timelock: height, aggregable: false, outpoint: BitcoinOutPoint { txid: self.key_storage.funding_info.as_ref().unwrap().0.txid.clone(), vout: self.key_storage.funding_info.as_ref().unwrap().0.index as u32 }, witness_data: InputMaterial::Funding { local_tx_remote_signed: cur_local_tx.tx.clone(), channel_value: self.channel_value_satoshis.unwrap() }});

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.

clone() ing the cur_local_tx wholesale here really sucks. a) you need to drop the add_local_sig line above, since we should now be signing + broadcasting this tx in onchain wholesale, and b) can we take() the cur_local_tx.tx and pass it to OnChainTxHandler? We should never be doing anything with it aside from sign, then broadcast, so can it happen in onchain?

Comment threadlightning/src/ln/functional_tests.rs Outdated

// Check the pair local commitment and HTLC-timeout broadcast due to HTLC expiration
assert_eq!(node_txn[3].input.len(), 1);
check_spends!(node_txn[3], chan_1.3.clone());

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.

Same here - can you do a pass for clone() in check_spends? Seems like you reintroduced a bunch of them.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Needs rebase.

@ariard

Copy link
Copy Markdown
Author

Replaced by #559

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

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

Move pre-signed channel transactions generation in OnchainTxHandler - #540

Closed
ariard wants to merge 7 commits into
lightningdevkit:masterfrom
ariard:2020-02-move-local-txn
Closed

Move pre-signed channel transactions generation in OnchainTxHandler#540
ariard wants to merge 7 commits into
lightningdevkit:masterfrom
ariard:2020-02-move-local-txn

Conversation

@ariard

Copy link
Copy Markdown

Next step in moving private keys behind an external signer interface, moving pre-signed channel transactions (local commitment, HTLC-Success, HTLC-Timeout) in OnchainTxHandler. There is no bump logic, as without option_simplified_commitment changes we can't CPFP/BYOF them.

After this, code should be ready to move key storage inside OnchainTxHandler and some chan_utils methods in signer. We need also to think about bumping logic, if we make it an interface accessible to the signer.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Note: failed borrowck on 1.22.

@codecov

codecovBot commented Mar 10, 2020

Copy link
Copy Markdown

Codecov Report

Merging #540 into master will decrease coverage by 0.02%.
The diff coverage is 96.01%.

Impacted file tree graph

@@ Coverage Diff @@## master #540 +/- ##
==========================================
- Coverage 90.23% 90.21% -0.03% 
==========================================
Files 34 34 Lines 19182 19120 -62 ==========================================
- Hits 17309 17249 -60 + Misses 1873 1871 -2
Impacted FilesCoverage Δ
lightning/src/ln/channelmonitor.rs92.15% <100%> (+1.89%)⬆️
lightning/src/util/macro_logger.rs87.5% <100%> (+2.71%)⬆️
lightning/src/ln/onchaintx.rs92.99% <90.27%> (+0.17%)⬆️
lightning/src/ln/functional_tests.rs96.26% <97.36%> (-0.08%)⬇️
lightning/src/ln/wire.rs54.54% <0%> (-11.31%)⬇️
lightning/src/ln/msgs.rs88.1% <0%> (-1.62%)⬇️
lightning/src/util/config.rs68.29% <0%> (-0.76%)⬇️
lightning/src/ln/features.rs96.62% <0%> (-0.26%)⬇️
lightning/src/ln/functional_test_utils.rs94.44% <0%> (-0.16%)⬇️
... and 5 more

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 33b7c90...d66011d. Read the comment docs.

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

First round.

Comment threadlightning/src/ln/channelmonitor.rs Outdated
Comment threadlightning/src/ln/onchaintx.rs Outdated
if let Some((new_timer, new_feerate, tx)) = self.generate_claim_tx(height, &claim_material, &*fee_estimator) {
claim_material.height_timer = new_timer;
claim_material.feerate_previous = new_feerate;
if claim_material.height_timer != ::std::u32::MAX {

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.

Please use Option<> instead of a sentinal value.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Yeah, spendable outputs is reworked in next PR, so just temporary but switch to a Option<> ofc

Comment threadlightning/src/ln/channelmonitor.rs Outdated
},
Funding {
local_tx_remote_signed: LocalCommitmentTransaction,
funding_key: SecretKey,

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.

Don't pass the SecretKeys - you can get them out of the ChannelKeys already with ChannelKeys::funding_key() or ChannelKeys::htlc_base_key().

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Hmmmm what do you suggest exactly ? To introduce yet ChannelKeys in OnchainTxHandler ?

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.

Yea, just pass in a reference to the ChannelMonitor ChannelKeys in OnchainTxHandler::block_connected() and pass it down. We can rework it later, but its so awkward to copy private keys around like this.

Antoine Riard added 2 commits March 17, 2020 17:35
Previously, we would regenerate this class of txn twice due to
block-rescan triggered by new watching outputs registered.
This commmit doesn't change behavior, it only tweaks TestBroadcaster
to ensure we modify cleanly tests anticipating next commit
refactor.
Watchtower will be supported through external signer interface
where a watchtower implementation may differ from a local one
by the scope of key access and pre-signed datas.
@ariard

ariard commented Mar 18, 2020

Copy link
Copy Markdown
Author

@TheBlueMatt okay added 2 new commits : one to drop Watchtower mode from Storage, tower support is planned to be implemented as an external signer implem, so remove it from ChannelMonitor which is for detection. The other to move duplicate keys storage in OnchainTxHanndler, to avoid passing back and forth stuff in InputMaterial. Next PRs should keep drying up key usage in ChannelMonitor and pass Storage behind ChanSigner.

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

Note this currently does not build.

assert_eq!(node_txn[3].input.len(), 1);
let witness_script = node_txn[3].input[0].witness.last().unwrap();
assert_eq!(witness_script.len(), OFFERED_HTLC_SCRIPT_WEIGHT); //Spending an offered htlc output
check_spends!(node_txn[3], node_txn[2].clone());

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.

Rebase error - you dont need the clone()s anymore. Also in a few other places.

Antoine Riard added 5 commits March 18, 2020 13:39
Going further between splitting detection and transaction
generation, we endow OnchainTxHandler with keys access.
That way, in latter commits, we may remove keys entirely
from ChannelMonitor.
Local Commitment Transaction can't be bumped without anchor outputs
so their generation is one-time for now. We move them in
OnchainTxHandler for simplifying ChannelMonitor and to prepare
storage of keys material behind one external signer interface.
Some tests break due to change in transaction broadcast order but
number of transactions broadcast should stay the same.
HTLC Transaction can't be bumped without sighash changes
so their gneeration is one-time for nwo. We move them in
OnchainTxHandler for simplifying ChannelMonitor and to prepare
storage of keys material behind one external signer interface.
Some tests break due to change in transaction broadcaster order.
Number of transactions may vary because of temporary anti-duplicata
tweak can't dissociate between 2- broadcast from different
origins (ChannelMonitor, ChannelManager) and 2-broadcast from same
component.
Comment threadlightning/src/ln/functional_tests.rs Outdated
assert_eq!(node_txn.len(), 3);
check_spends!(node_txn[1], node_txn[0]);
check_spends!(node_txn[2], node_txn[0]);
check_spends!(node_txn[0], node_txn[2].clone());

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.

Rebase error - clone is not needed here.

// If would_broadcast_at_height determine this local tx should be broadcast, absolute_timelock is set to current_height,
// because it indicates that this tx confirmation is urgent. It's not going to change anything because we can't bump
// local_commitment before anchor_outputs, should be rethought afterwards
claimable_outpoints.push(ClaimRequest { absolute_timelock: height, aggregable: false, outpoint: BitcoinOutPoint { txid: self.key_storage.funding_info.as_ref().unwrap().0.txid.clone(), vout: self.key_storage.funding_info.as_ref().unwrap().0.index as u32 }, witness_data: InputMaterial::Funding { local_tx_remote_signed: cur_local_tx.tx.clone(), channel_value: self.channel_value_satoshis.unwrap() }});

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.

clone() ing the cur_local_tx wholesale here really sucks. a) you need to drop the add_local_sig line above, since we should now be signing + broadcasting this tx in onchain wholesale, and b) can we take() the cur_local_tx.tx and pass it to OnChainTxHandler? We should never be doing anything with it aside from sign, then broadcast, so can it happen in onchain?

Comment threadlightning/src/ln/functional_tests.rs Outdated

// Check the pair local commitment and HTLC-timeout broadcast due to HTLC expiration
assert_eq!(node_txn[3].input.len(), 1);
check_spends!(node_txn[3], chan_1.3.clone());

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.

Same here - can you do a pass for clone() in check_spends? Seems like you reintroduced a bunch of them.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Needs rebase.

@ariard

Copy link
Copy Markdown
Author

Replaced by #559

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@ariard@TheBlueMatt
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Move pre-signed channel transactions generation in OnchainTxHandler by ariard · Pull Request #540 · lightningdevkit/rust-lightning · GitHub
Skip to content

Move pre-signed channel transactions generation in OnchainTxHandler - #540

Closed
ariard wants to merge 7 commits into
lightningdevkit:masterfrom
ariard:2020-02-move-local-txn
Closed

Move pre-signed channel transactions generation in OnchainTxHandler#540
ariard wants to merge 7 commits into
lightningdevkit:masterfrom
ariard:2020-02-move-local-txn

Conversation

@ariard

Copy link
Copy Markdown

Next step in moving private keys behind an external signer interface, moving pre-signed channel transactions (local commitment, HTLC-Success, HTLC-Timeout) in OnchainTxHandler. There is no bump logic, as without option_simplified_commitment changes we can't CPFP/BYOF them.

After this, code should be ready to move key storage inside OnchainTxHandler and some chan_utils methods in signer. We need also to think about bumping logic, if we make it an interface accessible to the signer.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Note: failed borrowck on 1.22.

@codecov

codecovBot commented Mar 10, 2020

Copy link
Copy Markdown

Codecov Report

Merging #540 into master will decrease coverage by 0.02%.
The diff coverage is 96.01%.

Impacted file tree graph

@@ Coverage Diff @@## master #540 +/- ##
==========================================
- Coverage 90.23% 90.21% -0.03% 
==========================================
Files 34 34 Lines 19182 19120 -62 ==========================================
- Hits 17309 17249 -60 + Misses 1873 1871 -2
Impacted FilesCoverage Δ
lightning/src/ln/channelmonitor.rs92.15% <100%> (+1.89%)⬆️
lightning/src/util/macro_logger.rs87.5% <100%> (+2.71%)⬆️
lightning/src/ln/onchaintx.rs92.99% <90.27%> (+0.17%)⬆️
lightning/src/ln/functional_tests.rs96.26% <97.36%> (-0.08%)⬇️
lightning/src/ln/wire.rs54.54% <0%> (-11.31%)⬇️
lightning/src/ln/msgs.rs88.1% <0%> (-1.62%)⬇️
lightning/src/util/config.rs68.29% <0%> (-0.76%)⬇️
lightning/src/ln/features.rs96.62% <0%> (-0.26%)⬇️
lightning/src/ln/functional_test_utils.rs94.44% <0%> (-0.16%)⬇️
... and 5 more

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 33b7c90...d66011d. Read the comment docs.

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

First round.

Comment threadlightning/src/ln/channelmonitor.rs Outdated
Comment threadlightning/src/ln/onchaintx.rs Outdated
if let Some((new_timer, new_feerate, tx)) = self.generate_claim_tx(height, &claim_material, &*fee_estimator) {
claim_material.height_timer = new_timer;
claim_material.feerate_previous = new_feerate;
if claim_material.height_timer != ::std::u32::MAX {

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.

Please use Option<> instead of a sentinal value.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Yeah, spendable outputs is reworked in next PR, so just temporary but switch to a Option<> ofc

Comment threadlightning/src/ln/channelmonitor.rs Outdated
},
Funding {
local_tx_remote_signed: LocalCommitmentTransaction,
funding_key: SecretKey,

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.

Don't pass the SecretKeys - you can get them out of the ChannelKeys already with ChannelKeys::funding_key() or ChannelKeys::htlc_base_key().

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Hmmmm what do you suggest exactly ? To introduce yet ChannelKeys in OnchainTxHandler ?

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.

Yea, just pass in a reference to the ChannelMonitor ChannelKeys in OnchainTxHandler::block_connected() and pass it down. We can rework it later, but its so awkward to copy private keys around like this.

Antoine Riard added 2 commits March 17, 2020 17:35
Previously, we would regenerate this class of txn twice due to
block-rescan triggered by new watching outputs registered.
This commmit doesn't change behavior, it only tweaks TestBroadcaster
to ensure we modify cleanly tests anticipating next commit
refactor.
Watchtower will be supported through external signer interface
where a watchtower implementation may differ from a local one
by the scope of key access and pre-signed datas.
@ariard

ariard commented Mar 18, 2020

Copy link
Copy Markdown
Author

@TheBlueMatt okay added 2 new commits : one to drop Watchtower mode from Storage, tower support is planned to be implemented as an external signer implem, so remove it from ChannelMonitor which is for detection. The other to move duplicate keys storage in OnchainTxHanndler, to avoid passing back and forth stuff in InputMaterial. Next PRs should keep drying up key usage in ChannelMonitor and pass Storage behind ChanSigner.

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

Note this currently does not build.

assert_eq!(node_txn[3].input.len(), 1);
let witness_script = node_txn[3].input[0].witness.last().unwrap();
assert_eq!(witness_script.len(), OFFERED_HTLC_SCRIPT_WEIGHT); //Spending an offered htlc output
check_spends!(node_txn[3], node_txn[2].clone());

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.

Rebase error - you dont need the clone()s anymore. Also in a few other places.

Antoine Riard added 5 commits March 18, 2020 13:39
Going further between splitting detection and transaction
generation, we endow OnchainTxHandler with keys access.
That way, in latter commits, we may remove keys entirely
from ChannelMonitor.
Local Commitment Transaction can't be bumped without anchor outputs
so their generation is one-time for now. We move them in
OnchainTxHandler for simplifying ChannelMonitor and to prepare
storage of keys material behind one external signer interface.
Some tests break due to change in transaction broadcast order but
number of transactions broadcast should stay the same.
HTLC Transaction can't be bumped without sighash changes
so their gneeration is one-time for nwo. We move them in
OnchainTxHandler for simplifying ChannelMonitor and to prepare
storage of keys material behind one external signer interface.
Some tests break due to change in transaction broadcaster order.
Number of transactions may vary because of temporary anti-duplicata
tweak can't dissociate between 2- broadcast from different
origins (ChannelMonitor, ChannelManager) and 2-broadcast from same
component.
Comment threadlightning/src/ln/functional_tests.rs Outdated
assert_eq!(node_txn.len(), 3);
check_spends!(node_txn[1], node_txn[0]);
check_spends!(node_txn[2], node_txn[0]);
check_spends!(node_txn[0], node_txn[2].clone());

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.

Rebase error - clone is not needed here.

// If would_broadcast_at_height determine this local tx should be broadcast, absolute_timelock is set to current_height,
// because it indicates that this tx confirmation is urgent. It's not going to change anything because we can't bump
// local_commitment before anchor_outputs, should be rethought afterwards
claimable_outpoints.push(ClaimRequest { absolute_timelock: height, aggregable: false, outpoint: BitcoinOutPoint { txid: self.key_storage.funding_info.as_ref().unwrap().0.txid.clone(), vout: self.key_storage.funding_info.as_ref().unwrap().0.index as u32 }, witness_data: InputMaterial::Funding { local_tx_remote_signed: cur_local_tx.tx.clone(), channel_value: self.channel_value_satoshis.unwrap() }});

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.

clone() ing the cur_local_tx wholesale here really sucks. a) you need to drop the add_local_sig line above, since we should now be signing + broadcasting this tx in onchain wholesale, and b) can we take() the cur_local_tx.tx and pass it to OnChainTxHandler? We should never be doing anything with it aside from sign, then broadcast, so can it happen in onchain?

Comment threadlightning/src/ln/functional_tests.rs Outdated

// Check the pair local commitment and HTLC-timeout broadcast due to HTLC expiration
assert_eq!(node_txn[3].input.len(), 1);
check_spends!(node_txn[3], chan_1.3.clone());

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.

Same here - can you do a pass for clone() in check_spends? Seems like you reintroduced a bunch of them.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Needs rebase.

@ariard

Copy link
Copy Markdown
Author

Replaced by #559

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@ariard@TheBlueMatt
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Move pre-signed channel transactions generation in OnchainTxHandler by ariard · Pull Request #540 · lightningdevkit/rust-lightning · GitHub
Skip to content

Move pre-signed channel transactions generation in OnchainTxHandler - #540

Closed
ariard wants to merge 7 commits into
lightningdevkit:masterfrom
ariard:2020-02-move-local-txn
Closed

Move pre-signed channel transactions generation in OnchainTxHandler#540
ariard wants to merge 7 commits into
lightningdevkit:masterfrom
ariard:2020-02-move-local-txn

Conversation

@ariard

Copy link
Copy Markdown

Next step in moving private keys behind an external signer interface, moving pre-signed channel transactions (local commitment, HTLC-Success, HTLC-Timeout) in OnchainTxHandler. There is no bump logic, as without option_simplified_commitment changes we can't CPFP/BYOF them.

After this, code should be ready to move key storage inside OnchainTxHandler and some chan_utils methods in signer. We need also to think about bumping logic, if we make it an interface accessible to the signer.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Note: failed borrowck on 1.22.

@codecov

codecovBot commented Mar 10, 2020

Copy link
Copy Markdown

Codecov Report

Merging #540 into master will decrease coverage by 0.02%.
The diff coverage is 96.01%.

Impacted file tree graph

@@ Coverage Diff @@## master #540 +/- ##
==========================================
- Coverage 90.23% 90.21% -0.03% 
==========================================
Files 34 34 Lines 19182 19120 -62 ==========================================
- Hits 17309 17249 -60 + Misses 1873 1871 -2
Impacted FilesCoverage Δ
lightning/src/ln/channelmonitor.rs92.15% <100%> (+1.89%)⬆️
lightning/src/util/macro_logger.rs87.5% <100%> (+2.71%)⬆️
lightning/src/ln/onchaintx.rs92.99% <90.27%> (+0.17%)⬆️
lightning/src/ln/functional_tests.rs96.26% <97.36%> (-0.08%)⬇️
lightning/src/ln/wire.rs54.54% <0%> (-11.31%)⬇️
lightning/src/ln/msgs.rs88.1% <0%> (-1.62%)⬇️
lightning/src/util/config.rs68.29% <0%> (-0.76%)⬇️
lightning/src/ln/features.rs96.62% <0%> (-0.26%)⬇️
lightning/src/ln/functional_test_utils.rs94.44% <0%> (-0.16%)⬇️
... and 5 more

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 33b7c90...d66011d. Read the comment docs.

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

First round.

Comment threadlightning/src/ln/channelmonitor.rs Outdated
Comment threadlightning/src/ln/onchaintx.rs Outdated
if let Some((new_timer, new_feerate, tx)) = self.generate_claim_tx(height, &claim_material, &*fee_estimator) {
claim_material.height_timer = new_timer;
claim_material.feerate_previous = new_feerate;
if claim_material.height_timer != ::std::u32::MAX {

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.

Please use Option<> instead of a sentinal value.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Yeah, spendable outputs is reworked in next PR, so just temporary but switch to a Option<> ofc

Comment threadlightning/src/ln/channelmonitor.rs Outdated
},
Funding {
local_tx_remote_signed: LocalCommitmentTransaction,
funding_key: SecretKey,

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.

Don't pass the SecretKeys - you can get them out of the ChannelKeys already with ChannelKeys::funding_key() or ChannelKeys::htlc_base_key().

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Hmmmm what do you suggest exactly ? To introduce yet ChannelKeys in OnchainTxHandler ?

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.

Yea, just pass in a reference to the ChannelMonitor ChannelKeys in OnchainTxHandler::block_connected() and pass it down. We can rework it later, but its so awkward to copy private keys around like this.

Antoine Riard added 2 commits March 17, 2020 17:35
Previously, we would regenerate this class of txn twice due to
block-rescan triggered by new watching outputs registered.
This commmit doesn't change behavior, it only tweaks TestBroadcaster
to ensure we modify cleanly tests anticipating next commit
refactor.
Watchtower will be supported through external signer interface
where a watchtower implementation may differ from a local one
by the scope of key access and pre-signed datas.
@ariard

ariard commented Mar 18, 2020

Copy link
Copy Markdown
Author

@TheBlueMatt okay added 2 new commits : one to drop Watchtower mode from Storage, tower support is planned to be implemented as an external signer implem, so remove it from ChannelMonitor which is for detection. The other to move duplicate keys storage in OnchainTxHanndler, to avoid passing back and forth stuff in InputMaterial. Next PRs should keep drying up key usage in ChannelMonitor and pass Storage behind ChanSigner.

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

Note this currently does not build.

assert_eq!(node_txn[3].input.len(), 1);
let witness_script = node_txn[3].input[0].witness.last().unwrap();
assert_eq!(witness_script.len(), OFFERED_HTLC_SCRIPT_WEIGHT); //Spending an offered htlc output
check_spends!(node_txn[3], node_txn[2].clone());

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.

Rebase error - you dont need the clone()s anymore. Also in a few other places.

Antoine Riard added 5 commits March 18, 2020 13:39
Going further between splitting detection and transaction
generation, we endow OnchainTxHandler with keys access.
That way, in latter commits, we may remove keys entirely
from ChannelMonitor.
Local Commitment Transaction can't be bumped without anchor outputs
so their generation is one-time for now. We move them in
OnchainTxHandler for simplifying ChannelMonitor and to prepare
storage of keys material behind one external signer interface.
Some tests break due to change in transaction broadcast order but
number of transactions broadcast should stay the same.
HTLC Transaction can't be bumped without sighash changes
so their gneeration is one-time for nwo. We move them in
OnchainTxHandler for simplifying ChannelMonitor and to prepare
storage of keys material behind one external signer interface.
Some tests break due to change in transaction broadcaster order.
Number of transactions may vary because of temporary anti-duplicata
tweak can't dissociate between 2- broadcast from different
origins (ChannelMonitor, ChannelManager) and 2-broadcast from same
component.
Comment threadlightning/src/ln/functional_tests.rs Outdated
assert_eq!(node_txn.len(), 3);
check_spends!(node_txn[1], node_txn[0]);
check_spends!(node_txn[2], node_txn[0]);
check_spends!(node_txn[0], node_txn[2].clone());

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.

Rebase error - clone is not needed here.

// If would_broadcast_at_height determine this local tx should be broadcast, absolute_timelock is set to current_height,
// because it indicates that this tx confirmation is urgent. It's not going to change anything because we can't bump
// local_commitment before anchor_outputs, should be rethought afterwards
claimable_outpoints.push(ClaimRequest { absolute_timelock: height, aggregable: false, outpoint: BitcoinOutPoint { txid: self.key_storage.funding_info.as_ref().unwrap().0.txid.clone(), vout: self.key_storage.funding_info.as_ref().unwrap().0.index as u32 }, witness_data: InputMaterial::Funding { local_tx_remote_signed: cur_local_tx.tx.clone(), channel_value: self.channel_value_satoshis.unwrap() }});

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.

clone() ing the cur_local_tx wholesale here really sucks. a) you need to drop the add_local_sig line above, since we should now be signing + broadcasting this tx in onchain wholesale, and b) can we take() the cur_local_tx.tx and pass it to OnChainTxHandler? We should never be doing anything with it aside from sign, then broadcast, so can it happen in onchain?

Comment threadlightning/src/ln/functional_tests.rs Outdated

// Check the pair local commitment and HTLC-timeout broadcast due to HTLC expiration
assert_eq!(node_txn[3].input.len(), 1);
check_spends!(node_txn[3], chan_1.3.clone());

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.

Same here - can you do a pass for clone() in check_spends? Seems like you reintroduced a bunch of them.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Needs rebase.

@ariard

Copy link
Copy Markdown
Author

Replaced by #559

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

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

Move pre-signed channel transactions generation in OnchainTxHandler - #540

Closed
ariard wants to merge 7 commits into
lightningdevkit:masterfrom
ariard:2020-02-move-local-txn
Closed

Move pre-signed channel transactions generation in OnchainTxHandler#540
ariard wants to merge 7 commits into
lightningdevkit:masterfrom
ariard:2020-02-move-local-txn

Conversation

@ariard

Copy link
Copy Markdown

Next step in moving private keys behind an external signer interface, moving pre-signed channel transactions (local commitment, HTLC-Success, HTLC-Timeout) in OnchainTxHandler. There is no bump logic, as without option_simplified_commitment changes we can't CPFP/BYOF them.

After this, code should be ready to move key storage inside OnchainTxHandler and some chan_utils methods in signer. We need also to think about bumping logic, if we make it an interface accessible to the signer.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Note: failed borrowck on 1.22.

@codecov

codecovBot commented Mar 10, 2020

Copy link
Copy Markdown

Codecov Report

Merging #540 into master will decrease coverage by 0.02%.
The diff coverage is 96.01%.

Impacted file tree graph

@@ Coverage Diff @@## master #540 +/- ##
==========================================
- Coverage 90.23% 90.21% -0.03% 
==========================================
Files 34 34 Lines 19182 19120 -62 ==========================================
- Hits 17309 17249 -60 + Misses 1873 1871 -2
Impacted FilesCoverage Δ
lightning/src/ln/channelmonitor.rs92.15% <100%> (+1.89%)⬆️
lightning/src/util/macro_logger.rs87.5% <100%> (+2.71%)⬆️
lightning/src/ln/onchaintx.rs92.99% <90.27%> (+0.17%)⬆️
lightning/src/ln/functional_tests.rs96.26% <97.36%> (-0.08%)⬇️
lightning/src/ln/wire.rs54.54% <0%> (-11.31%)⬇️
lightning/src/ln/msgs.rs88.1% <0%> (-1.62%)⬇️
lightning/src/util/config.rs68.29% <0%> (-0.76%)⬇️
lightning/src/ln/features.rs96.62% <0%> (-0.26%)⬇️
lightning/src/ln/functional_test_utils.rs94.44% <0%> (-0.16%)⬇️
... and 5 more

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 33b7c90...d66011d. Read the comment docs.

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

First round.

Comment threadlightning/src/ln/channelmonitor.rs Outdated
Comment threadlightning/src/ln/onchaintx.rs Outdated
if let Some((new_timer, new_feerate, tx)) = self.generate_claim_tx(height, &claim_material, &*fee_estimator) {
claim_material.height_timer = new_timer;
claim_material.feerate_previous = new_feerate;
if claim_material.height_timer != ::std::u32::MAX {

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.

Please use Option<> instead of a sentinal value.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Yeah, spendable outputs is reworked in next PR, so just temporary but switch to a Option<> ofc

Comment threadlightning/src/ln/channelmonitor.rs Outdated
},
Funding {
local_tx_remote_signed: LocalCommitmentTransaction,
funding_key: SecretKey,

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.

Don't pass the SecretKeys - you can get them out of the ChannelKeys already with ChannelKeys::funding_key() or ChannelKeys::htlc_base_key().

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Hmmmm what do you suggest exactly ? To introduce yet ChannelKeys in OnchainTxHandler ?

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.

Yea, just pass in a reference to the ChannelMonitor ChannelKeys in OnchainTxHandler::block_connected() and pass it down. We can rework it later, but its so awkward to copy private keys around like this.

Antoine Riard added 2 commits March 17, 2020 17:35
Previously, we would regenerate this class of txn twice due to
block-rescan triggered by new watching outputs registered.
This commmit doesn't change behavior, it only tweaks TestBroadcaster
to ensure we modify cleanly tests anticipating next commit
refactor.
Watchtower will be supported through external signer interface
where a watchtower implementation may differ from a local one
by the scope of key access and pre-signed datas.
@ariard

ariard commented Mar 18, 2020

Copy link
Copy Markdown
Author

@TheBlueMatt okay added 2 new commits : one to drop Watchtower mode from Storage, tower support is planned to be implemented as an external signer implem, so remove it from ChannelMonitor which is for detection. The other to move duplicate keys storage in OnchainTxHanndler, to avoid passing back and forth stuff in InputMaterial. Next PRs should keep drying up key usage in ChannelMonitor and pass Storage behind ChanSigner.

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

Note this currently does not build.

assert_eq!(node_txn[3].input.len(), 1);
let witness_script = node_txn[3].input[0].witness.last().unwrap();
assert_eq!(witness_script.len(), OFFERED_HTLC_SCRIPT_WEIGHT); //Spending an offered htlc output
check_spends!(node_txn[3], node_txn[2].clone());

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.

Rebase error - you dont need the clone()s anymore. Also in a few other places.

Antoine Riard added 5 commits March 18, 2020 13:39
Going further between splitting detection and transaction
generation, we endow OnchainTxHandler with keys access.
That way, in latter commits, we may remove keys entirely
from ChannelMonitor.
Local Commitment Transaction can't be bumped without anchor outputs
so their generation is one-time for now. We move them in
OnchainTxHandler for simplifying ChannelMonitor and to prepare
storage of keys material behind one external signer interface.
Some tests break due to change in transaction broadcast order but
number of transactions broadcast should stay the same.
HTLC Transaction can't be bumped without sighash changes
so their gneeration is one-time for nwo. We move them in
OnchainTxHandler for simplifying ChannelMonitor and to prepare
storage of keys material behind one external signer interface.
Some tests break due to change in transaction broadcaster order.
Number of transactions may vary because of temporary anti-duplicata
tweak can't dissociate between 2- broadcast from different
origins (ChannelMonitor, ChannelManager) and 2-broadcast from same
component.
Comment threadlightning/src/ln/functional_tests.rs Outdated
assert_eq!(node_txn.len(), 3);
check_spends!(node_txn[1], node_txn[0]);
check_spends!(node_txn[2], node_txn[0]);
check_spends!(node_txn[0], node_txn[2].clone());

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.

Rebase error - clone is not needed here.

// If would_broadcast_at_height determine this local tx should be broadcast, absolute_timelock is set to current_height,
// because it indicates that this tx confirmation is urgent. It's not going to change anything because we can't bump
// local_commitment before anchor_outputs, should be rethought afterwards
claimable_outpoints.push(ClaimRequest { absolute_timelock: height, aggregable: false, outpoint: BitcoinOutPoint { txid: self.key_storage.funding_info.as_ref().unwrap().0.txid.clone(), vout: self.key_storage.funding_info.as_ref().unwrap().0.index as u32 }, witness_data: InputMaterial::Funding { local_tx_remote_signed: cur_local_tx.tx.clone(), channel_value: self.channel_value_satoshis.unwrap() }});

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.

clone() ing the cur_local_tx wholesale here really sucks. a) you need to drop the add_local_sig line above, since we should now be signing + broadcasting this tx in onchain wholesale, and b) can we take() the cur_local_tx.tx and pass it to OnChainTxHandler? We should never be doing anything with it aside from sign, then broadcast, so can it happen in onchain?

Comment threadlightning/src/ln/functional_tests.rs Outdated

// Check the pair local commitment and HTLC-timeout broadcast due to HTLC expiration
assert_eq!(node_txn[3].input.len(), 1);
check_spends!(node_txn[3], chan_1.3.clone());

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.

Same here - can you do a pass for clone() in check_spends? Seems like you reintroduced a bunch of them.

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

Needs rebase.

@ariard

Copy link
Copy Markdown
Author

Replaced by #559

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@ariard@TheBlueMatt