Допис
Діліться своїми знаннями.

Освоєння мовних концепцій руху - Курс #2
ХочаКурс #1, який я зробив раніше, ознайомив вас з основами написання смарт-контрактів у Move та побудови простих DApps на блокчейні Sui, цей курс зосереджений на поглибині вашого розуміння самої мови Move**- від її потужної системи типів до розширених моделей, таких як генерики, події, модулі та механізми контролю доступу.
До кінця цього курсу ви зможете:
- Напишіть модульний, багаторазовий та безпечний код Move
- Ефективно використовувати дженерики, здібності та типи ресурсів
- Впровадити тонкозернистий контроль доступу, використовуючи можливості
- Випускайте та слухайте події для позаланцюгової інтеграції
- Робота зі складними структурами даних, такими як таблиці та вектори
- Зрозумійте, чим Move відрізняється від інших мов смарт-контрактів, таких як Solidity
Давайте зануримося в серце мови Move!
Крок 1: Розуміння основних мовних особливостей Move
Move розроблено з урахуванням безпеки та чіткості. Давайте розглянемо деякі з найважливіших функцій, які роблять Move унікальним як мова смарт-контрактів.
1.1 Ресурсоорієнтоване програмування (переглянуто)
В основі Move лежить концепціяресурсів, які є спеціальними типами, які не можна копіювати або видаляти, якщо це прямо не дозволено. Це забезпечує безпечне поводження з цифровими активами, такими як токени або NFT.
module examples::token {
use sui::object::{Self, UID};
struct MyToken has key, store {
id: UID,
value: u64,
}
public fun mint(ctx: &mut TxContext): MyToken {
MyToken {
id: object::new(ctx),
value: 100,
}
}
}
У цьому прикладі:
MyToken
- key
цересурс, оскільки він має здатність.
- Він може зберігатися (
store
) і однозначно ідентифікувати йогоid
. - Його не можна дублювати або скинути, якщо не вказано.
Це гарантує, що кожен екзе MyToken
мпляр має унікальну власність та управління, запобігаючи випадковому дублювання чи видаленню.
1.2 Система здібностей
Кожен тип у Move має набірможливостей, які визначають, які операції він підтримує:
Здатність | Значення |
---|---|
copy | Можна дублювати |
drop | Можна викинути без руйнування |
store | Може зберігатися в глобальному сховищі |
key | Може використовуватися як структура з полем ID (тобто об'єктом) |
Приклад:
struct Example has copy, drop { value: u64 }
Розуміння цих здібностей має важливе значення для розробки безпечних та передбачуваних смарт-контрактів.
Чому здібності мають значення
Здібності застосовують суворі правила під час компіляції. Наприклад:
- Структура з тільки
key
іstore
не може бути скопійована або скинута. - Ви не можете повернути структуру, яку не можна скинути, з функції, якщо вона не збережена або перенесена.
Це запобігає появі помилок, таких як подвійне витрачання або випадкова втрата токенів.
1.3 Дженерики та параметри типу
Move підтримує загальні типи, дозволяючи розробникам писати гнучкий і багаторазовий код.
module examples::storage {
use sui::object::{Self, UID};
struct Box<phantom T> has key {
id: UID,
content: T,
}
public fun new_box<T>(ctx: &mut TxContext, content: T): Box<T> {
Box {
id: object::new(ctx),
content,
}
}
}
Ось** <T>
параметр типу**, що робить роботу з будь-яким Box
типом, але при цьому безпечною та ефективною.
Примітка: Клю
phantom
чове слово вказує на те, щоT
не впливає на виконання представлення структури — корисно для абстрактного моделювання.
Крок 2: Модульна розробка та управління пакетами
Оскільки ваші проекти Move стають складнішими, організація вашого коду стає критичною.
2.1 Створення та публікація пакетів переміщення
Пакет переміщеннямістить один або кілька модулів і визначає залежності. Це блок розгортання та версій у Move.
Структура каталогів:
sources/
place.move
user.move
Move.toml
Move.toml
Визначте залежності в:
[dependencies]
Sui = { git = "https://github.com/MystenLabs/sui.git", subdir = "crates/sui-framework" }
MyLibrary = { local = "../my-library" }
Ви можете публікувати пакети в мережі Sui та повторно використовувати їх у кількох DApps.
2.2 Повторне використання існуючих модулів
coin``transfer``tx_context
Sui Frameworkнадає перевірені в бою модулі, такі як,, і. Завжди перевіряйте, що доступно, перш ніж писати власну логіку.
Наприклад, для перенесення об'єкта:
use sui::transfer;
public entry fun send_place(place: Place, recipient: address) {
transfer::public_transfer(place, recipient);
}
Використання стандартних бібліотек забезпечує безпечнішу, швидшу розробку та кращу взаємодію.
Крок 3: Події та позаланцюгове спілкування
Щоб створювати реальні програми, ваші контракти Move повинні спілкуватися з позаланцюговими системами, такими як фронтенди або індексатори.
3.1 Випромінювання подій
Переміщення дозволяє передаватиподії, які можуть бути індексовані зовнішніми службами.
use sui::event;
struct PlaceCreated has drop {
name: String,
}
public fun emit_place_created(name: String) {
event::emit(PlaceCreated { name });
}
Ця подія з'явиться на блокчейні і може бути підібрана дослідниками або інструментами індексації.
3.2 Прослуховування подій
Використовуйте такі інструменти, якSuiet Explorer,Subsquidабо API Sui JSON-RPC, щоб прослуховувати емітовані події та відповідним чином реагувати у вашій програмі.
У Javascript/TypeScript:
import { JsonRpcProvider } from '@mysten/sui.js';
const provider = new JsonRpcProvider('https://fullnode.devnet.sui.io');
const events = await provider.getEvents({
MoveEventType: '0x...::example::PlaceCreated'
});
Крок 4: Контроль доступу та моделі безпеки
Безпека має першорядне значення при роботі зі смарт-контрактами. Move надає кілька інструментів для реалізації надійного контролю доступу.
4.1 Модель власності на об'єкт
Sui здійснює право власності на рівні протоколу. Мутувати або передати його може тільки власник об'єкта.
public entry fun update_name(sweet_place: &mut SweetPlace, new_name: String) {
sweet_place.name = new_name;
}
Викликати цю функцію може тільки поточний власник.
4.2 Шаблон можливостей
Для отримання більш детальних дозволів використовуйтешаблон можливості— створюйте спеціальні об'єкти, які надають обмежений доступ до певних функцій.
struct AdminCap has key { id: UID }
public entry fun grant_admin_cap(ctx: &mut TxContext) {
let cap = AdminCap { id: object::new(ctx) };
transfer::public_transfer(cap, tx_context::sender(ctx));
}
public entry fun restricted_action(_: &AdminCap) {
// perform admin action
}
Тепер виконувати можуть тільки користувачі, які утриму AdminCap
ють цю функціюrestricted_action
.
Цей шаблон широко використовується в DeFi та DAO для безпечного делегування повноважень.
Крок 5: Робота зі складними структурами даних
Move підтримує структуровані типи даних, які дозволяють розробникам моделювати складну логіку та взаємозв'язки.
5.1 Вектори
Вектори використовуються для зберігання впорядкованих колекцій предметів одного типу.
let names = vector[String::utf8(b"Alice"), String::utf8(b"Bob")];
Вони корисні для зберігання списків NFT, ролей користувачів або динамічних метаданих.
Приклад використання:
vector::push_back(&mut names, String::utf8(b"Charlie"));
5.2 Таблиці (через стандартну бібліотеку Sui)
Хоча Move не підтримує карти або хеш-таблиці, Sui надає Table
тип у своїй стандартній бібліотеці.
use sui::table::{Self, Table};
struct Registry has key {
id: UID,
entries: Table<u64, String>,
}
public fun add_entry(registry: &mut Registry, key: u64, value: String) {
table::add(&mut registry.entries, key, value);
}
Використовуйте таблиці для ефективного управління великими наборами даних.
Крок 6: Тестування та налагодження ваших контрактів
Тестування гарантує, що код Move поводиться так, як очікувалося, за різних умов.
6.1 Тестування одиниць у русі
Пишіть блокові тести безпосередньо у модулі Move, використовуючи фреймворк тестування.
#[test]
public fun test_create_sweet_place() {
let ctx = tx_context::dummy();
create_sweet_place(&mut ctx, String::utf8(b"My House"));
}
Запустіть тести за допомогою:
sui move test
6.2 Використання провідника Sui
Після розгортання контракту скористайтеся Sui Explorer для перевірки транзакцій, перегляду станів об'єктів та налагодження проблем.
Крок 7: Реальні застосування розширених концепцій руху
Тепер, коли ви зрозуміли основні функції мови, давайте дослідимо, як вони застосовуються до реальних сценаріїв.
7.1 Платформа карбування NFT
Створіть платформу, яка дозволяє користувачам створювати NFT, підтримувані ресурсами Move, використовуючи моделі власності та ресурсів.
7.2 Система голосування DAO
Реалізуйте децентралізовану автономну організацію (DAO) за допомогою Move для голосування, пропозицій та управління, використовуючи події та можливості для безпечних дій.
7.3 Обмін токенами та AMM
Створіть децентралізовану біржу (DEX) за допомогою модулів Move для представлення пулів ліквідності та обміну токенами, використовуючи генерики та таблиці для ефективного управління станом.
- Sui
- Architecture
- Move
Sui is a Layer 1 protocol blockchain designed as the first internet-scale programmable blockchain platform.
Зароби свою частку з 1000 Sui
Заробляй бали репутації та отримуй винагороди за допомогу в розвитку спільноти Sui.
- Чому BCS вимагає точного порядку полів для десеріалізації, коли структури Move мають названі поля?53
- Помилки перевірки кількох джерел» у публікаціях модуля Sui Move - автоматичне вирішення помилок42
- Невдала операція Sui: об'єкти, зарезервовані для іншої транзакції24
- Як обмеження здібностей взаємодіють з динамічними полями в гетерогенних колекціях?04