Ограничения
Разработка программ на блокчейне Solana имеет некоторые присущие ей ограничения. Ниже приведен список распространенных ограничений, с которыми вы можете столкнуться.
Библиотеки Rust
Поскольку программы на основе Rust, работающие в блокчейне, должны быть детерминированными и выполняться в условиях ограниченных ресурсов и однопоточной среды, они имеют некоторые ограничения на использование различных библиотек.
Программы на Rust, работающие в блокчейне, поддерживают большую часть библиотек Rust: libstd, libcore и liballoc, а также многие сторонние библиотеки (crates).
Существуют некоторые ограничения, так как эти программы работают в условиях ограниченных ресурсов, однопоточной среды и должны быть детерминированными:
- Нет доступа к:
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
Кросс-программные вызовы позволяют программам напрямую вызывать другие
программы, но глубина в настоящее время ограничена до 4
.
Когда программа превышает допустимую
глубину вызовов кросс-программных вызовов, она получит ошибку
CallDepth
.
Поддержка типов с плавающей точкой в Rust
Программы поддерживают ограниченный набор операций с плавающей точкой в Rust. Если программа пытается использовать неподдерживаемую операцию с плавающей точкой, среда выполнения сообщит об ошибке неразрешённого символа.
Операции с плавающей точкой выполняются через программные библиотеки, в частности встроенные функции LLVM для работы с числами с плавающей точкой. Из-за программной эмуляции они потребляют больше вычислительных единиц, чем операции с целыми числами. В общем случае рекомендуется использовать операции с фиксированной точкой, если это возможно.
Тесты математической библиотеки Solana Program Library покажут производительность некоторых математических операций. Чтобы запустить тест, синхронизируйте репозиторий и выполните:
cargo test-sbf -- --nocapture --test-threads=1
Недавние результаты показывают, что операции с плавающей точкой требуют больше инструкций по сравнению с эквивалентами для целых чисел. Реализации с фиксированной точкой могут варьироваться, но также будут менее затратными, чем эквиваленты с плавающей точкой:
u64 f32Multiply 8 176Divide 9 219
Статические изменяемые данные
Общие объекты программ не поддерживают изменяемые общие данные. Программы используются совместно в нескольких параллельных выполнениях с использованием одного и того же общего кода и данных только для чтения. Это означает, что разработчикам не следует включать в программы статические изменяемые или глобальные переменные. В будущем может быть добавлен механизм копирования при записи для поддержки изменяемых данных.
Деление со знаком
Набор инструкций SBF не поддерживает деление со знаком.
Is this page helpful?