@@ -21,6 +21,7 @@ pub enum MyOperator {
21
21
Equal ,
22
22
Hash160 ,
23
23
Sha256 ,
24
+ CheckSig ,
24
25
CheckMultiSig ,
25
26
CheckTimeLock ,
26
27
/// Stop script execution if top-most element of stack is not "true"
@@ -75,6 +76,14 @@ fn sha_256_operator(stack: &mut Stack<MyValue>) {
75
76
}
76
77
}
77
78
79
+ fn check_sig_operator ( stack : & mut Stack < MyValue > ) {
80
+ let pkh = stack. pop ( ) ;
81
+ let keyed_signature = stack. pop ( ) ;
82
+ // CheckSig operator is validated as a 1-of-1 multisig
83
+ let res = check_multi_sig ( vec ! [ pkh] , vec ! [ keyed_signature] ) ;
84
+ stack. push ( MyValue :: Boolean ( res) ) ;
85
+ }
86
+
78
87
fn check_multisig_operator ( stack : & mut Stack < MyValue > ) {
79
88
let m = stack. pop ( ) ;
80
89
match m {
@@ -202,6 +211,7 @@ fn my_operator_system(
202
211
MyOperator :: Equal => equal_operator ( stack) ,
203
212
MyOperator :: Hash160 => hash_160_operator ( stack) ,
204
213
MyOperator :: Sha256 => sha_256_operator ( stack) ,
214
+ MyOperator :: CheckSig => check_sig_operator ( stack) ,
205
215
MyOperator :: CheckMultiSig => check_multisig_operator ( stack) ,
206
216
MyOperator :: CheckTimeLock => check_timelock_operator ( stack, context. block_timestamp ) ,
207
217
MyOperator :: Verify => {
@@ -632,6 +642,40 @@ mod tests {
632
642
public_key : pk,
633
643
}
634
644
}
645
+
646
+ #[ test]
647
+ fn test_check_sig ( ) {
648
+ let pk_1 = PublicKey :: from_bytes ( [ 1 ; 33 ] ) ;
649
+ let pk_2 = PublicKey :: from_bytes ( [ 2 ; 33 ] ) ;
650
+
651
+ let ks_1 = ks_from_pk ( pk_1. clone ( ) ) ;
652
+ let ks_2 = ks_from_pk ( pk_2. clone ( ) ) ;
653
+
654
+ let witness = vec ! [ Item :: Value ( MyValue :: Signature ( ks_1. to_pb_bytes( ) . unwrap( ) ) ) ] ;
655
+ let redeem_script = vec ! [
656
+ Item :: Value ( MyValue :: Bytes ( pk_1. pkh( ) . bytes( ) . to_vec( ) ) ) ,
657
+ Item :: Operator ( MyOperator :: CheckSig ) ,
658
+ ] ;
659
+ assert ! ( execute_redeem_script(
660
+ & encode( witness) . unwrap( ) ,
661
+ & encode( redeem_script) . unwrap( ) ,
662
+ & ScriptContext :: default ( ) ,
663
+ )
664
+ . unwrap( ) ) ;
665
+
666
+ let invalid_witness = vec ! [ Item :: Value ( MyValue :: Signature ( ks_2. to_pb_bytes( ) . unwrap( ) ) ) ] ;
667
+ let redeem_script = vec ! [
668
+ Item :: Value ( MyValue :: Bytes ( pk_1. pkh( ) . bytes( ) . to_vec( ) ) ) ,
669
+ Item :: Operator ( MyOperator :: CheckSig ) ,
670
+ ] ;
671
+ assert ! ( !execute_redeem_script(
672
+ & encode( invalid_witness) . unwrap( ) ,
673
+ & encode( redeem_script) . unwrap( ) ,
674
+ & ScriptContext :: default ( ) ,
675
+ )
676
+ . unwrap( ) ) ;
677
+ }
678
+
635
679
#[ test]
636
680
fn test_check_multisig ( ) {
637
681
let pk_1 = PublicKey :: from_bytes ( [ 1 ; 33 ] ) ;
0 commit comments