この記事は、Ioliteが後援し、作成しました。 SitePointを可能にしたパートナーをサポートしてくれてありがとう。
Solidityは、完全なコードがないため、コードとその意図した使用に関連する問題を含む比較的新しい言語です。この記事では、イーサリアムスマートコントラクトへの入力として乱数を使用する場合、ベストプラクティスと落とし穴を導きます。
キーポイント
- 堅牢性言語自体は、その決定論的な性質と複雑なアルゴリズムの高コストにより、真の乱数を生成することはできません。開発者は、場合によっては攻撃者が結果を予測できることに注意する必要があります。
- 堅牢性で擬似ランダム数を生成する一般的な方法は、線形合同ジェネレーター(LCG)アルゴリズムを使用することです。ただし、パスワードセキュリティアプリケーションでは機能せず、
block.timestamp
とblock.difficulty
に依存すると、鉱夫はこれらの値を操作できます。 - ChainLink VRF(検証されたランダム関数)は、実証済みの乱数を堅牢性で生成するソリューションを提供します。オンチェーンのランダム性チェックとパスワードの混合を使用して、数字が本当に乱数であることを確認します。
- ランダム数を生成するための他のメカニズムは、ランダムなデータソースを提供するランダムプロジェクトのようなスケジューリングのためのEthereum Alame Clocksを使用しますスマートコントラクト。
堅牢性乱数生成堅牢性乱数を作成できません。実際、乱数を作成するすべてのアルゴリズムは擬似ランダムです。言語は完全に乱数を作成できません。堅牢性の問題は、複雑なアルゴリズムが高すぎるため、より基本的なソリューションが使用されていることです。それとは別に、複数のノードで実行されるため、Solitidityコードは決定論的でなければなりません。乱数を一度に生成し、複数のノードで使用できるアルゴリズムが必要です。乱数を生成するためにクロック時間などの情報は利用できないため、他のオプションを探す必要があります。開発者として、攻撃者は特定の状況で結果を予測できるため、この問題に注意する必要があります。
最も一般的に使用されるアルゴリズムの1つは、「線形合同ジェネレーター」(LCG)です。それは最も古いアルゴリズムの1つであり、高速で理解しやすいです。 LCGは、メモリが限られているだけなので、組み込みシステムに適しています。ただし、パスワードセキュリティアプリケーションでは動作しません。それにもかかわらず、ガスコストの点で高速アルゴリズムが安価であるため、スマートコントラクトではまだ使用されています。
アルゴリズム自体は、次の手順を実行します
入力を受け入れます
- でアルゴリズムを実行します
- 出力のモジュラスを取得します(目的の範囲の最大数で割って)
- 出力0目的の範囲の最大数の間の値
- 宝くじのスマートコントラクトの例を使用して、乱数を作成するためのさまざまな方法を探りましょう。ユーザーは、0.1エーテルを契約に送信し、0〜250の整数を送信することで宝くじに参加できます。
-
-
block.timestamp
&block.difficulty
マイナーがトランザクションを確認するたびに、a
block.timestamp
が割り当てられます。宝くじ契約のプレーヤーはそれを制御できません。乱数を作成するために使用されるこのコードを見てみましょう。function random() private view returns (uint8) { return uint8(uint256(keccak256(block.timestamp, block.difficulty))%251); }
ここでgistを見つけます。
このコードは、最初にブロックタイムスタンプと難易度をハッシュします。次に、ハッシュ値を整数に変換し、それを251で割って0〜250の間の整数を取得します。ただし、このコードの問題は、鉱夫が勝者を選択することを信頼してはならないということです。- 宝くじ入力 - どんなデータ
- chainlink vrf
ChainLink VRFは、ChainLinkノードがイベントを読み取り、乱数を返すブロックチェーンにイベントを追加します。オンチェーンランダムされたチェックは、いわゆるVRFコーディネーターを介して実行されます。これは、Oracleからの特定のキーハッシュとユーザーからのシードフレーズ、およびいくつかの暗号化を使用して、数字が真の乱数であることを確認します。このようにして、公平な乱数を取得できます。
- その他のメカニズム
-
開発者は、いつ勝者を選択するかを考慮する必要があります。クロック時間などの情報は、複数のノードで異なる時間にコードが実行されるため、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ブロック番号モニター
設定したターゲット番号に一致するまでブロック番号をチェックするコードでモニターを使用することもできます。
function random() private view returns (uint8) { return uint8(uint256(keccak256(block.timestamp, block.difficulty))%251); }
ソース。 gist。
4.4 ioliteスマートコントラクトの作成
ioliteは、スマートコントラクトを作成するために自然言語を受け入れる製品を作成しています。 Stanford Natural Language Processing(NLP)エンジンを使用しています。これは、高速適応エンジン(FAE)と呼ばれます。 Ioliteは、コミュニティトレーニングのためにSolidityの専門家に依存しています。 Solidity Expert(Contributor)は、1つ以上の文を含む構造を定義し、対応するスマートコントラクトコードに追加できます。
スタンフォードNLPエンジンは、複雑な言語を理解するように設計されています。言語の複雑さは、マシントレーニングの量に依存します。適切なトレーニングの後、エンジンは複雑なスマートコントラクトを作成できます。複雑な契約は実際にはそれほど複雑ではないため、FAEはそのような契約を作成することができます。専門家は、リクエストを複数の小さなコードのスニペットに分割し、文に追加できます。
誰かが複数の文に入ると、「複雑な」契約を構築するための対応する構造/文を探します。貢献者は、新しい構造のマイニングプロセスを通じてioliteトークンの報酬を受け取ります。
結論
ご覧のとおり、真のランダム入力を生成するのは簡単ではありません。ランダム性のソースとして、
乱数生成ロジックを実装する前に、注意してよく考えてください。block.timestamp
、now
に依存しないでください。優れたソリューションには、いくつかの擬似ランダムデータ入力を組み合わせて、オラクルまたはスマートコントラクトを使用して信頼性を高めることが含まれます。スマートコントラクトに入力されたデータを誰も改ざんできないことを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 サイトの他の関連記事を参照してください。

これらのトップ開発者ニュースレターを使用して、最新のハイテクトレンドについてお知らせください! このキュレーションされたリストは、AI愛好家からベテランのバックエンドやフロントエンド開発者まで、すべての人に何かを提供します。 お気に入りを選択し、Relを検索する時間を節約してください

このチュートリアルは、AWSサービスを使用してサーバーレスイメージ処理パイプラインを構築することをガイドします。 APIゲートウェイ、Lambda関数、S3バケット、およびDynamoDBと対話するECS Fargateクラスターに展開されたnext.jsフロントエンドを作成します。 th

このパイロットプログラム、CNCF(クラウドネイティブコンピューティングファンデーション)、アンペアコンピューティング、Equinix Metal、およびActuatedのコラボレーションであるCNCF GithubプロジェクトのARM64 CI/CDが合理化されます。 このイニシアチブは、セキュリティの懸念とパフォーマンスリムに対処します


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

MinGW - Minimalist GNU for Windows
このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

SublimeText3 中国語版
中国語版、とても使いやすい

SAP NetWeaver Server Adapter for Eclipse
Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

Safe Exam Browser
Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境
