Skip to content

Commit 55b6cce

Browse files
committed
Merge #143: Blinding API cleanups
582325e rustfmt: add src/pset/mod.rs and src/blind.rs (sanket1729) 759d301 Add liquid testnet parameters (sanket1729) 2908bc1 Allow inserting inputs/outputs at specified positions (sanket1729) cbc2d56 Add issuance surjection proof verification (sanket1729) 3583ae2 Fix pset key bug (sanket1729) 2815e52 Fix pset Tweak serde (sanket1729) 3107c25 Add support for issuance (sanket1729) fa753b4 Cleanup bunch of blinding APIs (sanket1729) d521aee Remove public has_issuance field from TxIn (sanket1729) Pull request description: - This required the user to explicitly maintain whether the current TxIn has issuance or not whereas it can directly be calculated from assetIssuance field The blinding APIs are separated into smaller chunks. This allows - Blinding only the values or the assets but not both - Not relying on rng to set asset/value blinding factors - Better input parameters Note I had to edit the test vectors the order in which they were sampled from rng had changed. ACKs for top commit: apoelstra: ACK 582325e Tree-SHA512: 1d70b58bc136341d1933a872749982cac8507aa5f355774de2dcaecfe68f89926d938bdf24031e8e34782562c5c78bb10d00d5726a2113c5dea1ee139bb2de0e
2 parents 2547a2d + 582325e commit 55b6cce

26 files changed

+1587
-775
lines changed

examples/pset_blind_coinjoin.rs

