【Ethereum】スマートコントラクトで乱数を実装する方法いろいろ
2/2019現在,スマートコントクト単一では乱数を生成できないので Ethereumコミュニティでは様々な工夫がされている
今回は、自分用のメモとしてスマートコントラクトでランダムな値を実現する方法を調査してまとめてみました 自分でやってみたりすると思うので実装など随時追記していきたいと思います
スマートコントラクトで乱数を実装する方法
複数のユーザーの入力値とハッシュ関数を使う
Ethereum におけるrandom numberの生成アルゴリズム
ユーザーにGasを消費させてしまう(比較的少なくはあるが)のでなにかインセンティブが必要
繰り返しハッシングによって作る
Participatory random numbers in Ethereum
前の項と同じくユーザーの入力値(アドレス)を用いてハッシングを行う
ブロックチェーン変数を入力値としてもちいる
block.coinbase、block.difficulty、block.timestampなどのブロック変数をソースとして使用する方法がある
しかし、これらすべてのブロック変数はマイナーが操作できる可能性があるため,完璧ではない。
外部Oracle
Oraclizeのような外部オラクルを使用すると、スマートコントラクトから為替レート、天気予報、株価(random.orgなど)などのWeb APIからデータを要求可能になる。
このアプローチの主な欠点は、それらのAPIは集中管理されている点である。
signidice
signidiceは暗号化署名に基づいたアルゴリズムで、プレーヤーと胴元の2者のみが関与するスマートコントラクトでの乱数生成に適している。 アルゴリズムは次のように機能する。
- signidiceはスマートコントラクトを呼ぶことによって賭けをする。
- 胴元は賭けを見て、その秘密鍵でその賭けに署名し、そしてその署名をスマートコントラクトに送る。
- スマートコントラクトは、既知の公開鍵を使用して署名を検証。
- この署名は,それから乱数を生成するのに使用する。