@@ -9,7 +9,7 @@ use wasmi::memory_units::Pages;
9
9
use wasmi:: {
10
10
Error as InterpreterError , Externals , FuncInstance , FuncRef , ImportsBuilder , MemoryInstance ,
11
11
MemoryRef , Module , ModuleImportResolver , ModuleInstance , NopExternals , RuntimeArgs ,
12
- RuntimeValue , Signature , Trap , ValueType ,
12
+ RuntimeValue , Signature , Trap , TrapKind , ValueType ,
13
13
} ;
14
14
15
15
mod types;
@@ -20,8 +20,10 @@ const BLOCKDATASIZE_FUNC_INDEX: usize = 1;
20
20
const BLOCKDATACOPY_FUNC_INDEX : usize = 2 ;
21
21
const SAVEPOSTSTATEROOT_FUNC_INDEX : usize = 3 ;
22
22
const PUSHNEWDEPOSIT_FUNC_INDEX : usize = 4 ;
23
+ const USETICKS_FUNC_INDEX : usize = 5 ;
23
24
24
25
struct Runtime < ' a > {
26
+ ticks_left : u32 ,
25
27
memory : Option < MemoryRef > ,
26
28
pre_state : & ' a Bytes32 ,
27
29
block_data : & ' a ShardBlockBody ,
@@ -35,6 +37,7 @@ impl<'a> Runtime<'a> {
35
37
memory : Option < MemoryRef > ,
36
38
) -> Runtime < ' a > {
37
39
Runtime {
40
+ ticks_left : 10_000_000 , // FIXME: make this configurable
38
41
memory : if memory. is_some ( ) {
39
42
memory
40
43
} else {
@@ -59,6 +62,15 @@ impl<'a> Externals for Runtime<'a> {
59
62
args : RuntimeArgs ,
60
63
) -> Result < Option < RuntimeValue > , Trap > {
61
64
match index {
65
+ USETICKS_FUNC_INDEX => {
66
+ let ticks: u32 = args. nth ( 0 ) ;
67
+ if self . ticks_left < ticks {
68
+ // FIXME: use TrapKind::Host
69
+ return Err ( Trap :: new ( TrapKind :: Unreachable ) ) ;
70
+ }
71
+ self . ticks_left -= ticks;
72
+ Ok ( None )
73
+ }
62
74
LOADPRESTATEROOT_FUNC_INDEX => {
63
75
let ptr: u32 = args. nth ( 0 ) ;
64
76
println ! ( "loadprestateroot to {}" , ptr) ;
@@ -124,6 +136,10 @@ impl<'a> ModuleImportResolver for RuntimeModuleImportResolver {
124
136
_signature : & Signature ,
125
137
) -> Result < FuncRef , InterpreterError > {
126
138
let func_ref = match field_name {
139
+ "eth2_useTicks" => FuncInstance :: alloc_host (
140
+ Signature :: new ( & [ ValueType :: I32 ] [ ..] , None ) ,
141
+ USETICKS_FUNC_INDEX ,
142
+ ) ,
127
143
"eth2_loadPreStateRoot" => FuncInstance :: alloc_host (
128
144
Signature :: new ( & [ ValueType :: I32 ] [ ..] , None ) ,
129
145
LOADPRESTATEROOT_FUNC_INDEX ,
0 commit comments