Skip to content

Commit

Permalink
taprootsigverifier - verifybase
Browse files Browse the repository at this point in the history
  • Loading branch information
Jeanmichel7 committed Jan 18, 2025
1 parent 76c627c commit 05a6315
Show file tree
Hide file tree
Showing 16 changed files with 68 additions and 40 deletions.
5 changes: 3 additions & 2 deletions packages/cmds/src/main.cairo
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
use shinigami_compiler::compiler::CompilerImpl;
use shinigami_engine::engine::{EngineImpl, EngineInternalImpl};
use shinigami_engine::utxo::{UTXO};
use shinigami_engine::transaction::{EngineInternalTransactionImpl, EngineInternalTransactionTrait};
use shinigami_engine::transaction::{
EngineInternalTransactionImpl, EngineInternalTransactionTrait, UTXO,
};
use shinigami_engine::flags;
use shinigami_engine::witness;
use shinigami_engine::hash_cache::HashCacheImpl;
Expand Down
1 change: 0 additions & 1 deletion packages/engine/src/lib.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,6 @@ pub mod signature {
pub mod schnorr;
}
pub mod transaction;
pub mod utxo;

#[cfg(test)]
mod tests {
Expand Down
4 changes: 4 additions & 0 deletions packages/engine/src/signature/sighash.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -221,6 +221,10 @@ pub impl TaprootSighashOptionsImpl of TaprootSighashOptionsTrait {
}
}

fn set_annex(ref self: TaprootSighashOptions, annex: @ByteArray) {
self.annex_hash = @sha256_byte_array(annex);
}

// Write in msg the sihash message extension defined by the current active flag.
fn write_digest_extensions(ref self: TaprootSighashOptions, ref msg: ByteArray) {
// Base extension doesn'nt modify the digest at all.
Expand Down
47 changes: 41 additions & 6 deletions packages/engine/src/signature/taproot_signature.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@ use crate::transaction::{
EngineTransactionTrait,
};
use crate::flags::ScriptFlags;
use crate::signature::{constants, schnorr, sighash, sighash::{TaprootSighashOptionsTrait}};
use crate::signature::{
constants, schnorr, sighash, sighash::{TaprootSighashOptionsTrait, TaprootSighashOptions},
};
use crate::hash_cache::{TxSigHashes, SigHashMidstateTrait};
use crate::errors::Error;

Expand Down Expand Up @@ -54,6 +56,13 @@ pub fn parse_taproot_sig_and_pk<
return Result::Ok((pk, sig, sighash_type));
}

// TODO: remplace sig result by VerifyResult ?
// #[derive(Clone, Copy, Drop, Default)]
// pub struct VerifyResult {
// sigValid: bool,
// sigMatch: bool,
// }

#[derive(Drop)]
pub struct TaprootSigVerifier<T> {
// public key as a point on the secp256k1 curve, used to verify the signature
Expand Down Expand Up @@ -96,7 +105,7 @@ pub trait TaprootSigVerifierTrait<
sig_bytes: @ByteArray, pk_bytes: @ByteArray, ref engine: Engine<T>,
) -> Result<TaprootSigVerifier<T>, felt252>;
fn verify(self: TaprootSigVerifier<T>) -> Result<(), felt252>;
fn verify_base(self: TaprootSigVerifier<T>) -> Result<(), felt252>;
fn verify_base(self: TaprootSigVerifier<T>, ref engine: Engine<T>) -> Result<(), felt252>;
}

pub impl TaprootSigVerifierImpl<
Expand Down Expand Up @@ -179,16 +188,42 @@ pub impl TaprootSigVerifierImpl<
let mut opts = TaprootSighashOptionsTrait::new_with_annex(self.annex);
let sig_hash = sighash::calc_taproot_signature_hash::<
T,
>(self.hashCache, self.hash_type, self.tx, self.inputIndex, self.prevOuts, ref opts)?;
>(
self.hashCache, self.hash_type, self.tx, self.inputIndex, self.prevOuts, ref opts,
)?; // on error should return error or false ?

