コントラクトを呼び出したときに、スマート コントラクトが 1 から 100 の範囲の 7 つまたは 8 つのUNIQUE乱数を返すようにします。そのような結果を得るための最良のアプローチは何ですか?
4 に答える
私はブレインストーミングのアイデアを持っています、多分誰かを助けるでしょう.
これは、参加者が 1 人だけの単純化された Commit-reveal アプローチです。ランダムな世代ごとにタイトルが必要になります。その称号は標準的で、監査しやすいものでなければなりません。
まず、smartContract で Commit("Alice's Lotery") を実行します。タイトルが繰り返される場合 (ハッシュをチェック)、拒否されます。そして、明らかにするためには、少なくとも 1 つの余分なブロックの確認を待つ必要があります。この 2 つのブロックは、マイナーがこのスマートコントラクトを攻撃していないことを確認するために、異なるマイナーからのものでなければなりません。
そして Reveal("Alberto's Lottery") を実行します。ここで魔法が起こります。random のソースは、コミット ブロックのタイトル、msg.sender、block.blockhash、および block.blockhash(commitBlockNumber+1) になります。よりランダムな値を取得するためのタイムスタンプ]。また、commitBlockNumber と commitBlockNumber+1 のタイムスタンプが近すぎたり、離れすぎたりしていないかどうかを確認できます。これは、マイナーが何らかのブロックを強制しようとしていることを示している可能性があるため、この宝くじを拒否できます。
そしてもちろん、("Alice's Lottery") || のようなコミットであまりにも多くのクローズ tx を見ることができれば。(「アリスの宝くじ」) この宝くじがだまされていることを調べることができます。また、2つ以上の「間隔」ブロックでこれを行うこともできます