Merge pull request #460 from lightning-signer/channel-value
authorMatt Corallo <649246+TheBlueMatt@users.noreply.github.com>
Sat, 25 Jan 2020 21:17:12 +0000 (21:17 +0000)
committerGitHub <noreply@github.com>
Sat, 25 Jan 2020 21:17:12 +0000 (21:17 +0000)
Channel value to ChannelKeys constructor

1  2 
fuzz/src/chanmon_consistency.rs
fuzz/src/full_stack.rs
lightning/src/chain/keysinterface.rs
lightning/src/util/test_utils.rs

index 1a55ee79ce4f0c623a66cf20dccad0c4fd6f8d3f,3a25ad1ef8851c6d18e2d7017f7e1f07f99732f2..b01fabad3053468347303272b0151c9db33ca849
@@@ -85,7 -85,7 +85,7 @@@ pub struct TestChannelMonitor 
  impl TestChannelMonitor {
        pub fn new(chain_monitor: Arc<dyn chaininterface::ChainWatchInterface>, broadcaster: Arc<dyn chaininterface::BroadcasterInterface>, logger: Arc<dyn Logger>, feeest: Arc<dyn chaininterface::FeeEstimator>) -> Self {
                Self {
 -                      simple_monitor: channelmonitor::SimpleManyChannelMonitor::new(chain_monitor, broadcaster, logger, feeest),
 +                      simple_monitor: Arc::new(channelmonitor::SimpleManyChannelMonitor::new(chain_monitor, broadcaster, logger, feeest)),
                        update_ret: Mutex::new(Ok(())),
                        latest_good_update: Mutex::new(HashMap::new()),
                        latest_update_good: Mutex::new(HashMap::new()),
@@@ -150,7 -150,7 +150,7 @@@ impl KeysInterface for KeyProvider 
                PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, self.node_id]).unwrap())
        }
  
-       fn get_channel_keys(&self, _inbound: bool) -> EnforcingChannelKeys {
+       fn get_channel_keys(&self, _inbound: bool, channel_value_satoshis: u64) -> EnforcingChannelKeys {
                EnforcingChannelKeys::new(InMemoryChannelKeys {
                        funding_key:               SecretKey::from_slice(&[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, self.node_id]).unwrap(),
                        revocation_base_key:       SecretKey::from_slice(&[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, self.node_id]).unwrap(),
                        htlc_base_key:             SecretKey::from_slice(&[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, self.node_id]).unwrap(),
                        commitment_seed: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, self.node_id],
                        remote_channel_pubkeys: None,
+                       channel_value_satoshis,
                })
        }
  
