@@ -6,9 +6,8 @@ use crate::{
6
6
syscalls:: generator:: generate_ckb_syscalls,
7
7
type_id:: TypeIdSystemScript ,
8
8
types:: {
9
- CoreMachine , DebugContext , DebugPrinter , FullSuspendedState , RunMode , ScriptGroup ,
10
- ScriptGroupType , ScriptVersion , SgData , SyscallGenerator , TransactionState , TxData ,
11
- VerifyResult , VmContext , VmId ,
9
+ DebugPrinter , FullSuspendedState , RunMode , ScriptGroup , ScriptGroupType , ScriptVersion ,
10
+ SgData , SyscallGenerator , TransactionState , TxData , VerifyResult ,
12
11
} ,
13
12
verify_env:: TxVerifyEnv ,
14
13
} ;
@@ -23,19 +22,16 @@ use ckb_types::{
23
22
packed:: { Byte32 , Script } ,
24
23
prelude:: * ,
25
24
} ;
25
+ use ckb_vm:: Error as VMInternalError ;
26
26
#[ cfg( not( target_family = "wasm" ) ) ]
27
27
use ckb_vm:: machine:: Pause as VMPause ;
28
- use ckb_vm:: { Error as VMInternalError , Syscalls } ;
29
28
use std:: sync:: Arc ;
30
29
#[ cfg( not( target_family = "wasm" ) ) ]
31
30
use tokio:: sync:: {
32
31
oneshot,
33
32
watch:: { self , Receiver } ,
34
33
} ;
35
34
36
- #[ cfg( test) ]
37
- use core:: sync:: atomic:: { AtomicBool , Ordering } ;
38
-
39
35
#[ cfg( test) ]
40
36
mod tests;
41
37
@@ -56,33 +52,23 @@ impl ChunkState {
56
52
}
57
53
58
54
/// This struct leverages CKB VM to verify transaction inputs.
59
- pub struct TransactionScriptsVerifier < DL : CellDataProvider > {
55
+ pub struct TransactionScriptsVerifier < DL : CellDataProvider , V > {
60
56
tx_data : Arc < TxData < DL > > ,
61
-
62
- debug_printer : DebugPrinter ,
63
- syscall_generator : SyscallGenerator < DL > ,
64
- #[ cfg( test) ]
65
- skip_pause : Arc < AtomicBool > ,
57
+ syscall_generator : SyscallGenerator < DL , V > ,
58
+ syscall_context : V ,
66
59
}
67
60
68
- impl < DL > TransactionScriptsVerifier < DL >
61
+ impl < DL > TransactionScriptsVerifier < DL , DebugPrinter >
69
62
where
70
63
DL : CellDataProvider + HeaderProvider + ExtensionProvider + Send + Sync + Clone + ' static ,
71
64
{
72
- /// Creates a script verifier for the transaction.
73
- ///
74
- /// ## Params
75
- ///
76
- /// * `rtx` - transaction which cell out points have been resolved.
77
- /// * `data_loader` - used to load cell data.
65
+ /// Create a script verifier using default CKB syscalls and a default debug printer
78
66
pub fn new (
79
67
rtx : Arc < ResolvedTransaction > ,
80
68
data_loader : DL ,
81
69
consensus : Arc < Consensus > ,
82
70
tx_env : Arc < TxVerifyEnv > ,
83
- ) -> TransactionScriptsVerifier < DL > {
84
- let tx_data = Arc :: new ( TxData :: new ( rtx, data_loader, consensus, tx_env) ) ;
85
-
71
+ ) -> Self {
86
72
let debug_printer: DebugPrinter = Arc :: new (
87
73
#[ allow( unused_variables) ]
88
74
|hash : & Byte32 , message : & str | {
@@ -91,50 +77,58 @@ where
91
77
} ,
92
78
) ;
93
79
94
- # [ cfg ( test ) ]
95
- let skip_pause = Arc :: new ( AtomicBool :: new ( false ) ) ;
80
+ Self :: new_with_debug_printer ( rtx , data_loader , consensus , tx_env , debug_printer )
81
+ }
96
82
97
- TransactionScriptsVerifier {
98
- tx_data,
83
+ /// Create a script verifier using default CKB syscalls and a custom debug printer
84
+ pub fn new_with_debug_printer (
85
+ rtx : Arc < ResolvedTransaction > ,
86
+ data_loader : DL ,
87
+ consensus : Arc < Consensus > ,
88
+ tx_env : Arc < TxVerifyEnv > ,
89
+ debug_printer : DebugPrinter ,
90
+ ) -> Self {
91
+ Self :: new_with_generator (
92
+ rtx,
93
+ data_loader,
94
+ consensus,
95
+ tx_env,
96
+ generate_ckb_syscalls,
99
97
debug_printer,
100
- syscall_generator : Arc :: new ( generate_ckb_syscalls) ,
101
- #[ cfg( test) ]
102
- skip_pause,
103
- }
98
+ )
104
99
}
100
+ }
105
101
106
- /// Sets a callback to handle the debug syscall.
107
- ///
108
- ///
109
- /// Script can print a message using the [debug syscall](github.com/nervosnetwork/rfcs/blob/master/rfcs/0009-vm-syscalls/0009-vm-syscalls.md#debug).
102
+ impl < DL , V > TransactionScriptsVerifier < DL , V >
103
+ where
104
+ DL : CellDataProvider + HeaderProvider + ExtensionProvider + Send + Sync + Clone + ' static ,
105
+ V : Send + Clone + ' static ,
106
+ {
107
+ /// Creates a script verifier for the transaction.
110
108
///
111
- /// The callback receives two parameters:
109
+ /// ## Params
112
110
///
113
- /// * `hash: &Byte32`: this is the script hash of currently running script group.
114
- /// * `message: &str`: message passed to the debug syscall.
115
- pub fn set_debug_printer < F : Fn ( & Byte32 , & str ) + Sync + Send + ' static > ( & mut self , func : F ) {
116
- self . debug_printer = Arc :: new ( func) ;
117
- }
118
-
119
- /// Sets a new syscall generator for special usages
120
- pub fn set_syscall_generator < F > ( & mut self , func : F )
121
- where
122
- F : Fn (
123
- & VmId ,
124
- & SgData < DL > ,
125
- & VmContext < DL > ,
126
- & DebugContext ,
127
- ) -> Vec < Box < ( dyn Syscalls < CoreMachine > ) > >
128
- + Sync
129
- + Send
130
- + ' static ,
131
- {
132
- self . syscall_generator = Arc :: new ( func) ;
133
- }
111
+ /// * `rtx` - transaction which cell out points have been resolved.
112
+ /// * `data_loader` - used to load cell data.
113
+ /// * `consensus` - consensus parameters.
114
+ /// * `tx_env` - enviroment for verifying transaction, such as committed block, etc.
115
+ /// * `syscall_generator` - a syscall generator for current verifier
116
+ /// * `syscall_context` - context for syscall generator
117
+ pub fn new_with_generator (
118
+ rtx : Arc < ResolvedTransaction > ,
119
+ data_loader : DL ,
120
+ consensus : Arc < Consensus > ,
121
+ tx_env : Arc < TxVerifyEnv > ,
122
+ syscall_generator : SyscallGenerator < DL , V > ,
123
+ syscall_context : V ,
124
+ ) -> TransactionScriptsVerifier < DL , V > {
125
+ let tx_data = Arc :: new ( TxData :: new ( rtx, data_loader, consensus, tx_env) ) ;
134
126
135
- #[ cfg( test) ]
136
- pub ( crate ) fn set_skip_pause ( & self , skip_pause : bool ) {
137
- self . skip_pause . store ( skip_pause, Ordering :: SeqCst ) ;
127
+ TransactionScriptsVerifier {
128
+ tx_data,
129
+ syscall_generator,
130
+ syscall_context,
131
+ }
138
132
}
139
133
140
134
//////////////////////////////////////////////////////////////////
@@ -570,17 +564,12 @@ where
570
564
pub fn create_scheduler (
571
565
& self ,
572
566
script_group : & ScriptGroup ,
573
- ) -> Result < Scheduler < DL > , ScriptError > {
567
+ ) -> Result < Scheduler < DL , V > , ScriptError > {
574
568
let sg_data = SgData :: new ( & self . tx_data , script_group) ?;
575
- let debug_context = DebugContext {
576
- debug_printer : Arc :: clone ( & self . debug_printer ) ,
577
- #[ cfg( test) ]
578
- skip_pause : Arc :: clone ( & self . skip_pause ) ,
579
- } ;
580
569
Ok ( Scheduler :: new (
581
570
sg_data,
582
- debug_context ,
583
- Arc :: clone ( & self . syscall_generator ) ,
571
+ self . syscall_generator ,
572
+ self . syscall_context . clone ( ) ,
584
573
) )
585
574
}
586
575
@@ -589,17 +578,12 @@ where
589
578
& self ,
590
579
script_group : & ScriptGroup ,
591
580
state : & FullSuspendedState ,
592
- ) -> Result < Scheduler < DL > , ScriptError > {
581
+ ) -> Result < Scheduler < DL , V > , ScriptError > {
593
582
let sg_data = SgData :: new ( & self . tx_data , script_group) ?;
594
- let debug_context = DebugContext {
595
- debug_printer : Arc :: clone ( & self . debug_printer ) ,
596
- #[ cfg( test) ]
597
- skip_pause : Arc :: clone ( & self . skip_pause ) ,
598
- } ;
599
583
Ok ( Scheduler :: resume (
600
584
sg_data,
601
- debug_context ,
602
- Arc :: clone ( & self . syscall_generator ) ,
585
+ self . syscall_generator ,
586
+ self . syscall_context . clone ( ) ,
603
587
state. clone ( ) ,
604
588
) )
605
589
}
0 commit comments