Skip to content

Commit 6e94399

Browse files
committed
Use concrete WitnessProgram type
1 parent e12517b commit 6e94399

File tree

5 files changed

+36
-60
lines changed

5 files changed

+36
-60
lines changed

lightning-invoice/src/lib.rs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ use std::time::SystemTime;
4646

4747
use bech32::u5;
4848
use bitcoin::{Address, Network, PubkeyHash, ScriptHash};
49-
use bitcoin::address::{Payload, WitnessVersion};
49+
use bitcoin::address::{Payload, WitnessProgram, WitnessVersion};
5050
use bitcoin_hashes::{Hash, sha256};
5151
use lightning::ln::features::Bolt11InvoiceFeatures;
5252
use lightning::util::invoice::construct_invoice_preimage;
@@ -413,6 +413,7 @@ impl From<Network> for Currency {
413413
Network::Testnet => Currency::BitcoinTestnet,
414414
Network::Regtest => Currency::Regtest,
415415
Network::Signet => Currency::Signet,
416+
_ => unreachable!(),
416417
}
417418
}
418419
}
@@ -1429,10 +1430,13 @@ impl Bolt11Invoice {
14291430

14301431
/// Returns a list of all fallback addresses as [`Address`]es
14311432
pub fn fallback_addresses(&self) -> Vec<Address> {
1432-
self.fallbacks().iter().map(|fallback| {
1433+
self.fallbacks().iter().filter_map(|fallback| {
14331434
let payload = match fallback {
14341435
Fallback::SegWitProgram { version, program } => {
1435-
Payload::WitnessProgram { version: *version, program: program.to_vec() }
1436+
match WitnessProgram::new(*version, program.clone()) {
1437+
Ok(witness_program) => Payload::WitnessProgram(witness_program),
1438+
Err(_) => return None,
1439+
}
14361440
}
14371441
Fallback::PubKeyHash(pkh) => {
14381442
Payload::PubkeyHash(*pkh)
@@ -1442,7 +1446,7 @@ impl Bolt11Invoice {
14421446
}
14431447
};
14441448

1445-
Address { payload, network: self.network() }
1449+
Some(Address::new(self.network(), payload))
14461450
}).collect()
14471451
}
14481452

lightning/src/ln/channel.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7823,7 +7823,7 @@ mod tests {
78237823
use bitcoin::hashes::Hash;
78247824
use bitcoin::hash_types::WPubkeyHash;
78257825
use bitcoin::blockdata::locktime::absolute::LockTime;
7826-
use bitcoin::address::WitnessVersion;
7826+
use bitcoin::address::{WitnessProgram, WitnessVersion};
78277827
use crate::prelude::*;
78287828

78297829
struct TestFeeEstimator {
@@ -7885,8 +7885,9 @@ mod tests {
78857885
#[test]
78867886
fn upfront_shutdown_script_incompatibility() {
78877887
let features = channelmanager::provided_init_features(&UserConfig::default()).clear_shutdown_anysegwit();
7888-
let non_v0_segwit_shutdown_script =
7889-
ShutdownScript::new_witness_program(WitnessVersion::V16, &[0, 40]).unwrap();
7888+
let non_v0_segwit_shutdown_script = ShutdownScript::new_witness_program(
7889+
&WitnessProgram::new(WitnessVersion::V16, &[0, 40]).unwrap(),
7890+
).unwrap();
78907891

78917892
let seed = [42; 32];
78927893
let network = Network::Testnet;

lightning/src/ln/script.rs

Lines changed: 9 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
//! Abstractions for scripts used in the Lightning Network.
22
33
use bitcoin::blockdata::opcodes::all::OP_PUSHBYTES_0 as SEGWIT_V0;
4-
use bitcoin::blockdata::script::{Builder, Script, ScriptBuf};
4+
use bitcoin::blockdata::script::{Script, ScriptBuf};
55
use bitcoin::hashes::Hash;
66
use bitcoin::hash_types::{WPubkeyHash, WScriptHash};
77
use bitcoin::secp256k1::PublicKey;
8-
use bitcoin::address::WitnessVersion;
8+
use bitcoin::address::WitnessProgram;
99

1010
use crate::ln::channelmanager;
1111
use crate::ln::features::InitFeatures;
@@ -81,12 +81,8 @@ impl ShutdownScript {
8181
/// # Errors
8282
///
8383
/// This function may return an error if `program` is invalid for the segwit `version`.
84-
pub fn new_witness_program(version: WitnessVersion, program: &[u8]) -> Result<Self, InvalidShutdownScript> {
85-
let script = Builder::new()
86-
.push_int(version as i64)
87-
.push_slice(&program)
88-
.into_script();
89-
Self::try_from(script)
84+
pub fn new_witness_program(witness_program: &WitnessProgram) -> Result<Self, InvalidShutdownScript> {
85+
Self::try_from(ScriptBuf::new_witness_program(witness_program))
9086
}
9187

9288
/// Converts the shutdown script into the underlying [`ScriptBuf`].
@@ -177,7 +173,7 @@ mod shutdown_script_tests {
177173
use bitcoin::secp256k1::{PublicKey, SecretKey};
178174
use crate::ln::features::InitFeatures;
179175
use core::convert::TryFrom;
180-
use bitcoin::address::WitnessVersion;
176+
use bitcoin::address::{WitnessProgram, WitnessVersion};
181177

182178
fn pubkey() -> bitcoin::key::PublicKey {
183179
let secp_ctx = Secp256k1::signing_only();
@@ -240,30 +236,17 @@ mod shutdown_script_tests {
240236

241237
#[test]
242238
fn generates_segwit_from_non_v0_witness_program() {
243-
let witness_program = ScriptBuf::new_witness_program(WitnessVersion::V16, &[0; 40]);
244-
let shutdown_script = ShutdownScript::new_witness_program(WitnessVersion::V16, &[0; 40]).unwrap();
239+
let witness_program = WitnessProgram::new(WitnessVersion::V16, &[0; 40]).unwrap();
240+
let script = ScriptBuf::new_witness_program(&witness_program);
241+
let shutdown_script = ShutdownScript::new_witness_program(&witness_program).unwrap();
245242
assert!(shutdown_script.is_compatible(&any_segwit_features()));
246243
assert!(!shutdown_script.is_compatible(&InitFeatures::empty()));
247-
assert_eq!(shutdown_script.into_inner(), witness_program);
244+
assert_eq!(shutdown_script.into_inner(), script);
248245
}
249246

250247
#[test]
251248
fn fails_from_unsupported_script() {
252249
let op_return = ScriptBuf::new_op_return(&[0; 42]);
253250
assert!(ShutdownScript::try_from(op_return).is_err());
254251
}
255-
256-
#[test]
257-
fn fails_from_invalid_segwit_v0_witness_program() {
258-
let witness_program = ScriptBuf::new_witness_program(WitnessVersion::V0, &[0; 2]);
259-
assert!(ShutdownScript::try_from(witness_program).is_err());
260-
}
261-
262-
#[test]
263-
fn fails_from_invalid_segwit_non_v0_witness_program() {
264-
let witness_program = ScriptBuf::new_witness_program(WitnessVersion::V16, &[0; 42]);
265-
assert!(ShutdownScript::try_from(witness_program).is_err());
266-
267-
assert!(ShutdownScript::new_witness_program(WitnessVersion::V16, &[0; 42]).is_err());
268-
}
269252
}

lightning/src/ln/shutdown_tests.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ use crate::util::string::UntrustedString;
2727
use bitcoin::blockdata::script::Builder;
2828
use bitcoin::blockdata::opcodes;
2929
use bitcoin::network::constants::Network;
30-
use bitcoin::address::WitnessVersion;
30+
use bitcoin::address::{WitnessProgram, WitnessVersion};
3131

3232
use regex;
3333

@@ -927,8 +927,9 @@ fn test_unsupported_anysegwit_shutdown_script() {
927927

928928
// Check that using an unsupported shutdown script fails and a supported one succeeds.
929929
let supported_shutdown_script = chanmon_cfgs[1].keys_manager.get_shutdown_scriptpubkey().unwrap();
930+
let unsupported_witness_program = WitnessProgram::new(WitnessVersion::V16, &[0, 40]).unwrap();
930931
let unsupported_shutdown_script =
931-
ShutdownScript::new_witness_program(WitnessVersion::V16, &[0, 40]).unwrap();
932+
ShutdownScript::new_witness_program(&unsupported_witness_program).unwrap();
932933
chanmon_cfgs[1].keys_manager
933934
.expect(OnGetShutdownScriptpubkey { returns: unsupported_shutdown_script.clone() })
934935
.expect(OnGetShutdownScriptpubkey { returns: supported_shutdown_script });

lightning/src/offers/invoice.rs

Lines changed: 12 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ use bitcoin::hashes::Hash;
103103
use bitcoin::network::constants::Network;
104104
use bitcoin::secp256k1::{KeyPair, PublicKey, Secp256k1, self};
105105
use bitcoin::secp256k1::schnorr::Signature;
106-
use bitcoin::address::{Address, Payload, WitnessVersion};
106+
use bitcoin::address::{Address, Payload, WitnessProgram, WitnessVersion};
107107
use bitcoin::key::TweakedPublicKey;
108108
use core::convert::{AsRef, Infallible, TryFrom};
109109
use core::time::Duration;
@@ -930,15 +930,12 @@ impl InvoiceContents {
930930
return None;
931931
}
932932

933-
let address = Address {
934-
payload: Payload::WitnessProgram {
935-
version,
936-
program: program.clone(),
937-
},
938-
network,
933+
let witness_program = match WitnessProgram::new(version, program.clone()) {
934+
Ok(witness_program) => witness_program,
935+
Err(_) => return None,
939936
};
940-
941-
if !address.is_standard() && version == WitnessVersion::V0 {
937+
let address = Address::new(network, Payload::WitnessProgram(witness_program));
938+
if !address.is_spend_standard() && version == WitnessVersion::V0 {
942939
return None;
943940
}
944941

@@ -1309,7 +1306,7 @@ mod tests {
13091306
use bitcoin::hashes::Hash;
13101307
use bitcoin::network::constants::Network;
13111308
use bitcoin::secp256k1::{Message, Secp256k1, XOnlyPublicKey, self};
1312-
use bitcoin::address::{Address, Payload, WitnessVersion};
1309+
use bitcoin::address::{Address, Payload, WitnessProgram, WitnessVersion};
13131310
use bitcoin::key::TweakedPublicKey;
13141311
use core::convert::TryFrom;
13151312
use core::time::Duration;
@@ -1837,7 +1834,7 @@ mod tests {
18371834
Some(&vec![
18381835
FallbackAddress {
18391836
version: WitnessVersion::V0.to_num(),
1840-
program: Vec::from(script.wscript_hash()),
1837+
program: Vec::from(script.wscript_hash().to_byte_array()),
18411838
},
18421839
FallbackAddress {
18431840
version: WitnessVersion::V0.to_num(),
@@ -2129,26 +2126,16 @@ mod tests {
21292126

21302127
match Bolt12Invoice::try_from(buffer) {
21312128
Ok(invoice) => {
2129+
let v1_witness_program = WitnessProgram::new(WitnessVersion::V1, vec![0u8; 33]).unwrap();
2130+
let v2_witness_program = WitnessProgram::new(WitnessVersion::V2, vec![0u8; 40]).unwrap();
21322131
assert_eq!(
21332132
invoice.fallbacks(),
21342133
vec![
21352134
Address::p2wsh(&script, Network::Bitcoin),
21362135
Address::p2wpkh(&pubkey, Network::Bitcoin).unwrap(),
21372136
Address::p2tr_tweaked(tweaked_pubkey, Network::Bitcoin),
2138-
Address {
2139-
payload: Payload::WitnessProgram {
2140-
version: WitnessVersion::V1,
2141-
program: vec![0u8; 33],
2142-
},
2143-
network: Network::Bitcoin,
2144-
},
2145-
Address {
2146-
payload: Payload::WitnessProgram {
2147-
version: WitnessVersion::V2,
2148-
program: vec![0u8; 40],
2149-
},
2150-
network: Network::Bitcoin,
2151-
},
2137+
Address::new(Network::Bitcoin, Payload::WitnessProgram(v1_witness_program)),
2138+
Address::new(Network::Bitcoin, Payload::WitnessProgram(v2_witness_program)),
21522139
],
21532140
);
21542141
},

0 commit comments

Comments
 (0)