Кратко
Программы взаимодействуют с рантаймом через системные вызовы, охватывающие логирование, хеширование, криптографию, CPI, sysvars, операции с памятью и многое другое. Каждый из них списывает вычислительные единицы из общего бюджета транзакции.
Системные вызовы (syscalls)
Программы взаимодействуют с рантаймом через системные вызовы, зарегистрированные
в
create_program_runtime_environment_v1().
Каждый системный вызов списывает вычислительные единицы из вычислительного
бюджета транзакции.
Стоимость системных вызовов
Базовые значения стоимости вычислительных единиц для каждого системного вызова
определены в
SVMTransactionExecutionCost.
Некоторые вызовы комбинируют эти значения в более сложные формулы в своей
реализации (например, масштабируются в зависимости от размера входных данных или
добавляют syscall_base_cost накладные расходы). Точные расчёты стоимости
смотрите по ссылкам на исходный код ниже.
Доступные системные вызовы
Полный набор системных вызовов, доступных программам sBPF, как зарегистрировано
в
create_program_runtime_environment_v1().
Вызовы, ограниченные фичами, доступны только при активной соответствующей
функции в кластере.
Управление потоком выполнения
| Системный вызов | Описание | Исходный код |
|---|---|---|
abort | Немедленно завершает выполнение программы. Вставляется LLVM при неразрешимых условиях; не предназначен для явного использования. | SyscallAbort |
sol_panic_ | Завершает выполнение программы с указанием имени файла, строки и столбца для диагностики. | SyscallPanic |
Логирование
| Системный вызов | Описание | Исходный код |
|---|---|---|
sol_log_ | Записывает строку в формате UTF-8 в лог программы. | SyscallLog |
sol_log_64_ | Записывает пять значений u64 в лог программы в виде hex. | SyscallLogU64 |
sol_log_pubkey | Записывает Pubkey как строку в формате base58 в лог программы. | SyscallLogPubkey |
sol_log_compute_units_ | Записывает оставшееся количество вычислительных единиц в лог программы. | SyscallLogBpfComputeUnits |
sol_log_data | Записывает произвольные байтовые срезы в лог программы в виде данных, закодированных в base64. | SyscallLogData |
PDA
| Системный вызов | Описание | Исходный код |
|---|---|---|
sol_create_program_address | Получает адрес программы из сидов и идентификатора программы. Возвращает 1, если полученный адрес находится на кривой Ed25519 (некорректный PDA). | SyscallCreateProgramAddress |
sol_try_find_program_address | Находит корректный PDA, перебирая bump seed от 255 до 1. Возвращает адрес и 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 | Восстанавливает публичный ключ secp256k1 из хеша подписанного сообщения и recovery ID. | 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-программы. Сериализует инструкцию, аккаунты и signer seeds с использованием 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 |
Данные программы
| Системный вызов | Описание | Исходный код |
|---|---|---|
sol_set_return_data | Устанавливает возвращаемые данные (максимум 1 024 байта) для текущей инструкции. Доступно вызывающей стороне после возврата CPI. | SyscallSetReturnData |
sol_get_return_data | Читает возвращаемые данные, установленные последним CPI. Возвращает длину данных и program ID, который их установил. | SyscallGetReturnData |
sol_get_processed_sibling_instruction | Получает ранее выполненную соседнюю инструкцию на той же высоте стека (по обратному индексу). Возвращает program ID, данные и метаданные аккаунта. | SyscallGetProcessedSiblingInstruction |
sol_get_stack_height | Возвращает текущую высоту стека вызовов. Высота 1 = инструкция верхнего уровня; каждый CPI увеличивает значение на 1. | SyscallGetStackHeight |
Вычисления
| Системный вызов | Описание | Исходный код |
|---|---|---|
sol_remaining_compute_units | Возвращает количество оставшихся вычислительных единиц в бюджете транзакции. Функция с ограничением по фиче. | SyscallRemainingComputeUnits |
Стейк эпохи
| Системный вызов | Описание | Исходный код |
|---|---|---|
sol_get_epoch_stake | Возвращает общий стейк кластера (нулевой указатель) или делегированный стейк определённого vote аккаунта за текущий epoch (SIMD-0133). Функция с ограничением по фиче. | SyscallGetEpochStake |
Выделение памяти
| Системный вызов | Описание | Исходный код |
|---|---|---|
sol_alloc_free_ | Устаревший bump-аллокатор для динамического выделения памяти. Отключён для новых деплоев; доступен только программам, размещённым до включения фичи. | SyscallAllocFree |
Is this page helpful?