Skip to content

Commit 0809d51

Browse files
committed
keep track of revocations in KeysInterface
1 parent b5813a1 commit 0809d51

File tree

3 files changed

+49
-29
lines changed

3 files changed

+49
-29
lines changed

lightning/src/ln/onchaintx.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -948,7 +948,7 @@ impl<ChanSigner: ChannelKeys> OnchainTxHandler<ChanSigner> {
948948
pub(crate) fn get_fully_signed_copy_holder_tx(&mut self, funding_redeemscript: &Script) -> Option<Transaction> {
949949
if let Some(ref mut holder_commitment) = self.holder_commitment {
950950
let holder_commitment = holder_commitment.clone();
951-
match self.key_storage.sign_holder_commitment(&holder_commitment, &self.secp_ctx) {
951+
match self.key_storage.unsafe_sign_holder_commitment(&holder_commitment, &self.secp_ctx) {
952952
Ok(sig) => Some(holder_commitment.add_holder_sig(funding_redeemscript, sig)),
953953
Err(_) => return None,
954954
}

lightning/src/util/enforcing_trait_impls.rs

Lines changed: 27 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ use util::ser::{Writeable, Writer, Readable};
2424
use std::io::Error;
2525
use ln::msgs::DecodeError;
2626

27-
const INITIAL_COMMITMENT_NUMBER: u64 = (1 << 48) - 1;
27+
/// Initial value for revoked commitment downward counter
28+
pub const INITIAL_REVOKED_COMMITMENT_NUMBER: u64 = 1 << 48;
2829

2930
/// Enforces some rules on ChannelKeys calls. Eventually we will probably want to expose a variant
3031
/// of this which would essentially be what you'd want to run on a hardware wallet.
@@ -40,7 +41,15 @@ impl EnforcingChannelKeys {
4041
Self {
4142
inner,
4243
commitment_number_obscure_and_last: Arc::new(Mutex::new((None, 0))),
43-
revoked_commitment: Arc::new(Mutex::new(INITIAL_COMMITMENT_NUMBER + 1)),
44+
revoked_commitment: Arc::new(Mutex::new(INITIAL_REVOKED_COMMITMENT_NUMBER))
45+
}
46+
}
47+
48+
pub fn new_with_revoked(inner: InMemoryChannelKeys, revoked_commitment: Arc<Mutex<u64>>) -> Self {
49+
Self {
50+
inner,
51+
commitment_number_obscure_and_last: Arc::new(Mutex::new((None, 0))),
52+
revoked_commitment
4453
}
4554
}
4655
}
@@ -69,20 +78,14 @@ impl ChannelKeys for EnforcingChannelKeys {
6978

7079
fn release_commitment_secret(&self, idx: u64) -> [u8; 32] {
7180
println!("XXX revoke {} {}", self.inner.commitment_seed[0], idx);
72-
let res = {
73-
let mut revoked = self.revoked_commitment.lock().unwrap();
74-
if idx != *revoked && idx != *revoked - 1 {
75-
panic!("can only revoke the current or next unrevoked commitment - trying {}, revoked {}", idx, *revoked)
76-
}
77-
*revoked = idx;
78-
self.inner.release_commitment_secret(idx)
79-
};
80-
{
81-
let revoked = self.revoked_commitment.lock().unwrap();
82-
assert_eq!(idx, *revoked);
81+
let mut revoked = self.revoked_commitment.lock().unwrap();
82+
if idx != *revoked && idx != *revoked - 1 {
83+
panic!("can only revoke the current or next unrevoked commitment - trying {}, revoked {}", idx, *revoked)
8384
}
84-
res
85+
*revoked = idx;
86+
self.inner.release_commitment_secret(idx)
8587
}
88+
8689
fn pubkeys(&self) -> &ChannelPublicKeys { self.inner.pubkeys() }
8790
fn key_derivation_params(&self) -> (u64, u64) { self.inner.key_derivation_params() }
8891

@@ -112,10 +115,12 @@ impl ChannelKeys for EnforcingChannelKeys {
112115
if keys.per_commitment_point != self.inner.get_per_commitment_point(*revoked - 1, secp_ctx) {
113116
if keys.per_commitment_point != self.inner.get_per_commitment_point(*revoked - 2, secp_ctx) {
114117
if keys.per_commitment_point == self.inner.get_per_commitment_point(*revoked, secp_ctx) {
115-
panic!("attempted to sign the latest revoked local commitment {}", self.inner.commitment_seed[0]);
118+
println!("attempted to sign the latest revoked local commitment {}", self.inner.commitment_seed[0]);
119+
return Err(())
116120
} else {
117-
panic!("can only sign the next two unrevoked commitment numbers, {} revoked={} point={}",
121+
println!("can only sign the next two unrevoked commitment numbers, {} revoked={} point={}",
118122
self.inner.commitment_seed[0], *revoked, keys.per_commitment_point);
123+
return Err(())
119124
}
120125
}
121126
}
@@ -166,12 +171,11 @@ impl ChannelKeys for EnforcingChannelKeys {
166171
}
167172
}
168173

174+
169175
impl Writeable for EnforcingChannelKeys {
170176
fn write<W: Writer>(&self, writer: &mut W) -> Result<(), Error> {
171177
self.inner.write(writer)?;
172-
let revoked = *self.revoked_commitment.lock().unwrap();
173-
revoked.write(writer)?;
174-
println!("XXX write {} {}", self.inner.commitment_seed[0], revoked);
178+
println!("XXX write {}", self.inner.commitment_seed[0]);
175179

176180
let (obscure, last) = *self.commitment_number_obscure_and_last.lock().unwrap();
177181
obscure.write(writer)?;
@@ -183,13 +187,12 @@ impl Writeable for EnforcingChannelKeys {
183187
impl Readable for EnforcingChannelKeys {
184188
fn read<R: ::std::io::Read>(reader: &mut R) -> Result<Self, DecodeError> {
185189
let inner: InMemoryChannelKeys = Readable::read(reader)?;
186-
let revoked = Readable::read(reader)?;
187190
let obscure_and_last = Readable::read(reader)?;
188-
println!("XXX read {} {}", inner.commitment_seed[0], revoked);
191+
println!("XXX read {}", inner.commitment_seed[0]);
189192
Ok(EnforcingChannelKeys {
190-
inner: inner,
191-
revoked_commitment: Arc::new(Mutex::new(revoked)),
192-
commitment_number_obscure_and_last: Arc::new(Mutex::new(obscure_and_last))
193+
inner,
194+
commitment_number_obscure_and_last: Arc::new(Mutex::new(obscure_and_last)),
195+
revoked_commitment: Arc::new(Mutex::new(INITIAL_REVOKED_COMMITMENT_NUMBER)),
193196
})
194197
}
195198
}

lightning/src/util/test_utils.rs

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ use chain::keysinterface;
1818
use ln::features::{ChannelFeatures, InitFeatures};
1919
use ln::msgs;
2020
use ln::msgs::OptionalField;
21-
use util::enforcing_trait_impls::EnforcingChannelKeys;
21+
use util::enforcing_trait_impls::{EnforcingChannelKeys, INITIAL_REVOKED_COMMITMENT_NUMBER};
2222
use util::events;
2323
use util::logger::{Logger, Level, Record};
2424
use util::ser::{Readable, Writer, Writeable};
@@ -35,7 +35,7 @@ use bitcoin::secp256k1::{SecretKey, PublicKey, Secp256k1, Signature};
3535
use regex;
3636

3737
use std::time::Duration;
38-
use std::sync::Mutex;
38+
use std::sync::{Mutex, Arc};
3939
use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering};
4040
use std::{cmp, mem};
4141
use std::collections::{HashMap, HashSet};
@@ -384,6 +384,7 @@ pub struct TestKeysInterface {
384384
backing: keysinterface::KeysManager,
385385
pub override_session_priv: Mutex<Option<[u8; 32]>>,
386386
pub override_channel_id_priv: Mutex<Option<[u8; 32]>>,
387+
revoked_commitments: Mutex<HashMap<[u8;32], Arc<Mutex<u64>>>>,
387388
}
388389

389390
impl keysinterface::KeysInterface for TestKeysInterface {
@@ -393,7 +394,9 @@ impl keysinterface::KeysInterface for TestKeysInterface {
393394
fn get_destination_script(&self) -> Script { self.backing.get_destination_script() }
394395
fn get_shutdown_pubkey(&self) -> PublicKey { self.backing.get_shutdown_pubkey() }
395396
fn get_channel_keys(&self, inbound: bool, channel_value_satoshis: u64) -> EnforcingChannelKeys {
396-
EnforcingChannelKeys::new(self.backing.get_channel_keys(inbound, channel_value_satoshis))
397+
let keys = self.backing.get_channel_keys(inbound, channel_value_satoshis);
398+
let revoked_commitment = self.make_revoked_commitment_cell(keys.commitment_seed);
399+
EnforcingChannelKeys::new_with_revoked(keys, revoked_commitment)
397400
}
398401

399402
fn get_secure_random_bytes(&self) -> [u8; 32] {
@@ -412,17 +415,21 @@ impl keysinterface::KeysInterface for TestKeysInterface {
412415
}
413416
}
414417

418+
415419
impl TestKeysInterface {
416420
pub fn new(seed: &[u8; 32], network: Network) -> Self {
417421
let now = Duration::from_secs(genesis_block(network).header.time as u64);
418422
Self {
419423
backing: keysinterface::KeysManager::new(seed, network, now.as_secs(), now.subsec_nanos()),
420424
override_session_priv: Mutex::new(None),
421425
override_channel_id_priv: Mutex::new(None),
426+
revoked_commitments: Mutex::new(HashMap::new()),
422427
}
423428
}
424429
pub fn derive_channel_keys(&self, channel_value_satoshis: u64, user_id_1: u64, user_id_2: u64) -> EnforcingChannelKeys {
425-
EnforcingChannelKeys::new(self.backing.derive_channel_keys(channel_value_satoshis, user_id_1, user_id_2))
430+
let keys = self.backing.derive_channel_keys(channel_value_satoshis, user_id_1, user_id_2);
431+
let revoked_commitment = self.make_revoked_commitment_cell(keys.commitment_seed);
432+
EnforcingChannelKeys::new_with_revoked(keys, revoked_commitment)
426433
}
427434
}
428435

@@ -464,3 +471,13 @@ impl chain::Filter for TestChainSource {
464471
self.watched_outputs.lock().unwrap().insert((*outpoint, script_pubkey.clone()));
465472
}
466473
}
474+
475+
impl TestKeysInterface {
476+
fn make_revoked_commitment_cell(&self, commitment_seed: [u8; 32]) -> Arc<Mutex<u64>> {
477+
let mut revoked_commitments = self.revoked_commitments.lock().unwrap();
478+
if !revoked_commitments.contains_key(&commitment_seed) {
479+
revoked_commitments.insert(commitment_seed, Arc::new(Mutex::new(INITIAL_REVOKED_COMMITMENT_NUMBER)));
480+
}
481+
Arc::clone(revoked_commitments.get(&commitment_seed).unwrap())
482+
}
483+
}

0 commit comments

Comments
 (0)