Skip to content

Commit 4662816

Browse files
committed
cost gas for calling imported fn
1 parent 6d8d1c9 commit 4662816

File tree

2 files changed

+27
-15
lines changed

2 files changed

+27
-15
lines changed

packages/vm/src/imports.rs

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -12,20 +12,22 @@ fn require_mem_range(max_range: usize, require_range: usize) -> Result<(), Error
1212
Ok(())
1313
}
1414

15-
fn do_gas<A, Q>(_env: &Environment<A, Q>, _gas: u32) -> Result<(), Error>
15+
fn do_gas<A, Q>(env: &Environment<A, Q>, _gas: u32) -> Result<(), Error>
1616
where
1717
A: BackendApi + 'static,
1818
Q: Querier + 'static,
1919
{
20+
env.decrease_gas_left(750_000_000)?;
2021
Ok(())
2122
}
2223

23-
fn do_get_span_size<A, Q>(env: &Environment<A, Q>) -> i64
24+
fn do_get_span_size<A, Q>(env: &Environment<A, Q>) -> Result<i64, Error>
2425
where
2526
A: BackendApi + 'static,
2627
Q: Querier + 'static,
2728
{
28-
env.with_querier_from_context(|querier| querier.get_span_size())
29+
env.decrease_gas_left(750_000_000)?;
30+
Ok(env.with_querier_from_context(|querier| querier.get_span_size()))
2931
}
3032

3133
fn do_read_calldata<A, Q>(env: &Environment<A, Q>, ptr: i64) -> Result<i64, Error>
@@ -40,6 +42,7 @@ where
4042
require_mem_range(memory.size().bytes().0, (ptr + span_size) as usize)?;
4143

4244
let data = querier.get_calldata()?;
45+
env.decrease_gas_left(3_000_000_000 + (data.len() as u64) * 30_000_000)?;
4346

4447
for (idx, byte) in data.iter().enumerate() {
4548
memory.view()[ptr as usize + idx].set(*byte);
@@ -60,6 +63,7 @@ where
6063
if len > span_size {
6164
return Err(Error::SpanTooSmallError);
6265
}
66+
env.decrease_gas_left(1_500_000_000 + (len as u64) * 50_000_000)?;
6367

6468
let memory = env.memory()?;
6569
require_mem_range(memory.size().bytes().0, (ptr + span_size) as usize)?;
@@ -72,35 +76,39 @@ where
7276
})
7377
}
7478

75-
fn do_get_ask_count<A, Q>(env: &Environment<A, Q>) -> i64
79+
fn do_get_ask_count<A, Q>(env: &Environment<A, Q>) -> Result<i64, Error>
7680
where
7781
A: BackendApi + 'static,
7882
Q: Querier + 'static,
7983
{
80-
env.with_querier_from_context(|querier| querier.get_ask_count())
84+
env.decrease_gas_left(750_000_000)?;
85+
Ok(env.with_querier_from_context(|querier| querier.get_ask_count()))
8186
}
8287

83-
fn do_get_min_count<A, Q>(env: &Environment<A, Q>) -> i64
88+
fn do_get_min_count<A, Q>(env: &Environment<A, Q>) -> Result<i64, Error>
8489
where
8590
A: BackendApi + 'static,
8691
Q: Querier + 'static,
8792
{
88-
env.with_querier_from_context(|querier| querier.get_min_count())
93+
env.decrease_gas_left(750_000_000)?;
94+
Ok(env.with_querier_from_context(|querier| querier.get_min_count()))
8995
}
9096

91-
fn do_get_prepare_time<A, Q>(env: &Environment<A, Q>) -> i64
97+
fn do_get_prepare_time<A, Q>(env: &Environment<A, Q>) -> Result<i64, Error>
9298
where
9399
A: BackendApi + 'static,
94100
Q: Querier + 'static,
95101
{
96-
env.with_querier_from_context(|querier| querier.get_prepare_time())
102+
env.decrease_gas_left(750_000_000)?;
103+
Ok(env.with_querier_from_context(|querier| querier.get_prepare_time()))
97104
}
98105