@@@ -190,7 -191,7 +191,7 @@@ pub fn do_test(data: &[u8]) 
                        config.channel_options.fee_proportional_millionths = 0;
                        config.channel_options.announced_channel = true;
                        config.peer_channel_config_limits.min_dust_limit_satoshis = 0;
 -                      (ChannelManager::new(Network::Bitcoin, fee_est.clone(), monitor.clone(), broadcast.clone(), Arc::clone(&logger), keys_manager.clone(), config, 0).unwrap(),
 +                      (Arc::new(ChannelManager::new(Network::Bitcoin, fee_est.clone(), monitor.clone() as Arc<channelmonitor::ManyChannelMonitor>, broadcast.clone(), Arc::clone(&logger), keys_manager.clone(), config, 0).unwrap()),
                        monitor)
                } }
        }
                        let read_args = ChannelManagerReadArgs {
                                keys_manager,
                                fee_estimator: fee_est.clone(),
 -                              monitor: monitor.clone(),
 +                              monitor: monitor.clone() as Arc<channelmonitor::ManyChannelMonitor>,
                                tx_broadcaster: broadcast.clone(),
                                logger,
                                default_config: config,
                                channel_monitors: &mut monitor_refs,
                        };
  
 -                      let res = (<(Sha256d, ChannelManager<EnforcingChannelKeys>)>::read(&mut Cursor::new(&$ser.0), read_args).expect("Failed to read manager").1, monitor);
 +                      let res = (<(Sha256d, ChannelManager<EnforcingChannelKeys, Arc<channelmonitor::ManyChannelMonitor>>)>::read(&mut Cursor::new(&$ser.0), read_args).expect("Failed to read manager").1, monitor);
                        for (_, was_good) in $old_monitors.latest_updates_good_at_last_ser.lock().unwrap().iter() {
                                if !was_good {
                                        // If the last time we updated a monitor we didn't successfully update (and we
diff --combined fuzz/src/full_stack.rs
index f8e76971afcd550e3095483fc36d3803d47dcd1e,1066c80dcc33ba2e36fc2763924a6428d982c429..b39d061b7e5bac742622020bb7235e1ee8af53af
@@@ -136,9 -136,9 +136,9 @@@ impl<'a> Hash for Peer<'a> 
  }
  
  struct MoneyLossDetector<'a> {
 -      manager: Arc<ChannelManager<EnforcingChannelKeys>>,
 +      manager: Arc<ChannelManager<EnforcingChannelKeys, Arc<channelmonitor::ManyChannelMonitor>>>,
        monitor: Arc<channelmonitor::SimpleManyChannelMonitor<OutPoint>>,
 -      handler: PeerManager<Peer<'a>>,
 +      handler: PeerManager<Peer<'a>, Arc<ChannelManager<EnforcingChannelKeys, Arc<channelmonitor::ManyChannelMonitor>>>>,
  
        peers: &'a RefCell<[bool; 256]>,
        funding_txn: Vec<Transaction>,
        blocks_connected: u32,
  }
  impl<'a> MoneyLossDetector<'a> {
 -      pub fn new(peers: &'a RefCell<[bool; 256]>, manager: Arc<ChannelManager<EnforcingChannelKeys>>, monitor: Arc<channelmonitor::SimpleManyChannelMonitor<OutPoint>>, handler: PeerManager<Peer<'a>>) -> Self {
 +      pub fn new(peers: &'a RefCell<[bool; 256]>, manager: Arc<ChannelManager<EnforcingChannelKeys, Arc<channelmonitor::ManyChannelMonitor>>>, monitor: Arc<channelmonitor::SimpleManyChannelMonitor<OutPoint>>, handler: PeerManager<Peer<'a>, Arc<ChannelManager<EnforcingChannelKeys, Arc<channelmonitor::ManyChannelMonitor>>>>) -> Self {
                MoneyLossDetector {
                        manager,
                        monitor,
@@@ -247,7 -247,7 +247,7 @@@ impl KeysInterface for KeyProvider 
                PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]).unwrap())
        }
  
-       fn get_channel_keys(&self, inbound: bool) -> EnforcingChannelKeys {
+       fn get_channel_keys(&self, inbound: bool, channel_value_satoshis: u64) -> EnforcingChannelKeys {
                let ctr = self.counter.fetch_add(1, Ordering::Relaxed) as u8;
                EnforcingChannelKeys::new(if inbound {
                        InMemoryChannelKeys {
                                htlc_base_key:             SecretKey::from_slice(&[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, ctr]).unwrap(),
                                commitment_seed: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, ctr],
                                remote_channel_pubkeys: None,
+                               channel_value_satoshis: channel_value_satoshis,
                        }
                } else {
                        InMemoryChannelKeys {
                                htlc_base_key:             SecretKey::from_slice(&[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, ctr]).unwrap(),
                                commitment_seed: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, ctr],
                                remote_channel_pubkeys: None,
+                               channel_value_satoshis: channel_value_satoshis,
                        }
                })
        }
