ホームページ >テクノロジー周辺機器 >IT業界 >堅実さの落とし穴:イーサリアムの乱数生成

堅実さの落とし穴:イーサリアムの乱数生成

尊渡假赌尊渡假赌尊渡假赌
尊渡假赌尊渡假赌尊渡假赌オリジナル
2025-02-16 10:44:09641ブラウズ

Solidity Pitfalls: Random Number Generation for Ethereum

この記事は、Ioliteが後援し、作成しました。 SitePointを可能にしたパートナーをサポートしてくれてありがとう。

Solidityは、完全なコードがないため、コードとその意図した使用に関連する問題を含む比較的新しい言語です。この記事では、イーサリアムスマートコントラクトへの入力として乱数を使用する場合、ベストプラクティスと落とし穴を導きます。

キーポイント

  • 堅牢性言語自体は、その決定論的な性質と複雑なアルゴリズムの高コストにより、真の乱数を生成することはできません。開発者は、場合によっては攻撃者が結果を予測できることに注意する必要があります。
  • 堅牢性で擬似ランダム数を生成する一般的な方法は、線形合同ジェネレーター(LCG)アルゴリズムを使用することです。ただし、パスワードセキュリティアプリケーションでは機能せず、block.timestampblock.difficultyに依存すると、鉱夫はこれらの値を操作できます。
  • ChainLink VRF(検証されたランダム関数)は、実証済みの乱数を堅牢性で生成するソリューションを提供します。オンチェーンのランダム性チェックとパスワードの混合を使用して、数字が本当に乱数であることを確認します。
  • ランダム数を生成するための他のメカニズムは、ランダムなデータソースを提供するランダムプロジェクトのようなスケジューリングのためのEthereum Alame Clocksを使用しますスマートコントラクト。

堅牢性乱数生成堅牢性乱数を作成できません。実際、乱数を作成するすべてのアルゴリズムは擬似ランダムです。言語は完全に乱数を作成できません。堅牢性の問題は、複雑なアルゴリズムが高すぎるため、より基本的なソリューションが使用されていることです。それとは別に、複数のノードで実行されるため、Solitidityコードは決定論的でなければなりません。乱数を一度に生成し、複数のノードで使用できるアルゴリズムが必要です。乱数を生成するためにクロック時間などの情報は利用できないため、他のオプションを探す必要があります。開発者として、攻撃者は特定の状況で結果を予測できるため、この問題に注意する必要があります。

最も一般的に使用されるアルゴリズムの1つは、「線形合同ジェネレーター」(LCG)です。それは最も古いアルゴリズムの1つであり、高速で理解しやすいです。 LCGは、メモリが限られているだけなので、組み込みシステムに適しています。ただし、パスワードセキュリティアプリケーションでは動作しません。それにもかかわらず、ガスコストの点で高速アルゴリズムが安価であるため、スマートコントラクトではまだ使用されています。

アルゴリズム自体は、次の手順を実行します

入力を受け入れます

