-
Notifications
You must be signed in to change notification settings - Fork 408
Move pre-signed channel transactions generation in OnchainTxHandler #540
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
Note: failed borrowck on 1.22. |
15fa3be
to
5927ccf
Compare
Codecov Report
@@ 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
Continue to review full report at Codecov.
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
First round.
lightning/src/ln/onchaintx.rs
Outdated
@@ -514,17 +548,19 @@ impl OnchainTxHandler { | |||
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 { |
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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
lightning/src/ln/channelmonitor.rs
Outdated
}, | ||
Funding { | ||
local_tx_remote_signed: LocalCommitmentTransaction, | ||
funding_key: SecretKey, |
There was a problem hiding this comment.
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().
There was a problem hiding this comment.
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 ?
There was a problem hiding this comment.
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.
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.
5927ccf
to
f453402
Compare
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.
f453402
to
d66011d
Compare
@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. |
d66011d
to
45db495
Compare
There was a problem hiding this comment.
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()); |
There was a problem hiding this comment.
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.
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.
45db495
to
2fea557
Compare
lightning/src/ln/functional_tests.rs
Outdated
@@ -7168,11 +7176,11 @@ fn test_set_outpoints_partial_claiming() { | |||
let partial_claim_tx = { | |||
let node_txn = nodes[1].tx_broadcaster.txn_broadcasted.lock().unwrap(); | |||
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()); |
There was a problem hiding this comment.
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() }}); |
There was a problem hiding this comment.
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?
lightning/src/ln/functional_tests.rs
Outdated
@@ -2334,24 +2334,32 @@ fn claim_htlc_outputs_single_tx() { | |||
// ChannelMonitor: local commitment + local HTLC-timeout (2) | |||
|
|||
// 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()); |
There was a problem hiding this comment.
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.
Needs rebase. |
Replaced by #559 |
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.