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

Ограничения

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

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

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

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

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

Is this page helpful?