Пост
Поделитесь своими знаниями.

Освоение понятий языка движений — курс #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_context
Sui 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
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