Документация SolanaРазработка программ

Ограничения

Разработка программ на блокчейне 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 f32
Multiply 8 176
Divide 9 219

Статические записываемые данные

Программные общие объекты не поддерживают записываемые общие данные. Программы используются совместно между несколькими параллельными выполнениями, используя один и тот же общий код и данные только для чтения. Это означает, что разработчики не должны включать в программы статические записываемые или глобальные переменные. В будущем может быть добавлен механизм копирования при записи для поддержки записываемых данных.

Деление со знаком

Набор инструкций SBF не поддерживает деление со знаком.

Is this page helpful?