Sui.

Допис

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

article banner.
MiniBob.
Jul 01, 2025
Стаття

Освоєння мовних концепцій руху - Курс #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_contextSui 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
2
Поділитися
Коментарі
.