EKT マルチチェーン テクノロジーは、スマート コントラクト データのストレージと設計の問題をどのように解決しますか
昨年、イーサリアム上のゲーム CtyptoKitties (クリプト キャット) が人気になって以来、多くの人がスマート コントラクトをプレイする新しい方法、つまりゲームの作成を発見しました。モバイルゲーム市場では、ファイト・ザ・ランドロードやテキサス・ホールデムなどのチェスやカードゲームが大きな市場を占めています。このタイプのゲームには共通の特徴があります。ゲームの各ラウンドの開始前に、各ラウンドでのカードのランダム性を確保するために乱数を生成してカードをシャッフルする必要があります。この種のチェスやカード ゲームをスマート コントラクトを介して実装する際に遭遇する問題の 1 つは、ブロックチェーン上のデータを含むスマート コントラクトはオープン ソースであるため、シャッフルのこのラウンドで使用される乱数がブロックに記録される前にブロックに記録されることです。ゲームの現在のラウンドの終了 チェーン上で、プレーヤーはこの乱数に基づいて他のすべてのプレーヤーのカードを計算できます。その後、シャッフルは本来の意味を失い、ゲームは続行されません。この状況をブロックチェーン上でどのように解決できるのでしょうか?この記事では、スマートコントラクトのデータストレージ問題について一緒に説明します。
1. チェスとカードゲームのシャッフルアルゴリズム
誰もがチェスやドゥーディズやテキサス ホールデムなどのカード ゲームをプレイしたことがあるのではないでしょうか。これらのゲームでは、各ラウンドの開始時にプレイヤーの手札にあるカードが異なりますが、これはどのようにして実現されるのでしょうか?この問題はコンピュータの分野では「シャッフルアルゴリズム」と呼ばれており、抽象的には有限集合に対するランダムな置換アルゴリズム(配列ランダムソート)をどのように生成するかという問題を記述している。このアルゴリズムによって生成されるランダムな置換は同じ確率であり、アルゴリズムは非常に効率的である必要があります。人気のフィッシャー・イェーツのシャッフル アルゴリズムの解決策を見てみましょう。
1 ~ N 枚のカードが元のリスト list1 に格納されます
ランダムにシャッフルされたカードは新しいリスト list2 に保存されます。
数値 i (1 から残りの数値 (この数値を含む)) をランダムに生成します
下位ビットから i 番目の番号 (この番号は取り出されていない) を取得し、それを取り出して list2 に格納します
すべての数値が取り出されるまで、3 番目のステップを繰り返して i を再生成します
取り出されたリストは元のリストをランダムにソートしたリストであり、アルゴリズムが完成します
上記のアルゴリズムは、疑似コードで次のように表現されます。
このアルゴリズムでは、乱数 i が非常に重要な役割を果たし、各プレイヤーの手の最終カードを直接決定します。この数字が公開されれば、最終的なシャッフル結果を推測するのは簡単です。
2. スマートコントラクトの乱数問題
ブロックチェーンは、そのオープン性、透明性、改ざん不可能な特性により、ディーラーが不正を行う余地を残しません。したがって、ブロックチェーン スマート コントラクトに基づくチェスとカード ゲームの実装は、プレーヤーの利益を十分に保証することができ、非常に有望なアプリケーションでもあります。問題は、ゲームの公平性とプレイヤーの利益を確保するために、スマート コントラクトを通じて乱数を生成および保存する方法です。私たちはまずイーサリアム上のゲーム契約の現状を分析し、それから私たちの考えを提案します。
1. 安全でない乱数生成方法
ブロック内の特定の変数に基づく
block.coinbase、block.difficulty、block.gaslimit、block.number、block.timestamp など、ブロックに関する多くのメタ情報がブロックに記録されます。多くの人は、これらのメタ情報に基づいて乱数を生成できると考えていますが、実際にはこれは安全ではありません。まず第一に、この乱数が十分な利益を生み出すことができるのであれば、ブロックチェーンの運用を維持するマイナーはこれらのデータを変更する動機を持つことになります。第二に、攻撃者が攻撃したい場合には、この情報に基づいて乱数を同時に生成することもできます。
生成されたいくつかのブロックのブロックハッシュに基づく
各ブロックには独自のブロックハッシュがあり、EVM は block.blockhash() を通じてブロックハッシュを取得するインターフェイスも提供します。現在の多くのスマート コントラクトでは、前のブロックのブロックハッシュ、つまり block.blockhash(block.number - 1) が乱数の生成によく使用されます。このスキームの欠点も非常に明らかです。攻撃者が攻撃したい場合、前のブロックのブロックハッシュに基づいて同じ乱数を持つスマート コントラクトを生成することもできます。
2. より安全に乱数を生成して保存する方法
前回の記事でオラクルマシンの問題点について説明しましたが、オラクルマシンはブロックチェーンの世界と現実世界の情報をつなぐ架け橋です。乱数ジェネレーターを自分で実装し、オラクルマシンを介してスマートコントラクトをインポートするか、Random.org などの Web サイトを直接呼び出して実際の乱数を取得できます。この点に関しては、EKT の継続的な改善により、この問題を解決するための優れたメカニズムも提供していきます。
冒頭のチェスとカードゲームの例に戻りますが、乱数生成の問題が解決したとしても、その乱数はいつブロックチェーンに書き込まれるのでしょうか。各ゲームを「セッション」と考えることができます。各セッションの開始は乱数の生成に基づいていますが、乱数が生成された後、すぐにはブロックチェーンに書き込まれません。この情報は、まず独自の「プライベート」永続スペースに記録されます。ゲームの各ラウンド後に、このデータは独自のプライベート空間からブロックチェーンに書き込まれます。これにより、ゲームの公平性が保証されるだけでなく、ゲームの情報が事前に公開されることもありません。







