X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;f=lightning%2Fsrc%2Fchain%2Fkeysinterface.rs;h=c4045e9c60c4e96aa6989ab0cb48f4e90ed992e4;hb=0133739e9e585ebe966ba4a1d41b003f4f4769bf;hp=4e4d182aa24c2243bf9ef4b89369efb8eefac089;hpb=d0c5e9c81d74c667684bba34166074c89f158485;p=rust-lightning diff --git a/lightning/src/chain/keysinterface.rs b/lightning/src/chain/keysinterface.rs index 4e4d182a..c4045e9c 100644 --- a/lightning/src/chain/keysinterface.rs +++ b/lightning/src/chain/keysinterface.rs @@ -167,28 +167,6 @@ impl Readable for SpendableOutputDescriptor { } } -/// A trait to describe an object which can get user secrets and key material. -pub trait KeysInterface: Send + Sync { - /// A type which implements ChannelKeys which will be returned by get_channel_keys. - type ChanKeySigner : ChannelKeys; - - /// Get node secret key (aka node_id or network_key) - fn get_node_secret(&self) -> SecretKey; - /// Get destination redeemScript to encumber static protocol exit points. - fn get_destination_script(&self) -> Script; - /// Get shutdown_pubkey to use as PublicKey at channel closure - 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, 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 - /// transaction is created, at which point they will use the outpoint in the funding - /// transaction. - fn get_channel_id(&self) -> [u8; 32]; -} - /// Set of lightning keys needed to operate a channel as described in BOLT 3. /// /// Signing services could be implemented on a hardware wallet. In this case, @@ -217,22 +195,10 @@ pub trait KeysInterface: Send + Sync { // TODO: We should remove Clone by instead requesting a new ChannelKeys copy when we create // ChannelMonitors instead of expecting to clone the one out of the Channel into the monitors. pub trait ChannelKeys : Send+Clone { - /// Gets the private key for the anchor tx - fn funding_key<'a>(&'a self) -> &'a SecretKey; - /// Gets the local secret key for blinded revocation pubkey - fn revocation_base_key<'a>(&'a self) -> &'a SecretKey; - /// Gets the local secret key used in the to_remote output of remote commitment tx (ie the - /// output to us in transactions our counterparty broadcasts). - /// Also as part of obscured commitment number. - fn payment_key<'a>(&'a self) -> &'a SecretKey; - /// Gets the local secret key used in HTLC-Success/HTLC-Timeout txn and to_local output - fn delayed_payment_base_key<'a>(&'a self) -> &'a SecretKey; - /// Gets the local htlc secret key used in commitment tx htlc outputs - fn htlc_base_key<'a>(&'a self) -> &'a SecretKey; /// Gets the commitment seed - fn commitment_seed<'a>(&'a self) -> &'a [u8; 32]; + fn commitment_seed(&self) -> &[u8; 32]; /// Gets the local channel public keys and basepoints - fn pubkeys<'a>(&'a self) -> &'a ChannelPublicKeys; + fn pubkeys(&self) -> &ChannelPublicKeys; /// Gets arbitrary identifiers describing the set of keys which are provided back to you in /// some SpendableOutputDescriptor types. These should be sufficient to identify this /// ChannelKeys object uniquely and lookup or re-derive its keys. @@ -245,7 +211,7 @@ pub trait ChannelKeys : Send+Clone { // 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(&self, feerate_per_kw: u64, commitment_tx: &Transaction, keys: &TxCreationKeys, htlcs: &[&HTLCOutputInCommitment], to_self_delay: u16, secp_ctx: &Secp256k1) -> Result<(Signature, Vec), ()>; + fn sign_remote_commitment(&self, feerate_per_kw: u32, commitment_tx: &Transaction, keys: &TxCreationKeys, htlcs: &[&HTLCOutputInCommitment], to_self_delay: u16, secp_ctx: &Secp256k1) -> Result<(Signature, Vec), ()>; /// Create a signature for a local commitment transaction. This will only ever be called with /// the same local_commitment_tx (or a copy thereof), though there are currently no guarantees @@ -341,21 +307,43 @@ pub trait ChannelKeys : Send+Clone { fn set_remote_channel_pubkeys(&mut self, channel_points: &ChannelPublicKeys); } +/// A trait to describe an object which can get user secrets and key material. +pub trait KeysInterface: Send + Sync { + /// A type which implements ChannelKeys which will be returned by get_channel_keys. + type ChanKeySigner : ChannelKeys; + + /// Get node secret key (aka node_id or network_key) + fn get_node_secret(&self) -> SecretKey; + /// Get destination redeemScript to encumber static protocol exit points. + fn get_destination_script(&self) -> Script; + /// Get shutdown_pubkey to use as PublicKey at channel closure + 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, channel_value_satoshis: u64) -> Self::ChanKeySigner; + /// Get a secret and PRNG seed for constructing 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 + /// transaction is created, at which point they will use the outpoint in the funding + /// transaction. + fn get_channel_id(&self) -> [u8; 32]; +} + #[derive(Clone)] /// A simple implementation of ChannelKeys that just keeps the private keys in memory. pub struct InMemoryChannelKeys { /// Private key of anchor tx - funding_key: SecretKey, + pub funding_key: SecretKey, /// Local secret key for blinded revocation pubkey - revocation_base_key: SecretKey, + pub revocation_base_key: SecretKey, /// Local secret key used for our balance in remote-broadcasted commitment transactions - payment_key: SecretKey, + pub payment_key: SecretKey, /// Local secret key used in HTLC tx - delayed_payment_base_key: SecretKey, + pub delayed_payment_base_key: SecretKey, /// Local htlc secret key used in commitment tx htlc outputs - htlc_base_key: SecretKey, + pub htlc_base_key: SecretKey, /// Commitment seed - commitment_seed: [u8; 32], + pub commitment_seed: [u8; 32], /// Local public keys and basepoints pub(crate) local_channel_pubkeys: ChannelPublicKeys, /// Remote public keys and base points @@ -416,16 +404,11 @@ impl InMemoryChannelKeys { } impl ChannelKeys for InMemoryChannelKeys { - fn funding_key(&self) -> &SecretKey { &self.funding_key } - fn revocation_base_key(&self) -> &SecretKey { &self.revocation_base_key } - fn payment_key(&self) -> &SecretKey { &self.payment_key } - fn delayed_payment_base_key(&self) -> &SecretKey { &self.delayed_payment_base_key } - fn htlc_base_key(&self) -> &SecretKey { &self.htlc_base_key } fn commitment_seed(&self) -> &[u8; 32] { &self.commitment_seed } - fn pubkeys<'a>(&'a self) -> &'a ChannelPublicKeys { &self.local_channel_pubkeys } + fn pubkeys(&self) -> &ChannelPublicKeys { &self.local_channel_pubkeys } fn key_derivation_params(&self) -> (u64, u64) { self.key_derivation_params } - fn sign_remote_commitment(&self, feerate_per_kw: u64, commitment_tx: &Transaction, keys: &TxCreationKeys, htlcs: &[&HTLCOutputInCommitment], to_self_delay: u16, secp_ctx: &Secp256k1) -> Result<(Signature, Vec), ()> { + fn sign_remote_commitment(&self, feerate_per_kw: u32, commitment_tx: &Transaction, keys: &TxCreationKeys, htlcs: &[&HTLCOutputInCommitment], to_self_delay: u16, secp_ctx: &Secp256k1) -> Result<(Signature, Vec), ()> { if commitment_tx.input.len() != 1 { return Err(()); } let funding_pubkey = PublicKey::from_secret_key(secp_ctx, &self.funding_key); @@ -642,7 +625,7 @@ impl KeysManager { /// Note that until the 0.1 release there is no guarantee of backward compatibility between /// versions. Once the library is more fully supported, the docs will be updated to include a /// detailed description of the guarantee. - pub fn new(seed: &[u8; 32], network: Network, starting_time_secs: u64, starting_time_nanos: u32) -> KeysManager { + pub fn new(seed: &[u8; 32], network: Network, starting_time_secs: u64, starting_time_nanos: u32) -> Self { let secp_ctx = Secp256k1::signing_only(); match ExtendedPrivKey::new_master(network.clone(), seed) { Ok(master_key) => {