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>параметрtype, позволяющий Boxработать с любым типом, сохраняя при этом безопасность и эффективность.

Примечание: phantomключевое слово означает, что Tоно не влияет на представление структуры во время выполнения — полезно для абстрактного моделирования.


Шаг 2: модульная разработка и управление пакетами

По мере усложнения проектов Move организация кода становится критически важной.

2.1 Создание и публикация пакетов Move

ПакетMoveсодержит один или несколько модулей и определяет зависимости. Это модуль развертывания и управления версиями в 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 Эмиссия событий

Move позволяет генерироватьсобытия, которые могут индексироваться внешними сервисами.

use sui::event;

struct PlaceCreated has drop {
    name: String,
}

public fun emit_place_created(name: String) {
    event::emit(PlaceCreated { name });
}

Это событие появится в блокчейне и может быть подхвачено исследователями или инструментами индексации.

3.2 Прослушивание событий

Используйте такие инструменты, какSuite 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 Шаблон возможностей

Для получения более подробных разрешений используйте паттернcapability— создавайте специальные объекты, предоставляющие ограниченный доступ к определенным функциям.

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

Пишите модульные тесты непосредственно в модулях 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 Explorer

После развертывания контракта используйте Sui Explorer для проверки транзакций, просмотра состояний объектов и устранения неполадок.


Шаг 7. Реальное применение передовых концепций перемещения

Теперь, когда вы разбираетесь в основных языковых функциях, давайте рассмотрим, как они применимы к реальным сценариям.

7.1 Платформа для майнинга NFT

Создайте платформу, которая позволит пользователям создавать NFT на основе ресурсов Move, используя модели владения и ресурсов.

7.2 Система голосования DAO

Внедрите децентрализованную автономную организацию (DAO), используя Move для голосования, предложений и управления, используя события и возможности для безопасных действий.

7.3 Обмен токенами и банкоматами

Создайте децентрализованную биржу (DEX), используя модули Move для представления пулов ликвидности и свопов токенов, используя дженерики и таблицы для эффективного управления состоянием.

  • Sui
  • Architecture
  • Move
2
Поделиться
Комментарии
.