99106
fn do_get_execute_time<A, Q>(env: &Environment<A, Q>) -> Result<i64, Error>
100107
where
101108
A: BackendApi + 'static,
102109
Q: Querier + 'static,
103110
{
111+
env.decrease_gas_left(750_000_000)?;
104112
env.with_querier_from_context(|querier| querier.get_execute_time())
105113
}
106114

@@ -109,6 +117,7 @@ where
109117
A: BackendApi + 'static,
110118
Q: Querier + 'static,
111119
{
120+
env.decrease_gas_left(750_000_000)?;
112121
env.with_querier_from_context(|querier| querier.get_ans_count())
113122
}
114123

@@ -129,6 +138,7 @@ where
129138
if len > span_size {
130139
return Err(Error::SpanTooSmallError);
131140
}
141+
env.decrease_gas_left(1_500_000_000 + (len as u64) * 50_000_000)?;
132142

133143
let memory = env.memory()?;
134144
require_mem_range(memory.size().bytes().0, (ptr + span_size) as usize)?;
@@ -150,6 +160,7 @@ where
150160
A: BackendApi + 'static,
151161
Q: Querier + 'static,
152162
{
163+
env.decrease_gas_left(750_000_000)?;
153164
env.with_querier_from_context(|querier| querier.get_external_data_status(eid, vid))
154165
}
155166

@@ -170,6 +181,7 @@ where
170181
require_mem_range(memory.size().bytes().0, (ptr + span_size) as usize)?;
171182

172183
let data = querier.get_external_data(eid, vid)?;
184+
env.decrease_gas_left(3_000_000_000 + (data.len() as u64) * 60_000_000)?;
173185

174186
for (idx, byte) in data.iter().enumerate() {
175187
memory.view()[ptr as usize + idx].set(*byte);
@@ -203,7 +215,7 @@ where
203215
Q: Querier + 'static,
204216
{
205217
// consume gas relatively to the function running time (~12ms)
206-
env.decrease_gas_left(3_500_000_000_000)?;
218+
env.decrease_gas_left(7_500_000_000_000)?;
207219
let y: Vec<u8> = get_from_mem(env, y_ptr, y_len)?;
208220
let pi: Vec<u8> = get_from_mem(env, pi_ptr, pi_len)?;
209221
let alpha: Vec<u8> = get_from_mem(env, alpha_ptr, alpha_len)?;
@@ -470,7 +482,7 @@ mod test {
470482
owasm_env.set_wasmer_instance(Some(instance_ptr));
471483
owasm_env.set_gas_left(gas_limit);
472484

473-
assert_eq!(300, do_get_span_size(&owasm_env));
485+
assert_eq!(300, do_get_span_size(&owasm_env).unwrap());
474486
}
475487

476488
#[test]
@@ -503,7 +515,7 @@ mod test {
503515
owasm_env.set_wasmer_instance(Some(instance_ptr));
504516
owasm_env.set_gas_left(gas_limit);
505517

506-
assert_eq!(10, do_get_ask_count(&owasm_env));
518+
assert_eq!(10, do_get_ask_count(&owasm_env).unwrap());
507519
}
508520

509521
#[test]
@@ -514,7 +526,7 @@ mod test {
514526
owasm_env.set_wasmer_instance(Some(instance_ptr));
515527
owasm_env.set_gas_left(gas_limit);
516528

517-
assert_eq!(8, do_get_min_count(&owasm_env));
529+
assert_eq!(8, do_get_min_count(&owasm_env).unwrap());
518530
}
519531

520532
#[test]
@@ -525,7 +537,7 @@ mod test {
525537
owasm_env.set_wasmer_instance(Some(instance_ptr));
526538
owasm_env.set_gas_left(gas_limit);
527539

528-
assert_eq!(100_000, do_get_prepare_time(&owasm_env));
540+
assert_eq!(100_000, do_get_prepare_time(&owasm_env).unwrap());
529541
}
530542

531543
#[test]

packages/vm/src/store.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ fn cost(operator: &Operator) -> u64 {
1818
| Operator::CallIndirect { .. } // function call - branch source
1919
| Operator::Return // end of function - branch source
2020
=> { return 2_500_000 }
21-
_ => { return 625_000 }
21+
_ => { return 650_000 }
2222
}
2323
}
2424

0 commit comments

Comments
 (0)