제한 사항
Solana 블록체인에서 프로그램을 개발하는 것에는 몇 가지 고유한 제한 사항이 있습니다. 아래는 흔히 마주할 수 있는 제한 사항 목록입니다.
Rust 라이브러리
Rust 기반 온체인 프로그램은 리소스가 제한된 단일 스레드 환경에서 결정적으로 실행되어야 하기 때문에, 다양한 라이브러리 사용에 몇 가지 제한이 있습니다.
온체인 Rust 프로그램은 Rust의 libstd, libcore, liballoc의 대부분과 많은 서드파티 크레이트를 지원합니다.
이러한 프로그램은 리소스가 제한된 단일 스레드 환경에서 실행되며 결정적이어야 하기 때문에 몇 가지 제한 사항이 있습니다:
- 다음에 대한 접근 불가:
rand
std::fs
std::net
std::future
std::process
std::sync
std::task
std::thread
std::time
- 제한된 접근:
std::hash
std::os
- Bincode는 사이클과 호출 깊이 모두에서 매우 계산 비용이 높으므로 피해야 합니다
- 문자열 포맷팅도 계산 비용이 높으므로 피해야 합니다
println!
,print!
지원 안 됨, 대신msg!
매크로를 사용하세요.- 런타임은 하나의 명령어 처리 중 프로그램이 실행할 수 있는 명령어 수에 제한을 적용합니다. 자세한 내용은 계산 예산을 참조하세요.
계산 예산
블록체인의 계산 리소스 남용을 방지하기 위해 각 트랜잭션에는 계산 예산이 할당됩니다. 이 계산 예산을 초과하면 트랜잭션이 실패합니다.
더 자세한 내용은 계산 제약 사항 문서를 참조하세요.
호출 스택 깊이 - CallDepthExceeded
오류
Solana 프로그램은 빠르게 실행되도록 제한되어 있으며, 이를 용이하게 하기 위해 프로그램의 호출 스택은 최대 64 프레임의 깊이로 제한됩니다.
프로그램이 허용된 콜 스택 깊이 제한을 초과하면 CallDepthExceeded
오류가
발생합니다.
CPI 호출 깊이 - CallDepth
오류
Cross Program Invocation을 통해 프로그램은 다른 프로그램을 직접 호출할 수
있지만, 현재 깊이는 4
로 제한되어 있습니다.
프로그램이 허용된 크로스 프로그램 호출 깊이를 초과하면
CallDepth
오류가 발생합니다
Float Rust 타입 지원
프로그램은 Rust의 부동 소수점 연산 중 제한된 하위 집합만 지원합니다. 프로그램이 지원되지 않는 부동 소수점 연산을 사용하려고 하면, 런타임은 해결되지 않은 심볼 오류를 보고합니다.
부동 소수점 연산은 소프트웨어 라이브러리, 특히 LLVM의 부동 소수점 내장 함수를 통해 수행됩니다. 소프트웨어로 에뮬레이션되기 때문에 정수 연산보다 더 많은 컴퓨팅 유닛을 소비합니다. 일반적으로 가능한 경우 고정 소수점 연산이 권장됩니다.
Solana Program Library math 테스트는 일부 수학 연산의 성능을 보고합니다. 테스트를 실행하려면 리포지토리를 동기화하고 다음을 실행하세요:
cargo test-sbf -- --nocapture --test-threads=1
최근 결과에 따르면 부동 소수점 연산은 정수 연산에 비해 더 많은 명령어를 필요로 합니다. 고정 소수점 구현은 다양할 수 있지만 부동 소수점 연산보다 적은 명령어를 사용합니다:
u64 f32Multiply 8 176Divide 9 219
정적 쓰기 가능 데이터
프로그램 공유 객체는 쓰기 가능한 공유 데이터를 지원하지 않습니다. 프로그램은 동일한 공유 읽기 전용 코드와 데이터를 사용하여 여러 병렬 실행 간에 공유됩니다. 이는 개발자가 프로그램에 정적 쓰기 가능 또는 전역 변수를 포함해서는 안 된다는 것을 의미합니다. 향후에는 쓰기 가능한 데이터를 지원하기 위해 복사-쓰기(copy-on-write) 메커니즘이 추가될 수 있습니다.
부호 있는 나눗셈
SBF 명령어 세트는 부호 있는 나눗셈을 지원하지 않습니다.
Is this page helpful?