Чим Sui Move відрізняється від Core Move

У цьому документі описується модель програмування Sui та висвітлюються відмінності між основною (раніше Diem) мовою Move і Move, яку ми використовуємо в Sui. По-перше, пам’ятайте, що Move – це мова, а Sui – платформа.

Загалом код Move, написаний для інших систем, працюватиме в Sui за цими винятками:

Ось короткий перелік основних відмінностей:

  1. Sui використовує свій власний object-centric global storage

  2. Sui об'єкти мають globally unique IDs

Нижче наведено детальний опис кожної зміни.

Об'єктно-орієнтоване глобальне сховище#

У базовій системі Move глобальне сховище є частиною моделі програмування, і до нього можна отримати доступ за допомогою спеціальних операцій, таких як move_to, move_from і багатьох інших операторів глобального сховища. І ресурси, і модулі зберігаються в основному глобальному сховищі Move. Коли ви публікуєте модуль, він зберігається у щойно згенерованій адресі модуля в Move. Коли створюється новий об’єкт (він же ресурс), він також зазвичай зберігається в адресі якогось облікового запису.

Але мережеве сховище дороге та обмежене (не оптимізоване для зберігання та індексування). Поточні блокчейни не можуть масштабуватися, щоб обробляти додатки, які займають велику кількість пам’яті, такі як маркетплейси та соціальні програми.

Тому в Sui Move немає глобального сховища. Жодна з глобальних операцій, пов’язаних із сховищем, не дозволена в Sui Move. (У нас є перевірка байт-коду для виявлення порушень.) Натомість зберігання відбувається виключно в Sui. Коли ми публікуємо модуль, щойно опублікований модуль зберігається в сховищі Sui, а не в сховищі Move. Так само новостворені об’єкти зберігаються в сховищі Sui. Це також означає, що коли нам потрібно прочитати об’єкт у Move, ми не можемо покладатися на глобальні операції зберігання, натомість Sui має явно передати всі об’єкти, до яких потрібно отримати доступ, у Move.

Адреси представляють ідентифікатори об’єктів

У Move є спеціальний тип адреси. Цей тип використовується для представлення адрес облікових записів у базовому Move. Під час роботи з глобальним сховищем Core Move має знати адресу облікового запису. Тип адреси становить 16 байт, що достатньо для базової моделі безпеки Move.

У Sui, оскільки ми не підтримуємо глобальне сховище в Move, нам не потрібен тип адреси для представлення облікових записів користувачів. Замість цього ми використовуємо тип адреси для представлення ідентифікатора об’єкта. Зверніться до файлу object.move у структурі Sui, щоб зрозуміти використання адреси.

Об’єкт із ключовими можливостями, глобально унікальними ідентифікаторами

Нам потрібен спосіб відрізнити об’єкти, які є внутрішніми для Move, і об’єкти, які можна передати через межу Move-Sui (тобто об’єкти, які можна зберігати в сховищі Sui). Це важливо, оскільки ми повинні мати можливість серіалізувати/десеріалізувати об’єкти в межах Move-Sui, і цей процес робить припущення щодо форми об’єктів.

Ми використовуємо переваги ключової можливості в Move, щоб анотувати об’єкт Sui. У базовому Move здатність ключа використовується, щоб сказати, що тип можна використовувати як ключ для глобального зберігання. Оскільки ми не торкаємося глобального сховища в Sui Move, ми можемо перепрофілювати цю можливість. Ми вимагаємо, щоб будь-яка структура з можливістю ключа починалася з поля ідентифікатора з типом ідентифікатора. Тип ID містить як ObjectID, так і порядковий номер (він же версія). У нас є верифікатори байт-коду, щоб переконатися, що поле ідентифікатора є незмінним і не може бути передано іншим об’єктам (оскільки кожен об’єкт повинен мати унікальний ідентифікатор).

Ініціалізатори модулів

Як описано в Об’єктно-орієнтованому глобальному сховищі, модулі Move публікуються в сховищі Sui. Спеціальна функція ініціалізатора, необов’язково визначена в модулі, виконується (один раз) під час публікації модуля середовищем виконання Sui з метою попередньої ініціалізації даних, специфічних для модуля (наприклад, створення одиночних об’єктів). Функція ініціалізатора повинна мати такі властивості, щоб виконуватися під час публікації:

  • Ім'я init

  • Єдиний параметр &mut TxContext типу

  • Немає повернених значень

  • Приватний

Точки входу приймають посилання на об'єкт як вхідні дані

Sui пропонує функції входу, які можна викликати безпосередньо з Sui, на додаток до функцій, які можна викликати з інших функцій. Дивіться функції введення.

Висновок

Підводячи підсумок, Sui використовує переваги безпеки та гнучкості Move і покращує його функціями, описаними вище, щоб значно підвищити пропускну здатність, зменшити затримки в завершенні та полегшити програмування Move. Тепер подивіться, як працює Sui. Щоб отримати повну інформацію, перегляньте технічний документ Sui Smart Contracts Platform.

Last updated