大幅な開発を経て、Sui テストネットで安全なランダム性が利用可能になりました。sui::random モジュールを搭載したこの重要な機能は、Sui の開発者とビルダーに新たな可能性をもたらします。

オンチェーンにランダム性が必要なのはなぜですか?

アプリやプロジェクトは、サイコロを振るシミュレーションから公平性を保証するシステムでのチケット番号の割り当てまで、さまざまな方法でランダム性を使用できます。オンチェーンのランダム性の使用例は、当初考えていたよりも多くあります。以下にいくつかの重要な例を示します。

1. 運任せのゲーム: 最も明らかな使用例は、宝くじ、カードゲーム、ガチャ、ルートボックス、ラッフル、カジノゲームなどのゲームです。オンチェーンのネイティブランダム性により、これらのゲームは、プレイヤーがゲームオペレーターを信頼しなくても運営できます。ゲームの公平性は誰でも検証できるため、透明性と信頼性が確保されます。この使用例は、RPG のキャラクターが敵にヒットしたかどうかを判断するなど、より複雑なゲームにも適用されます。

2. ランダム サンプリング: 大規模なグループからランダムにサブセットを選択すること。これは、ガバナンスやランダム監査などのさまざまな分野で役立ちます。紛争解決では、ランダム サンプリングを使用して、偏りのない陪審員を選出できます。別の例としては、オラクルや DAO で投票や意思決定プロセスにランダムに委員を選出し、公平性と透明性を高めることが挙げられます。

3. NFT: ランダム性により、希少性の異なるランダムな NFT を作成できます。たとえば、暗号コレクションには、さまざまな特性が確率的に割り当てられている可能性があります。さらに、NFT は遺伝的特性や繁殖シナリオのランダムな突然変異を組み込むことができるため、NFT の設計と使用における創造性への扉が開かれます。

4. コンテストとプレイヤーのマッチング: 興味深い例としては、トーナメント ブラケットに参加者をランダムに配置すること、ゲームやソーシャル インタラクションのプレイヤーをマッチングすること、ターン制ゲームでのプレイ順序を決定すること、引き分けの場合に勝者を選ぶこと、ドラフトでプレイヤーをチームに割り当てて順序を決めること、イベントの会場と審判を割り当てることなどが挙げられます。

Mysten Labs の Andrew Schran が Sui Basecamp で Sui のネイティブなランダム性について説明しています。

分散型ランダム性の技術的側面

オンチェーンのランダム性が安全であるためには、予測不可能かつ偏りのないものでなければなりません。予測不可能であれば、ランダム値が使用される前に誰もそれを予測できないため、攻撃者がトランザクションをフロントランニングしたり、結果が有利な場合にのみ関与したりしてアプリを操作することを防ぐことができます。偏りのないことで、単一の当事者がランダム性生成プロセスの結果に影響を与えることができないため、攻撃者が結果を有利に歪めることが防止されます。

既存のソリューションとその限界

さまざまな既存のソリューションは、それぞれトレードオフを伴う安全なランダム性を提供することを目指しています。ローカル/非分散型の検証可能ランダム関数 (VRF) などの外部ランダム性ソースを使用するのは簡単ですが、真の意味で分散化されているわけではありません。VRF を操作する少数のノードを信頼すると、ソースが他の当事者と共謀した場合に予測可能性とバイアスの問題が発生する可能性があるためです。検証可能遅延関数 (VDF) は、一定の時間が経過するまでランダム性を予測できないことを保証しますが、多くのアプリにとっては遅すぎる傾向があります。

他のソリューションでは、オラクルベースのランダム性を使用しますが、オラクルがノードと共謀した場合には予​​測可能で偏りが生じる可能性があり、安全な方法で使用するには時間がかかる可能性があります。たとえば、分散ランダム性ビーコンである drand を利用するには、プロセスが、予測不可能であることを確認するために十分に先のランダム性ラウンドを待機する必要があります。

スイのランダム性へのアプローチ

Mysten Labs は、しきい値暗号化と分散キー生成 (DKG) を活用して、予測不可能、偏りのない、高速という特性を発揮するソリューションを開発しました。このソリューションは、バリデータ ネットワークによってサポートされるランダム性ビーコンとして Sui に表示されます。各エポックの開始時に、バリデータは DKG プロトコルを開始して、分散キーの秘密の共有を生成します。その後、エポック中は継続的にキーの共有を使用して、アプリが使用するランダム性を生成します。

このネイティブなランダム性ソリューションは、Sui の既存のソリューションよりもはるかに高速です。ランダム性生成はコンセンサス メカニズムと並行して動作し、トランザクションが注文された後、実行前にランダムな値をすばやく提供します。

さらに、Move と Programmable Transaction Blocks (PTB) を使用すると、組み込みの制限とコンパイラの警告によって潜在的な操作を防ぎながら、強力な構成が可能になります。重要な安全レールが組み込まれていますが、開発者は他の Move 関数や PTB コマンドによる検査を回避するために、堅牢なプログラム設計を確保する必要があります。

sui::randomモジュールの使用

sui::random モジュールは、Sui 内で疑似ランダム性にアクセスできるようにし、さまざまなアプリを可能にします。たとえば、開発者はこの機能を使用して、抽選でランダムに当選者を選ぶ Move 関数を実装できます。この例やその他の例のソース コードは、GitHub リポジトリにあります。

entry set_winner(game: &mut Raffle, rnd: &Random, ctx: &TxContext) { assert!(is_none(game.winner), EWinnerAlreadySet); // winner は 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 です。}

関数の2行目

勝者を設定する

勝者がまだ選ばれていないことを確認します。次に、関数は新しい乱数ジェネレータを初期化し、チケット番号の範囲内で乱数を生成します。その結果、Sui の堅牢な乱数生成保証により、安全かつ予測不可能に選ばれた勝者が得られます。これにより、ネットワークの投票力の 3 分の 1 未満が破損している限り、generate_u32_in_range によって返される値はランダムかつ予測不可能になります。

ランダム性はトランザクションごとにではなくネットワーク全体で生成されるが、Suiはそのグローバルランダム性から予測不可能でバイアスのないシード付き疑似ランダム関数ファミリーを毎回導出する。

新しいジェネレータ

が呼び出されます。

Sui のランダム性をまとめる

Sui に安全でスケーラブルなランダム性のソースが導入されたことは、開発者がより堅牢で安全なアプリを作成できるようになる重要な進歩です。コミュニティからのフィードバックの提供と、ランダム性を使用する新しい方法の模索を奨励しています。より詳細な技術情報については、オンチェーン ランダム性のドキュメントを参照してください。

この機能は、現在 Sui テストネットで利用可能です。開発者の皆様には、この機能を試して、メインネットでネイティブのランダム性が利用可能になったときに、アプリが安全で堅牢なランダム値を活用できる状態になっていることを確認することをお勧めします。より安全で効率的な Sui エコシステムに貢献してくださった開発者の皆様に感謝します。