}
impl DelayedPaymentOutputDescriptor {
/// The maximum length a well-formed witness spending one of these should have.
+ /// Note: If you have the grind_signatures feature enabled, this will be at least 1 byte
+ /// shorter.
// Calculated as 1 byte length + 73 byte signature, 1 byte empty vec push, 1 byte length plus
// redeemscript push length.
pub const MAX_WITNESS_LENGTH: usize = 1 + 73 + 1 + chan_utils::REVOKEABLE_REDEEMSCRIPT_MAX_LENGTH + 1;
}
impl StaticPaymentOutputDescriptor {
/// The maximum length a well-formed witness spending one of these should have.
+ /// Note: If you have the grind_signatures feature enabled, this will be at least 1 byte
+ /// shorter.
// Calculated as 1 byte legnth + 73 byte signature, 1 byte empty vec push, 1 byte length plus
// redeemscript push length.
pub const MAX_WITNESS_LENGTH: usize = 1 + 73 + 34;
/// Get a script pubkey which we send funds to when claiming on-chain contestable outputs.
///
+ /// If this function returns an error, this will result in a channel failing to open.
+ ///
/// This method should return a different value each time it is called, to avoid linking
/// on-chain funds across channels as controlled to the same user.
- fn get_destination_script(&self) -> Script;
+ fn get_destination_script(&self) -> Result<Script, ()>;
/// Get a script pubkey which we will send funds to when closing a channel.
///
+ /// If this function returns an error, this will result in a channel failing to open or close.
+ /// In the event of a failure when the counterparty is initiating a close, this can result in a
+ /// channel force close.
+ ///
/// This method should return a different value each time it is called, to avoid linking
/// on-chain funds across channels as controlled to the same user.
- fn get_shutdown_scriptpubkey(&self) -> ShutdownScript;
+ fn get_shutdown_scriptpubkey(&self) -> Result<ShutdownScript, ()>;
}
/// A simple implementation of [`WriteableEcdsaChannelSigner`] that just keeps the private keys in memory.
witness: Witness::new(),
});
witness_weight += StaticPaymentOutputDescriptor::MAX_WITNESS_LENGTH;
+ #[cfg(feature = "grind_signatures")]
+ { witness_weight -= 1; } // Guarantees a low R signature
input_value += descriptor.output.value;
if !output_set.insert(descriptor.outpoint) { return Err(()); }
},
witness: Witness::new(),
});
witness_weight += DelayedPaymentOutputDescriptor::MAX_WITNESS_LENGTH;
+ #[cfg(feature = "grind_signatures")]
+ { witness_weight -= 1; } // Guarantees a low R signature
input_value += descriptor.output.value;
if !output_set.insert(descriptor.outpoint) { return Err(()); }
},
witness: Witness::new(),
});
witness_weight += 1 + 73 + 34;
+ #[cfg(feature = "grind_signatures")]
+ { witness_weight -= 1; } // Guarantees a low R signature
input_value += output.value;
if !output_set.insert(*outpoint) { return Err(()); }
}
InMemorySigner::read(&mut io::Cursor::new(reader), self)
}
- fn get_destination_script(&self) -> Script {
- self.destination_script.clone()
+ fn get_destination_script(&self) -> Result<Script, ()> {
+ Ok(self.destination_script.clone())
}
- fn get_shutdown_scriptpubkey(&self) -> ShutdownScript {
- ShutdownScript::new_p2wpkh_from_pubkey(self.shutdown_pubkey.clone())
+ fn get_shutdown_scriptpubkey(&self) -> Result<ShutdownScript, ()> {
+ Ok(ShutdownScript::new_p2wpkh_from_pubkey(self.shutdown_pubkey.clone()))
}
}
self.inner.read_chan_signer(reader)
}
- fn get_destination_script(&self) -> Script {
+ fn get_destination_script(&self) -> Result<Script, ()> {
self.inner.get_destination_script()
}
- fn get_shutdown_scriptpubkey(&self) -> ShutdownScript {
+ fn get_shutdown_scriptpubkey(&self) -> Result<ShutdownScript, ()> {
self.inner.get_shutdown_scriptpubkey()
}
}