System Builtins
A collection of system functions provides access to low-level operations, serving both our VM runtime and our circuit definitions. Each system function is replaced with a specialized ZK-gadget to speed up the proving process. These functions can include hashing algorithms, I/O operations, and nested call functions.
WARNING: The system functions API/ABI are still under development and may change in the future.
#![allow(unused)] fn main() { #[link(wasm_import_module = "fluentbase_v1preview")] extern "C" { /// Functions that provide access to crypto elements, right now we support following: /// - Keccak256 /// - Poseidon (two modes, message hash and two elements hash) /// - Ecrecover pub fn _keccak256(data_offset: *const u8, data_len: u32, output32_offset: *mut u8); pub fn _poseidon(data_offset: *const u8, data_len: u32, output32_offset: *mut u8); pub fn _poseidon_hash( fa32_offset: *const u8, fb32_offset: *const u8, fd32_offset: *const u8, output32_offset: *mut u8, ); pub fn _ecrecover( digest32_offset: *const u8, sig64_offset: *const u8, output65_offset: *mut u8, rec_id: u32, ); /// Basic system methods that are available for every app (shared and sovereign) pub fn _exit(code: i32) -> !; pub fn _write(offset: *const u8, length: u32); pub fn _input_size() -> u32; pub fn _read(target: *mut u8, offset: u32, length: u32); pub fn _output_size() -> u32; pub fn _read_output(target: *mut u8, offset: u32, length: u32); pub fn _forward_output(offset: u32, len: u32); pub fn _state() -> u32; pub fn _read_context(target_ptr: *mut u8, offset: u32, length: u32); /// Executes a nested call with specified bytecode poseidon hash. /// /// # Parameters /// - `hash32_ptr`: A pointer to a 254-bit poseidon hash of a contract to be called. /// - `input_ptr`: A pointer to the input data (const u8). /// - `input_len`: The length of the input data (u32). /// - `fuel_ptr`: A mutable pointer to a fuel value (u64), consumed fuel is stored in the same /// pointer after execution. /// - `state`: A state value (u32), used internally to maintain function state. /// /// Fuel ptr can be set to zero if you want to delegate all remaining gas. /// In this case sender won't get consumed gas result. /// /// # Returns /// - An `i32` value indicating the result of the execution, /// negative or zero result stands for terminated execution, /// but positive code stands for interrupted execution (works only for root execution level) pub fn _exec( hash32_ptr: *const u8, input_ptr: *const u8, input_len: u32, fuel_ptr: *mut u64, state: u32, ) -> i32; /// Resumes the execution of a previously suspended function call. /// /// This function is designed to handle the resumption of a function call /// that was previously paused. /// It takes several parameters that provide /// the necessary context and data for resuming the call. /// /// # Parameters /// /// * `call_id` - A unique identifier for the call that needs to be resumed. /// * `return_data_ptr` - A pointer to the return data that needs to be passed back to the /// resuming function. /// This should point to a byte array. /// * `return_data_len` - The length of the return data in bytes. /// * `exit_code` - An integer code that represents the exit status of the resuming function. /// Typically, this might be 0 for success or an error code for failure. /// * `fuel_ptr` - A mutable pointer to a 64-bit unsigned integer representing the fuel need to /// be charged, also it puts a consumed fuel result into the same pointer pub fn _resume( call_id: u32, return_data_ptr: *const u8, return_data_len: u32, exit_code: i32, fuel_ptr: *mut u64, ) -> i32; pub fn _charge_fuel(delta: u64) -> u64; pub fn _fuel() -> u64; /// Journaled ZK Trie methods to work with blockchain state pub fn _preimage_size(hash32_ptr: *const u8) -> u32; pub fn _preimage_copy(hash32_ptr: *const u8, preimage_ptr: *mut u8); pub fn _debug_log(msg_ptr: *const u8, msg_len: u32); } }
For each system function, a unique identifier is assigned.
During the rWASM translation, every function call is replaced with a Call(SysCallIdx)
instruction.
This approach significantly enhances the efficiency and simplicity of the proving process.
#![allow(unused)] fn main() { #[repr(u32)] #[allow(non_camel_case_types)] pub enum SysFuncIdx { #[default] UNKNOWN = 0x0000, // crypto KECCAK256 = 0x0101, POSEIDON = 0x0102, POSEIDON_HASH = 0x0103, ECRECOVER = 0x0104, // SYS host EXIT = 0x0001, STATE = 0x0002, READ = 0x0003, INPUT_SIZE = 0x0004, WRITE = 0x0005, OUTPUT_SIZE = 0x0006, READ_OUTPUT = 0x0007, EXEC = 0x0009, RESUME = 0x000a, FORWARD_OUTPUT = 0x000b, CHARGE_FUEL = 0x000c, FUEL = 0x000d, READ_CONTEXT = 0x000e, // preimage PREIMAGE_SIZE = 0x070D, PREIMAGE_COPY = 0x070E, DEBUG_LOG = 0x0901, } }