Skip to content
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

Move back to ChannelMonitor RemoteTxCache #610

Merged
merged 25 commits into from
May 28, 2020
Merged
Changes from 1 commit
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
6b1afcc
Cache remote basepoint and remote_csv in new OnchainTxHandler::Remote…
Mar 24, 2020
275814c
Cache remote HTLC inside OnchainTxHandler::RemoteTxCache
Mar 24, 2020
6512e8a
Replace is_htlc in InputMaterial by InputDescriptor
Mar 24, 2020
824e318
Build witness_script for justice tx inside OnchainTxHandler
Mar 24, 2020
276c607
Move justice transaction signature behind ChanSigner
Mar 24, 2020
0a345c0
Build witness_script for remote htlc transactions inside
Mar 24, 2020
ea238a2
Move remote htlc transaction signature behind ChanSigner
Mar 24, 2020
f8ea748
Add KeysManager::derive_unique_start
May 12, 2020
2f4f0aa
Extend KeysInterface with derive_channel_keys
May 6, 2020
3188ac9
Remove SecretKey from DynamicOutputP2WSH descriptor
Mar 24, 2020
2c07f8e
Remove SecretKey from DynamicOuputP2WPKH descriptor
Mar 24, 2020
1d7ed17
Duplicate RemoteTxCache in ChannelMonitor
May 18, 2020
9455b49
Dedup RemoteTxCache by removing OnchainTxHandler copy
Apr 28, 2020
56ec6e0
Drop remote_csv from OnchainTxHandler, cache it in Monitor's cache
Apr 28, 2020
f655c51
Rename their_to_self_delay as on_local_tx_csv
Apr 30, 2020
3aef447
Rename RemoteTxCache as RemoteCommitmentTransaction and document better
Apr 29, 2020
7de03e1
Imp Writer/Reader for RemoteCommitmentTransaction
Apr 29, 2020
479e1c8
Dry-up witnessScript in sign_justice_transaction
May 4, 2020
06445b6
Dry-up witnessScript in sign_remote_htlc_transaction
May 4, 2020
4f84b05
Make derive_private_key public
May 5, 2020
03fa056
Make get_revokable_redeemscript
May 5, 2020
22daecb
Remove useless build warnings
May 6, 2020
42b731d
Document better DynamicOutputP2WSH
May 8, 2020
d0c5e9c
Significantly clarify key derivation and expose methods referenced
TheBlueMatt May 15, 2020
81e358c
Add test_key_derivation_params
May 18, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
85 changes: 49 additions & 36 deletions lightning/src/ln/channelmonitor.rs
Original file line number Diff line number Diff line change
@@ -438,6 +438,53 @@ struct RemoteCommitmentTransaction {
per_htlc: HashMap<Txid, Vec<HTLCOutputInCommitment>>
}

impl Writeable for RemoteCommitmentTransaction {
fn write<W: Writer>(&self, w: &mut W) -> Result<(), ::std::io::Error> {
self.remote_delayed_payment_base_key.write(w)?;
self.remote_htlc_base_key.write(w)?;
w.write_all(&byte_utils::be16_to_array(self.on_remote_tx_csv))?;
w.write_all(&byte_utils::be64_to_array(self.per_htlc.len() as u64))?;
for (ref txid, ref htlcs) in self.per_htlc.iter() {
w.write_all(&txid[..])?;
w.write_all(&byte_utils::be64_to_array(htlcs.len() as u64))?;
for &ref htlc in htlcs.iter() {
htlc.write(w)?;
}
}
Ok(())
}
}
impl Readable for RemoteCommitmentTransaction {
fn read<R: ::std::io::Read>(r: &mut R) -> Result<Self, DecodeError> {
let remote_commitment_transaction = {
let remote_delayed_payment_base_key = Readable::read(r)?;
let remote_htlc_base_key = Readable::read(r)?;
let on_remote_tx_csv: u16 = Readable::read(r)?;
let per_htlc_len: u64 = Readable::read(r)?;
let mut per_htlc = HashMap::with_capacity(cmp::min(per_htlc_len as usize, MAX_ALLOC_SIZE / 64));
for _ in 0..per_htlc_len {
let txid: Txid = Readable::read(r)?;
let htlcs_count: u64 = Readable::read(r)?;
let mut htlcs = Vec::with_capacity(cmp::min(htlcs_count as usize, MAX_ALLOC_SIZE / 32));
for _ in 0..htlcs_count {
let htlc = Readable::read(r)?;
htlcs.push(htlc);
}
if let Some(_) = per_htlc.insert(txid, htlcs) {
return Err(DecodeError::InvalidValue);
}
}
RemoteCommitmentTransaction {
remote_delayed_payment_base_key,
remote_htlc_base_key,
on_remote_tx_csv,
per_htlc,
}
};
Ok(remote_commitment_transaction)
}
}

