pub struct KeysManager { /* private fields */ }Expand description
Simple KeysInterface implementation that takes a 32-byte seed for use as a BIP 32 extended
key and derives keys from that.
Your node_id is seed/0’.
Unilateral closes may use seed/1’.
Cooperative closes may use seed/2’.
The two close keys may be needed to claim on-chain funds!
This struct cannot be used for nodes that wish to support receiving phantom payments;
PhantomKeysManager must be used instead.
Note that switching between this struct and PhantomKeysManager will invalidate any
previously issued invoices and attempts to pay previous invoices will fail.
Implementations§
Source§impl KeysManager
impl KeysManager
Sourcepub fn new(
seed: &[u8; 32],
starting_time_secs: u64,
starting_time_nanos: u32,
) -> Self
pub fn new( seed: &[u8; 32], starting_time_secs: u64, starting_time_nanos: u32, ) -> Self
Constructs a KeysManager from a 32-byte seed. If the seed is in some way biased (e.g.,
your CSRNG is busted) this may panic (but more importantly, you will possibly lose funds).
starting_time isn’t strictly required to actually be a time, but it must absolutely,
without a doubt, be unique to this instance. ie if you start multiple times with the same
seed, starting_time must be unique to each run. Thus, the easiest way to achieve this
is to simply use the current time (with very high precision).
The seed MUST be backed up safely prior to use so that the keys can be re-created, however,
obviously, starting_time should be unique every time you reload the library - it is only
used to generate new ephemeral key data (which will be stored by the individual channel if
necessary).
Note that the seed is required to recover certain on-chain funds independent of
ChannelMonitor data, though a current copy of ChannelMonitor data is also required
for any channel, and some on-chain during-closing funds.
Sourcepub fn derive_channel_keys(
&self,
channel_value_satoshis: u64,
params: &[u8; 32],
) -> InMemorySigner
pub fn derive_channel_keys( &self, channel_value_satoshis: u64, params: &[u8; 32], ) -> InMemorySigner
Derive an old Sign containing per-channel secrets based on a key derivation parameters.
Sourcepub fn spend_spendable_outputs<C: Signing>(
&self,
descriptors: &[&SpendableOutputDescriptor],
outputs: Vec<TxOut>,
change_destination_script: Script,
feerate_sat_per_1000_weight: u32,
secp_ctx: &Secp256k1<C>,
) -> Result<Transaction, ()>
pub fn spend_spendable_outputs<C: Signing>( &self, descriptors: &[&SpendableOutputDescriptor], outputs: Vec<TxOut>, change_destination_script: Script, feerate_sat_per_1000_weight: u32, secp_ctx: &Secp256k1<C>, ) -> Result<Transaction, ()>
Creates a Transaction which spends the given descriptors to the given outputs, plus an
output to the given change destination (if sufficient change value remains). The
transaction will have a feerate, at least, of the given value.
Returns Err(()) if the output value is greater than the input value minus required fee,
if a descriptor was duplicated, or if an output descriptor script_pubkey
does not match the one we can spend.
We do not enforce that outputs meet the dust limit or that any output scripts are standard.
May panic if the SpendableOutputDescriptors were not generated by channels which used
this KeysManager or one of the InMemorySigner created by this KeysManager.
Trait Implementations§
Source§impl KeysInterface for KeysManager
impl KeysInterface for KeysManager
Source§type Signer = InMemorySigner
type Signer = InMemorySigner
Sign which will be returned by Self::derive_channel_signer.Source§fn get_node_id(&self, recipient: Recipient) -> Result<PublicKey, ()>
fn get_node_id(&self, recipient: Recipient) -> Result<PublicKey, ()>
Recipient. This public key corresponds to the secret in
get_node_secret. Read moreSource§fn ecdh(
&self,
recipient: Recipient,
other_key: &PublicKey,
tweak: Option<&Scalar>,
) -> Result<SharedSecret, ()>
fn ecdh( &self, recipient: Recipient, other_key: &PublicKey, tweak: Option<&Scalar>, ) -> Result<SharedSecret, ()>
node secret and other_key, multiplying by tweak if
one is provided. Note that this tweak can be applied to other_key instead of our node
secret, though this is less efficient. Read moreSource§fn get_inbound_payment_key_material(&self) -> KeyMaterial
fn get_inbound_payment_key_material(&self) -> KeyMaterial
Source§fn get_destination_script(&self) -> Script
fn get_destination_script(&self) -> Script
Source§fn get_shutdown_scriptpubkey(&self) -> ShutdownScript
fn get_shutdown_scriptpubkey(&self) -> ShutdownScript
Source§fn generate_channel_keys_id(
&self,
_inbound: bool,
_channel_value_satoshis: u64,
user_channel_id: u128,
) -> [u8; 32]
fn generate_channel_keys_id( &self, _inbound: bool, _channel_value_satoshis: u64, user_channel_id: u128, ) -> [u8; 32]
Source§fn derive_channel_signer(
&self,
channel_value_satoshis: u64,
channel_keys_id: [u8; 32],
) -> Self::Signer
fn derive_channel_signer( &self, channel_value_satoshis: u64, channel_keys_id: [u8; 32], ) -> Self::Signer
Signer. Read moreSource§fn get_secure_random_bytes(&self) -> [u8; 32]
fn get_secure_random_bytes(&self) -> [u8; 32]
Source§fn read_chan_signer(&self, reader: &[u8]) -> Result<Self::Signer, DecodeError>
fn read_chan_signer(&self, reader: &[u8]) -> Result<Self::Signer, DecodeError>
Signer for this KeysInterface from the given input stream.
This is only called during deserialization of other objects which contain
Sign-implementing objects (i.e., ChannelMonitors and ChannelManagers).
The bytes are exactly those which <Self::Signer as Writeable>::write() writes, and
contain no versioning scheme. You may wish to include your own version prefix and ensure
you’ve read all of the provided bytes to ensure no corruption occurred. Read moreSource§fn sign_invoice(
&self,
hrp_bytes: &[u8],
invoice_data: &[u5],
recipient: Recipient,
) -> Result<RecoverableSignature, ()>
fn sign_invoice( &self, hrp_bytes: &[u8], invoice_data: &[u5], recipient: Recipient, ) -> Result<RecoverableSignature, ()>
hrp is ASCII bytes, while the invoice data is base32-encoded. Read more