radix_engine/vm/wasm/
traits.rs

1use crate::errors::InvokeError;
2use crate::internal_prelude::*;
3use crate::vm::wasm::errors::*;
4use radix_engine_interface::api::actor_api::EventFlags;
5use radix_engine_interface::api::ActorRefHandle;
6use radix_engine_interface::blueprints::package::CodeHash;
7use sbor::rust::boxed::Box;
8use sbor::rust::vec::Vec;
9
10/// Represents the runtime that can be invoked by Scrypto modules.
11pub trait WasmRuntime {
12    fn allocate_buffer(&mut self, buffer: Vec<u8>)
13        -> Result<Buffer, InvokeError<WasmRuntimeError>>;
14
15    fn buffer_consume(
16        &mut self,
17        buffer_id: BufferId,
18    ) -> Result<Vec<u8>, InvokeError<WasmRuntimeError>>;
19
20    fn object_call(
21        &mut self,
22        receiver: Vec<u8>,
23        ident: Vec<u8>,
24        args: Vec<u8>,
25    ) -> Result<Buffer, InvokeError<WasmRuntimeError>>;
26
27    fn object_call_module(
28        &mut self,
29        receiver: Vec<u8>,
30        module_id: u32,
31        ident: Vec<u8>,
32        args: Vec<u8>,
33    ) -> Result<Buffer, InvokeError<WasmRuntimeError>>;
34
35    fn object_call_direct(
36        &mut self,
37        receiver: Vec<u8>,
38        ident: Vec<u8>,
39        args: Vec<u8>,
40    ) -> Result<Buffer, InvokeError<WasmRuntimeError>>;
41
42    fn blueprint_call(
43        &mut self,
44        package_address: Vec<u8>,
45        blueprint_name: Vec<u8>,
46        ident: Vec<u8>,
47        args: Vec<u8>,
48    ) -> Result<Buffer, InvokeError<WasmRuntimeError>>;
49
50    fn object_new(
51        &mut self,
52        blueprint_name: Vec<u8>,
53        object_states: Vec<u8>,
54    ) -> Result<Buffer, InvokeError<WasmRuntimeError>>;
55
56    fn address_allocate(
57        &mut self,
58        package_address: Vec<u8>,
59        blueprint_name: Vec<u8>,
60    ) -> Result<Buffer, InvokeError<WasmRuntimeError>>;
61
62    fn address_get_reservation_address(
63        &mut self,
64        node_id: Vec<u8>,
65    ) -> Result<Buffer, InvokeError<WasmRuntimeError>>;
66
67    fn globalize_object(
68        &mut self,
69        node_id: Vec<u8>,
70        modules: Vec<u8>,
71        address: Vec<u8>,
72    ) -> Result<Buffer, InvokeError<WasmRuntimeError>>;
73
74    fn key_value_store_new(
75        &mut self,
76        schema: Vec<u8>,
77    ) -> Result<Buffer, InvokeError<WasmRuntimeError>>;
78
79    fn key_value_store_open_entry(
80        &mut self,
81        node_id: Vec<u8>,
82        key: Vec<u8>,
83        flags: u32,
84    ) -> Result<SubstateHandle, InvokeError<WasmRuntimeError>>;
85
86    fn key_value_entry_get(&mut self, handle: u32)
87        -> Result<Buffer, InvokeError<WasmRuntimeError>>;
88
89    fn key_value_entry_set(
90        &mut self,
91        handle: u32,
92        data: Vec<u8>,
93    ) -> Result<(), InvokeError<WasmRuntimeError>>;
94
95    fn key_value_entry_remove(
96        &mut self,
97        handle: u32,
98    ) -> Result<Buffer, InvokeError<WasmRuntimeError>>;
99
100    fn key_value_entry_close(&mut self, handle: u32) -> Result<(), InvokeError<WasmRuntimeError>>;
101
102    fn key_value_store_remove_entry(
103        &mut self,
104        node_id: Vec<u8>,
105        key: Vec<u8>,
106    ) -> Result<Buffer, InvokeError<WasmRuntimeError>>;
107
108    fn instance_of(
109        &mut self,
110        object_id: Vec<u8>,
111        package_address: Vec<u8>,
112        blueprint_name: Vec<u8>,
113    ) -> Result<u32, InvokeError<WasmRuntimeError>>;
114
115    fn blueprint_id(&mut self, object_id: Vec<u8>)
116        -> Result<Buffer, InvokeError<WasmRuntimeError>>;
117
118    fn get_outer_object(
119        &mut self,
120        component_id: Vec<u8>,
121    ) -> Result<Buffer, InvokeError<WasmRuntimeError>>;
122
123    fn actor_open_field(
124        &mut self,
125        object_handle: u32,
126        field: u8,
127        flags: u32,
128    ) -> Result<SubstateHandle, InvokeError<WasmRuntimeError>>;
129
130    fn field_entry_read(
131        &mut self,
132        handle: SubstateHandle,
133    ) -> Result<Buffer, InvokeError<WasmRuntimeError>>;
134
135    fn field_entry_write(
136        &mut self,
137        handle: SubstateHandle,
138        data: Vec<u8>,
139    ) -> Result<(), InvokeError<WasmRuntimeError>>;
140
141    fn field_entry_close(
142        &mut self,
143        handle: SubstateHandle,
144    ) -> Result<(), InvokeError<WasmRuntimeError>>;
145
146    fn actor_get_node_id(
147        &mut self,
148        actor_ref_handle: ActorRefHandle,
149    ) -> Result<Buffer, InvokeError<WasmRuntimeError>>;
150
151    fn actor_get_package_address(&mut self) -> Result<Buffer, InvokeError<WasmRuntimeError>>;
152
153    fn actor_get_blueprint_name(&mut self) -> Result<Buffer, InvokeError<WasmRuntimeError>>;
154
155    fn consume_wasm_execution_units(&mut self, n: u32)
156        -> Result<(), InvokeError<WasmRuntimeError>>;
157
158    fn costing_get_execution_cost_unit_limit(
159        &mut self,
160    ) -> Result<u32, InvokeError<WasmRuntimeError>>;
161
162    fn costing_get_execution_cost_unit_price(
163        &mut self,
164    ) -> Result<Buffer, InvokeError<WasmRuntimeError>>;
165
166    fn costing_get_finalization_cost_unit_limit(
167        &mut self,
168    ) -> Result<u32, InvokeError<WasmRuntimeError>>;
169
170    fn costing_get_finalization_cost_unit_price(
171        &mut self,
172    ) -> Result<Buffer, InvokeError<WasmRuntimeError>>;
173
174    fn costing_get_usd_price(&mut self) -> Result<Buffer, InvokeError<WasmRuntimeError>>;
175
176    fn costing_get_tip_percentage(&mut self) -> Result<u32, InvokeError<WasmRuntimeError>>;
177
178    fn costing_get_fee_balance(&mut self) -> Result<Buffer, InvokeError<WasmRuntimeError>>;
179
180    fn actor_emit_event(
181        &mut self,
182        event_name: Vec<u8>,
183        event_payload: Vec<u8>,
184        event_flags: EventFlags,
185    ) -> Result<(), InvokeError<WasmRuntimeError>>;
186
187    fn sys_log(
188        &mut self,
189        level: Vec<u8>,
190        message: Vec<u8>,
191    ) -> Result<(), InvokeError<WasmRuntimeError>>;
192
193    fn sys_bech32_encode_address(
194        &mut self,
195        address: Vec<u8>,
196    ) -> Result<Buffer, InvokeError<WasmRuntimeError>>;
197
198    fn sys_get_transaction_hash(&mut self) -> Result<Buffer, InvokeError<WasmRuntimeError>>;
199
200    fn sys_generate_ruid(&mut self) -> Result<Buffer, InvokeError<WasmRuntimeError>>;
201
202    fn sys_panic(&mut self, message: Vec<u8>) -> Result<(), InvokeError<WasmRuntimeError>>;
203
204    fn crypto_utils_bls12381_v1_verify(
205        &mut self,
206        message: Vec<u8>,
207        public_key: Vec<u8>,
208        signature: Vec<u8>,
209    ) -> Result<u32, InvokeError<WasmRuntimeError>>;
210
211    fn crypto_utils_bls12381_v1_aggregate_verify(
212        &mut self,
213        pub_keys_and_msgs: Vec<u8>,
214        signatures: Vec<u8>,
215    ) -> Result<u32, InvokeError<WasmRuntimeError>>;
216
217    fn crypto_utils_bls12381_v1_fast_aggregate_verify(
218        &mut self,
219        message: Vec<u8>,
220        public_keys: Vec<u8>,
221        signatures: Vec<u8>,
222    ) -> Result<u32, InvokeError<WasmRuntimeError>>;
223
224    fn crypto_utils_bls12381_g2_signature_aggregate(
225        &mut self,
226        signatures: Vec<u8>,
227    ) -> Result<Buffer, InvokeError<WasmRuntimeError>>;
228
229    fn crypto_utils_keccak256_hash(
230        &mut self,
231        data: Vec<u8>,
232    ) -> Result<Buffer, InvokeError<WasmRuntimeError>>;
233
234    fn crypto_utils_blake2b_256_hash(
235        &mut self,
236        data: Vec<u8>,
237    ) -> Result<Buffer, InvokeError<WasmRuntimeError>>;
238
239    fn crypto_utils_ed25519_verify(
240        &mut self,
241        message: Vec<u8>,
242        public_key: Vec<u8>,
243        signature: Vec<u8>,
244    ) -> Result<u32, InvokeError<WasmRuntimeError>>;
245
246    fn crypto_utils_secp256k1_ecdsa_verify(
247        &mut self,
248        message: Vec<u8>,
249        public_key: Vec<u8>,
250        signature: Vec<u8>,
251    ) -> Result<u32, InvokeError<WasmRuntimeError>>;
252
253    fn crypto_utils_secp256k1_ecdsa_verify_and_key_recover(
254        &mut self,
255        message: Vec<u8>,
256        signature: Vec<u8>,
257    ) -> Result<Buffer, InvokeError<WasmRuntimeError>>;
258
259    fn crypto_utils_secp256k1_ecdsa_verify_and_key_recover_uncompressed(
260        &mut self,
261        message: Vec<u8>,
262        signature: Vec<u8>,
263    ) -> Result<Buffer, InvokeError<WasmRuntimeError>>;
264}
265
266/// Represents an instantiated, invocable Scrypto module.
267pub trait WasmInstance {
268    /// Invokes an export defined in this module.
269    ///
270    /// The expected signature is as follows:
271    /// - The input is a list of U64, each of which represents a `(BufferId, BufferLen)`.
272    /// - The return data is U64, which represents a `(SlicePtr, SliceLen)`.
273    ///
274    /// The return data is copied into a `Vec<u8>`.
275    fn invoke_export<'r>(
276        &mut self,
277        func_name: &str,
278        args: Vec<Buffer>,
279        runtime: &mut Box<dyn WasmRuntime + 'r>,
280    ) -> Result<Vec<u8>, InvokeError<WasmRuntimeError>>;
281}
282
283/// A Scrypto WASM engine validates, instruments and runs Scrypto modules.
284pub trait WasmEngine {
285    type WasmInstance: WasmInstance;
286
287    /// Instantiate a Scrypto module.
288    ///
289    /// The code must have been validated and instrumented!
290    fn instantiate(&self, code_hash: CodeHash, instrumented_code: &[u8]) -> Self::WasmInstance;
291}