Line data Source code
1 : #ifndef HEADER_fd_src_flamenco_vm_syscall_fd_vm_syscall_h
2 : #define HEADER_fd_src_flamenco_vm_syscall_fd_vm_syscall_h
3 :
4 : #include "../fd_vm_private.h"
5 : #include "fd_vm_syscall_macros.h"
6 : #include "fd_vm_cpi.h" /* FIXME: REFINE THIS MORE */
7 : #include "../../runtime/fd_runtime.h" /* FIXME: REFINE THIS MORE */
8 : #include "../../runtime/context/fd_exec_instr_ctx.h"
9 : #include "../../log_collector/fd_log_collector.h"
10 :
11 : #define FD_VM_RETURN_DATA_MAX (1024UL) /* FIXME: DOCUMENT AND DOES THIS BELONG HERE? */
12 :
13 : /* The maximum number of seeds a PDA can have
14 : https://github.com/solana-labs/solana/blob/2afde1b028ed4593da5b6c735729d8994c4bfac6/sdk/program/src/pubkey.rs#L21 */
15 : #define FD_VM_PDA_SEEDS_MAX (16UL)
16 : /* The maximum length of a PDA seed
17 : https://github.com/solana-labs/solana/blob/2afde1b028ed4593da5b6c735729d8994c4bfac6/sdk/program/src/pubkey.rs#L19 */
18 : #define FD_VM_PDA_SEED_MEM_MAX (32UL)
19 :
20 : /* PYTHON3 CODE FOR COMPUTING THE SYSCALL MURMUR3 HASH (e.g. sol_get_epoch_stake):
21 : ```
22 : import mmh3
23 : import ctypes
24 :
25 : def compute_murmur3_hash(input_string):
26 : # Compute the Murmur3 hash of the input string
27 : hash_value = mmh3.hash(input_string)
28 : # Convert the hash value to a 32-bit unsigned integer
29 : u32_hash_value = ctypes.c_uint32(hash_value).value
30 : return u32_hash_value
31 :
32 : input_string = b"sol_get_epoch_stake"
33 : hash_value = compute_murmur3_hash(input_string)
34 : print(f"The Murmur3 hash of '{input_string}' as u32 is: {hex(hash_value)}")
35 :
36 : Output:
37 : The Murmur3 hash of 'b'sol_get_epoch_stake'' as u32 is: 0x5be92f4a
38 : ```
39 : */
40 :
41 : /* https://github.com/solana-labs/solana/blob/2afde1b028ed4593da5b6c735729d8994c4bfac6/sdk/program/src/pubkey.rs#L22 */
42 :
43 : /* FIXME: CONSIDER NOT PREFIXING SYSCALLS WITH SOL_? (OR MAYBE THIS
44 : IS NECESSARY TO DISAMBIGUATE SOLANA SYSCALLS FROM NON-SOLANA?
45 : SYSCALLS? */
46 :
47 : /* FD_VM_SYSCALL_DECL declares a prototype of a syscall. When a
48 : syscall implementation is called, the syscall will see a precise
49 : reporting VM's state at time of the syscall. Notably:
50 :
51 : - vm->pc will be at the syscall instruction
52 : - vm->ic will include the syscall instruction
53 : - vm->cu will include the 1 cu cost of the syscall instruction.
54 : Further, it will be positive.
55 :
56 : r1,r2,r3,r4,r5 are the values in r1,r2,r3,r4,r5 at time of the
57 : syscall.
58 :
59 : When a syscall implementation returns FD_VM_SUCCESS, vm->reg[0] holds
60 : the application return value.
61 :
62 : When an syscall implementation returns FD_VM_SYSCALL_ERR*, the
63 : syscall is considered to have faulted the VM. It ideally should not
64 : have set vm->reg[0] (or changed any vm state, except vm->cu, though
65 : that often isn't practical, and not critical to consensus).
66 :
67 : It is the syscall's responsibility to deduct from vm->cu its specific
68 : cost model (not including the syscall instruction itself). As such,
69 : when a syscall returns COMPUTE_BUDGET_EXCEEDED, it should have set
70 : vm->cu to zero. When it returns anything else, it should have set cu
71 : to something in [0,cu_at_function_entry] (upper bound inclusive,
72 : despite most syscalls deducing base CUs first thing, some don't,
73 : e.g., sol_sha256).
74 :
75 : To mitigate risks of from syscall implementations that do not
76 : strictly enforce this and other similar risks that can affect
77 : bookkeeping, on return from a syscall, the VM will:
78 :
79 : - Ignore updates to pc, ic and frame_cnt.
80 : - Ignore updates to cu that increase it.
81 : - Treat updates to cu that zero it as SIGCOST.
82 : - Treat SIGCOST returns that didn't update cu to zero as zeroing it.
83 :
84 : FIXME: ADD NO SETTING OF R0 ON VM_ERR IN VM_INTERP. */
85 :
86 : #define FD_VM_SYSCALL_DECL(name) \
87 : int \
88 : fd_vm_syscall_##name( void * _vm, \
89 : ulong r1, \
90 : ulong r2, \
91 : ulong r3, \
92 : ulong r4, \
93 : ulong r5 )
94 :
95 : FD_PROTOTYPES_BEGIN
96 :
97 : /* fd_vm_syscall_util *************************************************/
98 :
99 : /* syscall(b6fc1a11) "abort"
100 : Abort program execution and fail transaction.
101 :
102 : Inputs:
103 :
104 : r1 - ignored
105 : r2 - ignored
106 : r3 - ignored
107 : r4 - ignored
108 : r5 - ignored
109 :
110 : Return:
111 :
112 : FD_VM_SYSCALL_ERR_ABORT: vm->reg[0] unchanged. vm->cu unchanged.
113 :
114 : FIXME: SHOULD THIS BE NAMED "SOL_ABORT"? */
115 :
116 : FD_VM_SYSCALL_DECL( abort );
117 :
118 : /* syscall(686093bb) "sol_panic_"
119 : Log panic message, abort program execution, and fail transaction.
120 :
121 : Inputs:
122 :
123 : r1 - file, byte VM pointer, indexed [0,file_sz), not necessarily
124 : \0 terminated and may contain \0 within,
125 : r2 - file_sz, may be 0,
126 : r3 - line (currently ignored)
127 : r4 - column (currently ignored)
128 : r5 - ignored
129 :
130 : Return:
131 :
132 : FD_VM_SYSCALL_ERR_COMPUTE_BUDGET_EXCEEDED: insufficient compute
133 : budget. vm->reg[0] unchanged. vm->cu==0.
134 :
135 : FD_VM_SYSCALL_ERR_SEGFAULT: invalid file address range.
136 :
137 : FD_VM_SYSCALL_ERR_INVALID_LENGTH: file_sz exceeds LONG_MAX.
138 :
139 : FD_VM_SYSCALL_ERR_INVALID_STRING: Bad filepath string, file is not
140 : a valid sequence of utf8 bytes. vm->reg[0] unchanged and vm->cu>=0.
141 :
142 : FD_VM_SYSCALL_ERR_PANIC: vm->reg[0] unchanged. vm->cu
143 : decremented and vm->cu>=0. */
144 :
145 : FD_VM_SYSCALL_DECL( sol_panic );
146 :
147 : /* syscall(207559bd) "sol_log_"
148 : Write message encoded as (msg, msg_sz) to log, prefixed with
149 : "Program log: ".
150 :
151 : Inputs:
152 :
153 : r1 - msg, byte VM pointer, indexed [0,msg_sz),
154 : r2 - msg_sz, may be 0,
155 : r3 - ignored
156 : r4 - ignored
157 : r5 - ignored
158 :
159 : Return:
160 :
161 : FD_VM_SYSCALL_ERR_COMPUTE_BUDGET_EXCEEDED: insufficient compute
162 : budget. vm->reg[0] unchanged. vm->cu==0.
163 :
164 : FD_VM_SYSCALL_ERR_SEGFAULT: invalid message address range.
165 :
166 : FD_VM_SYSCALL_ERR_INVALID_LENGTH: msg_sz exceeds LONG_MAX.
167 :
168 : FD_VM_SYSCALL_ERR_INVALID_STRING: bad message string. vm->reg[0]
169 : unchanged. vm->cu decremented and vm->cu>=0.
170 :
171 : FD_VM_SUCCESS: success. vm->reg[0]==0. vm->cu decremented and
172 : vm->cu>=0.
173 :
174 : IMPORTANT SAFETY TIP! The log message will be silently truncated
175 : if there was not enough room for the message in the syscall log
176 : when called. */
177 :
178 : FD_VM_SYSCALL_DECL( sol_log );
179 :
180 : /* syscall(5c2a3178) "sol_log_64_"
181 : Write r1:5 to the log as a hexadecimal
182 :
183 : Inputs:
184 :
185 : r1 - ulong
186 : r2 - ulong
187 : r3 - ulong
188 : r4 - ulong
189 : r5 - ulong
190 :
191 : Return:
192 :
193 : FD_VM_SYSCALL_ERR_COMPUTE_BUDGET_EXCEEDED: insufficient compute
194 : budget. vm->reg[0] unchanged. vm->cu==0.
195 :
196 : FD_VM_SUCCESS: success. vm->reg[0]=0. vm->cu decremented and
197 : vm->cu>=0.
198 :
199 : IMPORTANT SAFETY TIP! The log message will be silently truncated
200 : if there was not enough room for the message in the syscall log
201 : when called. */
202 :
203 : FD_VM_SYSCALL_DECL( sol_log_64 );
204 :
205 : /* syscall(7ef088ca) "sol_log_pubkey"
206 : Write the base58 encoding of 32 byte array to the log.
207 :
208 : Inputs:
209 :
210 : r1 - pubkey, byte VM pointer, indexed [0,32)
211 : r2 - ignored
212 : r3 - ignored
213 : r4 - ignored
214 : r5 - ignored
215 :
216 : Return:
217 :
218 : FD_VM_SYSCALL_ERR_COMPUTE_BUDGET_EXCEEDED: insufficient compute
219 : budget. vm->reg[0] unchanged. vm->cu==0.
220 :
221 : FD_VM_SYSCALL_ERR_SEGFAULT: bad address range. vm->reg[0] unchanged.
222 : vm->cu decremented and vm->cu>=0.
223 :
224 : FD_VM_SUCCESS: success. vm->reg[0]==0. vm->cu decremented and
225 : vm->cu>=0.
226 :
227 : IMPORTANT SAFETY TIP! The log message will be silently truncated
228 : if there was not enough room for the message in the syscall log
229 : when called. */
230 :
231 : FD_VM_SYSCALL_DECL( sol_log_pubkey );
232 :
233 : /* syscall(52ba5096) "sol_log_compute_units_"
234 : Write remaining compute unit count to log.
235 :
236 : Inputs:
237 :
238 : r1 - ignored
239 : r2 - ignored
240 : r3 - ignored
241 : r4 - ignored
242 : r5 - ignored
243 :
244 : Return:
245 :
246 : FD_VM_SYSCALL_ERR_COMPUTE_BUDGET_EXCEEDED: insufficient compute
247 : budget. vm->reg[0] unchanged. vm->cu==0.
248 :
249 : FD_VM_SUCCESS: success. vm->reg[0]=0. vm->cu decremented
250 : and vm->cu>=0. The value logged will be the value of cu when
251 : between when the syscall completed and the next iteration starts
252 : and will be >=0.
253 :
254 : IMPORTANT SAFETY TIP! The log message will be silently truncated
255 : if there was not enough room for the message in the syscall log
256 : when called. */
257 :
258 : FD_VM_SYSCALL_DECL( sol_log_compute_units );
259 :
260 : /* syscall(7317b434) "sol_log_data"
261 : Write the base64 encoded cnt data slices to the log.
262 :
263 : Inputs:
264 :
265 : r1 - slice, ulong pair VM pointer, indexed [0,cnt),
266 : r2 - cnt, may be 0,
267 : r3 - ignored
268 : r4 - ignored
269 : r5 - ignored
270 :
271 : slice[i] holds the ulong pair:
272 : mem, byte VM pointer, indexed [0,sz),
273 : sz, may be 0
274 :
275 : Return:
276 :
277 : FD_VM_SYSCALL_ERR_COMPUTE_BUDGET_EXCEEDED: insufficient compute budget.
278 : vm->reg[0] unchanged. vm->cu==0.
279 :
280 : FD_VM_SYSCALL_ERR_SEGFAULT: bad address range. vm->reg[0] unchanged. vm->cu
281 : decremented and vm->cu>=0.
282 :
283 : FD_VM_SUCCESS: success. vm->reg[0]=0. vm->cu decremented and vm->cu>=0.
284 :
285 : IMPORTANT SAFETY TIP! The log message will be silently truncated
286 : if there was not enough room for the message in the syscall log
287 : when called. */
288 :
289 : FD_VM_SYSCALL_DECL( sol_log_data );
290 :
291 : /* syscall(83f00e8f) "sol_alloc_free_"
292 : DEPRECATED ... dynamic heap allocation support
293 :
294 : Inputs:
295 :
296 : r1 - sz, ignored if vaddr is not 0
297 : r2 - free_vaddr, byte VM pointer
298 : r3 - ignored
299 : r4 - ignored
300 : r5 - ignored
301 :
302 : Return:
303 :
304 : All cases return FD_VM_SUCCESS and leave vm->cu unchanged.
305 :
306 : If free_vaddr is 0, this is "malloc"-like:
307 :
308 : Let the VM heap region cover bytes [heap_start,heap_end) with
309 : heap_start<=heap_end. If the request was satisfied, on return,
310 : vm->reg[0] will point to a range of heap bytes [vm->reg[0],vm->reg[0]+sz) that
311 : does not overlap with any other current allocation such that
312 : heap_start<=vm->reg[0]<=vm->reg[0]+sz<=heap_end. This includes the zero sz
313 : case (note that the zero sz case might return the same value as a
314 : previous zero sz case and/or return the exact value of heap_end).
315 :
316 : If the request cannot be satisfied, vm->reg[0]=0 on return and the
317 : heap unchanged.
318 :
319 : IMPORTANT SAFETY TIP! If the VM has check_align set, this
320 : location will have at least 8 byte alignment. Otherwise, this
321 : location will have no particular alignment. Note that this
322 : implies allocations done by this syscall do not conform to the
323 : usual alignment requirements of a standard malloc call for older
324 : VM code.
325 :
326 : If vaddr is not-zero, this is "free"-like. Since the underlying
327 : implementation is necessarily a bump allocator (see implementation
328 : for more details), the specific value is ignored and vm->reg[0]=0 on
329 : return. */
330 :
331 : FD_VM_SYSCALL_DECL( sol_alloc_free );
332 :
333 : /* syscall(717cc4a3) "sol_memcpy_"
334 : Copy sz bytes from src to dst. src and dst should not overlap.
335 :
336 : Inputs:
337 :
338 : r1 - dst, byte VM pointer, indexed [0,sz),
339 : r2 - src, byte VM pointer, indexed [0,sz),
340 : r3 - sz,
341 : r4 - ignored
342 : r5 - ignored
343 :
344 : Return:
345 :
346 : FD_VM_SYSCALL_ERR_COMPUTE_BUDGET_EXCEEDED: insufficient compute
347 : budget. vm->reg[0] unchanged. vm->cu==0.
348 :
349 : FD_VM_SYSCALL_ERR_COPY_OVERLAPPING: address ranges for src and dst
350 : overlap (either partially or fully). Empty address ranges are
351 : considered to **never** overlap. vm->reg[0]==0. vm->cu decremented and
352 : vm->cu>=0.
353 :
354 : FD_VM_SYSCALL_ERR_SEGFAULT: bad address range. vm->reg[0]==0. vm->cu
355 : decremented and vm->cu>=0.
356 :
357 : FD_VM_SUCCESS: success. vm->reg[0]==0. vm->cu decremented and
358 : vm->cu>=0. On return, dst[i]==src[i] for i in [0,sz). */
359 :
360 : FD_VM_SYSCALL_DECL( sol_memcpy );
361 :
362 : /* syscall(5fdcde31) "sol_memcmp_"
363 : Compare sz bytes at m0 to m1
364 :
365 : Inputs:
366 :
367 : r1 - m0, byte VM pointer, indexed [0,sz), FIXME: WHEN IS NULL OKAY?
368 : r2 - m1, byte VM pointer, indexed [0,sz), FIXME: WHEN IS NULL OKAY?
369 : r3 - sz, FIXME: IS SZ 0 OKAY?
370 : r4 - out, int VM pointer
371 : r5 - ignored
372 :
373 : Return:
374 :
375 : FD_VM_SYSCALL_ERR_COMPUTE_BUDGET_EXCEEDED: insufficient compute budget.
376 : vm->reg[0]==0. vm->cu==0.
377 :
378 : FD_VM_SYSCALL_ERR_SEGFAULT: bad address range (including out not 4 byte
379 : aligned). vm->reg[0]==0. vm->cu decremented and vm->cu>=0.
380 : Strict alignment is only required when the VM has check_align set.
381 :
382 : FD_VM_SUCCESS: success. vm->reg[0]=0. vm->cu decremented and vm->cu>=0.
383 : On return, *_out will hold a positive / zero / negative number if
384 : the region at m0 lexicographically compares strictly greater than /
385 : equal to / strictly less than the region at m1 when treated as
386 : uchars. Specifically, if the regions are different, *_out will be
387 : (int)m0[i] - (int)m1[i] where i is the first differing byte.
388 :
389 : IMPORTANT SAFETY TIP! Note that, strangely, this returns the result
390 : in memory instead of via vm->reg[0] like a libc-style memcmp would. */
391 :
392 : FD_VM_SYSCALL_DECL( sol_memcmp );
393 :
394 : /* syscall(3770fb22) "sol_memset_"
395 : Set sz bytes at dst to the byte value c.
396 :
397 : Inputs:
398 :
399 : r1 - dst, byte VM pointer, indexed [0,sz), FIXME: WHEN IS NULL OKAY?
400 : r2 - c, bits [8,64) ignored (FIXME: CHECK SOLANA DOES THIS)
401 : r3 - sz, may be 0,
402 : r4 - ignored
403 : r5 - ignored
404 :
405 : Return:
406 :
407 : FD_VM_SYSCALL_ERR_COMPUTE_BUDGET_EXCEEDED: insufficient compute budget.
408 : vm->reg[0]==0. vm->cu==0.
409 :
410 : FD_VM_SYSCALL_ERR_SEGFAULT: bad address range. vm->reg[0]==0. vm->cu
411 : decremented and vm->cu>=0.
412 :
413 : FD_VM_SUCCESS: success. vm->reg[0]=0. vm->cu decremented and vm->cu>=0.
414 : On return, dst[i]==(uchar)(c & 255UL) for i in [0,sz). */
415 :
416 : FD_VM_SYSCALL_DECL( sol_memset );
417 :
418 : /* syscall(434371f8) "sol_memmove_"
419 : Copy sz bytes from src to dst. src and dst can overlap.
420 :
421 : Inputs:
422 :
423 : r1 - dst, byte VM pointer, indexed [0,sz),
424 : r2 - src, byte VM pointer, indexed [0,sz),
425 : r3 - sz, may be 0,
426 : r4 - ignored
427 : r5 - ignored
428 :
429 : Return:
430 :
431 : FD_VM_SYSCALL_ERR_COMPUTE_BUDGET_EXCEEDED: insufficient compute budget.
432 : vm->reg[0] unchanged. vm->cu==0.
433 :
434 : FD_VM_SYSCALL_ERR_SEGFAULT: bad address range. vm->reg[0]==0. vm->cu
435 : decremented and vm->cu>=0.
436 :
437 : FD_VM_SUCCESS: success. vm->reg[0]=0. vm->cu decremented and vm->cu>=0.
438 : On return, dst[i]==src_as_it_was_before_the_call[i] for i in
439 : [0,sz). */
440 :
441 : FD_VM_SYSCALL_DECL( sol_memmove );
442 :
443 : /* fd_vm_syscall_runtime **********************************************/
444 :
445 : /* syscall(d56b5fe9) "sol_get_clock_sysvar"
446 : syscall(23a29a61) "sol_get_epoch_schedule_sysvar"
447 : syscall(bf7188f6) "sol_get_rent_sysvar"
448 : syscall(188a0031) "sol_get_last_restart_slot"
449 : Get various sysvar values
450 :
451 : Inputs:
452 :
453 : r1 - out, {clock,schedule,fees,rent,last_restart_slot} VM pointer
454 : r2 - ignored
455 : r3 - ignored
456 : r4 - ignored
457 : r5 - ignored
458 :
459 : Return:
460 :
461 : FD_VM_SYSCALL_ERR_OUTSIDE_RUNTIME: the VM is not running within the
462 : Solana runtime. vm->reg[0] unchanged. vm->cu unchanged.
463 :
464 : FD_VM_SYSCALL_ERR_COMPUTE_BUDGET_EXCEEDED: insufficient compute
465 : budget. vm->reg[0] unchanged. vm->cu==0.
466 :
467 : FD_VM_SYSCALL_ERR_SEGFAULT: bad address range. vm->reg[0] unchanged.
468 : vm->cu decremented and vm->cu>=0. out should have:
469 : | align | sz
470 : clock | 8 | 40
471 : schedule | 8 | 40
472 : rent | 8 | 24
473 : last restart slot | 8 | 8
474 : Strict alignment is only required when the VM has check_align set.
475 :
476 : FD_VM_SUCCESS: success. vm->reg[0]=0. vm->cu decremented and vm->cu>=0.
477 : On return, *out will hold the value of the appropriate sysvar. */
478 :
479 : FD_VM_SYSCALL_DECL( sol_get_clock_sysvar );
480 : FD_VM_SYSCALL_DECL( sol_get_epoch_schedule_sysvar );
481 : FD_VM_SYSCALL_DECL( sol_get_rent_sysvar );
482 : FD_VM_SYSCALL_DECL( sol_get_last_restart_slot_sysvar );
483 : FD_VM_SYSCALL_DECL( sol_get_epoch_rewards_sysvar );
484 :
485 : /* syscall(13c1b505) "sol_get_sysvar"
486 :
487 : Get a slice of a sysvar account's data.
488 :
489 : Inputs:
490 :
491 : r1 - sysvar_id_vaddr, sysvar pubkey VM pointer
492 : r2 - out_vaddr, byte VM pointer
493 : r3 - offset, ulong
494 : r4 - sz, num bytes to store
495 : r5 - ignored
496 :
497 : Return:
498 :
499 : FD_VM_SYSCALL_ERR_COMPUTE_BUDGET_EXCEEDED: insufficient compute
500 : budget. vm->reg[0] unchanged. vm->cu==0.
501 :
502 : FD_VM_SYSCALL_ERR_SEGFAULT: bad sysvar_id_vaddr, bad out_vaddr,
503 : requested slice outside of sysvar data buffer. vm->reg[0] unchanged.
504 : vm->cu decremented and vm->cu>=0.
505 :
506 : FD_VM_SYSCALL_ERR_ABORT: offset+sz overflow. vm->reg[0] unchanged.
507 : vm->cu decremented and vm->cu>=0.
508 :
509 : FD_VM_SUCCESS: success. vm->cu decremented and vm->cu>=0.
510 : - vm->reg[0] = 2 if sysvar id is not in {clock,schedule,rewards,rent,
511 : slot hashes,stake history, last restart slot}
512 : OR sysvar account does not exist.
513 : - vm->reg[0] = 1 if [offset,offset+sz) is outside of sysvar data
514 : buffer.
515 : - vm->reg[0] = 0 if success.
516 :
517 : On return, sz bytes of appropriate offset sysvar data will be
518 : copied into haddr belonging to out_vaddr. */
519 : FD_VM_SYSCALL_DECL( sol_get_sysvar );
520 :
521 : /* syscall(5be92f4a) "sol_get_epoch_stake"
522 :
523 : This syscall is meant to return the latest frozen stakes at an epoch
524 : boundary. So for instance, when we are executing in epoch 7, this
525 : should return the stakes at the end of epoch 6. Note that this is
526 : also the stakes that determined the leader schedule for the upcoming
527 : epoch, namely epoch 8.
528 :
529 : Inputs:
530 :
531 : r1 - var_addr, vote pubkey VM pointer, or zero to get the total
532 : active stake on the cluster.
533 : r2 - ignored
534 : r3 - ignored
535 : r4 - ignored
536 : r5 - ignored
537 :
538 : Return:
539 :
540 : FD_VM_ERR_SIGCOST: insufficient compute budget. vm->reg[0] unchanged.
541 : vm->cu==0.
542 :
543 : FD_VM_ERR_SIGSEGV: bad var_addr. vm->reg[0] unchanged. vm->cu
544 : decremented and vm->cu>=0.
545 :
546 : FD_VM_ERR_ABORT: offset+sz overflow. vm->reg[0] unchanged.
547 :
548 : FD_VM_SUCCESS: success. vm->cu decremented and vm->cu>=0.
549 : If var_addr == 0, vm->reg[0] is the total active stake on the
550 : cluster. Else, it is the vote account's delegated stake if
551 : var_addr is an existing vote account, and 0 otherwise. */
552 :
553 : FD_VM_SYSCALL_DECL( sol_get_epoch_stake );
554 :
555 : /* syscall(85532d94) "sol_get_stack_height"
556 :
557 : Inputs:
558 :
559 : r1 - ignored
560 : r2 - ignored
561 : r3 - ignored
562 : r4 - ignored
563 : r5 - ignored
564 :
565 : Return:
566 :
567 : FD_VM_SYSCALL_ERR_COMPUTE_BUDGET_EXCEEDED: insufficient compute
568 : budget. vm->reg[0] unchanged. vm->cu==0.
569 :
570 : FD_VM_SUCCESS: success. vm->reg[0]==stack_height. vm->cu decremented
571 : and vm->cu>=0. */
572 :
573 : FD_VM_SYSCALL_DECL( sol_get_stack_height );
574 :
575 : /* syscall(5d2245e4) "sol_get_return_data"
576 : Get the return data and program id associated with it.
577 : Requires a valid runtime instruction context in vm->instr_ctx.
578 :
579 : Inputs:
580 :
581 : r1 - dst, byte VM pointer, indexed [0,dst_max),
582 : r2 - dst_max, may be 0,
583 : r3 - program_id, byte VM pointer, indexed [0,32)
584 : r4 - ignored
585 : r5 - ignored
586 :
587 : Return:
588 :
589 : FD_VM_SYSCALL_ERR_COMPUTE_BUDGET_EXCEEDED: insufficient compute
590 : budget. vm->reg[0] unchanged. vm->cu==0.
591 :
592 : FD_VM_SYSCALL_ERR_COPY_OVERLAPPING: dst and program_id address
593 : ranges overlap. vm->reg[0] unchanged. vm->cu decremented and
594 : vm->cu>=0.
595 :
596 : FD_VM_SYSCALL_ERR_SEGFAULT: bad address range for dst and/or
597 : program_id. vm->reg[0] unchanged. Compute budget decremented.
598 :
599 : FD_VM_SUCCESS: success. vm->reg[0]=return_data_sz. vm->cu decremented
600 : and vm->cu>=0. On return, if return_data_sz and dst_max are non-zero,
601 : dst holds the leading min(return_data_sz,dst_max) bytes of return data
602 : (as such, if return_data_sz>dst_max, the value returned in the buffer was
603 : truncated). Any trailing bytes of dst are unchanged. program_id
604 : holds the program_id associated with the return data.
605 :
606 : If either return_data_sz or dst_max is zero, dst and program_id are
607 : untouched. */
608 :
609 : FD_VM_SYSCALL_DECL( sol_get_return_data );
610 :
611 : /* syscall(a226d3eb) "sol_set_return_data"
612 : Set the return data. The return data will be associated with the
613 : caller's program ID.
614 :
615 : Inputs:
616 :
617 : r1 - src, byte VM pointer, indexed [0,src_sz),
618 : r2 - src_sz, may be 0,
619 : r3 - ignored
620 : r4 - ignored
621 : r5 - ignored
622 :
623 : Return:
624 : FD_VM_SYSCALL_ERR_OUTSIDE_RUNTIME: the VM is not running within the
625 : Solana runtime. vm->reg[0] unchanged. vm->cu unchanged.
626 :
627 : FD_VM_SYSCALL_ERR_COMPUTE_BUDGET_EXCEEDED: insufficient compute
628 : budget. vm->reg[0] unchanged. vm->cu==0.
629 :
630 : FD_VM_SYSCALL_ERR_RETURN_DATA_TOO_LARGE: src_sz too large. vm->reg[0]
631 : unchanged. vm->cu decremented and vm->cu>=0.
632 :
633 : FD_VM_SYSCALL_ERR_SEGFAULT: bad address range for src. vm->reg[0] unchanged.
634 : vm->cu decremented and vm->cu>=0.
635 :
636 : FD_VM_SUCCESS: success. vm->reg[0]=0. vm->cu decremented and vm->cu>=0. */
637 :
638 : FD_VM_SYSCALL_DECL( sol_set_return_data );
639 :
640 : /* syscall(adb8efc8) "sol_get_processed_sibling_instruction"
641 : Returns the last element from a reverse-ordered list of successfully
642 : processed sibling instructions: the "processed sibling instruction
643 : list".
644 :
645 : For example, given the call flow:
646 : A
647 : B -> C -> D
648 : B -> E
649 : B -> F (current execution point)
650 :
651 : B's processed sibling instruction list is [A]
652 : F's processed sibling instruction list is [E, C]
653 :
654 : This allows the current instruction to know what the last processed
655 : sibling instruction was. This is useful to check that critical
656 : preceding instructions have actually executed: for example, ensuring
657 : that an assert instruction has successfully executed.
658 :
659 : Inputs:
660 :
661 : r1 - index
662 : r2 - result_meta_vaddr, byte VM pointer of the object where
663 : metadata about the last processed sibling instruction will be
664 : stored upon successful execution (the length of the arrays in
665 : the result). Has the type
666 : solana_program::instruction::ProcessedSiblingInstruction
667 : https://github.com/anza-xyz/agave/blob/70089cce5119c9afaeb2986e2ecaa6d4505ec15d/sdk/program/src/instruction.rs#L672-L681
668 : r3 - result_program_id_vaddr, byte VM pointer where the pubkey of
669 : the program ID of the last processed sibling instruction will
670 : be stored upon successful execution
671 : r4 - result_data_vaddr, byte VM pointer where the instruction
672 : data of the last processed sibling instruction will be stored
673 : upon successful execution. The length of the data will be
674 : stored in ProcessedSiblingInstruction.data_len
675 : r5 - result_accounts_vaddr, byte VM pointer where an array of
676 : account meta structures will be stored into upon successful
677 : execution. The length of the data will be stored in
678 : ProcessedSiblingInstruction.accounts_len. Each account meta
679 : has the type solana_program::instruction::AccountMeta
680 : https://github.com/anza-xyz/agave/blob/70089cce5119c9afaeb2986e2ecaa6d4505ec15d/sdk/program/src/instruction.rs#L525-L548
681 :
682 : Return:
683 :
684 : FD_VM_SYSCALL_ERR_COMPUTE_BUDGET_EXCEEDED: insufficient compute
685 : budget. vm->reg[0] unchanged. vm->cu==0.
686 :
687 : FD_VM_SYSCALL_ERR_SEGFAULT: invalid output address range.
688 :
689 : FD_VM_SYSCALL_ERR_COPY_OVERLAPPING: translated output ranges overlap.
690 :
691 : FD_VM_SYSCALL_ERR_INVALID_LENGTH: a translated slice exceeds LONG_MAX.
692 :
693 : FD_EXECUTOR_INSTR_ERR_MISSING_ACC: an instruction account
694 : index is outside the transaction account list.
695 :
696 : FD_VM_SUCCESS: vm->reg[0]==1 if the instruction was found and, vm->reg[0]==0
697 : otherwise. vm->cu decremented and vm->cu>=0. */
698 :
699 :
700 : FD_VM_SYSCALL_DECL( sol_get_processed_sibling_instruction );
701 :
702 : /* fd_vm_syscall_pda **************************************************/
703 :
704 : /* syscall(9377323c) "sol_create_program_address"
705 :
706 : Compute SHA-256 hash of &[&[u8]] .. <program ID> .. <PDA Marker>
707 : and check whether result is an Ed25519 curve point.
708 :
709 : Inputs:
710 :
711 : r1 - seeds, bytes VM pointer, indexed [0,seed_cnt),
712 : r2 - seed_cnt, may be 0,
713 : r3 - program_id, byte VM pointer, indexed [0,32)
714 : r4 - out, byte VM pointer, indexed [0,32)
715 : r5 - ignored
716 :
717 : seed[i] holds the ulong pair
718 : mem, byte VM pointer, indexed [0,sz),
719 : sz, may be 0
720 :
721 : Return:
722 :
723 : FD_VM_SYSCALL_ERR_COMPUTE_BUDGET_EXCEEDED: insufficient compute
724 : budget. vm->reg[0] unchanged. vm->cu==0.
725 :
726 : FD_VM_SYSCALL_ERR_BAD_SEEDS: seed_cnt and/or seed[i].sz too large.
727 : vm->reg[0] unchanged. Compute budget decremented.
728 :
729 : FD_VM_SYSCALL_ERR_SEGFAULT: bad address range for seed, seed[i].mem,
730 : program_id and/or out (including 8-byte alignment for seed if the VM
731 : has check_align set). vm->reg[0] unchanged. vm->cu decremented and
732 : vm->cu>=0.
733 :
734 : FD_VM_SUCCESS: success. If vm->reg[0]==0, a PDA was created and
735 : stored at out. If vm->reg[0]==1, create failed and out was unchanged.
736 : Compute budget decremented. */
737 :
738 : FD_VM_SYSCALL_DECL( sol_create_program_address );
739 :
740 : /* syscall(48504a38) "sol_try_find_program_address"
741 :
742 : Derive program addresses with bump seeds descending from 255 through 1
743 : until a point is found that is not a valid Ed25519 curve point.
744 :
745 : Inputs:
746 :
747 : r1 - seed, ulong pair VM pointer, indexed [0,seed_cnt),
748 : r2 - seed_cnt, may be 0,
749 : r3 - program_id, byte VM pointer, indexed [0,32)
750 : r4 - out, byte VM pointer, indexed [0,32)
751 : r5 - bump_seed, byte VM pointer, indexed [0,1)
752 :
753 : seed[i] holds the ulong pair
754 : mem, byte VM pointer, indexed [0,sz),
755 : sz, may be 0
756 :
757 : Return:
758 :
759 : FD_VM_SYSCALL_ERR_COMPUTE_BUDGET_EXCEEDED: insufficient compute
760 : budget. vm->reg[0] unchanged. vm->cu==0.
761 :
762 : FD_VM_SYSCALL_ERR_BAD_SEEDS: seed_cnt and/or seed[i].sz too large.
763 : vm->reg[0] unchanged. Compute budget decremented.
764 :
765 : FD_VM_SYSCALL_ERR_SEGFAULT: bad address range for seed, seed[i].mem,
766 : program_id, out and/or bump_seed (including 8-byte alignment for
767 : seed if the VM has check_align set). vm->reg[0] unchanged. vm->cu
768 : decremented and vm->cu>=0.
769 :
770 : FD_VM_SYSCALL_ERR_COPY_OVERLAPPING: translated output ranges overlap.
771 :
772 : FD_VM_SYSCALL_ERR_INVALID_LENGTH: a translated slice exceeds LONG_MAX.
773 :
774 : FD_VM_SUCCESS: success. If vm->reg[0]==0, a PDA was found and stored at
775 : out and the suffix stored at bump_seed. If vm->reg[0]==1, no PDA was
776 : found and out and bump_seed were unchanged. Compute budget
777 : decremented. */
778 :
779 : FD_VM_SYSCALL_DECL( sol_try_find_program_address );
780 :
781 : /* fd_vm_syscall_cpi **************************************************/
782 :
783 : /* Prepare instruction method */
784 : /* FIXME: DOES THIS GO HERE? MAYBE GROUP WITH ADMIN OR OUTSIDE SYSCALL? */
785 :
786 : int
787 : fd_vm_prepare_instruction( fd_instr_info_t * callee_instr,
788 : fd_exec_instr_ctx_t * instr_ctx,
789 : fd_pubkey_t const * callee_program_id_pubkey,
790 : fd_pubkey_t const instr_acct_keys[ FD_TXN_INSTR_ACCT_MAX ],
791 : fd_instruction_account_t instruction_accounts[ FD_TXN_INSTR_ACCT_MAX ],
792 : ulong * instruction_accounts_cnt,
793 : fd_pubkey_t const * signers,
794 : ulong signers_cnt );
795 :
796 : /* syscall(a22b9c85) "sol_invoke_signed_c"
797 : Dispatch a cross program invocation. Inputs are in C ABI.
798 :
799 : FIXME: BELT SAND AND DOCUMENT */
800 :
801 : FD_VM_SYSCALL_DECL( cpi_c );
802 :
803 : /* syscall(d7449092) "sol_invoke_signed_rust"
804 : Dispatch a cross program invocation. Inputs are in Rust ABI.
805 :
806 : FIXME: BELT SAND AND DOCUMENT */
807 :
808 : FD_VM_SYSCALL_DECL( cpi_rust );
809 :
810 : /* fd_vm_syscall_crypto ***********************************************/
811 :
812 : /* FD_VM_SYSCALL_SOL_ALT_BN128_{ADD,SUB,MUL,PAIRING} specifies the curve operation. */
813 :
814 310 : #define FD_VM_SYSCALL_SOL_ALT_BN128_G1_ADD_BE ( 0UL) /* add */
815 : #define FD_VM_SYSCALL_SOL_ALT_BN128_G1_SUB_BE ( 1UL) /* add inverse */
816 7345 : #define FD_VM_SYSCALL_SOL_ALT_BN128_G1_MUL_BE ( 2UL) /* scalar mult */
817 2154 : #define FD_VM_SYSCALL_SOL_ALT_BN128_PAIRING_BE ( 3UL) /* pairing */
818 187 : #define FD_VM_SYSCALL_SOL_ALT_BN128_G2_ADD_BE ( 4UL) /* add */
819 : #define FD_VM_SYSCALL_SOL_ALT_BN128_G2_SUB_BE ( 5UL) /* add inverse */
820 155 : #define FD_VM_SYSCALL_SOL_ALT_BN128_G2_MUL_BE ( 6UL) /* scalar mult */
821 11429 : #define FD_VM_SYSCALL_SOL_ALT_BN128_LITTLE_ENDIAN_FLAG ( 0x80) /* little endian (SIMD-0284) */
822 187 : #define FD_VM_SYSCALL_SOL_ALT_BN128_G1_ADD_LE ( FD_VM_SYSCALL_SOL_ALT_BN128_G1_ADD_BE | FD_VM_SYSCALL_SOL_ALT_BN128_LITTLE_ENDIAN_FLAG )
823 3707 : #define FD_VM_SYSCALL_SOL_ALT_BN128_G1_MUL_LE ( FD_VM_SYSCALL_SOL_ALT_BN128_G1_MUL_BE | FD_VM_SYSCALL_SOL_ALT_BN128_LITTLE_ENDIAN_FLAG )
824 1107 : #define FD_VM_SYSCALL_SOL_ALT_BN128_PAIRING_LE ( FD_VM_SYSCALL_SOL_ALT_BN128_PAIRING_BE | FD_VM_SYSCALL_SOL_ALT_BN128_LITTLE_ENDIAN_FLAG )
825 125 : #define FD_VM_SYSCALL_SOL_ALT_BN128_G2_ADD_LE ( FD_VM_SYSCALL_SOL_ALT_BN128_G2_ADD_BE | FD_VM_SYSCALL_SOL_ALT_BN128_LITTLE_ENDIAN_FLAG )
826 107 : #define FD_VM_SYSCALL_SOL_ALT_BN128_G2_MUL_LE ( FD_VM_SYSCALL_SOL_ALT_BN128_G2_MUL_BE | FD_VM_SYSCALL_SOL_ALT_BN128_LITTLE_ENDIAN_FLAG )
827 :
828 : /* FD_VM_SYSCALL_SOL_ALT_BN128_{...}COMPRESS specifies the (de)compress operation. */
829 :
830 1015 : #define FD_VM_SYSCALL_SOL_ALT_BN128_G1_COMPRESS_BE ( 0UL) /* compress point in G1 */
831 1006 : #define FD_VM_SYSCALL_SOL_ALT_BN128_G1_DECOMPRESS_BE ( 1UL) /* decompress point in G1 */
832 1244 : #define FD_VM_SYSCALL_SOL_ALT_BN128_G2_COMPRESS_BE ( 2UL) /* compress point in G2 */
833 1286 : #define FD_VM_SYSCALL_SOL_ALT_BN128_G2_DECOMPRESS_BE ( 3UL) /* decompress point in G2 */
834 542 : #define FD_VM_SYSCALL_SOL_ALT_BN128_G1_COMPRESS_LE ( FD_VM_SYSCALL_SOL_ALT_BN128_G1_COMPRESS_BE | FD_VM_SYSCALL_SOL_ALT_BN128_LITTLE_ENDIAN_FLAG )
835 535 : #define FD_VM_SYSCALL_SOL_ALT_BN128_G1_DECOMPRESS_LE ( FD_VM_SYSCALL_SOL_ALT_BN128_G1_DECOMPRESS_BE | FD_VM_SYSCALL_SOL_ALT_BN128_LITTLE_ENDIAN_FLAG )
836 657 : #define FD_VM_SYSCALL_SOL_ALT_BN128_G2_COMPRESS_LE ( FD_VM_SYSCALL_SOL_ALT_BN128_G2_COMPRESS_BE | FD_VM_SYSCALL_SOL_ALT_BN128_LITTLE_ENDIAN_FLAG )
837 671 : #define FD_VM_SYSCALL_SOL_ALT_BN128_G2_DECOMPRESS_LE ( FD_VM_SYSCALL_SOL_ALT_BN128_G2_DECOMPRESS_BE | FD_VM_SYSCALL_SOL_ALT_BN128_LITTLE_ENDIAN_FLAG )
838 :
839 : /* FD_VM_SYSCALL_SOL_ALT_BN128_{...}_SZ specifies the size of inputs/outputs for the Alt_BN128 curve. */
840 :
841 2217 : #define FD_VM_SYSCALL_SOL_ALT_BN128_G1_SZ ( 64UL) /* size of a point in G1 */
842 274 : #define FD_VM_SYSCALL_SOL_ALT_BN128_G1_COMPRESSED_SZ ( 32UL) /* size of a compressed point in G2 */
843 458 : #define FD_VM_SYSCALL_SOL_ALT_BN128_G2_SZ (128UL) /* size of a point in G2 */
844 331 : #define FD_VM_SYSCALL_SOL_ALT_BN128_G2_COMPRESSED_SZ ( 64UL) /* size of a compressed point in G2 */
845 558 : #define FD_VM_SYSCALL_SOL_ALT_BN128_PAIRING_INPUT_EL_SZ (192UL) /* size of G1 + G2 */
846 1116 : #define FD_VM_SYSCALL_SOL_ALT_BN128_PAIRING_OUTPUT_SZ ( 32UL) /* size of pairing syscall result, i.e. 0 or 1 as 256-bit int ¯\_(ツ)_/¯ */
847 :
848 : /* syscall(ae0c318b) sol_alt_bn128_group_op computes operations on the Alt_BN128 curve,
849 : including point addition in G1, scalar multiplication in G1, and pairing.
850 : See SIMD-0129.
851 :
852 : FIXME: DOCUMENT */
853 :
854 : FD_VM_SYSCALL_DECL( sol_alt_bn128_group_op );
855 :
856 : /* syscall(334fd5ed) sol_alt_bn128_compression allows to compress or decompress points
857 : in G1 or G2 groups over the Alt_BN128 curve.
858 : See SIMD-0129.
859 :
860 : FIXME: DOCUMENT */
861 :
862 : FD_VM_SYSCALL_DECL( sol_alt_bn128_compression );
863 :
864 : /* syscall(d7793abb) "sol_keccak256"
865 : syscall(11f49d86) "sol_sha256"
866 :
867 : Inputs:
868 :
869 : arg0 - slice, ulong pair VM pointer, indexed [0,cnt), FIXME: WHEN IS NULL OKAY?
870 : arg1 - cnt, FIXME: IS 0 OKAY?
871 : arg2 - hash, byte VM pointer, indexed [0,32)
872 : arg3 - ignored
873 : arg4 - ignored
874 :
875 : slice[i] holds the ulong pair:
876 : mem, byte vector VM pointer, indexed [0,sz), FIXME: WHEN IS NULL OKAY?
877 : sz, FIXME: IS 0 OKAY?
878 :
879 : Return:
880 :
881 : FD_VM_ERR_INVAL: cnt too large. vm->reg[0] unchanged.
882 :
883 : FD_VM_SYSCALL_ERR_COMPUTE_BUDGET_EXCEEDED: insufficient compute budget.
884 : vm->reg[0] unchanged. Compute budget decremented.
885 :
886 : FD_VM_SYSCALL_ERR_SEGFAULT: bad address range for slice, hash and/or
887 : slice[i].addr (including slice not 8 byte aligned if the VM has
888 : check_align set). vm->reg[0] unchanged. Compute budget decremented.
889 :
890 : FD_VM_SUCCESS: success. vm->reg[0]=0 and hash[i] holds the hash of the
891 : concatenation of the slices. Compute budget decremented. */
892 :
893 : FD_VM_SYSCALL_DECL( sol_keccak256 );
894 : FD_VM_SYSCALL_DECL( sol_sha256 );
895 : FD_VM_SYSCALL_DECL( sol_sha512 );
896 :
897 : /* syscall(c4947c21) sol_poseidon computes the Poseidon hash on an array of input values.
898 : See SIMD-0129.
899 :
900 : FIXME: DOCUMENT */
901 :
902 : #define FD_VM_SYSCALL_SOL_POSEIDON_MAX_VALS 12UL
903 :
904 : FD_VM_SYSCALL_DECL( sol_poseidon ); /* Light protocol flavor */
905 :
906 : /* syscall(17e40350) "sol_secp256k1_recover"
907 :
908 : FIXME: BELT SAND AND DOCUMENT */
909 :
910 : FD_VM_SYSCALL_DECL( sol_secp256k1_recover );
911 :
912 : /* syscall "sol_big_mod_exp" (SIMD-0529)
913 :
914 : result := (base ^ exponent) mod modulus, where all operands are
915 : little-endian and the modulus is odd and > 1. r1 is a vaddr to a
916 : BigModExpParams record; r2 is a vaddr to the result buffer. Gated
917 : behind the enable_big_mod_exp_syscall feature. */
918 :
919 : FD_VM_SYSCALL_DECL( sol_big_mod_exp );
920 :
921 : /* fd_vm_syscall_curve ************************************************/
922 :
923 : /* FD_VM_SYSCALL_SOL_CURVE_CURVE25519_{...} specifies the curve ID */
924 :
925 811 : #define FD_VM_SYSCALL_SOL_CURVE_CURVE25519_EDWARDS ( 0UL ) /* ed25519 */
926 768 : #define FD_VM_SYSCALL_SOL_CURVE_CURVE25519_RISTRETTO ( 1UL ) /* ristretto255 */
927 65 : #define FD_VM_SYSCALL_SOL_CURVE_BLS12_381_BE ( 4UL | 0x80 ) /* bls12-381 big endian */
928 138 : #define FD_VM_SYSCALL_SOL_CURVE_BLS12_381_LE ( 4UL ) /* bls12-381 little endian */
929 147 : #define FD_VM_SYSCALL_SOL_CURVE_BLS12_381_G1_BE ( 5UL | 0x80 ) /* bls12-381 G1 big endian */
930 313 : #define FD_VM_SYSCALL_SOL_CURVE_BLS12_381_G1_LE ( 5UL ) /* bls12-381 G1 little endian */
931 145 : #define FD_VM_SYSCALL_SOL_CURVE_BLS12_381_G2_BE ( 6UL | 0x80 ) /* bls12-381 G2 big endian */
932 319 : #define FD_VM_SYSCALL_SOL_CURVE_BLS12_381_G2_LE ( 6UL ) /* bls12-381 G2 little endian */
933 0 : #define FD_VM_SYSCALL_SOL_CURVE_SECP256R1_BE ( 7UL | 0x80 ) /* secp256r1 big endian */
934 0 : #define FD_VM_SYSCALL_SOL_CURVE_SECP256R1_LE ( 7UL ) /* secp256r1 little endian */
935 :
936 : /* FD_VM_SYSCALL_SOL_CURVE_{...} specifies the curve operation */
937 :
938 194 : #define FD_VM_SYSCALL_SOL_CURVE_ADD ( 0UL) /* add */
939 197 : #define FD_VM_SYSCALL_SOL_CURVE_SUB ( 1UL) /* add inverse */
940 248 : #define FD_VM_SYSCALL_SOL_CURVE_MUL ( 2UL) /* scalar mul */
941 :
942 : /* FD_VM_SYSCALL_SOL_CURVE_{...}_SZ specifies the size of inputs/outputs. */
943 :
944 777 : #define FD_VM_SYSCALL_SOL_CURVE_CURVE25519_POINT_SZ (32UL) /* point (compressed) */
945 777 : #define FD_VM_SYSCALL_SOL_CURVE_CURVE25519_SCALAR_SZ (32UL) /* scalar */
946 : #define FD_VM_SYSCALL_SOL_CURVE_BLS12_381_G1_COMPRESSED_SZ (48UL) /* G1 point (compressed) */
947 518 : #define FD_VM_SYSCALL_SOL_CURVE_BLS12_381_G1_POINT_SZ (96UL) /* G1 point (uncompressed) */
948 : #define FD_VM_SYSCALL_SOL_CURVE_BLS12_381_G2_COMPRESSED_SZ (2*48UL) /* G2 point (compressed) */
949 514 : #define FD_VM_SYSCALL_SOL_CURVE_BLS12_381_G2_POINT_SZ (2*96UL) /* G2 point (uncompressed) */
950 90 : #define FD_VM_SYSCALL_SOL_CURVE_BLS12_381_GT_ELE_SZ (12*48UL) /* GT element */
951 : #define FD_VM_SYSCALL_SOL_CURVE_SECP256R1_COMPRESSED_SZ (33UL) /* point (compressed) */
952 0 : #define FD_VM_SYSCALL_SOL_CURVE_SECP256R1_POINT_SZ (64UL) /* point (uncompressed) */
953 0 : #define FD_VM_SYSCALL_SOL_CURVE_SECP256R1_SCALAR_SZ (32UL) /* scalar */
954 :
955 : /* syscall(aa2607ca) sol_curve_validate_point
956 :
957 : Inputs:
958 :
959 : arg0 - curve_id
960 : arg1 - point_addr
961 : arg2 - ignored
962 : arg3 - ignored
963 : arg4 - ignored
964 :
965 : Return:
966 :
967 : FD_VM_SYSCALL_ERR_INVALID_ATTRIBUTE: invalid curve_id.
968 :
969 : FD_VM_SYSCALL_ERR_COMPUTE_BUDGET_EXCEEDED: insufficient compute budget.
970 : vm->reg[0] unchanged. Compute budget decremented.
971 :
972 : FD_VM_SYSCALL_ERR_SEGFAULT: bad address range for point_addr
973 : vm->reg[0] unchanged. Compute budget decremented.
974 :
975 : FD_VM_SUCCESS: success. vm->reg[0]=0 point is valid.
976 : vm->reg[0]=1 point is invalid. */
977 :
978 : FD_VM_SYSCALL_DECL( sol_curve_validate_point );
979 :
980 : /* syscall(dd1c41a6) sol_curve_group_op
981 :
982 : Inputs:
983 :
984 : arg0 - curve_id
985 : arg1 - group_op
986 : arg2 - left_input_addr
987 : arg3 - right_input_addr
988 : arg4 - result_point_addr
989 :
990 : Return:
991 :
992 : FD_VM_SYSCALL_ERR_INVALID_ATTRIBUTE: invalid curve_id/group_op.
993 :
994 : FD_VM_SYSCALL_ERR_COMPUTE_BUDGET_EXCEEDED: insufficient compute budget.
995 : vm->reg[0] unchanged. Compute budget decremented.
996 :
997 : FD_VM_SYSCALL_ERR_SEGFAULT: bad address range for left_input_addr,
998 : right_input_addr or result_point_addr.
999 : vm->reg[0] unchanged. Compute budget decremented.
1000 :
1001 : FD_VM_SUCCESS: success. vm->reg[0]=0 success, result written at result_point_addr.
1002 : vm->reg[0]=1 input validation failed, memory at
1003 : result_point_addr unchanged. */
1004 :
1005 : FD_VM_SYSCALL_DECL( sol_curve_group_op );
1006 :
1007 : /* syscall(60a40880) sol_curve_multiscalar_mul
1008 :
1009 : Inputs:
1010 :
1011 : arg0 - curve_id
1012 : arg1 - scalars_addr
1013 : arg2 - points_addr
1014 : arg3 - points_len
1015 : arg4 - result_point_addr
1016 :
1017 : Return:
1018 :
1019 : FD_VM_SYSCALL_ERR_INVALID_ATTRIBUTE: invalid curve_id/group_op.
1020 :
1021 : FD_VM_SYSCALL_ERR_COMPUTE_BUDGET_EXCEEDED: insufficient compute budget.
1022 : vm->reg[0] unchanged. Compute budget decremented.
1023 :
1024 : FD_VM_SYSCALL_ERR_SEGFAULT: bad address range for scalars_addr or
1025 : points_addr.
1026 : vm->reg[0] unchanged. Compute budget decremented.
1027 :
1028 : FD_VM_SUCCESS: success. vm->reg[0]=0 success, result written at result_point_addr.
1029 : vm->reg[0]=1 input validation failed, memory at
1030 : result_point_addr unchanged. */
1031 :
1032 : FD_VM_SYSCALL_DECL( sol_curve_multiscalar_mul );
1033 :
1034 : /* syscall(80c98b0) sol_curve_decompress
1035 :
1036 : Inputs:
1037 :
1038 : arg0 - curve_id
1039 : arg1 - point_addr, compressed BLS12-381 point selected by curve_id
1040 : arg2 - result_addr, uncompressed BLS12-381 point
1041 : arg3 - ignored
1042 : arg4 - ignored
1043 :
1044 : Return:
1045 :
1046 : FD_VM_SYSCALL_ERR_INVALID_ATTRIBUTE: invalid curve_id/group_op.
1047 :
1048 : FD_VM_SYSCALL_ERR_COMPUTE_BUDGET_EXCEEDED: insufficient compute budget.
1049 : vm->reg[0] unchanged. Compute budget decremented.
1050 :
1051 : FD_VM_SYSCALL_ERR_SEGFAULT: bad address range for point_addr or
1052 : result_addr.
1053 : vm->reg[0] unchanged. Compute budget decremented.
1054 :
1055 : FD_VM_SUCCESS: success. vm->reg[0]=0 success, result written at result_addr.
1056 : vm->reg[0]=1 input validation failed, memory at
1057 : result_addr unchanged. */
1058 :
1059 : FD_VM_SYSCALL_DECL( sol_curve_decompress );
1060 :
1061 : /* syscall(f111a47e) sol_curve_pairing_map
1062 :
1063 : Inputs:
1064 :
1065 : arg0 - curve_id
1066 : arg1 - num_pairs
1067 : arg2 - g1_points_addr
1068 : arg3 - g2_points_addr
1069 : arg4 - result_addr
1070 :
1071 : Return:
1072 :
1073 : FD_VM_SYSCALL_ERR_INVALID_ATTRIBUTE: invalid curve_id/group_op.
1074 :
1075 : FD_VM_SYSCALL_ERR_COMPUTE_BUDGET_EXCEEDED: insufficient compute budget.
1076 : vm->reg[0] unchanged. Compute budget decremented.
1077 :
1078 : FD_VM_SYSCALL_ERR_SEGFAULT: bad address range for g1_points_addr,
1079 : g2_points_addr or result_addr.
1080 : vm->reg[0] unchanged. Compute budget decremented.
1081 :
1082 : FD_VM_SUCCESS: success. vm->reg[0]=0 success, result written at result_addr.
1083 : vm->reg[0]=1 input validation failed, memory at
1084 : result_addr unchanged. */
1085 :
1086 : FD_VM_SYSCALL_DECL( sol_curve_pairing_map );
1087 :
1088 : int
1089 : fd_vm_derive_pda( fd_vm_t * vm,
1090 : fd_pubkey_t const * program_id,
1091 : void const * * seed_haddrs,
1092 : ulong * seed_szs,
1093 : ulong seeds_cnt,
1094 : uchar * bump_seed,
1095 : fd_pubkey_t * out );
1096 :
1097 : int
1098 : fd_vm_translate_and_check_program_address_inputs( fd_vm_t * vm,
1099 : ulong seeds_vaddr,
1100 : ulong seeds_cnt,
1101 : ulong program_id_vaddr,
1102 : void const * * out_seed_haddrs,
1103 : ulong * out_seed_szs,
1104 : fd_pubkey_t const * * out_program_id,
1105 : uchar is_syscall );
1106 : FD_PROTOTYPES_END
1107 :
1108 : #endif /* HEADER_src_flamenco_vm_syscall_fd_vm_syscall_h */
|