После значительного развития мы сделали безопасную случайность доступной в Sui Testnet. Эта важная функция, основанная на модуле sui::random, открывает новые возможности для разработчиков и разработчиков Sui.

Зачем нам нужна случайность в цепочке?

Приложения и проекты могут использовать случайность самыми разными способами: от моделирования броска игральной кости до присвоения номеров билетов в системе, обеспечивающей справедливость. Существует больше вариантов использования случайной цепочки, чем можно было подумать на первый взгляд. Вот несколько ключевых примеров:

1. Азартные игры. Наиболее очевидным вариантом использования являются такие игры, как лотереи, карточные игры, гача, лутбоксы, лотереи и игры в казино. Встроенная случайность Onchain позволяет этим играм работать, не требуя от игроков доверия игровому оператору. Честность игры может проверить любой, обеспечивая прозрачность и доверие. Этот вариант использования распространяется и на более сложные игры, например определение того, нанесет ли персонаж в ролевой игре удар по врагу.

2. Случайная выборка: выбор случайной подгруппы из более крупной группы, что полезно в различных областях, таких как управление и рандомизированный аудит. При разрешении споров можно использовать случайную выборку для выбора беспристрастного жюри. Другим примером является случайный выбор комитетов в оракулах и DAO для процессов голосования и принятия решений с целью повышения справедливости и прозрачности.

3. NFT. Случайность позволяет создавать случайные NFT с разным уровнем редкости. Например, криптографический предмет коллекционирования может иметь различные характеристики, присвоенные вероятностно. Кроме того, NFT могут включать генетические черты или случайные мутации в сценарии разведения, открывая двери для творчества в разработке и использовании NFT.

4. Соревнования и подбор игроков. Интересные примеры включают случайное размещение участников в турнирных сетках, подбор игроков для игр и социальных взаимодействий, определение порядка игры в пошаговых играх, выбор победителей в случае ничьей, распределение игроков по командам и их порядок в редакции, назначении места проведения и судей на мероприятиях.

Эндрю Шран из Mysten Labs обсуждает природную случайность Суи в Sui Basecamp.

Техническая сторона децентрализованной случайности

Чтобы случайность в цепочке была безопасной, она должна быть непредсказуемой и беспристрастной. Непредсказуемость гарантирует, что никто не сможет предсказать случайные значения до того, как они будут использованы, что не позволяет злоумышленникам манипулировать приложениями с помощью опережающих транзакций или вмешиваться только тогда, когда результаты благоприятны. Непредвзятость гарантирует, что ни одна сторона не сможет повлиять на результат процесса генерации случайности, что не позволяет злоумышленникам искажать результаты в свою пользу.

Существующие решения и их ограничения

Различные существующие решения направлены на обеспечение безопасной случайности, каждое из которых имеет свои собственные компромиссы. Использование внешнего источника случайности, такого как локальная/нераспределенная проверяемая случайная функция (VRF), является простым, но не полностью децентрализованным, поскольку доверие к нескольким узлам, управляющим VRF, может привести к проблемам с предсказуемостью и предвзятостью, если источник вступает в сговор с другими сторонами. Поддающиеся проверке функции задержки (VDF) гарантируют, что случайность не может быть предсказана до тех пор, пока не пройдет определенное время, но также имеют тенденцию быть слишком медленными для многих приложений. 

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

Подход Суи к случайности

Mysten Labs разработала решение, которое использует пороговую криптографию и генерацию распределенных ключей (DKG), чтобы продемонстрировать непредсказуемость, беспристрастность и скорость. Это решение появляется на Sui как маяк случайности, поддерживаемый сетью валидаторов. В начале каждой эпохи валидаторы запускают протокол DKG для генерации секретных долей распределенного ключа. Затем, непрерывно в течение эпохи, они используют свои доли ключа для создания случайности для использования приложениями. 

Это собственное решение случайности намного быстрее, чем существующие решения на Sui. Генерация случайности работает параллельно механизму консенсуса, предоставляя случайные значения сразу после заказа транзакции, но до ее выполнения.

Кроме того, блоки перемещения и программируемых транзакций (PTB) позволяют создавать мощные композиции, предотвращая потенциальные манипуляции с помощью встроенных ограничений и предупреждений компилятора. Несмотря на то, что в программе имеются важные встроенные средства безопасности, разработчикам следует обеспечить надежность конструкции программы, чтобы избежать проверки другими функциями перемещения или командами PTB.

Использование модуля sui::random

Модуль sui::random обеспечивает доступ к псевдослучайности внутри Sui, позволяя использовать множество приложений. Например, разработчики могут использовать эту функцию для реализации функции Move, которая выбирает случайного победителя для лотереи. Исходный код этого и других примеров можно найти в нашем репозитории GitHub.

запись set_winner(game: &mut Raffle, rnd: &Random, ctx: &TxContext) {assert!(is_none(game.winner), EWinnerAlreadySet); // победитель имеет тип Option<u32> let gen = new_generator(rnd, ctx); game.winner = Some(gen.generate_u32_in_range(1, game.num_of_tickets)); // num_of_tickets — это u32, обозначающее количество участников }

Вторая строка функции

set_winner

гарантирует, что победитель еще не выбран. Затем функция инициализирует новый генератор случайных чисел, и случайное число генерируется в диапазоне номеров билетов. Результатом является безопасно и непредсказуемо выбранный победитель благодаря надежным гарантиям случайной генерации Sui, которые гарантируют, что значение, возвращаемое функциейgenerate_u32_in_range, является случайным и непредсказуемым, пока менее одной трети голосов в сети повреждено.

Хотя случайность генерируется глобально сетью, а не каждой транзакцией, Суй каждый раз извлекает из этой глобальной случайности непредсказуемое и несмещенное семейство псевдослучайных функций с начальным значением. 

новый_генератор

вызывается.

Округление случайности в Sui

Внедрение безопасного и масштабируемого источника случайности в Sui является важным достижением, позволяющим разработчикам создавать более надежные и безопасные приложения. Мы призываем наше сообщество оставлять отзывы и исследовать новые способы использования случайности. Более подробную техническую информацию можно найти в документации по случайности Onchain.

Эта функция теперь доступна в Sui Testnet. Мы призываем разработчиков опробовать это и убедиться, что их приложения готовы использовать безопасные и надежные случайные значения, когда в основной сети доступна собственная случайность. Спасибо нашим разработчикам за вклад в создание более безопасной и эффективной экосистемы Sui!