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