요약
프로그램은 로깅, 해싱, 암호화, CPI, 시스템 변수, 메모리 작업 등을 다루는 시스템 호출을 통해 런타임과 상호작용합니다. 각 시스템 호출은 트랜잭션의 공유 예산에서 컴퓨트 유닛을 차감합니다.
시스템 호출
프로그램은
create_program_runtime_environment_v1()에
등록된 시스템 호출을 통해 런타임과 상호작용합니다. 각 시스템 호출은 트랜잭션의
컴퓨트 예산에서 컴퓨트 유닛을 차감합니다.
시스템 호출 비용
각 시스템 호출의 기본 컴퓨트 유닛 비용 상수는
SVMTransactionExecutionCost에
정의되어 있습니다. 일부 시스템 호출은 구현에서 이러한 상수를 더 복잡한 공식으로
결합합니다(예: 입력 크기에 따라 확장하거나 syscall_base_cost 오버헤드를 추가).
정확한 비용 계산은 아래의 개별 시스템 호출 소스 링크를 참조하세요.
사용 가능한 시스템 호출
create_program_runtime_environment_v1()에
등록된 sBPF 프로그램에서 사용 가능한 전체 시스템 호출 세트입니다. 기능 게이트가
적용된 시스템 호출은 클러스터에서 해당 기능이 활성화된 경우에만 사용할 수
있습니다.
제어 흐름
| 시스템 호출 | 설명 | 소스 |
|---|---|---|
abort | 프로그램을 즉시 중단합니다. LLVM이 지속 불가능한 조건에 대해 삽입하며, 명시적 사용을 위한 것이 아닙니다. | SyscallAbort |
sol_panic_ | 진단을 위해 파일 이름, 줄 번호, 열 번호와 함께 프로그램을 중단합니다. | SyscallPanic |
로깅
| 시스템 호출 | 설명 | 소스 |
|---|---|---|
sol_log_ | UTF-8 문자열 메시지를 프로그램 로그에 기록합니다. | SyscallLog |
sol_log_64_ | 5개의 u64 값을 16진수로 프로그램 로그에 기록합니다. | SyscallLogU64 |
sol_log_pubkey | Pubkey를 base58 문자열로 프로그램 로그에 기록합니다. | SyscallLogPubkey |
sol_log_compute_units_ | 남은 컴퓨트 유닛을 프로그램 로그에 기록합니다. | SyscallLogBpfComputeUnits |
sol_log_data | 임의의 바이트 슬라이스를 base64 인코딩된 데이터로 기록합니다. | SyscallLogData |
PDA
| Syscall | 설명 | 소스 |
|---|---|---|
sol_create_program_address | 시드와 프로그램 ID로부터 프로그램 주소를 파생합니다. 파생된 주소가 Ed25519 곡선 위에 있으면(유효하지 않은 PDA) 1을 반환합니다. | SyscallCreateProgramAddress |
sol_try_find_program_address | 범프 시드를 255부터 1까지 반복하여 유효한 PDA를 찾습니다. 주소와 범프를 반환합니다. | SyscallTryFindProgramAddress |
해싱
| Syscall | 설명 | 소스 |
|---|---|---|
sol_sha256 | 하나 이상의 바이트 슬라이스에 대해 SHA-256 해시를 계산합니다. | SyscallHash<Sha256Hasher> |
sol_keccak256 | 하나 이상의 바이트 슬라이스에 대해 Keccak-256 해시를 계산합니다. | SyscallHash<Keccak256Hasher> |
sol_blake3 | 하나 이상의 바이트 슬라이스에 대해 Blake3 해시를 계산합니다. 기능 게이트됨. | SyscallHash<Blake3Hasher> |
sol_poseidon | 입력에 대해 Poseidon 해시를 계산합니다. 기능 게이트됨. | SyscallPoseidon |
암호화
| Syscall | 설명 | 소스 |
|---|---|---|
sol_secp256k1_recover | 서명된 메시지 해시와 복구 ID로부터 secp256k1 공개 키를 복구합니다. | SyscallSecp256k1Recover |
sol_curve_validate_point | 바이트 배열이 Curve25519(Edwards 또는 Ristretto)의 유효한 점인지 검증합니다. 기능 게이트됨. | SyscallCurvePointValidation |
sol_curve_group_op | Edwards 또는 Ristretto 점에 대해 Curve25519 그룹 연산(덧셈, 뺄셈, 곱셈)을 수행합니다. 기능 게이트됨. | 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
| Syscall | 설명 | 소스 |
|---|---|---|
sol_invoke_signed_rust | Rust 프로그램에서 크로스 프로그램 명령을 호출합니다. Rust ABI를 사용하여 명령, 계정 및 서명자 시드를 직렬화합니다. | SyscallInvokeSignedRust |
sol_invoke_signed_c | C 프로그램에서 크로스 프로그램 명령을 호출합니다. 직렬화를 위해 C SolInstruction ABI를 사용합니다. | SyscallInvokeSignedC |
Sysvars
| Syscall | 설명 | 소스 |
|---|---|---|
sol_get_clock_sysvar | Clock sysvar를 프로그램이 제공한 버퍼에 씁니다. | SyscallGetClockSysvar |
sol_get_epoch_schedule_sysvar | EpochSchedule sysvar를 프로그램이 제공한 버퍼에 씁니다. | SyscallGetEpochScheduleSysvar |
sol_get_rent_sysvar | Rent sysvar를 프로그램이 제공한 버퍼에 씁니다. | SyscallGetRentSysvar |
sol_get_epoch_rewards_sysvar | EpochRewards sysvar를 프로그램이 제공한 버퍼에 씁니다. | SyscallGetEpochRewardsSysvar |
sol_get_last_restart_slot | LastRestartSlot sysvar를 프로그램이 제공한 버퍼에 씁니다. 기능 게이트 적용. | SyscallGetLastRestartSlotSysvar |
sol_get_fees_sysvar | 더 이상 사용되지 않는 Fees sysvar를 프로그램이 제공한 버퍼에 씁니다. 기능 게이트 적용(더 이상 사용되지 않음). | SyscallGetFeesSysvar |
sol_get_sysvar | 일반 sysvar 액세스: pubkey, 오프셋 및 길이로 캐시된 모든 sysvar에서 바이트 슬라이스를 읽습니다(SIMD-0127). 기능 게이트 적용. | SyscallGetSysvar |
메모리 작업
| Syscall | 설명 | 소스 |
|---|---|---|
sol_memcpy_ | 소스에서 대상으로 n 바이트를 복사합니다. VM 주소 공간에서 영역이 겹치면 중단됩니다. | 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에서 설정한 반환 데이터를 읽습니다. 데이터 길이와 이를 설정한 프로그램 ID를 반환합니다. | SyscallGetReturnData |
sol_get_processed_sibling_instruction | 동일한 스택 높이에서 이전에 실행된 형제 명령어를 역순 인덱스로 검색합니다. 프로그램 ID, 데이터 및 계정 메타를 반환합니다. | SyscallGetProcessedSiblingInstruction |
sol_get_stack_height | 현재 호출 스택 높이를 반환합니다. 높이 1 = 최상위 명령어; 각 CPI마다 1씩 증가합니다. | SyscallGetStackHeight |
컴퓨팅
| 시스템 콜 | 설명 | 소스 |
|---|---|---|
sol_remaining_compute_units | 트랜잭션 예산에서 남은 컴퓨팅 유닛 수를 반환합니다. 기능 게이트 적용 대상입니다. | SyscallRemainingComputeUnits |
Epoch 스테이크
| 시스템 콜 | 설명 | 소스 |
|---|---|---|
sol_get_epoch_stake | 전체 클러스터 스테이크(널 포인터) 또는 현재 epoch에 대한 특정 투표 계정의 위임된 스테이크를 반환합니다(SIMD-0133). 기능 게이트 적용 대상입니다. | SyscallGetEpochStake |
메모리 할당
| 시스템 콜 | 설명 | 소스 |
|---|---|---|
sol_alloc_free_ | 동적 메모리 할당을 위한 레거시 범프 할당자입니다. 새로운 배포에서는 비활성화되며, 기능 게이트 이전에 배포된 프로그램에서만 사용할 수 있습니다. | SyscallAllocFree |
Is this page helpful?