if !schnorr::verify_schnorr(self.sig, @sig_hash.into(), self.pk_bytes)? {
return Result::Err(Error::TAPROOT_INVALID_SIG);
return Result::Err(
Error::TAPROOT_INVALID_SIG,
); // should not return error ? VerifyResult ?
}
Result::Ok(())
}

fn verify_base(self: TaprootSigVerifier<T>) -> Result<(), felt252> {
// TODO: implement taproot verification
fn verify_base(self: TaprootSigVerifier<T>, ref engine: Engine<T>) -> Result<(), felt252> {
if (self.pub_key.is_none()) {
return Result::Ok(());
}

let mut opts = TaprootSighashOptionsTrait::new_with_tapscript_version(
engine.taproot_context.code_sep, @engine.taproot_context.tapleaf_hash.into(),
);

if engine.taproot_context.annex.len() > 0 {
opts.set_annex(engine.taproot_context.annex);
}

let sig_hash = sighash::calc_taproot_signature_hash::<
T,
>(
self.hashCache, self.hash_type, self.tx, self.inputIndex, self.prevOuts, ref opts,
)?; // on error should return error or false ?

if !schnorr::verify_schnorr(self.sig, @sig_hash.into(), self.pk_bytes)? {
return Result::Err(
Error::TAPROOT_INVALID_SIG,
); // should not return error ? VerifyResult ?
}
Result::Ok(())
}
}
Expand Down
4 changes: 2 additions & 2 deletions packages/engine/src/tests/test_taproot_hash.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@ use crate::signature::sighash::{
TAPSCRIPT_SIGHASH_EXT_FLAG,
};
use crate::transaction::{
EngineTransactionOutput, EngineTransaction, EngineTransactionInput, EngineOutPoint,
EngineTransactionOutput, EngineTransaction, EngineTransactionInput, EngineOutPoint, UTXO,
};
use crate::hash_cache::{TxSigHashes, SigHashMidstateTrait};
use shinigami_engine::utxo::{UTXO};
use shinigami_engine::utxo::{};
use shinigami_utils::bytecode::hex_to_bytecode;
use shinigami_utils::byte_array::{U256IntoByteArray};

