Explorer
Приєднуйтесь до спільнот і відкривайте нові ідеї.
Зароби свою частку з 1000 Sui
Заробляй бали репутації та отримуй винагороди за допомогу в розвитку спільноти Sui.
Спільноти
Sui is a Layer 1 protocol blockchain designed as the first internet-scale programmable blockchain platform.
Топ публікаціїТоп учасників- 701
- 618
- 595
Move is an executable bytecode language used to implement custom transactions and smart contracts.
Топ публікаціїТоп учасників- 271
- 260
- 251
Peera is a decentralized questions and answers protocol for Web3 where users can organize and store their interests and skills, creating a common community platform
Топ учасників- 328
- 286
- 225
The InterPlanetary File System (IPFS) is a protocol, hypermedia and file sharing peer-to-peer network for storing and sharing data in a distributed file system.
Топ публікаціїТоп учасників- 25
- 20
- 20
Walrus is a decentralized storage and data availability protocol designed specifically for large binary files, or "blobs"
Топ публікаціїТоп учасників- 41
- 40
- 38
Винагорода
- +15Xavier.eth313ДляSuiJun 27, 2025
Невдала операція Sui: об'єкти, зарезервовані для іншої транзакції
Я стикаюся з наполегли JsonRpcErrorвим при спробі виконати транзакції на Sui. Помилка вказує на те, що об'єкти зарезервовані для іншої транзакції, навіть якщо я впровадив послідовну обробку транзакцій із затримками. JsonRpcError: Failed to sign transaction by a quorum of validators because one or more of its objects is reserved for another transaction. Other transactions locking these objects: AV7coSQHWg5vN3S47xada6UiZGW54xxUNhRv1QUPqWK (stake 33.83) 0x1c20f15cbe780ee7586a2df90c1ab70861ca77a15970bea8702a8cf97bd3eed9 0x1c20f15cbe780ee7586a2df90c1ab70861ca77a15970bea8702a8cf97bd3eed9 0x1c20f15cbe780ee7586a2df90c1ab70861ca77a15970bea8702a8cf97bd3eed9 Я пробував: Послідовне виконання транзакції (очікування завершення попередньої транзакції) Додані 3-секундні затримки між транзакціями І все ще отримуємо ту саму помилку послідовно. Використання Sui RPC для подання транзакцій. Один і той же ідентифікатор об'єкта з'являється кілька разів у списку блокування. Помилка виникає навіть при ретельному послідовності транзакцій. Що призводить до того, що об'єкти «зарезервовані» для інших транзакцій? Як правильно перевірити наявність об'єкта, перш ніж використовувати його в транзакції? Чи існують найкращі методи роботи з блокуванням об'єктів у Sui? Чи може це бути пов'язано з термінами остаточності транзакції? Хтось стикався з цією проблемою раніше? Будь-яка інформація про правильне управління об'єктами в транзакціях Sui буде дуже вдячна!
24 - +15Xavier.eth313ДляSuiJun 17, 2025
Як обмеження здібностей взаємодіють з динамічними полями в гетерогенних колекціях?
Я створюю ринок, який повинен обробляти кілька типів активів з різними вимогами до здібностей, і я зіткнувся з деякими фундаментальними запитаннями щодо системи типів Move. Я хочу зберігати різні типи активів в одній колекції, але вони мають різні здібності: Звичайні NFT: key + store(можна передавати) Токени Soulbound: key тільки (не передаються) Користувальницькі активи з обмеженнями передачі public struct Marketplace has key { id: UID, listings: Bag, // Want to store different asset types here } // This works for transferable assets public fun list_transferable( marketplace: &mut Marketplace, asset: T, price: u64 ) { /* ... */ } // But how to handle soulbound assets? public fun list_soulbound( // No store ability marketplace: &mut Marketplace, asset_ref: &T, // Can only take reference price: u64 ) { /* How do I store metadata about this? */ } Ключові питання: Вимоги до здібностей: dynamic_field::add()При використанні Vзавжди потрібно під store час компіляції? Чи можуть типи обгортки обійти це? Гетерогенне зберігання: Чи може одна сумка зберігати об'єкти з різними наборами здіб key + store + copyностей (vskey + store) та обробляти їх по-різному під час виконання? Безпека типу: Оскільки динамічні поля виконують стирання типу, як я можу підтримувати безпеку типу під час отримання значень? Який шаблон для зберігання метаданих типу? Шаблон свідків: Як працюють обмеження здібностей з фантомними типами? Чи можу я зберігати Assetі Assetв тій самій колекції та витягувати інформацію про тип пізніше? Побудова системи, де NFT, токени, пов'язані з душею, та обмежені активи потребують функціональності ринку, але з різною семантикою передачі. Я спробував типи обгортки, кілька колекцій на набір можливостей, окреме зберігання метаданих типу. Кожен з них має компроміси між безпекою типу, витратами на газ та складністю.
04 - +10ДляSuiMay 29, 2025
Чому BCS вимагає точного порядку полів для десеріалізації, коли структури Move мають названі поля?
Чому BCS вимагає точного порядку полів для десеріалізації, коли структури Move мають названі поля? Я глибоко занурювався в кодування/декодування BCS у Move, особливо для міжланцюгового зв'язку та обробки даних поза ланцюгом. Опрацьовуючи приклади в документації Sui Move, я зіткнувся з деякою поведінкою, яка здається неінтуїтивною, і я намагаюся зрозуміти основні рішення щодо дизайну. Відповідно до специфікації BCS, «в BCS немає структур (оскільки немає типів); структура просто визначає порядок, в якому поля серіалізуються». Це означає, що при десеріалізації ми повинні використовувати peel_*функції в тому ж порядку, що і визначення поля struct. Мої конкретні запитання: Обґрунтування дизайну: Чому BCS вимагає точного узгодження порядку полів, коли структури Move мають названі поля? Чи не було б надійніше серіалізувати імена полів поряд зі значеннями, подібними до JSON або інших форматів, що самоописуються? Взаємодія загальних типів: У документах згадується, що «типи, що містять поля загального типу, можна обробити до першого поля загального типу». Розглянемо таку структуру: struct ComplexObject has drop, copy { id: ID, owner: address, metadata: Metadata, generic_data: T, more_metadata: String, another_generic: U } Як саме тут працює часткова десеріалізація? Чи можу я десеріалізувати до more_metadata та ігнорувати обидва загальні поля, чи перше загальне поле (generic_data) повністю блокує подальшу десеріалізацію? Міжмовна послідовність: Під час використання бібліотеки JavaScript @mysten /bcs для серіалізації даних, які будуть споживані контрактами Move, що станеться, якщо: Я випадково змінюю порядок полів в об'єкті JavaScript? Визначення структури Move змінює порядок поля в оновленні контракту? У мене є вкладені структури з власними загальними параметрами? Практичні наслідки: як команди обробляють еволюцію схеми BCS у виробничих системах? Ви редагуєте свої схеми BCS, чи очікуєте, що порядок полів структури є незмінним після розгортання?
53
Найновіші
Як відновити монети SUI зі старого гаманця?
Я намагався знайти свої монети SUI під час створення нового облікового запису Slush, але я їх не бачу. Як перевірити, чи використовую я правильну фразу для імпорту свого старого гаманця?
02Освоєння мовних концепцій руху - Курс #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 has key { id: UID, content: T, } public fun new_box(ctx: &mut TxContext, content: T): Box { Box { id: object::new(ctx), content, } } } Ось* `параметр типу*, що робить роботу з будь-яким 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 Повторне використання існуючих модулів cointransfertx_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, } 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 для представлення пулів ліквідності та обміну токенами, використовуючи генерики та таблиці для ефективного управління станом.
2- ДляSuiJun 30, 2025
Що таке динамічні NFT і чому Sui досягає успіху в них?
Простір NFT розвивається за межі статичних зображень та зображень профілю (PFP). Наступний кордон? Динамічні NFT (DNFT) — токени, які можуть змінюватися на основі реальних даних, взаємодії користувачів або ланцюгових подій. Хоча багато блокчейнів підтримують NFT, Sui Network має унікальну позицію для забезпечення майбутнього DNFT завдяки своїй інноваційній архітектурі. Ця стаття досліджує: Що робить NFT «динамічним»? Чому технологія Sui ідеально підходить для DNFT Реальні випадки використання сьогодні Майбутнє інтерактивних цифрових активів 1. Що таке динамічні NFT? На відміну від традиційних NFT (які є статичними та незмінними), динамічні NFT можуть оновлювати свої: Метадані (наприклад, спортивний NFT, який змінюється на основі статистики гри) Зовнішній вигляд (наприклад, ілюстрація, яка розвивається з часом) Утиліта (наприклад, NFT лояльності, який відкриває нові пільги) Як вони працюють? DNFT використовують логіку смарт-контракту+зовнішні входи даних (оракули, дії користувача тощо) для запуску змін. Приклад: Чутлива до погодних умов NFT ілюстрація, яка змінює кольори на основі даних клімату в режимі реального часу. Ігровий персонаж NFT, який підвищується рівень під час гри. 2. Чому Sui є найкращим блокчейном для динамічних NFT Хоча Ethereum і Solana також підтримують DNFT, дизайн Sui пропонує ключові переваги: Ланцюгове сховище (без зовнішніх залежностей) Більшість блокчейнів зберігають метадані NFT поза ланцюгом (наприклад, IPFS), роблячи динамічні оновлення незграбними. Sui зберігає все в мережі, дозволяючи миттєві, безнадійні модифікації. Мова переміщення: безпечні та гнучкі оновлення Solidity Ethereum вимагає складних проксі-контрактів для оновлюваних NFT. Мова Sui Move дозволяє змінювати рідну зміну — без незграбних обхідних шляхів. Паралельна обробка (масивна масштабованість) Оновлення тисяч DNFT відразу? Ethereum бореться з перевантаженнями. Паралельне виконання Sui обробляє мільйони оновлень без уповільнення. Об'єктно-центрична модель (гранульований контроль) Кожен NFT є незалежним об'єктом з настроюваною логікою. Вмикає тонко налаштовану інтерактивність (наприклад, лише власник може викликати зміни). 3. Реальні випадки використання DNFT на Sui Ігри та метавсесвіт Еволюційні ігрові предмети (наприклад, меч NFT, який отримує здібності з використанням). Міжігрова сумісність (об'єкти Sui можуть переміщатися між DApps). Приклад: * Ігри на основі SUI, такі як Panzerdogs, використовують DNFT для настроюваних аватарів. * Генеративне та реактивне мистецтво NFT на основі штучного інтелекту, які змінюють стиль на основі тенденцій ринку. Спільне мистецтво, де колекціонери впливають на остаточний твір. Приклад: *Мистецькі лабораторії, такі як Sui Gallery, проводять виставки DnFT. * Відстеження реальних активів (RWA) Договірні NFT, які оновлюються записами власності. Сертифікаційні значки, термін дії яких закінчується або поновлюється автоматично. Програми лояльності та членства Динамічні NFT зі знижками, які покращуються із витратами клієнтів. VIP-пропуски доступу, які з часом розблоковують нові рівні. Приклад: *Роздрібні партнери Sui тестують програми лояльності dNFT. * 4. Майбутнє DNFT на Суї Очікуйте побачити: інтегровані з штучним інтелектом DNFT (наприклад, чат-боти, що живуть у аватарах NFT). DNFT із забезпеченням DEFI (вартість коригується залежно від ринкових умов). Повністю мережеві ігри, де кожен актив є змінним dNFT. Висновок: Sui будує майбутнє NFT У той час як статичні NFT домінували в 2021-2023 роках, динамічні NFT керуватимуть наступним бичком — і технологія Sui робить його ідеальною платформою. Завдяки мережевому сховищу, безпеці Move та неперевершеній масштабованості Sui готова стати домом передових DNFT.
5
Без відповіді
Як оновити ключ продавця в ObjectTable, коли він змінюється в структурі?
Привіт усім, я тільки починаю писати смарт-контракти і працюю над своїм першим проектом. Я хотів би допомогти з проблемою, на якій я застряг. Поки що я створив Merchantструктуру, яка виглядає так: -id: унікальний ідентифікатор (UID) -owner: адреса продавця -key: Рядок, що використовується як унікальний ключ -balance: u64, що представляє їх баланс Я також зробив структуру MerchantRegistryдля управління всіма продавцями: -id: інший UID -merchant_to_address: ObjectTableвідображення адрес для продавців -merchant_to_key: ObjectTableвідображення ключів для продавців Я хочу мати можливість шукати продавця або за їхньоюадресу, або за їхнімключа. Коли користувач оновлює свій ключ Merchantвсередині структури, зміна автоматично не оновлює ключ у merchant_to_keyтаблиці. Це означає, що старий ключ все ще вказує на купця, який ламає речі. Я намагався видалити запис з таблиці та вставити його назад за допомогою нового ключа, але я постійно стикаюся з такими помилками, як: «Не можна ігнорувати значення без можливості падіння» Я впевнений, що це помилка початківців, але мені ніде не вдалося знайти чіткого пояснення чи рішення. Чи є правильний спосіб обробки оновлення ключа як у структурі, так і в таблиці пошуку?
50- 0xduckmove618ДляSuiJun 06, 2025
Який інтерфейс найпростіший для завантаження крапок моржів?
просто простий інтерфейс користувача для завантаження на морж? (крім туски)
20 Що станеться, якщо я не претендую на ETH через міст Sui?
Я використовував міст Sui для передачі деяких ETH, але ще не претендував на нього, оскільки комісії досить високі. Що буде, якщо я залишу його незатребуваним?
00
У тренді
Бот AMM в екосистемі Sui
Які ключові особливості та функціональні можливості ботів AMM в екосистемі Sui? Як вони покращують традиційні торгові механізми та які переваги вони пропонують користувачам, які користуються протоколами DeFi в мережі Sui? Чи потрібно мені будувати його або я можу використовувати Turbos Finance, наприклад
82- 0xduckmove618ДляSuiApr 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 робить все це можливим. Контроль доступу живе onchain, повністю автоматизований, адміністратор не потребує керування ним. Просто логіка, запечена прямо в блокчейн. SEAL робить все це можливим. Контроль доступу живе onchain, повністю автоматизований, адміністратор не потребує керування ним. Просто логіка, запечена прямо в блокчейн. Ще один цікавий фрагмент - це те, як SEAL обробляєшифрування. Він використовує щось, що називаєтьсяпорогове шифрування, що означає: жоден вузол не може розшифрувати дані. Для спільної роботи потрібна група серверів - щось на зразок multi-sig, але для розблокування секретів. Це розподіляє довіру та дозволяє уникнути звичайної проблеми з однією точкою відмови. І щоб зберегти речі по-справжньому приватними, 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адреса гаманця дао_голосували: пропозиція_xyz PKGID_2025_05_01 (правило на основі міток часу) або навіть геймкористувач_nftхолдер Коли дані зашифровані, це виглядає так: Encrypt(mpk, identity, message) mpk = головний відкритий ключ (відомий всім) ідентичність = логічно визначений одержувач повідомлення = фактичні дані Пізніше, якщо хтось хоче розшифрувати, сервер ключів перевіряє, чи відповідають вони політиці (за допомогою виклику seal_approve onchain). Якщо він схвалений, він повертає похідний приватний ключ для цього ідентифікатора. Derive(msk, identity) → sk Decrypt(sk, encrypted_data) Потім користувач може розшифрувати вміст локально. Таким чином, шифрування робиться без необхідності знати ко розшифруватиме заздалегідь. Ви просто визначаєте умови, а SEAL з'ясовує решту пізніше. Це динамічно. ##Крок 3: Ключовий сервер - поза ланцюгом, але не централізований Ви можете задатися питанням: хто тримає ці головні ключі? Тут на допомогу приходитьКлючовий сервер SEAL. Подумайте про це як про бекенд, який: Тримає головний секретний ключ (msk) Дивиться на ланцюгові контракти (як ваша логіка seal_approve) Видає лише похідні ключі, якщо умови виконані Але - і це ключове - SEAL не покладається лише на * один* ключовий сервер. Ви можете запустити його впороговому режимі, де кілька незалежних серверів повинні погодитися, перш ніж буде видано ключ розшифровки. Наприклад: 3 з 5 ключових серверів повинні схвалити запит. Це дозволяє уникнути центральних точок відмови та дозволяє децентралізувати також на рівні управління ключами. Ще краще, що в майбутньому SEAL підтримуватимеMPC (багатосторонні обчислення) таналаштування на основі анклав(наприклад TEE) - так що ви можете отримати ще сильніші гарантії без шкоди для зручності використання. ##Крок 4: Дешифрування на стороні клієнта Після повернення ключа користувачеві фактичне дешифрування відбуваєтьсяна його пристрої. Це означає: Сервер ніколи не бачить ваші дані Backend ніколи не зберігає розшифрований вміст Тільки користувач може отримати доступ до остаточного повідомлення Це надійна модель конфіденційності. Навіть якщо хтось компрометує шар зберігання (IPFS, Arweave тощо), вони все одно не можуть прочитати дані, не передаючи логіку доступу. Ось швидка ментальна модель: Ця структура дозволяє легко створювати DApps, де правила доступу не жорстко закодовані - вони динамічні, піддаються перевірці та повністю інтегровані у логіку вашого ланцюга. ##Команда за SEAL SEAL очолюєSamczsun, відома фігура в спільноті безпеки блокчейнів. Раніше був дослідницьким партнером Paradigm, він перевіряв та врятував кілька екосистем від великих подвигів. Тепер він повністю зосереджений на тому, щоб SEAL перетворився на основну частину інфраструктури конфіденційності Web3. Завдяки своєму досвіду та довірі SEAL є не просто ще одним експериментальним інструментом - це серйозна спроба зробити децентралізовану конфіденційність даних практичною та масштабованою. Оскільки SEAL виходить в ефір на Sui Testnet, він приносить новий стандарт того, як додатки Web3 можуть керувати секретами. Поєднуючи контроль доступу в ланцюжок, порогове шифрування та конфіденційність на стороні клієнта, SEAL пропонує більш надійну основу для децентралізованої обробки даних. Незалежно від того, створюєте ви DApps, DAO чи децентралізовані ігри - SEAL надає потужний набір інструментів для забезпечення контролю доступу та захисту даних користувачів без шкоди для децентралізації. Якщо Web3 збирається рухатися вперед, безпечна інфраструктура, така як SEAL, не є необов'язковою - це важливо
8 Єдиний спосіб опублікувати пакети Move через EOA?
Я припускаю, що в ланцюжку Sui немає способу, оскільки в ланцюжку немає модуля, який публікує пакети.
73