Syscall 参考

概要

程序通过 syscall 与运行时交互,涵盖日志、哈希、 加密、CPI、sysvars、内存操作等。每次调用都会从交易的共享预算中扣除计算单元。

Syscall

程序通过在 create_program_runtime_environment_v1() 注册的 syscall 与运行时交互。每个 syscall 都会从交易的计算预算中扣除计算单元。

Syscall 成本

每个 syscall 的基础计算单元成本常量定义在 SVMTransactionExecutionCost。部分 syscall 在实现中会将这些常量组合为更复杂的公式(例如,随输入大小变化或增加 syscall_base_cost 的开销)。具体成本计算请参见下方各 syscall 源码链接。

可用的 syscall

sBPF 程序可用的所有 syscall,均注册于 create_program_runtime_environment_v1()。带有功能门控的 syscall 仅在对应功能在集群上激活时可用。

控制流

Syscall描述源码
abort立即终止程序。由 LLVM 在不可恢复条件下插入;不建议显式使用。SyscallAbort
sol_panic_终止程序并输出文件名、行号和列号以便诊断。SyscallPanic

日志

Syscall描述源码
sol_log_将 UTF-8 字符串消息记录到程序日志。SyscallLog
sol_log_64_以十六进制形式将五个 u64 值记录到程序日志。SyscallLogU64
sol_log_pubkeyPubkey 以 base58 字符串形式记录到程序日志。SyscallLogPubkey
sol_log_compute_units_记录剩余计算单元到程序日志。SyscallLogBpfComputeUnits
sol_log_data以 base64 编码形式记录任意字节切片数据。SyscallLogData

PDA

系统调用描述源码
sol_create_program_address根据种子和程序 ID 派生程序地址。如果派生出的地址位于 Ed25519 曲线上,则返回 1(无效 PDA)。SyscallCreateProgramAddress
sol_try_find_program_address通过从 255 递减到 1 迭代 bump 种子,查找有效的 PDA。返回地址和 bump。SyscallTryFindProgramAddress

哈希

系统调用描述源码
sol_sha256对一个或多个字节切片计算 SHA-256 哈希。SyscallHash<Sha256Hasher>
sol_keccak256对一个或多个字节切片计算 Keccak-256 哈希。SyscallHash<Keccak256Hasher>
sol_blake3对一个或多个字节切片计算 Blake3 哈希。需特性开启。SyscallHash<Blake3Hasher>
sol_poseidon对输入计算 Poseidon 哈希。需特性开启。SyscallPoseidon

密码学

系统调用描述源码
sol_secp256k1_recover从签名消息哈希和恢复 ID 恢复 secp256k1 公钥。SyscallSecp256k1Recover
sol_curve_validate_point验证字节数组是否为 Curve25519(Edwards 或 Ristretto)上的有效点。需特性开启。SyscallCurvePointValidation
sol_curve_group_op对 Curve25519 Edwards 或 Ristretto 点执行群操作(加、减、乘)。需特性开启。SyscallCurveGroupOps
sol_curve_multiscalar_mul对 Curve25519 Edwards 或 Ristretto 点执行多标量乘法。需特性开启。SyscallCurveMultiscalarMultiplication
sol_alt_bn128_group_op执行 alt_bn128(BN254)群操作:G1 加法、G1 乘法和配对检查。需特性开启。SyscallAltBn128
sol_alt_bn128_compression压缩和解压 alt_bn128 G1 和 G2 点。需特性开启。SyscallAltBn128Compression
sol_big_mod_exp计算大整数模幂(base^exp mod modulus)。需特性开启。SyscallBigModExp

CPI

系统调用描述来源
sol_invoke_signed_rust从 Rust 程序调用跨程序指令。使用 Rust ABI 对指令、账户和签名者种子进行序列化。SyscallInvokeSignedRust
sol_invoke_signed_c从 C 程序调用跨程序指令。序列化时使用 C SolInstruction ABI。SyscallInvokeSignedC

系统变量

系统调用描述来源
sol_get_clock_sysvar将 Clock 系统变量写入程序提供的缓冲区。SyscallGetClockSysvar
sol_get_epoch_schedule_sysvar将 EpochSchedule 系统变量写入程序提供的缓冲区。SyscallGetEpochScheduleSysvar
sol_get_rent_sysvar将 Rent 系统变量写入程序提供的缓冲区。SyscallGetRentSysvar
sol_get_epoch_rewards_sysvar将 EpochRewards 系统变量写入程序提供的缓冲区。SyscallGetEpochRewardsSysvar
sol_get_last_restart_slot将 LastRestartSlot 系统变量写入程序提供的缓冲区。受功能开关控制。SyscallGetLastRestartSlotSysvar
sol_get_fees_sysvar将已弃用的 Fees 系统变量写入程序提供的缓冲区。受功能开关控制(已弃用)。SyscallGetFeesSysvar
sol_get_sysvar通用系统变量访问:通过 pubkey、偏移量和长度从任何缓存的系统变量中读取字节切片(SIMD-0127)。受功能开关控制。SyscallGetSysvar

内存操作

系统调用描述来源
sol_memcpy_从源地址复制 n 字节到目标地址。如果区域在虚拟机地址空间中重叠则中止。SyscallMemcpy
sol_memmove_从源地址复制 n 字节到目标地址,正确处理重叠区域。SyscallMemmove
sol_memcmp_比较两个内存区域的 n 字节。将结果(第一个不同字节的比较结果)写入结果地址。SyscallMemcmp
sol_memset_用指定字节值填充内存区域的 n 字节。SyscallMemset

程序数据

Syscall描述来源
sol_set_return_data为当前指令设置返回数据(最大 1,024 字节)。CPI 返回后,调用方可读取。SyscallSetReturnData
sol_get_return_data读取最近一次 CPI 设置的返回数据。返回数据长度和设置该数据的程序 ID。SyscallGetReturnData
sol_get_processed_sibling_instruction获取同一堆栈高度下先前执行的兄弟指令(按反向索引)。返回程序 ID、数据和账户元信息。SyscallGetProcessedSiblingInstruction
sol_get_stack_height返回当前调用堆栈高度。高度 1 = 顶层指令,每次 CPI 增加 1。SyscallGetStackHeight

计算

Syscall描述来源
sol_remaining_compute_units返回交易预算中剩余的计算单元数。受功能门控。SyscallRemainingComputeUnits

Epoch stake

Syscall描述来源
sol_get_epoch_stake返回当前 epoch 的集群总质押(空指针)或指定投票账户的委托质押(SIMD-0133)。受功能门控。SyscallGetEpochStake

内存分配

Syscall描述来源
sol_alloc_free_用于动态内存分配的传统 bump 分配器。新部署已禁用,仅对功能门控前部署的程序可用。SyscallAllocFree

Is this page helpful?

Table of Contents

Edit Page

管理者

©️ 2026 Solana 基金会版权所有
取得联系