Expand Down
9 changes: 8 additions & 1 deletion packages/engine/src/transaction.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,14 @@ use shinigami_utils::byte_array::{byte_array_value_at_le, byte_array_value_at_be
use shinigami_utils::bytecode::{bytecode_to_hex, read_var_int, write_var_int};
use shinigami_utils::bit_shifts::shr;
use shinigami_utils::hash::double_sha256;
use shinigami_engine::utxo::{UTXO};

#[derive(Debug, Drop, Clone, Default)]
pub struct UTXO {
pub amount: i64,
pub pubkey_script: ByteArray,
pub block_height: u32,
// TODO: flags?
}

// Tracks previous transaction outputs
#[derive(Drop, Copy, Default)]
Expand Down
7 changes: 0 additions & 7 deletions packages/engine/src/utxo.cairo

This file was deleted.

2 changes: 0 additions & 2 deletions packages/tests/src/tests/test_coinbase.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,6 @@ fn test_validate_coinbase_block_481823() {
}

#[test]
#[ignore]
fn test_validate_coinbase_block_481824() {
// Test the first block after BIP141 segwit
let raw_transaction_hex =
Expand All @@ -127,7 +126,6 @@ fn test_validate_coinbase_block_481824() {
}

#[test]
#[ignore]
fn test_validate_coinbase_block_538403() {
// Test random block from learnmebitcoin
let raw_transaction_hex =
Expand Down
6 changes: 2 additions & 4 deletions packages/tests/src/tests/test_p2ms.cairo
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
use shinigami_engine::transaction::EngineInternalTransactionTrait;
use shinigami_engine::utxo::{UTXO};

use crate::validate;
use shinigami_engine::transaction::{UTXO, EngineInternalTransactionTrait};
use shinigami_utils::bytecode::hex_to_bytecode;
use crate::validate;

#[test]
fn test_p2ms_1_of_2() {
Expand Down
3 changes: 1 addition & 2 deletions packages/tests/src/tests/test_p2pk.cairo
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
use shinigami_engine::engine::{EngineImpl};
use shinigami_engine::transaction::EngineInternalTransactionTrait;
use shinigami_engine::transaction::{UTXO, EngineInternalTransactionTrait};
use crate::validate;
use shinigami_engine::utxo::{UTXO};
use shinigami_utils::bytecode::hex_to_bytecode;

// https://learnmeabitcoin.com/explorer/tx/cda1f7d88232ff7e4fc1fcbf8a66b2cc3b8e19b5bc0ad22618453b8b75156740
Expand Down
5 changes: 2 additions & 3 deletions packages/tests/src/tests/test_p2pkh.cairo
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
use shinigami_engine::transaction::EngineInternalTransactionTrait;
use shinigami_engine::utxo::{UTXO};
use crate::validate;
use shinigami_engine::transaction::{UTXO, EngineInternalTransactionTrait};
use shinigami_utils::bytecode::hex_to_bytecode;
use crate::validate;

#[test]
fn test_p2pkh_transaction() {
Expand Down
3 changes: 1 addition & 2 deletions packages/tests/src/tests/test_p2sh.cairo
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
use shinigami_engine::transaction::EngineInternalTransactionTrait;
use shinigami_engine::transaction::{UTXO, EngineInternalTransactionTrait};
use shinigami_engine::engine::EngineImpl;
use shinigami_engine::hash_cache::HashCacheImpl;
use shinigami_engine::utxo::{UTXO};
use shinigami_engine::flags::ScriptFlags;
use crate::validate;
use shinigami_utils::bytecode::hex_to_bytecode;
Expand Down
3 changes: 1 addition & 2 deletions packages/tests/src/tests/test_p2wpkh.cairo
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
use shinigami_engine::transaction::EngineInternalTransactionTrait;
use shinigami_engine::utxo::{UTXO};
use shinigami_engine::transaction::{UTXO, EngineInternalTransactionTrait};
use crate::validate;
use shinigami_utils::bytecode::hex_to_bytecode;
use shinigami_engine::flags::ScriptFlags;
Expand Down
3 changes: 1 addition & 2 deletions packages/tests/src/tests/test_p2wsh.cairo
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
use shinigami_engine::transaction::EngineInternalTransactionTrait;
use shinigami_engine::transaction::{UTXO, EngineInternalTransactionTrait};
use shinigami_engine::flags::ScriptFlags;
use shinigami_engine::errors::Error;

use crate::validate;
use shinigami_engine::utxo::{UTXO};
use shinigami_utils::bytecode::hex_to_bytecode;

// P2WSH with P2MS
Expand Down
3 changes: 1 addition & 2 deletions packages/tests/src/tests/test_transactions.cairo
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
use shinigami_engine::transaction::EngineInternalTransactionTrait;
use shinigami_engine::utxo::{UTXO};
use shinigami_engine::transaction::{UTXO, EngineInternalTransactionTrait};

use crate::validate;
use shinigami_utils::byte_array::u256_from_byte_array_with_offset;
Expand Down
3 changes: 1 addition & 2 deletions packages/tests/src/validate.cairo
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
use shinigami_engine::engine::EngineImpl;
use shinigami_engine::hash_cache::HashCacheImpl;
use shinigami_engine::transaction::EngineTransaction;
use shinigami_engine::transaction::{EngineTransaction, UTXO};
use shinigami_engine::opcodes::Opcode;
use shinigami_engine::utxo::{UTXO};

// TODO: Move validate coinbase here

Expand Down

0 comments on commit 05a6315

Please sign in to comment.