Документація 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?