Skip to content

Commit f476ae0

Browse files
committed
feat: rework import linker to syscall params
1 parent f127259 commit f476ae0

File tree

3 files changed

+226
-54
lines changed

3 files changed

+226
-54
lines changed

crates/runtime/src/runtime/strategy_runtime.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ impl StrategyRuntime {
3131

3232
pub fn execute(&mut self) -> Result<(), TrapCode> {
3333
self.strategy
34-
.execute(&mut self.store, self.entrypoint, &[], &mut [])
34+
.execute(&mut self.store, self.entrypoint, &[], &mut [], FuelConfig::default())
3535
}
3636

3737
pub fn resume(&mut self, exit_code: i32) -> Result<(), TrapCode> {

crates/types/src/block_fuel.rs

Lines changed: 223 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use crate::{SysFuncIdx, FUEL_DENOM_RATE};
2-
use rwasm::{instruction_set, InstructionSet, TrapCode, Value};
2+
use rwasm::{instruction_set, InstructionSet, SyscallFuelParams, TrapCode};
33

44
/// The maximum allowed value for the `x` parameter used in linear gas cost calculation
55
/// of builtins.
@@ -190,72 +190,244 @@ pub(crate) fn emit_fuel_procedure(sys_func_idx: SysFuncIdx) -> InstructionSet {
190190
}
191191
}
192192

193-
pub(crate) fn calculate_syscall_fuel(sys_func_idx: SysFuncIdx, params: &[Value]) -> u32 {
193+
pub(crate) fn calculate_syscall_fuel(sys_func_idx: SysFuncIdx) -> SyscallFuelParams {
194194
use SysFuncIdx::*;
195-
let linear_fuel = |param: u32, base_cost: u32, word_cost: u32| -> u32 {
196-
base_cost + word_cost * (param + 31) / 32
197-
};
198-
199195
match sys_func_idx {
200196
// input/output & state control (0x00)
201-
EXIT => 0,
202-
STATE => LOW_FUEL_COST,
203-
READ_INPUT => linear_fuel(params.get(1).and_then(|p| p.i32()).unwrap_or_default() as u32, COPY_BASE_FUEL_COST, COPY_WORD_FUEL_COST),
204-
INPUT_SIZE => LOW_FUEL_COST,
205-
WRITE_OUTPUT => linear_fuel(params.get(1).and_then(|p| p.i32()).unwrap_or_default() as u32, COPY_BASE_FUEL_COST, COPY_WORD_FUEL_COST),
206-
OUTPUT_SIZE => LOW_FUEL_COST,
207-
READ_OUTPUT => linear_fuel(params.get(1).and_then(|p| p.i32()).unwrap_or_default() as u32, COPY_BASE_FUEL_COST, COPY_WORD_FUEL_COST),
208-
EXEC => 0,
209-
RESUME => 0,
210-
FORWARD_OUTPUT => linear_fuel(params.get(1).and_then(|p| p.i32()).unwrap_or_default() as u32, COPY_BASE_FUEL_COST, COPY_WORD_FUEL_COST),
211-
CHARGE_FUEL_MANUALLY => 0,
212-
FUEL => LOW_FUEL_COST,
213-
DEBUG_LOG => linear_fuel(params.get(1).and_then(|p| p.i32()).unwrap_or_default() as u32, DEBUG_LOG_BASE_FUEL_COST, DEBUG_LOG_WORD_FUEL_COST),
214-
CHARGE_FUEL => CHARGE_FUEL_BASE_COST,
197+
EXIT => SyscallFuelParams {
198+
base_fuel: 0,
199+
param_index: 0,
200+
linear_fuel: 0,
201+
},
202+
STATE => SyscallFuelParams {
203+
base_fuel: LOW_FUEL_COST as u64,
204+
param_index: 0,
205+
linear_fuel: 0,
206+
},
207+
READ_INPUT => SyscallFuelParams {
208+
base_fuel: COPY_BASE_FUEL_COST as u64,
209+
param_index: 1,
210+
linear_fuel: COPY_WORD_FUEL_COST as u64,
211+
},
212+
INPUT_SIZE => SyscallFuelParams {
213+
base_fuel: LOW_FUEL_COST as u64,
214+
param_index: 0,
215+
linear_fuel: 0,
216+
},
217+
WRITE_OUTPUT => SyscallFuelParams {
218+
base_fuel: COPY_BASE_FUEL_COST as u64,
219+
param_index: 1,
220+
linear_fuel: COPY_WORD_FUEL_COST as u64,
221+
},
222+
OUTPUT_SIZE => SyscallFuelParams {
223+
base_fuel: LOW_FUEL_COST as u64,
224+
param_index: 0,
225+
linear_fuel: 0,
226+
},
227+
READ_OUTPUT => SyscallFuelParams {
228+
base_fuel: COPY_BASE_FUEL_COST as u64,
229+
param_index: 1,
230+
linear_fuel: COPY_WORD_FUEL_COST as u64,
231+
},
232+
EXEC => SyscallFuelParams {
233+
base_fuel: 0,
234+
param_index: 0,
235+
linear_fuel: 0,
236+
},
237+
RESUME => SyscallFuelParams {
238+
base_fuel: 0,
239+
param_index: 0,
240+
linear_fuel: 0,
241+
},
242+
FORWARD_OUTPUT => SyscallFuelParams {
243+
base_fuel: COPY_BASE_FUEL_COST as u64,
244+
param_index: 1,
245+
linear_fuel: COPY_WORD_FUEL_COST as u64,
246+
},
247+
CHARGE_FUEL_MANUALLY => SyscallFuelParams {
248+
base_fuel: 0,
249+
param_index: 0,
250+
linear_fuel: 0,
251+
},
252+
FUEL => SyscallFuelParams {
253+
base_fuel: LOW_FUEL_COST as u64,
254+
param_index: 0,
255+
linear_fuel: 0,
256+
},
257+
DEBUG_LOG => SyscallFuelParams {
258+
base_fuel: DEBUG_LOG_BASE_FUEL_COST as u64,
259+
param_index: 1,
260+
linear_fuel: DEBUG_LOG_WORD_FUEL_COST as u64,
261+
},
262+
CHARGE_FUEL => SyscallFuelParams {
263+
base_fuel: CHARGE_FUEL_BASE_COST as u64,
264+
param_index: 0,
265+
linear_fuel: 0,
266+
},
215267

216268
// hashing functions (0x01)
217-
KECCAK256 => linear_fuel(params.get(2).and_then(|p| p.i32()).unwrap_or_default() as u32, KECCAK_BASE_FUEL_COST, KECCAK_WORD_FUEL_COST),
218-
KECCAK256_PERMUTE => KECCAK_BASE_FUEL_COST,
219-
POSEIDON => linear_fuel(params.get(2).and_then(|p| p.i32()).unwrap_or_default() as u32, 100, 20),
220-
SHA256_EXTEND => SHA256_BASE_FUEL_COST,
221-
SHA256_COMPRESS => SHA256_BASE_FUEL_COST,
222-
SHA256 => linear_fuel(params.get(2).and_then(|p| p.i32()).unwrap_or_default() as u32, SHA256_BASE_FUEL_COST, SHA256_WORD_FUEL_COST),
223-
BLAKE3 => linear_fuel(params.get(2).and_then(|p| p.i32()).unwrap_or_default() as u32, BLAKE3_BASE_FUEL_COST, BLAKE3_WORD_FUEL_COST),
269+
KECCAK256 => SyscallFuelParams {
270+
base_fuel: KECCAK_BASE_FUEL_COST as u64,
271+
param_index: 2,
272+
linear_fuel: KECCAK_WORD_FUEL_COST as u64,
273+
},
274+
KECCAK256_PERMUTE => SyscallFuelParams {
275+
base_fuel: KECCAK_BASE_FUEL_COST as u64,
276+
param_index: 0,
277+
linear_fuel: 0,
278+
},
279+
POSEIDON => SyscallFuelParams {
280+
base_fuel: 100,
281+
param_index: 2,
282+
linear_fuel: 20,
283+
},
284+
SHA256_EXTEND => SyscallFuelParams {
285+
base_fuel: SHA256_BASE_FUEL_COST as u64,
286+
param_index: 0,
287+
linear_fuel: 0,
288+
},
289+
SHA256_COMPRESS => SyscallFuelParams {
290+
base_fuel: SHA256_BASE_FUEL_COST as u64,
291+
param_index: 0,
292+
linear_fuel: 0,
293+
},
294+
SHA256 => SyscallFuelParams {
295+
base_fuel: SHA256_BASE_FUEL_COST as u64,
296+
param_index: 2,
297+
linear_fuel: SHA256_WORD_FUEL_COST as u64,
298+
},
299+
BLAKE3 => SyscallFuelParams {
300+
base_fuel: BLAKE3_BASE_FUEL_COST as u64,
301+
param_index: 2,
302+
linear_fuel: BLAKE3_WORD_FUEL_COST as u64,
303+
},
224304

225305
// ed25519 (0x02)
226-
ED25519_DECOMPRESS => ED25519_DECOMPRESS_COST,
227-
ED25519_ADD => ED25519_ADD_COST,
306+
ED25519_DECOMPRESS => SyscallFuelParams {
307+
base_fuel: ED25519_DECOMPRESS_COST as u64,
308+
param_index: 0,
309+
linear_fuel: 0,
310+
},
311+
ED25519_ADD => SyscallFuelParams {
312+
base_fuel: ED25519_ADD_COST as u64,
313+
param_index: 0,
314+
linear_fuel: 0,
315+
},
228316

229317
// fp1/fp2 tower field (0x03)
230-
TOWER_FP1_BN254_ADD | TOWER_FP1_BN254_SUB => FP1_ADD_COST,
231-
TOWER_FP1_BN254_MUL => FP1_MUL_COST,
232-
TOWER_FP1_BLS12381_ADD | TOWER_FP1_BLS12381_SUB => FP1_BLS_ADD_COST,
233-
TOWER_FP1_BLS12381_MUL => FP1_BLS_MUL_COST,
234-
TOWER_FP2_BN254_ADD | TOWER_FP2_BN254_SUB => FP2_ADD_COST,
235-
TOWER_FP2_BN254_MUL => FP2_MUL_COST,
236-
TOWER_FP2_BLS12381_ADD | TOWER_FP2_BLS12381_SUB => FP2_BLS_ADD_COST,
237-
TOWER_FP2_BLS12381_MUL => FP2_BLS_MUL_COST,
318+
TOWER_FP1_BN254_ADD | TOWER_FP1_BN254_SUB => SyscallFuelParams {
319+
base_fuel: FP1_ADD_COST as u64,
320+
param_index: 0,
321+
linear_fuel: 0,
322+
},
323+
TOWER_FP1_BN254_MUL => SyscallFuelParams {
324+
base_fuel: FP1_MUL_COST as u64,
325+
param_index: 0,
326+
linear_fuel: 0,
327+
},
328+
TOWER_FP1_BLS12381_ADD | TOWER_FP1_BLS12381_SUB => SyscallFuelParams {
329+
base_fuel: FP1_BLS_ADD_COST as u64,
330+
param_index: 0,
331+
linear_fuel: 0,
332+
},
333+
TOWER_FP1_BLS12381_MUL => SyscallFuelParams {
334+
base_fuel: FP1_BLS_MUL_COST as u64,
335+
param_index: 0,
336+
linear_fuel: 0,
337+
},
338+
TOWER_FP2_BN254_ADD | TOWER_FP2_BN254_SUB => SyscallFuelParams {
339+
base_fuel: FP2_ADD_COST as u64,
340+
param_index: 0,
341+
linear_fuel: 0,
342+
},
343+
TOWER_FP2_BN254_MUL => SyscallFuelParams {
344+
base_fuel: FP2_MUL_COST as u64,
345+
param_index: 0,
346+
linear_fuel: 0,
347+
},
348+
TOWER_FP2_BLS12381_ADD | TOWER_FP2_BLS12381_SUB => SyscallFuelParams {
349+
base_fuel: FP2_BLS_ADD_COST as u64,
350+
param_index: 0,
351+
linear_fuel: 0,
352+
},
353+
TOWER_FP2_BLS12381_MUL => SyscallFuelParams {
354+
base_fuel: FP2_BLS_MUL_COST as u64,
355+
param_index: 0,
356+
linear_fuel: 0,
357+
},
238358

239359
// secp256k1 (0x04)
240-
SECP256K1_ADD => SECP256K1_ADD_COST,
241-
SECP256K1_DECOMPRESS => SECP256K1_DECOMPRESS_COST,
242-
SECP256K1_DOUBLE => SECP256K1_DOUBLE_COST,
360+
SECP256K1_ADD => SyscallFuelParams {
361+
base_fuel: SECP256K1_ADD_COST as u64,
362+
param_index: 0,
363+
linear_fuel: 0,
364+
},
365+
SECP256K1_DECOMPRESS => SyscallFuelParams {
366+
base_fuel: SECP256K1_DECOMPRESS_COST as u64,
367+
param_index: 0,
368+
linear_fuel: 0,
369+
},
370+
SECP256K1_DOUBLE => SyscallFuelParams {
371+
base_fuel: SECP256K1_DOUBLE_COST as u64,
372+
param_index: 0,
373+
linear_fuel: 0,
374+
},
243375

244376
// bls12381 (0x06)
245-
BLS12381_ADD => BLS_G1_ADD_COST,
246-
// BLS12381_G2_ADD => BLS_G2_ADD_COST,
247-
// BLS12381_PAIRING => BLS_PAIRING_COST,
248-
// BLS12381_MAP_G1 => BLS_MAP_G1_COST,
249-
// BLS12381_MAP_G2 => BLS_MAP_G2_COST,
377+
BLS12381_ADD => SyscallFuelParams {
378+
base_fuel: BLS_G1_ADD_COST as u64,
379+
param_index: 0,
380+
linear_fuel: 0,
381+
},
382+
// BLS12381_G2_ADD => SyscallFuelParams {
383+
// base_fuel: BLS_G2_ADD_COST as u64,
384+
// param_index: 0,
385+
// linear_fuel: 0,
386+
// },
387+
// BLS12381_PAIRING => SyscallFuelParams {
388+
// base_fuel: BLS_PAIRING_COST as u64,
389+
// param_index: 0,
390+
// linear_fuel: 0,
391+
// },
392+
// BLS12381_MAP_G1 => SyscallFuelParams {
393+
// base_fuel: BLS_MAP_G1_COST as u64,
394+
// param_index: 0,
395+
// linear_fuel: 0,
396+
// },
397+
// BLS12381_MAP_G2 => SyscallFuelParams {
398+
// base_fuel: BLS_MAP_G2_COST as u64,
399+
// param_index: 0,
400+
// linear_fuel: 0,
401+
// },
250402

251403
// bn254 (0x07)
252-
BN254_ADD => BN254_ADD_COST,
253-
BN254_DOUBLE => BN254_DOUBLE_COST,
404+
BN254_ADD => SyscallFuelParams {
405+
base_fuel: BN254_ADD_COST as u64,
406+
param_index: 0,
407+
linear_fuel: 0,
408+
},
409+
BN254_DOUBLE => SyscallFuelParams {
410+
base_fuel: BN254_DOUBLE_COST as u64,
411+
param_index: 0,
412+
linear_fuel: 0,
413+
},
254414

255415
// uint256 (0x08)
256-
UINT256_MUL_MOD => UINT256_MUL_MOD_COST,
257-
UINT256_X2048_MUL => UINT256_X2048_MUL_COST,
258-
259-
_ => 0,
416+
UINT256_MUL_MOD => SyscallFuelParams {
417+
base_fuel: UINT256_MUL_MOD_COST as u64,
418+
param_index: 0,
419+
linear_fuel: 0,
420+
},
421+
UINT256_X2048_MUL => SyscallFuelParams {
422+
base_fuel: UINT256_X2048_MUL_COST as u64,
423+
param_index: 0,
424+
linear_fuel: 0,
425+
},
426+
427+
_ => SyscallFuelParams {
428+
base_fuel: 0,
429+
param_index: 0,
430+
linear_fuel: 0,
431+
},
260432
}
261433
}

crates/types/src/import_linker.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::{emit_fuel_procedure, SysFuncIdx};
1+
use crate::{calculate_syscall_fuel, SysFuncIdx};
22
use alloc::sync::Arc;
33
use rwasm::{ImportLinker, ImportName, ValType};
44

@@ -10,7 +10,7 @@ pub fn import_linker_v1_preview() -> Arc<ImportLinker> {
1010
import_linker.insert_function(
1111
ImportName::new("fluentbase_v1preview", $func_name),
1212
SysFuncIdx::$sys_func_idx as u32,
13-
emit_fuel_procedure(SysFuncIdx::$sys_func_idx),
13+
calculate_syscall_fuel(SysFuncIdx::$sys_func_idx),
1414
$params,
1515
$results,
1616
);

0 commit comments

Comments
 (0)