+5-9
Original file line numberDiff line numberDiff line change
@@ -266,20 +266,16 @@ fn main() {
266266
// ----------------------------------------------------------
267267
// B Adds it's own outputs. Step 2 completed
268268
// ----- Step 3: B to blind it's own outputs
269-
let inp_txout_sec = [
270-
None,
271-
Some(&asset_txout_secrets.sec),
272-
];
269+
let mut inp_txout_sec = HashMap::new();
270+
inp_txout_sec.insert(1, asset_txout_secrets.sec);
273271

274272
pset.blind_non_last(&mut rng, &secp, &inp_txout_sec).unwrap();
275273
assert_eq!(pset, deser_pset(&tests["pset_coinjoined_B_blinded"]));
276274

277275
// Step 4: A blinds it's own inputs
278-
let inp_txout_sec = [
279-
Some(&btc_txout_secrets.sec),
280-
None,
281-
];
282-
pset.blind_last(&mut rng, &secp, &inp_txout_sec).unwrap();
276+
let mut inp_txout_sec_a = HashMap::new();
277+
inp_txout_sec_a.insert(0, btc_txout_secrets.sec);
278+
pset.blind_last(&mut rng, &secp, &inp_txout_sec_a).unwrap();
283279
assert_eq!(pset, deser_pset(&tests["pset_coinjoined_blinded"]));
284280

285281
// check whether the blinding was correct

examples/raw_blind.rs

+10-13
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use elements::{
1010
bitcoin::PublicKey, pset::PartiallySignedTransaction as Pset, Address, AddressParams, OutPoint,
1111
Script, TxOutSecrets, TxOutWitness, Txid, WScriptHash,
1212
};
13-
use elements::{pset, secp256k1_zkp};
13+
use elements::{pset, secp256k1_zkp, SurjectionInput};
1414

1515
use elements::encode::{deserialize, serialize_hex};
1616
use elements::hashes::hex::FromHex;
@@ -168,8 +168,8 @@ fn main() {
168168
// Add outputs
169169
// Send 5_000 worth of asset units to new address
170170
let inputs = [
171-
(btc_txout.asset, Some(&btc_txout_secrets.sec)),
172-
(asset_txout.asset, Some(&asset_txout_secrets.sec)),
171+
(SurjectionInput::from_txout_secrets(btc_txout_secrets.sec)),
172+
(SurjectionInput::from_txout_secrets(asset_txout_secrets.sec)),
173173
];
174174

175175
let dest_wsh =
@@ -179,7 +179,7 @@ fn main() {
179179
let dest_blind_pk =
180180
PublicKey::from_str("0212bf0ea45b733dfde8ecb5e896306c4165c666c99fc5d1ab887f71393a975cea")
181181
.unwrap();
182-
let (dest_asset_txout, dest_abf, dest_vbf) = TxOut::new_not_last_confidential(
182+
let (dest_asset_txout, dest_abf, dest_vbf, _) = TxOut::new_not_last_confidential(
183183
&mut rng,
184184
&secp,
185185
dest_amt,
@@ -200,7 +200,7 @@ fn main() {
200200
let change_wsh =
201201
WScriptHash::from_str("f6b43d56e004e9d0b1ec2fc3c95511d81af08420992be8dec7f86cdf8970b3e2")
202202
.unwrap();
203-
let (change_asset_txout, asset_change_abf, asset_change_vbf) =
203+
let (change_asset_txout, asset_change_abf, asset_change_vbf, _) =
204204
TxOut::new_not_last_confidential(
205205
&mut rng,
206206
&secp,
@@ -254,19 +254,16 @@ fn main() {
254254

255255
// For the last output we require all secrets.
256256
let inputs = [
257-
(btc_txout.asset, &btc_txout_secrets.sec),
258-
(asset_txout.asset, &asset_txout_secrets.sec),
257+
btc_txout_secrets.sec,
258+
asset_txout_secrets.sec,
259259
];
260-
let (btc_change_txout, _abf, _vbf) = TxOut::new_last_confidential(
260+
let (btc_change_txout, _abf, _vbf, _) = TxOut::new_last_confidential(
261261
&mut rng,
262262
&secp,
263263
change_amt,
264-
Address::p2wsh(
265-
&Script::new_v0_wsh(&change_wsh),
266-
Some(change_blind_pk.inner),
267-
&PARAMS,
268-
),
269264
btc_txout_secrets.sec.asset,
265+
Script::new_v0_wsh(&change_wsh),
266+
change_blind_pk.inner,
270267
&inputs,
271268
&output_secrets,
272269
)

examples/test_vector/pset_blind_coinjoin/pset_coinjoined_B_blinded.hex

+1-1
Large diffs are not rendered by default.

examples/test_vector/pset_blind_coinjoin/pset_coinjoined_blinded.hex

+1-1
Large diffs are not rendered by default.

examples/test_vector/raw_blind/blinded_one_inp_signed.hex

+1-1
Large diffs are not rendered by default.

examples/test_vector/raw_blind/blinded_signed.hex

+1-1
Large diffs are not rendered by default.

examples/test_vector/raw_blind/blinded_unsigned.hex

+1-1
Large diffs are not rendered by default.

examples/test_vector/raw_blind/extracted_tx.hex

+1-1
Large diffs are not rendered by default.

examples/test_vector/raw_blind/finalized.hex

+1-1
Large diffs are not rendered by default.

src/address.rs

+25-18
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,15 @@ impl AddressParams {
146146
bech_hrp: "ert",
147147
blech_hrp: "el",
148148
};
149+
150+
/// The default liquid testnet network address parameters.
151+
pub const LIQUID_TESTNET: AddressParams = AddressParams {
152+
p2pkh_prefix: 36,
153+
p2sh_prefix: 19,
154+
blinded_prefix: 23,
155+
bech_hrp: "tex",
156+
blech_hrp: "tlq",
157+
};
149158
}
150159

151160
/// The method used to produce an address
@@ -439,7 +448,7 @@ impl Address {
439448
if data.len() < 2 || data.len() > 40 + if blinded { 33 } else { 0 } {
440449
return Err(AddressError::InvalidWitnessProgramLength(data.len() - if blinded { 33 } else { 0 }));
441450
}
442-
451+
443452
// Specific segwit v0 check.
444453
if !blinded && version.to_u8() == 0 && data.len() != 20 && data.len() != 32 {
445454
return Err(AddressError::InvalidSegwitV0ProgramLength(data.len()));
@@ -649,20 +658,19 @@ impl FromStr for Address {
649658
// shorthands
650659
let liq = &AddressParams::LIQUID;
651660
let ele = &AddressParams::ELEMENTS;
661+
let liq_test = &AddressParams::LIQUID_TESTNET;
662+
663+
let net_arr = [liq, ele, liq_test];
652664

653-
// Bech32.
654665
let prefix = find_prefix(s);
655-
if match_prefix(prefix, liq.bech_hrp) {
656-
return Address::from_bech32(s, false, liq);
657-
}
658-
if match_prefix(prefix, liq.blech_hrp) {
659-
return Address::from_bech32(s, true, liq);
660-
}
661-
if match_prefix(prefix, ele.bech_hrp) {
662-
return Address::from_bech32(s, false, ele);
663-
}
664-
if match_prefix(prefix, ele.blech_hrp) {
665-
return Address::from_bech32(s, true, ele);
666+
for net in net_arr.iter() {
667+
// Bech32.
668+
if match_prefix(prefix, net.bech_hrp) {
669+
return Address::from_bech32(s, false, net);
670+
}
671+
if match_prefix(prefix, net.blech_hrp) {
672+
return Address::from_bech32(s, true, net);
673+
}
666674
}
667675

668676
// Base58.
@@ -675,11 +683,10 @@ impl FromStr for Address {
675683
}
676684

677685
let p = data[0];
678-
if p == liq.p2pkh_prefix || p == liq.p2sh_prefix || p == liq.blinded_prefix {
679-
return Address::from_base58(&data, liq);
680-
}
681-
if p == ele.p2pkh_prefix || p == ele.p2sh_prefix || p == ele.blinded_prefix {
682-
return Address::from_base58(&data, ele);
686+
for net in net_arr.iter() {
687+
if p == net.p2pkh_prefix || p == net.p2sh_prefix || p == net.blinded_prefix {
688+
return Address::from_base58(&data, net);
689+
}
683690
}
684691

685692
Err(AddressError::InvalidAddress(s.to_owned()))

0 commit comments

Comments
 (0)