/// When ChannelMonitor discovers an onchain outpoint being a step of a channel and that it needs
/// to generate a tx to push channel state forward, we cache outpoint-solving tx material to build
/// a new bumped one in case of lenghty confirmation delay
@@ -904,17 +951,7 @@ impl<ChanSigner: ChannelKeys + Writeable> ChannelMonitor<ChanSigner> {
self.current_remote_commitment_txid.write(writer)?;
self.prev_remote_commitment_txid.write(writer)?;

self.remote_tx_cache.remote_delayed_payment_base_key.write(writer)?;
self.remote_tx_cache.remote_htlc_base_key.write(writer)?;
writer.write_all(&byte_utils::be16_to_array(self.remote_tx_cache.on_remote_tx_csv))?;
writer.write_all(&byte_utils::be64_to_array(self.remote_tx_cache.per_htlc.len() as u64))?;
for (ref txid, ref htlcs) in self.remote_tx_cache.per_htlc.iter() {
writer.write_all(&txid[..])?;
writer.write_all(&byte_utils::be64_to_array(htlcs.len() as u64))?;
for &ref htlc in htlcs.iter() {
htlc.write(writer)?;
}
}
self.remote_tx_cache.write(writer)?;
self.funding_redeemscript.write(writer)?;
self.channel_value_satoshis.write(writer)?;

@@ -2237,31 +2274,7 @@ impl<ChanSigner: ChannelKeys + Readable> Readable for (BlockHash, ChannelMonitor
let current_remote_commitment_txid = Readable::read(reader)?;
let prev_remote_commitment_txid = Readable::read(reader)?;

let remote_tx_cache = {
let remote_delayed_payment_base_key = Readable::read(reader)?;
let remote_htlc_base_key = Readable::read(reader)?;
let on_remote_tx_csv: u16 = Readable::read(reader)?;
let per_htlc_len: u64 = Readable::read(reader)?;
let mut per_htlc = HashMap::with_capacity(cmp::min(per_htlc_len as usize, MAX_ALLOC_SIZE / 64));
for _ in 0..per_htlc_len {
let txid: Txid = Readable::read(reader)?;
let htlcs_count: u64 = Readable::read(reader)?;
let mut htlcs = Vec::with_capacity(cmp::min(htlcs_count as usize, MAX_ALLOC_SIZE / 32));
for _ in 0..htlcs_count {
let htlc = Readable::read(reader)?;
htlcs.push(htlc);
}
if let Some(_) = per_htlc.insert(txid, htlcs) {
return Err(DecodeError::InvalidValue);
}
}
RemoteCommitmentTransaction {
remote_delayed_payment_base_key,
remote_htlc_base_key,
on_remote_tx_csv,
per_htlc,
}
};
let remote_tx_cache = Readable::read(reader)?;
let funding_redeemscript = Readable::read(reader)?;
let channel_value_satoshis = Readable::read(reader)?;