input
    でアルゴリズムを実行します
  • 出力のモジュラスを取得します(目的の範囲の最大数で割って)
  • 出力0目的の範囲の最大数の間の値
  • 宝くじのスマートコントラクトの例を使用して、乱数を作成するためのさまざまな方法を探りましょう。ユーザーは、0.1エーテルを契約に送信し、0〜250の整数を送信することで宝くじに参加できます。
    1. block.timestampblock.difficulty

    マイナーがトランザクションを確認するたびに、a block.timestampが割り当てられます。宝くじ契約のプレーヤーはそれを制御できません。乱数を作成するために使用されるこのコードを見てみましょう。

    <code class="language-solidity">function random() private view returns (uint8) {
      return uint8(uint256(keccak256(block.timestamp, block.difficulty))%251);
    }</code>

    ここでgistを見つけます。

    このコードは、最初にブロックタイムスタンプと難易度をハッシュします。次に、ハッシュ値を整数に変換し、それを251で割って0〜250の間の整数を取得します。ただし、このコードの問題は、鉱夫が勝者を選択することを信頼してはならないということです。

    1. 宝くじ入力 - どんなデータ

    勝者を選択するには、より多くの任意のデータが必要です。宝くじのスマートコントラクトに参加したプレイヤーの住所を使用できますが、虐待する可能性があるため、隠さなければなりません。すべての情報はブロックチェーンに記録されているため、この情報を非表示にすることはできません。

    宝くじのスマートコントラクトに提出できる数字。ユーザーは、Ethereumアドレスで選択したハッシュ番号を持っている必要があります。これにより、かなり乱数が得られます。

    1. chainlink vrf

    2. そうは言っても、ランダム性は可能ですが、オラクルを使用してブロックチェーンの外側から乱数を取得するだけです。外部データを使用することの問題は、数値が実際にランダムであることを証明することが非常に困難であり、オフチェーンエンティティがランダム数を何らかの形で操作しないようにすることです。これは、ChainLink VRFが登場する場所です。 ChainLink VRF(検証済みのランダム関数)は、堅牢性で実証済みの乱数を取得する方法です。

    ChainLink VRFは、ChainLinkノードがイベントを読み取り、乱数を返すブロックチェーンにイベントを追加します。オンチェーンランダムされたチェックは、いわゆるVRFコーディネーターを介して実行されます。これは、Oracleからの特定のキーハッシュとユーザーからのシードフレーズ、およびいくつかの暗号化を使用して、数字が真の乱数であることを確認します。このようにして、公平な乱数を取得できます。

      その他のメカニズム
    1. 4.1 Ethereum Alalarm Clock

    開発者は、いつ勝者を選択するかを考慮する必要があります。クロック時間などの情報は、複数のノードで異なる時間にコードが実行されるため、Ethereum Virtual Machineで使用できません。これにより、勝者を選択することがより困難になります。 1つの方法は、宝くじをオフにして勝者を選択するスマートコントラクトに機能を実装することです。これは、私たちが望んでいたほど分散化されていません。契約の所有者は、友人が勝つと判断されると、宝くじを閉鎖できます。この種の不正行為を避けなければなりません。

    より良いオプションは、イーサリアム目覚まし時計を使用することです。これは、スケジューリングトランザクションをEthereumブロックチェーンで後で実行できるようにするサービスです。このサービスは完全に信頼できません。つまり、サービス全体がスマートコントラクトとして実行されます。基本的に、Ethereumアラームはブロック番号を使用してトランザクションをスケジュールします。これは、契約が単独で開始されることを意味しないことに注意してください。 「select winner」関数(エーテル報酬)を呼び出すことにユーザーの関心に依存しています。もちろん、誰もあなたの機能を呼び出さなければ、あなたの宝くじは失敗します。

    4.2ランダムデータ入力

    random.orgは、JSONを介してランダムデータソースを提供するAPIを提供します。 Ethereum Smart Contractsは、このデータソースを使用して、乱数を選択するためのアルゴリズムをフィードすることができます。セキュリティは重要であるため、デジタル署名を使用できます。ランダムデータはrandom.orgによって署名されます。データの整合性を確認して、それが実際にrandom.orgからであり、データが改ざんされていないことを証明できるようにすることができます。

    Randaoは、ブロックチェーンフィールドの新しいプロジェクトであり、乱数の提供に完全に焦点を当てています。彼らはあなたに乱数を与えるためにオラクルとスマートコントラクトの組み合わせを使用します。ただし、Randaoサービスは現在非常に遅いです。頻繁に使用するアプリがある場合、これは理想的ではありません。

    4.3ブロック番号モニター

    設定したターゲット番号に一致するまでブロック番号をチェックするコードでモニターを使用することもできます。

    <code class="language-solidity">function random() private view returns (uint8) {
      return uint8(uint256(keccak256(block.timestamp, block.difficulty))%251);
    }</code>

    ソース。 gist

    4.4 ioliteスマートコントラクトの作成

    ioliteは、スマートコントラクトを作成するために自然言語を受け入れる製品を作成しています。 Stanford Natural Language Processing(NLP)エンジンを使用しています。これは、高速適応エンジン(FAE)と呼ばれます。 Ioliteは、コミュニティトレーニングのためにSolidityの専門家に依存しています。 Solidity Expert(Contributor)は、1つ以上の文を含む構造を定義し、対応するスマートコントラクトコードに追加できます。

    スタンフォードNLPエンジンは、複雑な言語を理解するように設計されています。言語の複雑さは、マシントレーニングの量に依存します。適切なトレーニングの後、エンジンは複雑なスマートコントラクトを作成できます。複雑な契約は実際にはそれほど複雑ではないため、FAEはそのような契約を作成することができます。専門家は、リクエストを複数の小さなコードのスニペットに分割し、文に追加できます。

    誰かが複数の文に入ると、「複雑な」契約を構築するための対応する構造/文を探します。貢献者は、新しい構造のマイニングプロセスを通じてioliteトークンの報酬を受け取ります。

    結論

    ご覧のとおり、真のランダム入力を生成するのは簡単ではありません。ランダム性のソースとして

    block.timestampnowに依存しないでください。優れたソリューションには、いくつかの擬似ランダムデータ入力を組み合わせて、オラクルまたはスマートコントラクトを使用して信頼性を高めることが含まれます。スマートコントラクトに入力されたデータを誰も改ざんできないことを100%確信する必要があります。 block.blockhash

    乱数生成ロジックを実装する前に、注意してよく考えてください。

    堅牢性(FAQ)

    の乱数生成のFAQ 堅牢性で乱数を生成するのが難しいのはなぜですか?

    Solidity(Ethereum Smart Contractsの書き込みに使用されるプログラミング言語)には、乱数を生成するための機能が組み込まれていません。これは、ブロックチェーン(イーサリアムの基本技術)が本質的に決定論的であるためです。これは、入力のセットが与えられた場合、出力は常に同じであることを意味します。この確実性は、ブロックチェーンの完全性とセキュリティを維持するために重要です。ただし、ランダム性の概念は本質的に非決定論的であるため、真の乱数を生成することは課題になります。

    堅牢性で乱数を生成する一般的な方法は何ですか?

    開発者は、いくつかの方法を使用して、堅実さで擬似ランダム数を生成します。一般的な方法は、現在のブロックタイムスタンプやブロックの難易度など、入力を予測するのが難しいKeccak256ハッシュ関数を使用することです。別のアプローチは、鎖のソースから乱数を提供するOracleサービスを使用することです。ただし、各アプローチには独自の制限と潜在的なセキュリティリスクがあります。

    keccak256ハッシュ関数を使用して乱数を生成するリスクは何ですか?

    Keccak256ハッシュ関数を使用して擬似ランダム数を生成できますが、セキュリティリスクの潜在的なリスクをもたらします。現在のブロックタイムスタンプやブロックの難易度などのハッシュ関数への入力は、ブロックチェーンで公開されているため、悪意のある鉱夫はこれらの値を操作して、乱数によって生成される出力に影響を与える可能性があります。

    Oracle Serviceを使用して堅実さで乱数を生成する方法は?

    元のサービスは、鎖外源から乱数を提供できます。これらのサービスは、ブロックチェーンと外の世界の間の橋渡しとして機能し、スマートコントラクトがブロックチェーン自体が利用できないデータと対話できるようにします。ただし、Smart Contractsは正確で公平な乱数を提供するためにオラクルに依存する必要があるため、Oracle Servicesを使用すると信頼レベルが導入されます。

    コミットメント - 乱数を生成する際のスキームを明らかにすることの役割は何ですか?

    コミットメントを改革するスキームは、分散型で安全な方法で乱数を生成する方法です。コミットメントを改訂するスキームでは、参加者は最初に秘密の数をコミットし、次にすべての秘密番号が同時に明らかになり、これらの秘密に基づいて乱数が生成されます。このアプローチにより、単一の参加者が乱数によって生成される出力に影響を与えることができなくなります。

    スマートコントラクトで真の乱数を生成することが重要なのはなぜですか?

    実際の乱数は、偶然のゲーム、宝くじ、ランダム性を必要とする他のアプリケーションに使用されるものなど、多くの種類のスマートコントラクトにとって重要です。これらの契約で使用される乱数が予測または影響を受けることがある場合、不公平な結果につながり、悪意のあるアクターが契約を悪用できるようになります。

    ブロックハッシュ関数を使用して、堅牢性で乱数を生成できますか?

    堅牢性のブロックハッシュ関数を使用して、擬似ランダム数を生成できます。この関数は、指定されたブロック数のハッシュ値を返します。これは予測不可能であり、各ブロックによって変化します。ただし、この方法には制限があります。たとえば、ブロックハッシュ関数は最新の256ブロックでのみ動作し、将来のブロックのブロックハッシュはマイニング前にはわかりません。

    現在のブロックタイムスタンプを使用して乱数を生成することの制限は何ですか?

    現在のブロックタイムスタンプを入力として使用して乱数を生成することには大きな制限があります。鉱夫は、彼らが採掘するブロックのタイムスタンプにある程度の影響を及ぼします。つまり、乱数によって生成される出力に影響を与えるためにタイムスタンプを操作する可能性があります。

    ランダオビーコンを使用して乱数を生成する方法は?

    Randao(乱数DAO)ビーコンは、乱数を生成するための分散型で透明な方法です。 Randao Beaconの参加者は、秘密の数字を約束します。秘密の数字は明らかにされ、組み合わされて乱数が生成されます。このアプローチは、単一の参加者が乱数によって生成される出力に影響を与えることができないように設計されています。

    堅実さで乱数を生成するための今後の改善や提案はありますか?

    堅牢性およびその他のブロックチェーンプラットフォームの乱数生成の改善に関する研究と提案が進行中です。たとえば、Ethereum 2.0(Ethereum Networkへの今後のアップグレード)には、組み込みの乱数ジェネレーターが含まれると予想されます。ただし、これらの改善が実装される前に、開発者は既存のアプローチとその固有の制限と潜在的なセキュリティリスクを引き続き使用する必要があります。

以上が堅実さの落とし穴:イーサリアムの乱数生成の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。