11use 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}
0 commit comments