Разработка программ на блокчейне Solana имеет некоторые присущие ей ограничения. Ниже приведен список распространенных ограничений, с которыми вы можете столкнуться.
Библиотеки Rust
Поскольку программы на основе Rust, работающие в блокчейне, должны быть детерминированными в условиях ограниченных ресурсов и однопоточной среды, они имеют некоторые ограничения на использование различных библиотек.
Программы на Rust, работающие в блокчейне, поддерживают большую часть библиотек Rust: libstd, libcore и liballoc, а также многие сторонние библиотеки (crates).
Существуют некоторые ограничения, так как эти программы работают в условиях ограниченных ресурсов, однопоточной среды и должны быть детерминированными:
- Нет доступа к
randstd::fsstd::netstd::futurestd::processstd::syncstd::taskstd::threadstd::time
- Ограниченный доступ к:
std::hashstd::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?