Update v5 transparent signature hashes to always commit to scriptPubKey
This commit is contained in:
parent
3c6e19f4e4
commit
fc82801d3d
|
@ -94,8 +94,8 @@ impl Shl<&[u8]> for Script {
|
|||
/// A transparent address corresponding to either a public key or a `Script`.
|
||||
#[derive(Debug, PartialEq, PartialOrd, Hash, Clone)]
|
||||
pub enum TransparentAddress {
|
||||
PublicKey([u8; 20]),
|
||||
Script([u8; 20]),
|
||||
PublicKey([u8; 20]), // TODO: Rename to PublicKeyHash
|
||||
Script([u8; 20]), // TODO: Rename to ScriptHash
|
||||
}
|
||||
|
||||
impl TransparentAddress {
|
||||
|
|
|
@ -194,7 +194,7 @@ impl TransparentAuthorizingContext for Unauthorized {
|
|||
vec![]
|
||||
}
|
||||
|
||||
fn input_scripts(&self) -> Vec<Script> {
|
||||
fn input_scriptpubkeys(&self) -> Vec<Script> {
|
||||
vec![]
|
||||
}
|
||||
}
|
||||
|
@ -205,7 +205,7 @@ impl TransparentAuthorizingContext for Unauthorized {
|
|||
return self.inputs.iter().map(|txin| txin.coin.value).collect();
|
||||
}
|
||||
|
||||
fn input_scripts(&self) -> Vec<Script> {
|
||||
fn input_scriptpubkeys(&self) -> Vec<Script> {
|
||||
return self
|
||||
.inputs
|
||||
.iter()
|
||||
|
@ -232,7 +232,8 @@ impl Bundle<Unauthorized> {
|
|||
&SignableInput::Transparent {
|
||||
hash_type: SIGHASH_ALL,
|
||||
index,
|
||||
script_code: &info.coin.script_pubkey,
|
||||
script_code: &info.coin.script_pubkey, // for p2pkh, always the same as script_pubkey
|
||||
script_pubkey: &info.coin.script_pubkey,
|
||||
value: info.coin.value,
|
||||
},
|
||||
txid_parts_cache,
|
||||
|
|
|
@ -27,6 +27,7 @@ pub enum SignableInput<'a> {
|
|||
hash_type: u8,
|
||||
index: usize,
|
||||
script_code: &'a Script,
|
||||
script_pubkey: &'a Script,
|
||||
value: Amount,
|
||||
},
|
||||
#[cfg(feature = "zfuture")]
|
||||
|
@ -64,11 +65,11 @@ pub trait TransparentAuthorizingContext: transparent::Authorization {
|
|||
/// without requiring the full data of the previous transactions
|
||||
/// providing these inputs.
|
||||
fn input_amounts(&self) -> Vec<Amount>;
|
||||
/// Returns the list of all transparent input scripts, provided
|
||||
/// Returns the list of all transparent input scriptPubKeys, provided
|
||||
/// so that wallets can commit to the transparent input breakdown
|
||||
/// without requiring the full data of the previous transactions
|
||||
/// providing these inputs.
|
||||
fn input_scripts(&self) -> Vec<Script>;
|
||||
fn input_scriptpubkeys(&self) -> Vec<Script>;
|
||||
}
|
||||
|
||||
/// Computes the signature hash for an input to a transaction, given
|
||||
|
|
|
@ -76,7 +76,7 @@ fn transparent_sig_digest<A: TransparentAuthorizingContext>(
|
|||
if flag_anyonecanpay {
|
||||
vec![]
|
||||
} else {
|
||||
bundle.authorization.input_scripts()
|
||||
bundle.authorization.input_scriptpubkeys()
|
||||
},
|
||||
|w, script| script.write(w),
|
||||
)
|
||||
|
@ -114,7 +114,7 @@ fn transparent_sig_digest<A: TransparentAuthorizingContext>(
|
|||
let mut ch = hasher(ZCASH_TRANSPARENT_INPUT_HASH_PERSONALIZATION);
|
||||
if let SignableInput::Transparent {
|
||||
index,
|
||||
script_code,
|
||||
script_pubkey,
|
||||
value,
|
||||
..
|
||||
} = input
|
||||
|
@ -122,7 +122,7 @@ fn transparent_sig_digest<A: TransparentAuthorizingContext>(
|
|||
let txin = &bundle.vin[*index];
|
||||
txin.prevout.write(&mut ch).unwrap();
|
||||
ch.write_all(&value.to_i64_le_bytes()).unwrap();
|
||||
script_code.write(&mut ch).unwrap();
|
||||
script_pubkey.write(&mut ch).unwrap();
|
||||
ch.write_u32::<LittleEndian>(txin.sequence).unwrap();
|
||||
}
|
||||
let per_input_digest = ch.finalize();
|
||||
|
|
|
@ -133,6 +133,7 @@ fn zip_0143() {
|
|||
hash_type: tv.hash_type as u8,
|
||||
index: n as usize,
|
||||
script_code: &tv.script_code,
|
||||
script_pubkey: &tv.script_code,
|
||||
value: Amount::from_nonnegative_i64(tv.amount).unwrap(),
|
||||
},
|
||||
_ => SignableInput::Shielded,
|
||||
|
@ -154,6 +155,7 @@ fn zip_0243() {
|
|||
hash_type: tv.hash_type as u8,
|
||||
index: n as usize,
|
||||
script_code: &tv.script_code,
|
||||
script_pubkey: &tv.script_code,
|
||||
value: Amount::from_nonnegative_i64(tv.amount).unwrap(),
|
||||
},
|
||||
_ => SignableInput::Shielded,
|
||||
|
@ -169,7 +171,7 @@ fn zip_0243() {
|
|||
#[derive(Debug)]
|
||||
struct TestTransparentAuth {
|
||||
input_amounts: Vec<Amount>,
|
||||
input_scripts: Vec<Script>,
|
||||
input_scriptpubkeys: Vec<Script>,
|
||||
}
|
||||
|
||||
impl transparent::Authorization for TestTransparentAuth {
|
||||
|
@ -181,8 +183,8 @@ impl TransparentAuthorizingContext for TestTransparentAuth {
|
|||
self.input_amounts.clone()
|
||||
}
|
||||
|
||||
fn input_scripts(&self) -> Vec<Script> {
|
||||
self.input_scripts.clone()
|
||||
fn input_scriptpubkeys(&self) -> Vec<Script> {
|
||||
self.input_scriptpubkeys.clone()
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -214,7 +216,7 @@ fn zip_0244() {
|
|||
.iter()
|
||||
.map(|amount| Amount::from_nonnegative_i64(*amount).unwrap())
|
||||
.collect();
|
||||
let input_scripts = tv.script_codes.iter().map(|s| Script(s.clone())).collect();
|
||||
let input_scriptpubkeys = tv.script_codes.iter().map(|s| Script(s.clone())).collect();
|
||||
|
||||
let test_bundle = txdata
|
||||
.transparent_bundle
|
||||
|
@ -235,7 +237,7 @@ fn zip_0244() {
|
|||
vout: b.vout.clone(),
|
||||
authorization: TestTransparentAuth {
|
||||
input_amounts,
|
||||
input_scripts,
|
||||
input_scriptpubkeys,
|
||||
},
|
||||
});
|
||||
|
||||
|
@ -262,11 +264,12 @@ fn zip_0244() {
|
|||
if let Some(index) = tv.transparent_input {
|
||||
let bundle = txdata.transparent_bundle().unwrap();
|
||||
let value = bundle.authorization.input_amounts[index];
|
||||
let script_code = &bundle.authorization.input_scripts[index];
|
||||
let script_code = &bundle.authorization.input_scriptpubkeys[index];
|
||||
let signable_input = |hash_type| SignableInput::Transparent {
|
||||
hash_type,
|
||||
index,
|
||||
script_code,
|
||||
script_pubkey: script_code,
|
||||
value,
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue