Skip to content

Commit

Permalink
SchnorrSigHashType -> SchnorrSighashType
Browse files Browse the repository at this point in the history
  • Loading branch information
RCasatta committed Jul 17, 2023
1 parent d78493e commit 43e36ff
Show file tree
Hide file tree
Showing 6 changed files with 78 additions and 78 deletions.
18 changes: 9 additions & 9 deletions elementsd-tests/src/taproot.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ use elements::sighash::{self, SighashCache};
use elements::taproot::{LeafVersion, TapTweakHash, TaprootBuilder, TaprootSpendInfo, TapLeafHash};
use elements::OutPoint;
use elements::{
confidential, opcodes, AssetIssuance, BlockHash, LockTime, SchnorrSig, SchnorrSigHashType, Script,
confidential, opcodes, AssetIssuance, BlockHash, LockTime, SchnorrSig, SchnorrSighashType, Script,
Sequence, TxInWitness, TxOut, Txid,
};
use elements::{AddressParams, Transaction, TxIn, TxOutSecrets};
Expand Down Expand Up @@ -144,7 +144,7 @@ fn taproot_spend_test(
elementsd: &ElementsD,
secp: &Secp256k1<secp256k1_zkp::All>,
genesis_hash: BlockHash,
sighash_ty: SchnorrSigHashType,
sighash_ty: SchnorrSighashType,
blind_prevout: bool,
blind_tx: bool,
key_spend: bool,
Expand Down Expand Up @@ -274,13 +274,13 @@ fn taproot_tests() {
let genesis_hash = BlockHash::from_str(&genesis_hash_str).unwrap();

let sighash_tys = [
SchnorrSigHashType::Default,
SchnorrSigHashType::Single,
SchnorrSigHashType::SinglePlusAnyoneCanPay,
SchnorrSigHashType::None,
SchnorrSigHashType::NonePlusAnyoneCanPay,
SchnorrSigHashType::All,
SchnorrSigHashType::AllPlusAnyoneCanPay,
SchnorrSighashType::Default,
SchnorrSighashType::Single,
SchnorrSighashType::SinglePlusAnyoneCanPay,
SchnorrSighashType::None,
SchnorrSighashType::NonePlusAnyoneCanPay,
SchnorrSighashType::All,
SchnorrSighashType::AllPlusAnyoneCanPay,
];

for &conf_prevout in &[true, false] {
Expand Down
2 changes: 1 addition & 1 deletion src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -83,5 +83,5 @@ pub use crate::hash_types::*;
pub use crate::issuance::{AssetId, ContractHash};
pub use crate::locktime::LockTime;
pub use crate::script::Script;
pub use crate::sighash::SchnorrSigHashType;
pub use crate::sighash::SchnorrSighashType;
pub use crate::schnorr::{SchnorrSig, SchnorrSigError};
28 changes: 14 additions & 14 deletions src/pset/map/input.rs
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ use crate::pset::map::Map;
use crate::pset::raw;
use crate::pset::serialize;
use crate::pset::{self, error, Error};
use crate::{transaction::SighashTypeParseError, SchnorrSigHashType};
use crate::{transaction::SighashTypeParseError, SchnorrSighashType};
use crate::{AssetIssuance, BlockHash, EcdsaSigHashType, Script, Transaction, TxIn, TxOut, Txid};
use bitcoin::bip32::KeySource;
use bitcoin::{PublicKey, key::XOnlyPublicKey};
Expand Down Expand Up @@ -292,7 +292,7 @@ impl Default for Input {
}

/// A Signature hash type for the corresponding input. As of taproot upgrade, the signature hash
/// type can be either [`EcdsaSigHashType`] or [`SchnorrSigHashType`] but it is not possible to know
/// type can be either [`EcdsaSigHashType`] or [`SchnorrSighashType`] but it is not possible to know
/// directly which signature hash type the user is dealing with. Therefore, the user is responsible
/// for converting to/from [`PsbtSighashType`] from/to the desired signature hash type they need.
#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
Expand All @@ -305,7 +305,7 @@ serde_string_impl!(PsbtSighashType, "a PsbtSighashType data");
impl fmt::Display for PsbtSighashType {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self.schnorr_hash_ty() {
Some(SchnorrSigHashType::Reserved) | None => write!(f, "{:#x}", self.inner),
Some(SchnorrSighashType::Reserved) | None => write!(f, "{:#x}", self.inner),
Some(schnorr_hash_ty) => fmt::Display::fmt(&schnorr_hash_ty, f),
}
}
Expand All @@ -321,8 +321,8 @@ impl FromStr for PsbtSighashType {
// NB: some of Schnorr sighash types are non-standard for pre-taproot
// inputs. We also do not support SIGHASH_RESERVED in verbatim form
// ("0xFF" string should be used instead).
match SchnorrSigHashType::from_str(s) {
Ok(SchnorrSigHashType::Reserved) => {
match SchnorrSighashType::from_str(s) {
Ok(SchnorrSighashType::Reserved) => {
return Err(SighashTypeParseError {
unrecognized: s.to_owned(),
})
Expand All @@ -349,8 +349,8 @@ impl From<EcdsaSigHashType> for PsbtSighashType {
}
}

impl From<SchnorrSigHashType> for PsbtSighashType {
fn from(schnorr_hash_ty: SchnorrSigHashType) -> Self {
impl From<SchnorrSighashType> for PsbtSighashType {
fn from(schnorr_hash_ty: SchnorrSighashType) -> Self {
PsbtSighashType {
inner: schnorr_hash_ty as u32,
}
Expand All @@ -364,13 +364,13 @@ impl PsbtSighashType {
EcdsaSigHashType::from_standard(self.inner).ok()
}

/// Returns the [`SchnorrSigHashType`] if the [`PsbtSighashType`] can be
/// Returns the [`SchnorrSighashType`] if the [`PsbtSighashType`] can be
/// converted to one.
pub fn schnorr_hash_ty(self) -> Option<SchnorrSigHashType> {
pub fn schnorr_hash_ty(self) -> Option<SchnorrSighashType> {
if self.inner > 0xffu32 {
None
} else {
SchnorrSigHashType::from_u8(self.inner as u8)
SchnorrSighashType::from_u8(self.inner as u8)
}
}

Expand Down Expand Up @@ -402,16 +402,16 @@ impl Input {
.unwrap_or(Some(EcdsaSigHashType::All))
}

/// Obtains the [`SchnorrSigHashType`] for this input if one is specified. If no sighash type is
/// specified, returns [`SchnorrSigHashType::Default`].
/// Obtains the [`SchnorrSighashType`] for this input if one is specified. If no sighash type is
/// specified, returns [`SchnorrSighashType::Default`].
///
/// # Errors
///
/// If the `sighash_type` field is set to a invalid Schnorr sighash value.
pub fn schnorr_hash_ty(&self) -> Option<SchnorrSigHashType> {
pub fn schnorr_hash_ty(&self) -> Option<SchnorrSighashType> {
self.sighash_type
.map(|sighash_type| sighash_type.schnorr_hash_ty())
.unwrap_or(Some(SchnorrSigHashType::Default))
.unwrap_or(Some(SchnorrSighashType::Default))
}

/// Create a psbt input from prevout
Expand Down
6 changes: 3 additions & 3 deletions src/pset/serialize.rs
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ use super::map::{PsbtSighashType, TapTree};
use crate::schnorr;
use crate::taproot::{ControlBlock, LeafVersion, TapBranchHash, TapLeafHash};

use crate::sighash::SchnorrSigHashType;
use crate::sighash::SchnorrSighashType;
use crate::taproot::TaprootBuilder;

/// A trait for serializing a value as raw data for insertion into PSET
Expand Down Expand Up @@ -300,7 +300,7 @@ impl Deserialize for schnorr::SchnorrSig {
fn deserialize(bytes: &[u8]) -> Result<Self, encode::Error> {
match bytes.len() {
65 => {
let hash_ty = SchnorrSigHashType::from_u8(bytes[64])
let hash_ty = SchnorrSighashType::from_u8(bytes[64])
.ok_or(encode::Error::ParseFailed("Invalid Sighash type"))?;
let sig = secp256k1_zkp::schnorr::Signature::from_slice(&bytes[..64])
.map_err(|_| encode::Error::ParseFailed("Invalid Schnorr signature"))?;
Expand All @@ -311,7 +311,7 @@ impl Deserialize for schnorr::SchnorrSig {
.map_err(|_| encode::Error::ParseFailed("Invalid Schnorr signature"))?;
Ok(schnorr::SchnorrSig {
sig,
hash_ty: SchnorrSigHashType::Default,
hash_ty: SchnorrSighashType::Default,
})
}
_ => Err(encode::Error::ParseFailed("Invalid Schnorr signature len")),
Expand Down
10 changes: 5 additions & 5 deletions src/schnorr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
use std::fmt;

use crate::taproot::{TapBranchHash, TapTweakHash};
use crate::SchnorrSigHashType;
use crate::SchnorrSighashType;
use secp256k1_zkp::{self, constants::SCHNORR_SIGNATURE_SIZE, Secp256k1, Verification};
pub use secp256k1_zkp::{KeyPair, XOnlyPublicKey};

Expand Down Expand Up @@ -209,7 +209,7 @@ pub struct SchnorrSig {
/// The underlying schnorr signature
pub sig: secp256k1_zkp::schnorr::Signature,
/// The corresponding hash type
pub hash_ty: SchnorrSigHashType,
pub hash_ty: SchnorrSighashType,
}

impl SchnorrSig {
Expand All @@ -220,11 +220,11 @@ impl SchnorrSig {
// default type
let sig = secp256k1_zkp::schnorr::Signature::from_slice(sl)
.map_err(|_| SchnorrSigError::InvalidSchnorrSig)?;
return Ok( SchnorrSig { sig, hash_ty : SchnorrSigHashType::Default });
return Ok( SchnorrSig { sig, hash_ty : SchnorrSighashType::Default });
}
let (hash_ty, sig) = sl.split_last()
.ok_or(SchnorrSigError::InvalidSchnorrSig)?;
let hash_ty = SchnorrSigHashType::from_u8(*hash_ty)
let hash_ty = SchnorrSighashType::from_u8(*hash_ty)
.ok_or(SchnorrSigError::InvalidSighashType(*hash_ty))?;
let sig = secp256k1_zkp::schnorr::Signature::from_slice(sig)
.map_err(|_| SchnorrSigError::InvalidSchnorrSig)?;
Expand All @@ -235,7 +235,7 @@ impl SchnorrSig {
pub fn to_vec(&self) -> Vec<u8> {
// TODO: add support to serialize to a writer to SerializedSig
let mut ser_sig = self.sig.as_ref().to_vec();
if let SchnorrSigHashType::Default = self.hash_ty {
if let SchnorrSighashType::Default = self.hash_ty {
// default sighash type, don't add extra sighash byte
} else {
ser_sig.push(self.hash_ty as u8);
Expand Down
92 changes: 46 additions & 46 deletions src/sighash.rs
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ struct TaprootCache {
}

/// Contains outputs of previous transactions.
/// In the case [`SchnorrSigHashType`] variant is `ANYONECANPAY`, [`Prevouts::One`] may be provided
/// In the case [`SchnorrSighashType`] variant is `ANYONECANPAY`, [`Prevouts::One`] may be provided
#[derive(Clone, PartialEq, Eq, Hash, Debug)]
pub enum Prevouts<'u, T> where T: 'u + Borrow<TxOut> {
/// `One` variant allows to provide the single Prevout needed. It's useful for example
Expand Down Expand Up @@ -256,7 +256,7 @@ impl<R: Deref<Target = Transaction>> SighashCache<R> {
prevouts: &Prevouts<T>,
annex: Option<Annex>,
leaf_hash_code_separator: Option<(TapLeafHash, u32)>,
sighash_type: SchnorrSigHashType,
sighash_type: SchnorrSighashType,
genesis_hash: BlockHash,
) -> Result<(), Error> {
prevouts.check_all(&self.tx)?;
Expand Down Expand Up @@ -313,7 +313,7 @@ impl<R: Deref<Target = Transaction>> SighashCache<R> {
// If hash_type & 3 does not equal SIGHASH_NONE or SIGHASH_SINGLE:
// sha_outputs (32): the SHA256 of the serialization of all outputs in CTxOut format.
// sha_output_witnesses (32): (ELEMENTS) the SHA256 of the serialization of all output witnesses
if sighash != SchnorrSigHashType::None && sighash != SchnorrSigHashType::Single {
if sighash != SchnorrSighashType::None && sighash != SchnorrSighashType::Single {
self.common_cache().outputs.consensus_encode(&mut writer)?;
self.taproot_cache(prevouts.get_all()?)
.output_witnesses
Expand Down Expand Up @@ -388,7 +388,7 @@ impl<R: Deref<Target = Transaction>> SighashCache<R> {
// If hash_type & 3 equals SIGHASH_SINGLE:
// sha_single_output (32): the SHA256 of the corresponding output in CTxOut format.
// sha_single_output_witness (32): the sha256 serialization of output witnesses
if sighash == SchnorrSigHashType::Single {
if sighash == SchnorrSighashType::Single {
let mut enc = sha256::Hash::engine();
let out = self.tx
.output
Expand Down Expand Up @@ -428,7 +428,7 @@ impl<R: Deref<Target = Transaction>> SighashCache<R> {
prevouts: &Prevouts<T>,
annex: Option<Annex>,
leaf_hash_code_separator: Option<(TapLeafHash, u32)>,
sighash_type: SchnorrSigHashType,
sighash_type: SchnorrSighashType,
genesis_hash: BlockHash,
) -> Result<TapSighashHash, Error> {
let mut enc = TapSighashHash::engine();
Expand All @@ -449,7 +449,7 @@ impl<R: Deref<Target = Transaction>> SighashCache<R> {
&mut self,
input_index: usize,
prevouts: &Prevouts<T>,
sighash_type: SchnorrSigHashType,
sighash_type: SchnorrSighashType,
genesis_hash: BlockHash,
) -> Result<TapSighashHash, Error> {
let mut enc = TapSighashHash::engine();
Expand All @@ -474,7 +474,7 @@ impl<R: Deref<Target = Transaction>> SighashCache<R> {
input_index: usize,
prevouts: &Prevouts<T>,
leaf_hash: S,
sighash_type: SchnorrSigHashType,
sighash_type: SchnorrSighashType,
genesis_hash: BlockHash,
) -> Result<TapSighashHash, Error> {
let mut enc = TapSighashHash::engine();
Expand Down Expand Up @@ -875,8 +875,8 @@ impl<'a> Encodable for Annex<'a> {
/// Hashtype of an input's signature, encoded in the last byte of the signature
/// Fixed values so they can be casted as integer types for encoding
#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug)]
pub enum SchnorrSigHashType {
/// 0x0: Used when not explicitly specified, defaulting to [`SchnorrSigHashType::All`]
pub enum SchnorrSighashType {
/// 0x0: Used when not explicitly specified, defaulting to [`SchnorrSighashType::All`]
Default = 0x00,
/// 0x1: Sign all outputs
All = 0x01,
Expand All @@ -898,67 +898,67 @@ pub enum SchnorrSigHashType {
Reserved = 0xFF,
}

serde_string_impl!(SchnorrSigHashType, "a SchnorrSigHashType data");
serde_string_impl!(SchnorrSighashType, "a SchnorrSighashType data");

impl SchnorrSigHashType {
impl SchnorrSighashType {
/// Break the sighash flag into the "real" sighash flag and the ANYONECANPAY boolean
pub fn split_anyonecanpay_flag(self) -> (SchnorrSigHashType, bool) {
pub fn split_anyonecanpay_flag(self) -> (SchnorrSighashType, bool) {
match self {
SchnorrSigHashType::Default => (SchnorrSigHashType::Default, false),
SchnorrSigHashType::All => (SchnorrSigHashType::All, false),
SchnorrSigHashType::None => (SchnorrSigHashType::None, false),
SchnorrSigHashType::Single => (SchnorrSigHashType::Single, false),
SchnorrSigHashType::AllPlusAnyoneCanPay => (SchnorrSigHashType::All, true),
SchnorrSigHashType::NonePlusAnyoneCanPay => (SchnorrSigHashType::None, true),
SchnorrSigHashType::SinglePlusAnyoneCanPay => (SchnorrSigHashType::Single, true),
SchnorrSigHashType::Reserved => (SchnorrSigHashType::Reserved, false),
SchnorrSighashType::Default => (SchnorrSighashType::Default, false),
SchnorrSighashType::All => (SchnorrSighashType::All, false),
SchnorrSighashType::None => (SchnorrSighashType::None, false),
SchnorrSighashType::Single => (SchnorrSighashType::Single, false),
SchnorrSighashType::AllPlusAnyoneCanPay => (SchnorrSighashType::All, true),
SchnorrSighashType::NonePlusAnyoneCanPay => (SchnorrSighashType::None, true),
SchnorrSighashType::SinglePlusAnyoneCanPay => (SchnorrSighashType::Single, true),
SchnorrSighashType::Reserved => (SchnorrSighashType::Reserved, false),
}
}

/// Create a [`SchnorrSigHashType`] from raw u8
/// Create a [`SchnorrSighashType`] from raw u8
pub fn from_u8(hash_ty: u8) -> Option<Self> {
match hash_ty {
0x00 => Some(SchnorrSigHashType::Default),
0x01 => Some(SchnorrSigHashType::All),
0x02 => Some(SchnorrSigHashType::None),
0x03 => Some(SchnorrSigHashType::Single),
0x81 => Some(SchnorrSigHashType::AllPlusAnyoneCanPay),
0x82 => Some(SchnorrSigHashType::NonePlusAnyoneCanPay),
0x83 => Some(SchnorrSigHashType::SinglePlusAnyoneCanPay),
0x00 => Some(SchnorrSighashType::Default),
0x01 => Some(SchnorrSighashType::All),
0x02 => Some(SchnorrSighashType::None),
0x03 => Some(SchnorrSighashType::Single),
0x81 => Some(SchnorrSighashType::AllPlusAnyoneCanPay),
0x82 => Some(SchnorrSighashType::NonePlusAnyoneCanPay),
0x83 => Some(SchnorrSighashType::SinglePlusAnyoneCanPay),
_x => None,
}
}
}

impl fmt::Display for SchnorrSigHashType {
impl fmt::Display for SchnorrSighashType {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let s = match self {
SchnorrSigHashType::Default => "SIGHASH_DEFAULT",
SchnorrSigHashType::All => "SIGHASH_ALL",
SchnorrSigHashType::None => "SIGHASH_NONE",
SchnorrSigHashType::Single => "SIGHASH_SINGLE",
SchnorrSigHashType::AllPlusAnyoneCanPay => "SIGHASH_ALL|SIGHASH_ANYONECANPAY",
SchnorrSigHashType::NonePlusAnyoneCanPay => "SIGHASH_NONE|SIGHASH_ANYONECANPAY",
SchnorrSigHashType::SinglePlusAnyoneCanPay => "SIGHASH_SINGLE|SIGHASH_ANYONECANPAY",
SchnorrSigHashType::Reserved => "SIGHASH_RESERVED",
SchnorrSighashType::Default => "SIGHASH_DEFAULT",
SchnorrSighashType::All => "SIGHASH_ALL",
SchnorrSighashType::None => "SIGHASH_NONE",
SchnorrSighashType::Single => "SIGHASH_SINGLE",
SchnorrSighashType::AllPlusAnyoneCanPay => "SIGHASH_ALL|SIGHASH_ANYONECANPAY",
SchnorrSighashType::NonePlusAnyoneCanPay => "SIGHASH_NONE|SIGHASH_ANYONECANPAY",
SchnorrSighashType::SinglePlusAnyoneCanPay => "SIGHASH_SINGLE|SIGHASH_ANYONECANPAY",
SchnorrSighashType::Reserved => "SIGHASH_RESERVED",
};
f.write_str(s)
}
}

impl std::str::FromStr for SchnorrSigHashType {
impl std::str::FromStr for SchnorrSighashType {
type Err = SighashTypeParseError;

fn from_str(s: &str) -> Result<Self, Self::Err> {
match s {
"SIGHASH_DEFAULT" => Ok(SchnorrSigHashType::Default),
"SIGHASH_ALL" => Ok(SchnorrSigHashType::All),
"SIGHASH_NONE" => Ok(SchnorrSigHashType::None),
"SIGHASH_SINGLE" => Ok(SchnorrSigHashType::Single),
"SIGHASH_ALL|SIGHASH_ANYONECANPAY" => Ok(SchnorrSigHashType::AllPlusAnyoneCanPay),
"SIGHASH_NONE|SIGHASH_ANYONECANPAY" => Ok(SchnorrSigHashType::NonePlusAnyoneCanPay),
"SIGHASH_SINGLE|SIGHASH_ANYONECANPAY" => Ok(SchnorrSigHashType::SinglePlusAnyoneCanPay),
"SIGHASH_RESERVED" => Ok(SchnorrSigHashType::Reserved),
"SIGHASH_DEFAULT" => Ok(SchnorrSighashType::Default),
"SIGHASH_ALL" => Ok(SchnorrSighashType::All),
"SIGHASH_NONE" => Ok(SchnorrSighashType::None),
"SIGHASH_SINGLE" => Ok(SchnorrSighashType::Single),
"SIGHASH_ALL|SIGHASH_ANYONECANPAY" => Ok(SchnorrSighashType::AllPlusAnyoneCanPay),
"SIGHASH_NONE|SIGHASH_ANYONECANPAY" => Ok(SchnorrSighashType::NonePlusAnyoneCanPay),
"SIGHASH_SINGLE|SIGHASH_ANYONECANPAY" => Ok(SchnorrSighashType::SinglePlusAnyoneCanPay),
"SIGHASH_RESERVED" => Ok(SchnorrSighashType::Reserved),
_ => Err(SighashTypeParseError{ unrecognized: s.to_owned() }),
}
}
Expand Down

0 comments on commit 43e36ff

Please sign in to comment.