Статьи
Образовательные материалы и учебные пособия о Sui
Посты
14- СтатьяApr 13, 2025
Механика контроля доступа к объектам и приема
Это вторая часть серии «Предметы для родителей и детей в режиме Sui Move». Первую часть можно прочитать здесь Передача контроля доступа к объектам: :receive Mechanics Итак, вы поместили объектXв родительский объектP(переведя X в идентификатор P). Как его вернуть или использовать? 🤔 Вот тут-то и пригодится специальный механизм приема Sui. Когда объект передается родителю, он не появляется автоматически. Он находится там и принадлежитP. Чтобы использовать или удалить этот дочерний объект в транзакции, вы должныполучитьего. Sui предоставляет структурированный способ сделать это, используяПолучение билетаи функцию transfer: :receive. ##Получающий билет Предположим, что получение — это заявка на получение дочернего объекта типа T. В транзакции вместо прямой передачи дочернего объекта (которым вы пока не владеете) функции, вы передаете приемку — по сути, ссылку на «объект с идентификатором Y, принадлежащий родителю X». Получение — это специальная структура Move, содержащая идентификатор, версию и дайджест получаемого объекта. Её можно только удалять, то есть она может существовать эфемерно, но не может постоянно храниться. Другими словами, это одноразовый билет на транзакцию. Как получить квитанцию? Обычно, осуществляя перевод. В программируемом блоке транзакций (PTB) объектCпередается родительскому блокуP, в результате чего получается квитанция о получении, которую можно использовать на следующем этапе. Если во время предыдущей транзакции ребенок уже сидел в родительском доме, в качестве входных данных для новой транзакции можно указать приемку (в интерфейсе SDK/CLI Sui SDK/CLI можно указать дочерний объект по его идентификатору и родительскому объекту для создания заявки). Важно: Получение не является самим объектом — оно еще не означает, что вы получаете право собственности*. Это просто означает, что «объект типа T с этим идентификатором принадлежит этому родителю, и я собираюсь его забрать». Чтобы действительно забрать объект, вы должны вызвать transfer: :receive: module example::toy_box { use sui::transfer::{Self, Receiving}; struct Toy has key { id: UID, name: vector } struct Box has key { id: UID } /// Remove a Toy child from a Box, returning the Toy to the caller. public entry fun take_toy(box: &mut Box, toy_ticket: Receiving): Toy { // Use the parent's UID and the Receiving ticket to get the Toy let toy = transfer::receive(&mut box.id, toy_ticket); // Now toy is an owned value we can return (or transfer to someone). toy } } В take_toy символ toy_ticket: Получение представляет собой игрушку, принадлежащую коробке. Вызывая команду transfer: :receive (&mut box.id, toy_ticket), мы используем встроенную логику Суи и извлекаем предмет «Игрушка» из коробки. Это приводит к нескольким важным вещам: Онпроверяетво время выполнения, действительно ли toy_ticket ссылается на объект, который в настоящее время принадлежит ящику (используя UID родителя). Если что-то не совпадает (неправильный родитель или объект на самом деле отсутствует), процесс будет прерван. После этого фактический объект Toy возвращается в качестве стоимости, принадлежащей ему в транзакции, а это значит, что теперь игрушка находится под контролем нашей функции. Обратите внимание, что нам нужно было передать &mut box.id. Sui означает, что для вызова и получения вызова у нас естьизменяемая ссылка на UID родителя. Это продуманный способ управления доступом: прием может быть разрешен только в модуле, который может выдавать идентификатор родителя в виде &mut UID. Обычно модуль, определяющий родительский тип, предоставляет функцию типа take_toy, которая получает внутренние вызовы. Если родительский модуль не предоставляет ни одной функции, выдающей UID &mut (прямо или косвенно), то ни один внешний код не сможет перехватить дочерние элементы модуля. Таким образом, родительский модуль контролирует, как и когда можно получить доступ к детям. В этом примере в Box есть поле id: UID. Поскольку take_toy находится в том же модуле, он может заимствовать &mut box.id. Внешние модули или транзакции могут вызывать take_toy (box_obj, ticket), но сами они не могут вызывать transfer: :receive on Box, так как box.id является приватным. Этот шаблон позволяет извлекать детей только с авторизованным кодом.✅ Как насчет вложенных объектов? Если бы игрушка была буквально полем в коробке (скажем, Box {id, toy: Toy}), нам не нужно было бы ничего получать — игрушку можно было бы получить в любое время, когда у вас есть коробка &mut Box. Но это также означает, что удалить игрушку или обработать ее по отдельности сложнее (это как часть коробки). С детскими предметами мы разделяем кладовую: игрушка стоит отдельно, и ее нужно специально вынуть. Именно по этой причине Суй требует предъявить билет на получение билета и получить звонок. Это означает, что забрать ребенка можно только по разрешенной процедуре. Изменчивое требование к справочным данным: Возможно, вы задаетесь вопросом, почему &mut UID, а не просто &UID? Mutable гарантирует блокировку родительского элемента во время операции приема, предотвращая одновременное внесение изменений и гарантируя, что абонент действительно имеет право изменять родительский объект (обычно подразумевая, что он является владельцем). Это один из способов динамической проверки прав собственности, применяемый компанией Sui. Взяв взаймы идентификационный номер родителя, Суй гарантирует, что никакая другая транзакция или параллельное действие не смогут помешать вам выводить ребенка из семьи. Это все равно, что запереть дверь родителя перед тем, как убрать содержимое. Пример использования в блоке транзакций: Предположим, что объект Box принадлежит Алисе и у нее есть предмет Toy, который она хочет положить �� коробку, а затем, возможно, Поэтому выньте его позже. Вот как это могло бы выглядеть нормально: Прикрепите игрушку к коробке:** Алиса звонит по телефону transfer: :public_transfer (игрушка, @); в PTB. При этом игрушка переносится под коробку (здесь мы используем public_transfer, потому что это контекст транзакции — об этом чуть позже). Теперь игрушка — это дитя коробки. -В той же или другой транзакции заберите игрушку: Алиса вызывает пример: :toy_box: :take_toy (box_obj,), где под получением подразумевается игрушка. Под капотом команда take_toy принимает звонки, проверяет связь и возвращает игрушку. Теперь результатом транзакции будет игрушка, которая, как правило, возвращается на адрес Алисы (поскольку мы вернули её из функции ввода). Ключевые выводы: Детские предметы по умолчанию недоступны; чтобы их достать, вам понадобится билет на получение и соответствующая функция. Модуль для родителей решает, как их можно извлечь (предоставляя функцию с &mut UID). transfer: :receive используется в определяющем родительском модуле для объектов этого модуля или его друзей. Если тип ребенка определен в другом месте, вам понадобится другой подход (введите public_receive...). Прежде чем перейти к более подробному описанию: если объект типа T имеет только ключевое значение (нет хранилища), Суй считает, что его использование несколько ограничено. Такие объекты не не могут быть получены обычным кодом за пределами модуля. На практике это означает, что если T используется только ключ и становится дочерним модулем, вам придется обрабатывать его извлечение в отдельном модуле или родительском модуле с помощью специального правила. Если у T также есть хранилище, то с помощью public_receive у нас будет больше возможностей. Давайте рассмотрим это дальше.
- Sui
2 - СтатьяApr 12, 2025
✏️ Предметы родителей и детей в Sui Move
В Sui Move объекты могут владеть другими объектами так же, как и учетные записи, владеющие объектами. Это открывает перед разработчиками новые шаблоны проектирования (и несколько ошибок). В этом руководстве я разобью концепции родительских и дочерних объектов в Sui Move на четыре части: 1.Знакомство с понятиями родителей и детей в Sui Move 2.Механика контроля доступа к объектам и приёма 3.Межмодульное управление детьми с помощью public_receive 4.Логика, связывающая душу, и схема получения возврата В конце концов вы поймете, как объединять объекты, извлекать дочерние объекты с помощью transfer: :receive, управлять дочерними объектами в разных модулях с помощью public_receive и даже создавать объекты, привязанные к душе, которые возвращаются владельцу бумерангом. Знакомство с понятиями «родитель — ребенок» в Sui Move ###Что такое родительские и дочерние объекты? В Sui каждый объект имеет уникальный идентификатор и владельца. Обычновладельцем является адрес(например, учетная запись пользователя), но владельцем может быть и другой объект. Если объект A владеет объектом B, мы называем A родителем, а B — дочерним объектом. Ребенку принадлежит объект, а не адрес. Передача данных объектам: на самом деле в Sui нет разницы между адресом и идентификатором объекта — оба идентификатора представляют собой 32-байтовые идентификаторы. Это значит, что объект можно перенести на идентификатор другого объекта точно так же, как и на адрес пользователя. При этом вы фактически вставляете объект в родительский объект. Среда выполнения Sui задает в поле владельца ребенка идентификатор родителя (а не адрес) Так почему же это круто? Потому что ребенок сохраняет свой уникальный идентификатор и существует в хранилище независимо, но теперь он привязан к родителю. Это все равно, что подарить другу уникальный коллекционный предмет, который можно хранить в шкафчике: этот предмет сохраняет свой идентификатор, и его можно отслеживать, но теперь владелец шкафчика вашего друга указан в списке его владельца. Важно различать уникальные, вложенные и дочерние предметы:** Уникальный объект (принадлежащий адресу) :**Обычный объект, владельцем которого является адрес (например, учетная запись пользователя). Так обстоит дело по умолчанию — например, NFT, монеты и т. д., которые находятся прямо в кошельке пользователя. Каждый из них имеет уникальный идентификатор и занимает первое место в хранилище. Вложенный (обернутый) объект:* Объект, который хранится *в данных другого объекта (например, в виде поля в структуре). В данном случае внутренний объект «упакован», анеявляется отдельным объектом верхнего уровня. Он не отображается в глобальном хранилище по идентификатору, поскольку он является частью байтового содержимого родительского объекта. В языке Sui, если вы поместите объект в виде поля в другое поле без специальной обработки, оно будет обернуто. Дочерний объект (принадлежащий объекту) :*Объект, который принадлежит другому объекту *но не помещен непосредственно в его поля. Дочерний объект остается в хранилище отдельным объектом верхнего уровня (со своим идентификатором и данными), а идентификатор родителя записывается как владелец в метаданных ребенка. Это означает, что вы можете запросить ребенка или получить к нему доступ по его идентификатору (при наличии соответствующих разрешений). Оно физически не встроено в содержимое родителя, а лишь логически находится в его собственности. Проведя аналогию, вы словно отдали другу свой коллекционный предмет на руки — всё равно что его можно промаркировать и отследить, просто спрятать в шкафчике. Преимущество изготовления детского предмета (переводом) вместо упаковки заключается в том, что удостоверение личности ребенка остается доступным извне. Например, обозреватели или кошельки могут перечислять дочерний объект по идентификатору, в то время как упакованный объект невидим за пределами родительского объекта. Дочерние объекты также сохраняют стабильные идентификаторы, даже если они перемещаются между владельцами или попадают в руки разных родителей. Это отлично подходит для таких вещей, как инвентарь в блокчейне или паттерны «кошелек в кошельке», когда вы хотите, чтобы в объекте-контейнере хранилось множество предметов, на которые другие могут ссылаться по отдельности Право собственности и доступ: если объект принадлежит другому объекту, доступ к объекту или его использование, как правило, имеет только владелец родителя. Это форма динамической авторизации. Например, если Алиса владеет родительским объектом P, а P владеет дочерним объектом C, то только Алиса (или транзакции, которые подписывает Алиса) может манипулировать C. Sui применяет этот метод таким образом, чтобы владеть родителем — все равно что владеть ключами от всех его дочерних объектов 🔑. Возможно, вы знаете: Функция передачи объектов в Sui, по сути, дает нам право собственности на объекты в виде дерева. У одного родителя может быть много детей (и эти дети могут иметь своих детей, образуя иерархию). Для этого идентификаторы объектов обрабатываются как адреса для передачи. У нас есть: объекты, принадлежащие адресу**(обычные уникальные объекты), Объекты, принадлежащие объектам**(дочерние объекты, все еще находящиеся на верхнем уровне, но привязанные к родительскому объекту), Обернутые объекты**(вложенные в данные другого объекта, а не верхнего уровня). В следующих статьях мы рассмотрим, как на самом деле извлекать дочерние объекты или взаимодействовать с ними (поскольку к ним нельзя получить прямой доступ, как к объектам, принадлежащим адресам) и как применять к ним правила.
- Sui
- Move
3 - СтатьяApr 10, 2025
Создание DApp нового поколения для лотерей NFT с помощью Sui Move и современного пользовательского интерфейса
🧩 Создание лотерейного приложения NFT нового поколения с помощью Sui Move и современного пользовательского интерфейса Это ваше полное руководство по созданию геймифицированного децентрализованного лотерейного приложения на базе NFT с использованиемSui Moveс поддержкой нескольких раундов, реферальными системами, управлением DAO и системой проектирования, которая понравится поколению Z. От архитектуры контрактов до управления пользовательским интерфейсом — давайте сделаем все возможное. 📦 Разбивка фаз Фаза 1 — Базовая лотерея Многораундовый геймплей Продажа билетов NFT Система реферальных вознаграждений Базовое голосование в DAO Фаза 2 — Маркетплейс и геймификация Интеграция с торговой площадкой NFT Бустеры (увеличивают шанс выигрыша) Система джекпотов Скрытые раздачи Фаза 3 — DAO и мультицепочка Межсетевая совместимость DAO с расширенными предложениями Динамическое ценообразование Ончейн-аналитика 🧠 Смарт-контракт: подробное описание Sui Move Структура контракта module nft_lottery_x::nft_lottery_x { use sui::object; use sui::balance::{Balance, zero}; use sui::coin::{Self, Coin}; use sui::clock::Clock; use sui::random::Random; use sui::event::emit; use sui::transfer; use sui::tx_context::TxContext; use std::option; use std::signer; const EGameNotStarted: u64 = 1000; const EGameAlreadyFinished: u64 = 1001; const EInvalidPayment: u64 = 1002; const ENoTickets: u64 = 1003; const EWinnerAlreadyChosen: u64 = 1004; const ENotWinner: u64 = 1005; public struct Game has key { id: UID, ticket_price: u64, start_time: u64, end_time: u64, total_tickets: u32, round: u32, winner: Option, balance: Balance, referral_bonus: u64, } public struct Ticket has key { id: UID, game_id: ID, ticket_number: u32, buyer: address, referrer: Option, } public struct GameCreated has copy, drop { game_id: ID, start_time: u64, end_time: u64, ticket_price: u64, } public struct TicketBought has copy, drop { game_id: ID, ticket_number: u32, buyer: address, referrer: Option, } public struct WinnerAnnounced has copy, drop { game_id: ID, winner_ticket: u32, round: u32, } public struct RewardClaimed has copy, drop { game_id: ID, ticket_number: u32, amount: u64, } public fun create_game( start_time: u64, end_time: u64, ticket_price: u64, referral_bonus: u64, ctx: &mut TxContext ) { let game = Game { id: object::new(ctx), ticket_price, start_time, end_time, total_tickets: 0, round: 1, winner: option::none(), balance: zero(), referral_bonus, }; emit(GameCreated { game_id: object::id(&game), start_time, end_time, ticket_price, }); transfer::share_object(game); } public fun buy_ticket( game: &mut Game, coin: Coin, clock: &Clock, referrer: Option, ctx: &mut TxContext ): Ticket { assert!(clock.timestamp_ms() >= game.start_time, EGameNotStarted); assert!(clock.timestamp_ms() (TicketBought { game_id: object::id(game), ticket_number: ticket.ticket_number, buyer: ticket.buyer, referrer: ticket.referrer, }); ticket } public entry fun determine_winner( game: &mut Game, rand: &Random, clock: &Clock, ctx: &mut TxContext ) { assert!(clock.timestamp_ms() >= game.end_time, EGameNotStarted); assert!(game.winner.is_none(), EWinnerAlreadyChosen); assert!(game.total_tickets > 0, ENoTickets); let mut generator = rand.new_generator(ctx); let winning_ticket = generator.generate_u32_in_range(1, game.total_tickets); game.winner = option::some(winning_ticket); emit(WinnerAnnounced { game_id: object::id(game), winner_ticket: winning_ticket, round: game.round, }); } public fun claim_reward( ticket: Ticket, game: Game, ctx: &mut TxContext ): Coin { assert!(object::id(&game) == ticket.game_id, EInvalidPayment); let ticket_num = ticket.ticket_number; assert!(game.winner.contains(&ticket_num), ENotWinner); let amount = game.balance.value(); let reward = game.balance.into_coin(ctx); emit(RewardClaimed { game_id: object::id(&game), ticket_number: ticket.ticket_number, amount, }); object::delete(object::id(&game)); reward } } Ключевые выводы: ✅ Balanceобеспечивает безопасность типов и надлежащее обращение с монетами ✅ Optionчетко сигнализирует о том, выбран ли победитель ✅ События позволяют пользователям и исследователям отслеживать события 🛠 Использование команд интерфейса командной строки sui client call --package --module nft_lottery_x --function create_game --args --gas-budget 10000000 Чтобы купить билет, определить победителя или получить вознаграждение, воспользуйтесь аналогичными процедурами командной строки. 🔮 Будущие дополнения Автоматический сброс логики следующего раунда claim_reward Запускайте больше событий, таких как ReferralRewardDistributed Реорганизуйте джекпоты и рефералов в подмодули Дайте мне знать, хотите ли вы во второй части создать пользовательский интерфейс и интегрировать его в тестовую сеть Sui!
- Sui
3 - СтатьяApr 09, 2025
Руководство по транзакциям Sui: от настройки до выполнения и проверки
Руководство по транзакциям Sui: от настройки до выполнения и проверки Если вам интересно узнать, как проводить транзакции в блокчейне Sui, и вам нужно подробное практическое руководство, которое поможет вам на каждом этапе. В этой статье мы рассмотрим весь процесс: от настройки клиентской среды, проверки состояния кошелька, расчета платы за газ до подписания и выполнения транзакции и, наконец, проверки ее деталей. Давайте разберем всё шаг за шагом: Что делает Суй таким особенным? 🔥 Sui предлагает высокооптимизированную платформу для децентрализованных приложений (dApps) и смарт-контрактов. Элегантный дизайн, позволяющий управлять тарифами на газ и логикой транзакций, делает эту платформу интересной игровой площадкой для разработчиков, стремящихся расширить границы технологии Web3. 2. Начало работы: настройка среды и конфигурация кошелька ⚙️ 2.1. Настройка клиентской среды Sui Прежде чем приступить к транзакциям, убедитесь, что ваш клиент Sui правильно настроен. Sui поддерживает несколько сетей (devnet, mainnet, testnet), и вы можете проверить, какая из них активна, выполнив следующую команду: ➜ sui client envs ╭─────────┬─────────────────────────────────────┬────────╮ │ alias │ url │ active │ ├─────────┼─────────────────────────────────────┼────────┤ │ devnet │ https://fullnode.devnet.sui.io:443 │ │ │ mainnet │ https://fullnode.mainnet.sui.io:443 │ │ │ testnet │ https://fullnode.testnet.sui.io:443 │ * │ ╰─────────┴─────────────────────────────────────┴────────╯ Это подтверждает, что вы подключены к тестовой сети. Подключение к правильной сети — это первый шаг к успешной транзакции. 2.2. Проверка активного кошелька Затем подтвердите адрес активного кошелька. Это очень важно, потому что каждая транзакция связана с идентификацией вашего кошелька: ➜ sui client active-address 0x35370841d2e69b495b1e2f944a3087e4242f314e503691a00b054e0ee2a45a73 2.3. Запрос принадлежащих объектов Используя API Suix_GetOwnedObjects, вы можете получить сведения о принадлежащих вам объектах (например, монетах) в блокчейне. Эта команда поможет вам проверить баланс счета и активы, доступные для транзакций: { "jsonrpc": "2.0", "id": 1, "method": "suix_getOwnedObjects", "params": [ "0x35370841d2e69b495b1e2f944a3087e4242f314e503691a00b054e0ee2a45a73", { "filter": { "MatchAll": [ { "StructType": "0x2::coin::Coin" } ] }, "options": { "showType": true, "showOwner": true, "showPreviousTransaction": true } } ] } Этот шаг очень важен для проверки наличия в вашем кошельке необходимых монет (в данном случае монет SUI), прежде чем совершать какие-либо транзакции. 3. Расчет газа: бюджетирование транзакционных издержек 💸 Газ — это топливо, обеспечивающее транзакции в блокчейне. Чтобы избежать сбоев в транзакциях, важно понимать как цену на газ, так и бюджет на газ. 3.1. Получение цены на газ Текущую цену на газ можно получить с помощью вызова API Suix_GetReferenceGasPrice: { "jsonrpc": "2.0", "id": 1, "method": "suix_getReferenceGasPrice", "params": [] } Если API возвращает «1000», это означает, что каждая единица газа стоит 1000 MIST. Помните, что 1 SUI равен 10 ^ 9 MIST, поэтому даже небольшие цифры в MIST могут суммироваться при составлении бюджета. 3.2. Настройка бюджета на газ Ваш бюджет на газ — это максимальное количество газа (в формате MIST), которое вы готовы потратить. Например, предположим, что ваш бюджет на газ составляет 4964000 MIST. Общая стоимость транзакции обычно рассчитывается следующим образом: Общая стоимость = стоимость вычислений + стоимость хранения — скидка на хранение Например: • Стоимость вычислений: 1 000 000 MIST • Стоимость хранения: 2 964 000 MIST • Скидка на хранение: 978 120 MIST Таким образом, чистая стоимость составляет 1 000 000 + 2 964 000 − 978 120 = 2 985 880 MIST. Четкое определение бюджета на газ гарантирует, что на транзакцию будет достаточно средств для успешного выполнения. 4. Составление сделки: путь к доверию 🔧 Прежде чем отправлять транзакцию в реальном времени, лучше всего провести пробную проверку, чтобы выявить возможные проблемы. Это позволит вам проверить логику транзакции, не тратя денег на газ. 4.1. Создание пробной транзакции Вот пример функции TypeScript, демонстрирующий, как подготовить и выполнить пробную транзакцию. В этом коде описывается, как разделить монеты и подготовить операции перевода: export const signSuiDryRunTransaction = async (requestParams: SignDryRequestParams): Promise => { const { gasPrice, privateKey, coinRefs, network, recipients } = requestParams; const keypair = Ed25519Keypair.fromSecretKey(privateKey); const tx = newTransaction(); // Configure gas payment, price, and sender tx.setGasPayment(coinRefs); tx.setGasPrice(gasPrice); tx.setSender(keypair.toSuiAddress()); // Split coins based on each recipient's amount const coins = tx.splitCoins(tx.gas, recipients.map((transfer) => transfer.amount)); recipients.forEach((transfer, index) => { tx.transferObjects([coins[index]], transfer.to); }); // Build and sign the transaction with the client const client = newSuiClient({ url: getFullnodeUrl(network) }); const bytes = await tx.build({ client }); const { signature } = await keypair.signTransaction(bytes); await verifyTransactionSignature(bytes, signature, { address: keypair.getPublicKey().toSuiAddress() }); return JSON.stringify([toBase64(bytes), signature]); }; Этот пробный шаг очень важен для того, чтобы убедиться, что все детали верны, прежде чем вкладывать реальные средства. 5. Подписание и выполнение транзакции: собираем все воедино ✍️ После успешного пробного запуска следующим шагом будет подписание и отправка транзакции в блокчейн. 5.1. Подписание транзакции Ниже приведен усовершенствованный пример функции, которая подписывает транзакцию с указанным бюджетом газа: const signSuiTransaction = async (requestParams: SignRequestParams): Promise => { const { gasBudget, gasPrice, privateKey, coinRefs, network, recipients } = requestParams; const keypair = Ed25519Keypair.fromSecretKey(privateKey); const tx = newTransaction(); // Set up gas parameters, including the gas budget tx.setGasPayment(coinRefs); tx.setGasPrice(gasPrice); tx.setGasBudget(gasBudget); tx.setSender(keypair.toSuiAddress()); // Split coins for each recipient const coins = tx.splitCoins(tx.gas, recipients.map((transfer) => transfer.amount)); recipients.forEach((transfer, index) => { tx.transferObjects([coins[index]], transfer.to); }); // Build the transaction and sign it const client = newSuiClient({ url: getFullnodeUrl(network) }); const bytes = await tx.build({ client }); const { signature } = await keypair.signTransaction(bytes); await verifyTransactionSignature(bytes, signature, { address: keypair.getPublicKey().toSuiAddress() }); return JSON.stringify([toBase64(bytes), signature]); }; Эта функция объединяет все необходимые параметры, включая данные о газе и получателях, обеспечивая надежное подписание транзакции и ее готовность к исполнению. 5.2. Выполнение транзакции После подписания транзакция отправляется в блокчейн с использованием конечной точки API SUI_ExecuteTransactionBlock: curl --location 'https://fullnode.testnet.sui.io:443' \ --header 'Content-Type: application/json' \ --data '{ "jsonrpc": "2.0", "id": 1, "method": "sui_executeTransactionBlock", "params": [ "", [""], { "showInput": true, "showRawInput": true, "showEffects": true, "showEvents": true, "showObjectChanges": true, "showBalanceChanges": true }, "WaitForLocalExecution" ] }' Этот вызов возвращает подробный ответ в формате JSON с такой информацией, как дайджест транзакций, потребление газа, модификации объектов и обновления баланса. 6. Подтверждение транзакции: перепроверьте все 🔍 После выполнения транзакции важно убедиться, что все выполнено так, как ожидалось. 6.1. Верификация браузера Вы можете проверить транзакцию в обозревателе блокчейнов, например Suivision Testnet Explorer. В обозревателе все сведения о транзакциях отображаются в интуитивно понятном визуальном формате, что упрощает обнаружение любых проблем. 6.2. Верификация в командной строке Для более подробного аудита используйте командную строку: sui client tx-block -- 3FopuDy5qzKm1kLRFZCdi8Lynadym9j15NaVxzUH6nYD Эта команда предоставляет исчерпывающую информацию о транзакции, включая сведения об отправителе, оплату газа, изменения объекта и статус выполнения. 7. Анализ ответа JSON: понимание уровней транзакции Давайте распакуем ответ JSON, который вы получите после выполнения транзакции: 7.1. Обзор транзакций jsonrpc & id: стандартные поля для протокола JSON-RPC. дайджест: уникальный хэш транзакции (например, «3fopudy5qzkm1klrfzcdi8lynadym9j15navxzuh6nyD»), который используется для отслеживания. TimestampMS и контрольная точка: укажите контекст того, когда транзакция была выполнена, и контрольную точку блокчейна в данный момент. 7.2. Содержимое транзакции Данные отправителя и газа: включают адрес отправителя и все конфигурации, связанные с газом (оплата, цена, бюджет). Операции (транзакции): логика транзакций включает такие операции, как: SplitCoins: разделение газовой монеты на более мелкие части. TransferObjects: перемещение сегментов монет по указанным адресам получателей. Подписи: криптографические подписи (в кодировке Base64) обеспечивают подлинность транзакции. 7.3. Эффекты выполнения Статус: статус «успешный» подтверждает, что транзакция была обработана без ошибок. Использование газа: подробная информация о вычислительных затратах и расходах на хранение, а также о применимых скидках. Изменения объектов: описание объектов, которые были изменены, созданы или обновлены в результате транзакции. Зависимости: список связанных хэшей транзакций, от которых зависит эта транзакция. Эта детальная разбивка необходима для отладки и повышения производительности вашего dApp. 8. Практическая информация для разработчиков: советы и выводы Понимая каждый этап этого процесса, вы приобретете навыки создания безопасных и эффективных приложений Web3 на Sui. Эти сведения не только помогают устранять неполадки, но и позволяют уверенно внедрять инновации в экосистеме Sui.
- Sui
- SDKs and Developer Tools
- Transaction Processing
3 - Статья0xduckmove135Apr 08, 2025
👀 SEAL - Я думаю, что конфиденциальность данных Web3 скоро изменится
👀 SEAL запущен в тестовой сети Sui Testnet — я думаю, что конфиденциальность данных Web3 скоро изменится В Web3 часто можно услышать такие фразы, как* «пользователи владеют своими данными»* или* «децентрализованы по замыслу»*. Но если присмотреться повнимательнее, многие приложения по-прежнему полагаются на централизованную инфраструктуру для обработки конфиденциальных данных — для управления ключами используются такие сервисы, как AWS или Google Cloud. Это приводит к противоречию: децентрализация на первый взгляд, централизация — под ней. Но что, если бы существовал способ безопасного управления секретами, не отказываясь от децентрализации? Представляем SEAL — децентрализованное управление секретами (DSM), которое теперь доступно в Sui Testnet. SEAL призвана исправить одно из самых больших лицемерий Web3: крики о децентрализации при тайном использовании AWS Вы можете спросить меня: что такое SEAL? SEAL — это протокол, который позволяет безопасно идецентрализованноуправлять конфиденциальными данными. Он создан специально для мира Web3. Воспринимайте его как уровень контроля доступа, ориентированный на конфиденциальность и подключаемый к вашему приложению dApp. Вы можете рассматривать SEAL как своего рода программируемую блокировку ваших данных. Вы не просто блокируете и разблокируете данные вручную — вывписываете политики прямо в смарт-контракты, используя Move on Sui. Допустим, вы создаете приложение dApp, в котором: Только владельцы NFT могут разблокировать учебное пособие премиум-класса Или, может быть, DAO должна проголосовать, прежде чем конфиденциальные файлы будут опубликованы Или вы хотите, чтобы метаданные были привязаны к времени и были доступны только после определенной даты SEAL делает все это возможным. Контроль доступа работает «в сетевом режиме», полностью автоматизирован, управление им не требуется со стороны администратора. Просто логика, встроенная прямо в блокчейн. SEAL делает все это возможным. Контроль доступа работает «в сетевом режиме», полностью автоматизирован, управление им не требуется со стороны администратора. Просто логика, встроенная прямо в блокчейн. Еще одна интересная статья — как SEAL обрабатывает шифрование. Он использует так называемоепороговое шифрование**, что означает, что ни один узел не может расшифровать данные. Для совместной работы требуется группа серверов — как в случае с несколькими подписями, но для разблокировки секретов. Это распределяет доверие и позволяет избежать обычной проблемы, возникающей в случае сбоя в одной точке. А чтобы сохранить конфиденциальность информации, SEAL шифрует и дешифрует все, что находится на стороне клиента**. Ваши данные никогда не видны ни одному серверу. Они в буквальном смысле остаются в ваших руках на вашем устройстве. и SEAL безразлично, где вы храните свои данные. Будь то IPFS, Arweave, Walrus или какая-либо другая платформа, SEAL не пытается контролировать эту часть. Основное внимание уделяется только тому, кому разрешено что-либо видеть**, а не тому, где хранятся вещи. Так что да, это не просто библиотека или API — это уровень для вашего dApp, работающий по умолчанию в сети, контролируемый доступом и конфиденциальность**. SEAL заполняет довольно серьезный пробел. Давайте разберемся в этом подробнее. Если вы создаете приложение dApp, которое работает с любыми конфиденциальными данными**— закрытым контентом, пользовательскими документами, зашифрованными сообщениями и даже метаданными NFT, заблокированными по времени, — вы столкнетесь с той же проблемой: ➡️ Как безопасно управлять доступом, не полагаясь на централизованный сервис? Без такого решения, как SEAL, большинство команд тоже: Используйте централизованные инструменты, такие как AWS KMS или Firebase, что явно противоречит децентрализации Или попробуйте самостоятельно исправить недоработанную логику шифрования, которая обычно оказывается хрупкой и трудно поддающейся аудиту https://x.com/EmanAbio/status/1908240279720841425?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1908240279720841425%7Ctwgr%5E697f93dc65359d0c8c7d64ddede66c0c4adeadf1%7Ctwcon%5Es1_&ref_url=https%3A%2F%2Fwww.notion.so%2Fharryph%2FSEAL-Launches-on-Sui-Testnet-1cc4f8e09bb380969c0dcc627b96cc22 Ни то, ни другое не очень хорошо масштабируется. Особенно если вы пытаетесь создавать надежные приложения в нескольких сетях или сообществах. SEAL делает весь процесс модульным и программируемым. Вы определяете правила доступа в смарт-контрактах Move, а SEAL берет на себя все остальное — генерацию ключей, одобрение расшифровки и контроль доступа — и все это без необходимости вручную выдавать ключи или проводить внутренние проверки. Более того, эти правилапроверяемы и неизменные— как только они внедряются в блокчейн, они подчиняются контракту, а не администратору-человеку. Поэтому вместо того, чтобы спрашивать: «Кто должен управлять доступом к этим данным?» вы просто спрашиваете: «Какая логика должна определять доступ?» > ... и пусть цепь справится с этим. Чистый и масштабируемый. Именно поэтому SEAL подходит не только для «инструментов безопасности». Это базовый уровень для любого приложения dApp, которое заботится о конфиденциальности, соответствии нормативным требованиям или динамической логике доступа.** Это небольшое изменение, но оно сильно меняет наше представление о данных в Web3. Вместо того чтобы шифровать данные после развертывания или полагаться на внешние сервисы,вы начинаете со встроенных функций обеспечения конфиденциальности, а доступ к ним осуществляется исключительно с помощью логики смарт-контрактов. И это именно то, что сейчас нужно Web3. Как на самом деле работает SEAL? Мы рассмотреличто такое SEALизачем он нужен Web3, давайте посмотрим, как он на самом деле устроен под капотом. В этой части все становится более техническим, но в хорошем смысле. Архитектура выглядит элегантно, как только вы видите, как все элементы сочетаются друг с другом. На высоком уровне SEAL объединяетлогику доступа в блокчейнес управлением ключамивне блокчейна, используя методШифрование на основе идентификационных данных (IBE). Это позволяет разработчикам шифровать данные в виде личности, а затем использовать смарт-контракты для определения того, кому разрешено их расшифровывать. Шаг 1. Правила доступа к смарт-контрактам (на языке Sui) Все начинается со смарт-контракта. Когда вы используете SEAL, вы определяете функцию seal_approve в контракте Move. Здесь вы пишете условия для расшифровки. Например, вот простое правило блокировки времени, написанное в Move: entry fun seal_approve(id: vector, c: &clock::Clock) { let mut prepared: BCS = bcs::new(id); let t = prepared.peel_u64(); let leftovers = prepared.into_remainder_bytes(); assert!((leftovers.length() == 0) && (c.timestamp_ms() >= t), ENoAccess); } После развертывания этот контракт выступает в роли привратника. Всякий раз, когда кто-то захочет расшифровать данные, его запрос будет проверен в соответствии с этой логикой. Если ответ будет принят, ключ будет освобожден. В противном случае они заблокированы. Никто не должен вмешиваться. ##Шаг 2: шифрование на основе личных данных (IBE) Вот где происходит волшебство. Вместо шифрования данных определенного адреса кошелька (например, в PGP или RSA) SEAL используетидентификационные строки, то есть вы шифруете что-то вроде: 0x адрес кошелька dao_voted:proposal_xyz pkGid_2025_05_01 (правило, основанное на отметках времени) или даже game_user_nft_holder Когда данные зашифрованы, они выглядят следующим образом: Encrypt(mpk, identity, message) mpk = мастер-публичный ключ (известный всем) личность = логически определенный получатель сообщение = фактические данные Позже, если кто-то захочет расшифровать данные, сервер ключей проверяет, соответствуют ли они политике (с помощью вызова seal_approve onchain). Если запрос одобрен, он возвращает производный закрытый ключ для этого удостоверения. Derive(msk, identity) → sk Decrypt(sk, encrypted_data) Затем пользователь может локально расшифровать содержимое. Таким образом, шифрование выполняется без необходимости заранее знать, кто будет расшифровывать данные. Вы просто определяете условия, а SEAL выяснит остальное позже. Это динамично. ##Шаг 3: Сервер ключей — вне блокчейна, но не централизован Возможно, вы задаетесь вопросом: у кого эти мастер-ключи? Здесь на помощь приходитСервер ключей SEAL. Думайте об этом как о бэкенде, который: Содержит главный секретный ключ (msk) Следит за контрактами в блокчейне (например, за вашей логикой seal_approve) Выпускает производные ключи только при соблюдении условий Но — и это главное — SEAL не полагается только на один* сервер ключей. Вы можете запустить его в режимеthreshold, когда перед выдачей ключа дешифрования необходимо согласование нескольких независимых серверов. Например: запрос должны одобрить 3 из 5 ключевых серверов. Это позволяет избежать основных точек сбоя, а также обеспечивает децентрализацию на уровне управления ключами. Более того, в будущем SEAL будет поддерживатьMPC (многопартийные вычисления) иконфигурации на основе анклав(например, TEE), чтобы вы могли получить еще более надежные гарантии без ущерба для удобства использования. ##Шаг 4: расшифровка на стороне клиента Как только ключ возвращается пользователю, фактическое дешифрование происходитна его устройстве. Это означает: Сервер никогда не видит ваши данные Бэкэнд никогда не хранит расшифрованный контент Только пользователь может получить доступ к окончательному сообщению Это надежная модель конфиденциальности. Даже если кто-то взломает уровень хранения данных (IPFS, Arweave и т. д.), он все равно не сможет прочитать данные, не пройдя логику доступа. Вот краткая ментальная модель: Эта структура позволяет легко создавать dApps, правила доступа которых не жестко закодированы — они динамичны, поддаются аудиту и полностью интегрированы в логику цепочки. ##Команда, стоящая за печатью SEAL возглавляетSamczsun, известная фигура в сообществе блокчейн-безопасности. Ранее он был партнером по исследованиям в Paradigm, а затем провел аудит и спас несколько экосистем от серьезных эксплойтов. Теперь он полностью сосредоточен на превращении SEAL в основную часть инфраструктуры конфиденциальности Web3. Судя по его опыту и авторитету, SEAL — это не просто еще один экспериментальный инструмент — это серьезная попытка сделать децентрализованную конфиденциальность данных практичной и масштабируемой. Внедрение SEAL в тестовой сети Sui Testnet открывает новый стандарт управления секретными данными приложениями Web3. Сочетая контроль доступа в блокчейне, пороговое шифрование и конфиденциальность на стороне клиента, SEAL обеспечивает более надежную основу для децентрализованной обработки данных. Независимо от того, создаете ли вы dApps, DAO или децентрализованные игры, SEAL предоставляет мощный набор инструментов для управления доступом и защиты пользовательских данных без ущерба для децентрализации. Если Web3 собирается двигаться вперед, безопасная инфраструктура, такая как SEAL, не является факультативной, а просто необходима
- Sui
- Architecture
- SDKs and Developer Tools
4 - СтатьяLokie13Mar 16, 2025
Step by step guide to create a Suiet wallet
Step by step guide to create a Suiet wallet: Download suiet extension: https://suiet.app/ After successful installation, click on the Suiet icon in your browser and select "Create New". Set a strong password to protect your wallet. Write down and save your recovery phrase in a safe place. This phrase is needed to recover your wallet if needed Done
- Sui
1 - СтатьяBahador85Mar 15, 2025
Путешествие в качестве разработчика смарт-контрактов SUI Move
В сегодняшней статье я хочу подробнее рассказать о дорожной карте для тех, кто хочет освоить путь разработки в стиле SUI move. 1. Изучите основы блокчейна Основные концепции:* Ознакомьтесь с ключевыми концепциями блокчейна, такими как децентрализация, механизмы консенсуса, криптографические примитивы и смарт-контракты. Обзор блокчейна SUI:* Узнайте, в чем уникальность SUI: объектно-ориентированная модель данных, цели по производительности и управление государством. 2. Изучите язык движений Основы языка:* Начните с основ языка программирования Move. Сосредоточьтесь на Типы ресурсов:* Как ресурсы используются для обеспечения безопасности и владения. Модули и структуры:* Как определить модули и структуры данных. Функции входа:* Как транзакции выполняются через назначенные точки входа. Рекомендуемые ресурсы: Используйте официальные учебные пособия по языку Move, документацию и репозитории образцов кода. 3. Настройте свою среду разработки Инструменты и интерфейс командной строки:* Установите интерфейс командной строки SUI и настройте набор инструментов Move на локальном компьютере. Локальная тестовая среда:* Настройте локальную сеть разработки SUI или используйте доступные тестовые сети. Это поможет вам поэкспериментировать с развертыванием и тестированием смарт-контрактов перед запуском в эксплуатацию. IDE и отладка:* Выберите интегрированную среду разработки (IDE), поддерживающую Move (например, VSCode с расширениями Move), и ознакомьтесь с отладкой и тестированием контрактов. 4. Создайте свой первый простой контракт Практические руководства:* Начните с простого проекта, например контракта на поставку токенов. Это позволит вам применить базовые конструкции Move. Изучите паттерны, специфичные для SUI:* Поработайте с объектной моделью SUI и узнайте, как транзакции обрабатываются в экосистеме SUI. Документация и примеры:* Используйте документацию SUI для разработчиков и примеры проектов, чтобы понять передовые практики. 5. Глубокое погружение в особенности SUI Объектно-ориентированная модель:* Узнайте, чем SUI обрабатывает объекты иначе, чем блокчейны на основе учетных записей, такие как Ethereum. Газ и модель транзакций:* Изучите, как рассчитывается плата за газ и как осуществляется управление исполнением транзакций в SUI. Государственное управление:* Узнайте о подходе SUI к государственному хранилищу, модульным обновлениям и управлению жизненным циклом объектов. 6. Тестирование, отладка и развертывание Модульное и интеграционное тестирование:* Напишите тесты для проверки логики и безопасности ваших смарт-контрактов. Убедитесь, что вы рассмотрели крайние случаи и потенциальные уязвимости. Развертывание в локальной сети и в тестовой сети:* Развертывайте контракты в контролируемой среде, чтобы увидеть, как они работают в реальных условиях. Инструменты:* Используйте инструменты отладки и логирования SUI для повторения и улучшения кода. 7. Передовые практики безопасности и аудиты кода Ознакомьтесь с распространенными ошибками:* Изучите распространенные уязвимости безопасности смарт-контрактов (например, повторный вход в систему, неправильный контроль доступа) и способы их устранения с помощью архитектуры Move. Обзоры кода:* Примите участие в рецензировании кода сообществом или сотрудничайте с коллегами для аудита и улучшения своего кода. Формальная верификация:* Изучите любые доступные инструменты формальной проверки Move, чтобы математически доказать правильность ваших контрактов. 8. Присоединяйтесь к сообществу разработчиков SUI Каналы сообщества:* Общайтесь с другими разработчиками на форумах, каналах Discord или через звонки в сообщество. Обмен опытом и проблемами бесценен. Материалы с открытым исходным кодом:* Внесите свой вклад в проекты с открытым исходным кодом или репозитории разработчиков, связанные с SUI и Move. Будьте в курсе событий:* Следите за блогами SUI и Move, репозиториями GitHub и каналами социальных сетей, чтобы следить за новыми разработками, обновлениями и передовыми практиками. 9. Изучите продвинутые темы Сложные приложения:* Когда вам станет удобнее, поэкспериментируйте с более продвинутыми дизайнами смарт-контрактов, такими как протоколы децентрализованного финансирования (DeFi), NFT или кошельки с несколькими подписями. Совместимость и интеграция:* Узнайте, как взаимодействовать с другими смарт-контрактами и интегрировать модули SUI Move с внесетевыми системами. Производительность и масштабируемость:* Изучите методы оптимизации контрактов с точки зрения скорости и экономичности в блокчейне SUI. 10. Создайте портфолио и продолжайте практиковаться Витринные проекты:* Разработайте и задокументируйте серию проектов, демонстрирующих ваше понимание и опыт. Непрерывное обучение:* Блокчейн и Move быстро развиваются. Сделайте непрерывное обучение привычкой, изучая документацию, посещая семинары и участвуя в хакатонах. Цикл обратной связи:* Используйте отзывы сообщества, чтобы усовершенствовать свои навыки и быть на шаг впереди конкурентов в разработке смарт-контрактов. Несмотря на то, что приведенные выше материалы являются рекомендациями и не единственным способом стать разработчиком SUI, я надеюсь, что они будут полезны для вас, ребята. Счастливого программирования. Счастливого использования!
- Sui
- SDKs and Developer Tools
- Move
2 - Статья0xduckmove135Mar 12, 2025
Setting Up a Project to Test the SUI Name Service (SuiNS)
The SUI Name Service (SuiNS) is a decentralized naming system on the SUI blockchain that allows users to map human-readable names (e.g., "0xduck.sui") to blockchain addresses or other data, enhancing usability and accessibility. For developers, testing the SuiNS SDK is an essential step to ensure applications can resolve these names correctly. In this article, we’ll walk you through the process of setting up a project to test the SuiNS SDK, from preparing your development environment to querying a name record like "0xduck.sui" and understanding the results. Introduction to SUI Name Service The SUI Name Service (SuiNS) simplifies blockchain interactions by allowing users to register memorable names instead of using complex cryptographic addresses. For example, instead of sending tokens to "0x1234...abcd", you could send them to "0xduck.sui". Testing the SuiNS SDK ensures that your application can correctly interact with this system, retrieving and interpreting name records as needed. In this project, we’ll set up a Node.js environment, connect to the SUI mainnet, and write a script to query the name record for "0xduck.sui". By the end, you’ll have a working setup to explore SuiNS further. Prerequisites Before starting, ensure you have the following: Node.js (version 14 or higher) and npm (version 6 or higher) installed. Download them from nodejs.org if needed. Basic understanding of JavaScript, particularly asynchronous programming (e.g., async/await). A code editor like Visual Studio Code (VS Code) for writing and running scripts. An internet connection to install packages and connect to the SUI. Setting Up the Development Environment Let’s create a new project directory and initialize it as a Node.js project. This will provide a clean workspace for our test. Step-by-Step Instructions: Open your terminal (e.g., Command Prompt, PowerShell, or a Unix shell). Create a new directory: mkdir suins-test-project cd suins-test-project Initialize a Node.js project: Run this command to create a package.json file with default settings: npm init -y Your project is now set up with a basic structure. Installing Dependencies Run the following in your terminal: npm install @mysten/suins @mysten/sui Verify the Installation: Check that the packages are added to package.json under dependencies. You can also confirm the installed versions by running: npm list @mysten/suins @mysten/sui This should output something like: suins-test-project@1.0.0 ├── @mysten/sui@x.x.x └── @mysten/suins@y.y.y Configuring the SUI Client The SUI client connects your project to the SUI blockchain. For testing, we’ll use the mainnet. Create a Script File: In your project directory, create a file named test-suins.js: touch test-suins.js # On Unix/macOS echo. > test-suins.js # On Windows Open test-suins.js in your editor and add the following: import { getFullnodeUrl, SuiClient } from '@mysten/sui/client'; // Create a SUI client connected to the testnet const suiClient = new SuiClient({ url: getFullnodeUrl('testnet') }); Note: If you encounter an error about ES modules (e.g., "Cannot use import statement outside a module"), add "type": "module" to your package.json: { "name": "suins-test-project", "version": "1.0.0", "type": "module", ... } Testing the Name Service Now, let’s write a script to query the name record for "0xduck.sui" and log the result. import { getFullnodeUrl, SuiClient } from '@mysten/sui/client'; import { SuinsClient } from '@mysten/suins'; // Create a SUI client connected to the testnet // const suiClient = new SuiClient({ url: getFullnodeUrl('mainnet') }); const client = new SuiClient({ url: getFullnodeUrl('mainnet') }); // Create a SuiNS client using the SUI client const suinsClient = new SuinsClient({ client, network: 'mainnet', }); // Function to test the name service async function testNameService() { try { // Query the name record for 'demo.sui' const nameRecord = await suinsClient.getNameRecord('0xduck.sui'); // Log the result console.log('Name Record for "0xduck.sui":', nameRecord); } catch (error) { console.error('Error fetching name record:', error.message); } } testNameService(); In your terminal, execute: node test-suins.js
- SDKs and Developer Tools
3 - СтатьяBahador85Mar 11, 2025
Suibase, a great tool to experience the SUI
As I was checking some resources for the SUI development, I faced a tool named, suibase. In my exploration on that, I found it very helpful, especially when using localnet which a local explorer will be set up on our local system. I loved it so much. as there is stated in the official website of Suibase: Suibase makes it easy to create "workdirs", each defining a distinct development environment targeting a network. It seems like virtual env in python programming. As far as I found this tool, there are many usefull functionalities which we can take benefit of: Key functionalities of Suibase include: Workdir Management: Suibase enables the creation of isolated workdirs for each network, ensuring that configurations and dependencies are maintained separately. This isolation facilitates organized and efficient development workflows. Suibase Simplified Command-Line Interface:* The tool provides scripts such as lsui, dsui, tsui, and msui, which serve as frontends to the Mysten Labs sui binaries for localnet, devnet, testnet, and mainnet, respectively. These scripts eliminate the need to manually switch environments, as they automatically execute the appropriate sui client and keystore for the targeted network. Localnet Operations:* Suibase offers commands like localnet start, localnet stop, and localnet status to manage the local network. Additionally, the localnet regen command allows developers to reset the network to its initial state, complete with predefined addresses and aliases, which is particularly useful for testing purposes. Faucet Functionality:* The localnet faucet command enables the distribution of Sui coins to specified addresses or all addresses within the localnet, facilitating testing and development activities. Independent Installation:* Suibase operates independently of other Mysten Labs installations and keystores, ensuring that it does not interfere with existing setups. This design allows Suibase to coexist safely with standard installations on the same system. By providing these features, Suibase enhances the development experience on the Sui network, offering a structured and efficient environment for building and testing applications. I recommend testing it!
- Sui
- SDKs and Developer Tools
3 - СтатьяBahador85Mar 11, 2025
How to fix the SUI installation error?
When I try to install and build the SUI binary on my local system with this command: cargo install --git https://github.com/MystenLabs/sui.git --bin sui --branch devnet I face this error: Please specify a package, e.g. cargo install --git https://github.com/MystenLabs/sui.git anemo-benchmark. After some digging, I found the solution and was able to install and build it error-free and completely using some modification in the above command: For Devnet: cargo install --locked --git https://github.com/MystenLabs/sui.git sui --branch devnet For Testnet: cargo install --locked --git https://github.com/MystenLabs/sui.git sui --branch devnet This way, you can install and build SUI on your local machine and start on your way! Best of luck.
- Sui
- Move
3
Заработай свою долю из 1000 Sui
Зарабатывай очки репутации и получай награды за помощь в развитии сообщества Sui.
- Sui
- SDKs and Developer Tools
- Architecture
- Move
- NFT Ecosystem
- Transaction Processing
- Security Protocols
- How to access and manage nested structs and dynamic fields in Move?56
- Как преобразовать закрытый ключ в новый формат с помощью интерфейса командной строки43
- 👀 SEAL - Я думаю, что конфиденциальность данных Web3 скоро изменится4
- Sui memes DEX options and chart44
- How to update coin logo on Sui smart contract?32