@@@ -320,14 -322,14 +322,14 @@@ pub fn do_test(data: &[u8], logger: &Ar
  
        let watch = Arc::new(ChainWatchInterfaceUtil::new(Network::Bitcoin, Arc::clone(&logger)));
        let broadcast = Arc::new(TestBroadcaster{});
 -      let monitor = channelmonitor::SimpleManyChannelMonitor::new(watch.clone(), broadcast.clone(), Arc::clone(&logger), fee_est.clone());
 +      let monitor = Arc::new(channelmonitor::SimpleManyChannelMonitor::new(watch.clone(), broadcast.clone(), Arc::clone(&logger), fee_est.clone()));
  
        let keys_manager = Arc::new(KeyProvider { node_secret: our_network_key.clone(), counter: AtomicU64::new(0) });
        let mut config = UserConfig::default();
        config.channel_options.fee_proportional_millionths =  slice_to_be32(get_slice!(4));
        config.channel_options.announced_channel = get_slice!(1)[0] != 0;
        config.peer_channel_config_limits.min_dust_limit_satoshis = 0;
 -      let channelmanager = ChannelManager::new(Network::Bitcoin, fee_est.clone(), monitor.clone(), broadcast.clone(), Arc::clone(&logger), keys_manager.clone(), config, 0).unwrap();
 +      let channelmanager = Arc::new(ChannelManager::new(Network::Bitcoin, fee_est.clone(), monitor.clone() as Arc<channelmonitor::ManyChannelMonitor>, broadcast.clone(), Arc::clone(&logger), keys_manager.clone(), config, 0).unwrap());
        let router = Arc::new(Router::new(PublicKey::from_secret_key(&Secp256k1::signing_only(), &keys_manager.get_node_secret()), watch.clone(), Arc::clone(&logger)));
  
        let peers = RefCell::new([false; 256]);
index b65cd0df77d3a150011d53c321ccb1fec406c96c,c35dbc4bc46150e954a38c56c381a33dcef546f6..f5a919bc22528c76caa9603e10ceec6ba42abb1a
@@@ -30,56 -30,43 +30,56 @@@ use ln::msgs
  use std::sync::Arc;
  use std::sync::atomic::{AtomicUsize, Ordering};
  
 -/// When on-chain outputs are created by rust-lightning an event is generated which informs the
 -/// user thereof. This enum describes the format of the output and provides the OutPoint.
 +/// When on-chain outputs are created by rust-lightning (which our counterparty is not able to
 +/// claim at any point in the future) an event is generated which you must track and be able to
 +/// spend on-chain. The information needed to do this is provided in this enum, including the
 +/// outpoint describing which txid and output index is available, the full output which exists at
 +/// that txid/index, and any keys or other information required to sign.
  pub enum SpendableOutputDescriptor {
 -      /// Outpoint with an output to a script which was provided via KeysInterface, thus you should
 -      /// have stored somewhere how to spend script_pubkey!
 -      /// Outputs from a justice tx, claim tx or preimage tx
 +      /// An output to a script which was provided via KeysInterface, thus you should already know
 +      /// how to spend it. No keys are provided as rust-lightning was never given any keys - only the
 +      /// script_pubkey as it appears in the output.
 +      /// These may include outputs from a transaction punishing our counterparty or claiming an HTLC
 +      /// on-chain using the payment preimage or after it has timed out.
        StaticOutput {
 -              /// The outpoint spendable by user wallet
 +              /// The outpoint which is spendable
                outpoint: OutPoint,
 -              /// The output which is referenced by the given outpoint
 +              /// The output which is referenced by the given outpoint.
                output: TxOut,
        },
 -      /// Outpoint commits to a P2WSH
 -      /// P2WSH should be spend by the following witness :
 -      /// <local_delayedsig> 0 <witnessScript>
 -      /// With input nSequence set to_self_delay.
 -      /// Outputs from a HTLC-Success/Timeout tx/commitment tx
 +      /// An output to a P2WSH script which can be spent with a single signature after a CSV delay.
 +      /// The private key which should be used to sign the transaction is provided, as well as the
 +      /// full witness redeemScript which is hashed in the output script_pubkey.
 +      /// The witness in the spending input should be:
 +      /// <BIP 143 signature generated with the given key> <one zero byte aka OP_0>
 +      /// <witness_script as provided>
 +      /// Note that the nSequence field in the input must be set to_self_delay (which corresponds to
 +      /// the transaction not being broadcastable until at least to_self_delay blocks after the input
 +      /// confirms).
 +      /// These are generally the result of a "revocable" output to us, spendable only by us unless
 +      /// it is an output from us having broadcast an old state (which should never happen).
        DynamicOutputP2WSH {
 -              /// Outpoint spendable by user wallet
 +              /// The outpoint which is spendable
                outpoint: OutPoint,
 -              /// local_delayedkey = delayed_payment_basepoint_secret + SHA256(per_commitment_point || delayed_payment_basepoint) OR
 +              /// The secret key which must be used to sign the spending transaction
                key: SecretKey,
 -              /// witness redeemScript encumbering output.
 +              /// The witness redeemScript which is hashed to create the script_pubkey in the given output
                witness_script: Script,
 -              /// nSequence input must commit to self_delay to satisfy script's OP_CSV
 +              /// The nSequence value which must be set in the spending input to satisfy the OP_CSV in
 +              /// the witness_script.
                to_self_delay: u16,
                /// The output which is referenced by the given outpoint
                output: TxOut,
        },
 -      /// Outpoint commits to a P2WPKH
 -      /// P2WPKH should be spend by the following witness :
 -      /// <local_sig> <local_pubkey>
 -      /// Outputs to_remote from a commitment tx
 +      /// An output to a P2WPKH, spendable exclusively by the given private key.
 +      /// The witness in the spending input, is, thus, simply:
 +      /// <BIP 143 signature generated with the given key> <public key derived from the given key>
 +      /// These are generally the result of our counterparty having broadcast the current state,
 +      /// allowing us to claim the non-HTLC-encumbered outputs immediately.
        DynamicOutputP2WPKH {
 -              /// Outpoint spendable by user wallet
 +              /// The outpoint which is spendable
                outpoint: OutPoint,
 -              /// localkey = payment_basepoint_secret + SHA256(per_commitment_point || payment_basepoint
 +              /// The secret key which must be used to sign the spending transaction
                key: SecretKey,
                /// The output which is reference by the given outpoint
                output: TxOut,
@@@ -99,7 -86,7 +99,7 @@@ pub trait KeysInterface: Send + Sync 
        fn get_shutdown_pubkey(&self) -> PublicKey;
        /// Get a new set of ChannelKeys for per-channel secrets. These MUST be unique even if you
        /// restarted with some stale data!
-       fn get_channel_keys(&self, inbound: bool) -> Self::ChanKeySigner;
+       fn get_channel_keys(&self, inbound: bool, channel_value_satoshis: u64) -> Self::ChanKeySigner;
        /// Get a secret and PRNG seed for construting an onion packet
        fn get_onion_rand(&self) -> (SecretKey, [u8; 32]);
        /// Get a unique temporary channel id. Channels will be referred to by this until the funding
@@@ -155,13 -142,13 +155,13 @@@ pub trait ChannelKeys : Send 
        /// TODO: Document the things someone using this interface should enforce before signing.
        /// TODO: Add more input vars to enable better checking (preferably removing commitment_tx and
        /// making the callee generate it via some util function we expose)!
-       fn sign_remote_commitment<T: secp256k1::Signing + secp256k1::Verification>(&self, channel_value_satoshis: u64, feerate_per_kw: u64, commitment_tx: &Transaction, keys: &TxCreationKeys, htlcs: &[&HTLCOutputInCommitment], to_self_delay: u16, secp_ctx: &Secp256k1<T>) -> Result<(Signature, Vec<Signature>), ()>;
+       fn sign_remote_commitment<T: secp256k1::Signing + secp256k1::Verification>(&self, feerate_per_kw: u64, commitment_tx: &Transaction, keys: &TxCreationKeys, htlcs: &[&HTLCOutputInCommitment], to_self_delay: u16, secp_ctx: &Secp256k1<T>) -> Result<(Signature, Vec<Signature>), ()>;
  
        /// Create a signature for a (proposed) closing transaction.
        ///
        /// Note that, due to rounding, there may be one "missing" satoshi, and either party may have
        /// chosen to forgo their output as dust.
-       fn sign_closing_transaction<T: secp256k1::Signing>(&self, channel_value_satoshis: u64, channel_funding_redeemscript: &Script, closing_tx: &Transaction, secp_ctx: &Secp256k1<T>) -> Result<Signature, ()>;
+       fn sign_closing_transaction<T: secp256k1::Signing>(&self, closing_tx: &Transaction, secp_ctx: &Secp256k1<T>) -> Result<Signature, ()>;
  
        /// Signs a channel announcement message with our funding key, proving it comes from one
        /// of the channel participants.
@@@ -193,8 -180,10 +193,10 @@@ pub struct InMemoryChannelKeys 
        pub htlc_base_key: SecretKey,
        /// Commitment seed
        pub commitment_seed: [u8; 32],
-       /// Remote funding pubkey
+       /// Remote public keys and base points
        pub remote_channel_pubkeys: Option<ChannelPublicKeys>,
+       /// The total value of this channel
+       pub channel_value_satoshis: u64,
  }
  
  impl ChannelKeys for InMemoryChannelKeys {
        fn htlc_base_key(&self) -> &SecretKey { &self.htlc_base_key }
        fn commitment_seed(&self) -> &[u8; 32] { &self.commitment_seed }
  
-       fn sign_remote_commitment<T: secp256k1::Signing + secp256k1::Verification>(&self, channel_value_satoshis: u64, feerate_per_kw: u64, commitment_tx: &Transaction, keys: &TxCreationKeys, htlcs: &[&HTLCOutputInCommitment], to_self_delay: u16, secp_ctx: &Secp256k1<T>) -> Result<(Signature, Vec<Signature>), ()> {
+       fn sign_remote_commitment<T: secp256k1::Signing + secp256k1::Verification>(&self, feerate_per_kw: u64, commitment_tx: &Transaction, keys: &TxCreationKeys, htlcs: &[&HTLCOutputInCommitment], to_self_delay: u16, secp_ctx: &Secp256k1<T>) -> Result<(Signature, Vec<Signature>), ()> {
                if commitment_tx.input.len() != 1 { return Err(()); }
  
                let funding_pubkey = PublicKey::from_secret_key(secp_ctx, &self.funding_key);
                let remote_channel_pubkeys = self.remote_channel_pubkeys.as_ref().expect("must set remote channel pubkeys before signing");
                let channel_funding_redeemscript = make_funding_redeemscript(&funding_pubkey, &remote_channel_pubkeys.funding_pubkey);
  
-               let commitment_sighash = hash_to_message!(&bip143::SighashComponents::new(&commitment_tx).sighash_all(&commitment_tx.input[0], &channel_funding_redeemscript, channel_value_satoshis)[..]);
+               let commitment_sighash = hash_to_message!(&bip143::SighashComponents::new(&commitment_tx).sighash_all(&commitment_tx.input[0], &channel_funding_redeemscript, self.channel_value_satoshis)[..]);
                let commitment_sig = secp_ctx.sign(&commitment_sighash, &self.funding_key);
  
                let commitment_txid = commitment_tx.txid();
                Ok((commitment_sig, htlc_sigs))
        }
  
-       fn sign_closing_transaction<T: secp256k1::Signing>(&self, channel_value_satoshis: u64, channel_funding_redeemscript: &Script, closing_tx: &Transaction, secp_ctx: &Secp256k1<T>) -> Result<Signature, ()> {
+       fn sign_closing_transaction<T: secp256k1::Signing>(&self, closing_tx: &Transaction, secp_ctx: &Secp256k1<T>) -> Result<Signature, ()> {
                if closing_tx.input.len() != 1 { return Err(()); }
                if closing_tx.input[0].witness.len() != 0 { return Err(()); }
                if closing_tx.output.len() > 2 { return Err(()); }
  
+               let remote_channel_pubkeys = self.remote_channel_pubkeys.as_ref().expect("must set remote channel pubkeys before signing");
+               let funding_pubkey = PublicKey::from_secret_key(secp_ctx, &self.funding_key);
+               let channel_funding_redeemscript = make_funding_redeemscript(&funding_pubkey, &remote_channel_pubkeys.funding_pubkey);
                let sighash = hash_to_message!(&bip143::SighashComponents::new(closing_tx)
-                       .sighash_all(&closing_tx.input[0], &channel_funding_redeemscript, channel_value_satoshis)[..]);
+                       .sighash_all(&closing_tx.input[0], &channel_funding_redeemscript, self.channel_value_satoshis)[..]);
                Ok(secp_ctx.sign(&sighash, &self.funding_key))
        }
  
@@@ -262,7 -255,8 +268,8 @@@ impl_writeable!(InMemoryChannelKeys, 0
        delayed_payment_base_key,
        htlc_base_key,
        commitment_seed,
-       remote_channel_pubkeys
+       remote_channel_pubkeys,
+       channel_value_satoshis
  });
  
  /// Simple KeysInterface implementor that takes a 32-byte seed for use as a BIP 32 extended key
@@@ -371,7 -365,7 +378,7 @@@ impl KeysInterface for KeysManager 
                self.shutdown_pubkey.clone()
        }
  
-       fn get_channel_keys(&self, _inbound: bool) -> InMemoryChannelKeys {
+       fn get_channel_keys(&self, _inbound: bool, channel_value_satoshis: u64) -> InMemoryChannelKeys {
                // We only seriously intend to rely on the channel_master_key for true secure
                // entropy, everything else just ensures uniqueness. We rely on the unique_start (ie
                // starting_time provided in the constructor) to be unique.
                        htlc_base_key,
                        commitment_seed,
                        remote_channel_pubkeys: None,
+                       channel_value_satoshis,
                }
        }
  
index a069f8049b7b580a86342b056f65d88a9eea23c4,cb028b184ba02ec5303a2fce5ba3ab4a9f01ac35..20479a33e1c41fa109d64a6163096928755ef339
@@@ -46,7 -46,7 +46,7 @@@ impl chaininterface::FeeEstimator for T
  
  pub struct TestChannelMonitor {
        pub added_monitors: Mutex<Vec<(OutPoint, channelmonitor::ChannelMonitor)>>,
 -      pub simple_monitor: Arc<channelmonitor::SimpleManyChannelMonitor<OutPoint>>,
 +      pub simple_monitor: channelmonitor::SimpleManyChannelMonitor<OutPoint>,
        pub update_ret: Mutex<Result<(), channelmonitor::ChannelMonitorUpdateErr>>,
  }
  impl TestChannelMonitor {
@@@ -203,7 -203,9 +203,9 @@@ impl keysinterface::KeysInterface for T
        fn get_node_secret(&self) -> SecretKey { self.backing.get_node_secret() }
        fn get_destination_script(&self) -> Script { self.backing.get_destination_script() }
        fn get_shutdown_pubkey(&self) -> PublicKey { self.backing.get_shutdown_pubkey() }
-       fn get_channel_keys(&self, inbound: bool) -> EnforcingChannelKeys { EnforcingChannelKeys::new(self.backing.get_channel_keys(inbound)) }
+       fn get_channel_keys(&self, inbound: bool, channel_value_satoshis: u64) -> EnforcingChannelKeys {
+               EnforcingChannelKeys::new(self.backing.get_channel_keys(inbound, channel_value_satoshis))
+       }
  
        fn get_onion_rand(&self) -> (SecretKey, [u8; 32]) {
                match *self.override_session_priv.lock().unwrap() {