Skip to content

Commit f127259

Browse files
committed
feat: add calculate_syscall_fuel function
1 parent 087966d commit f127259

File tree

1 file changed

+71
-1
lines changed

1 file changed

+71
-1
lines changed

crates/types/src/block_fuel.rs

Lines changed: 71 additions & 1 deletion
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};
2+
use rwasm::{instruction_set, InstructionSet, TrapCode, Value};
33

44
/// The maximum allowed value for the `x` parameter used in linear gas cost calculation
55
/// of builtins.
@@ -189,3 +189,73 @@ pub(crate) fn emit_fuel_procedure(sys_func_idx: SysFuncIdx) -> InstructionSet {
189189
_ => no_fuel!(),
190190
}
191191
}
192+
193+
pub(crate) fn calculate_syscall_fuel(sys_func_idx: SysFuncIdx, params: &[Value]) -> u32 {
194+
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+
199+
match sys_func_idx {
200+
// 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,
215+
216+
// 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),
224+
225+
// ed25519 (0x02)
226+
ED25519_DECOMPRESS => ED25519_DECOMPRESS_COST,
227+
ED25519_ADD => ED25519_ADD_COST,
228+
229+
// 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,
238+
239+
// secp256k1 (0x04)
240+
SECP256K1_ADD => SECP256K1_ADD_COST,
241+
SECP256K1_DECOMPRESS => SECP256K1_DECOMPRESS_COST,
242+
SECP256K1_DOUBLE => SECP256K1_DOUBLE_COST,
243+
244+
// 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,
250+
251+
// bn254 (0x07)
252+
BN254_ADD => BN254_ADD_COST,
253+
BN254_DOUBLE => BN254_DOUBLE_COST,
254+
255+
// uint256 (0x08)
256+
UINT256_MUL_MOD => UINT256_MUL_MOD_COST,
257+
UINT256_X2048_MUL => UINT256_X2048_MUL_COST,
258+
259+
_ => 0,
260+
}
261+
}

0 commit comments

Comments
 (0)