MORYLAB;

エンジニアの卵がソースコードやライフログを綴るブログ。

乱数生成について調べてみた

大学のゼミで、ブロックチェーン関連の暗号技術やゲーム理論を学んでるんだけど、乱数生成について興味を持ったので少しだけ調べてみた。

乱数と疑似乱数

疑似乱数は、ソフトウェア的な処理の結果出力されるものであり、純粋な乱数ではない。というのも、疑似乱数生成アルゴリズムによっては、生成法と内部の状態がわかれば乱数を予測できてしまう場合があるからである。

例えば、線形合同法では、規則的な分布が現れたり、最下位ビットが0101で繰り返されたりするため安全な疑似乱数とは言えず、暗号に用いてはいけない。

安全な乱数を生成するには、SecureRandom(Ruby)やCrypto/rand(Go) などを使い、ハードウェアの乱数生成器を使う必要がある。


乱数生成器

IntelAMDのモダンなCPUなら、ハードウェアの乱数生成器がついていて、熱雑音などをもとに安全な乱数を生成してくれる。
Mac/Linux系なら /dev/random(ちょっと遅い)か、
/dev/urandom(少し質が劣るが速い)を使う。 a /dev/random - Wikipedia

cat /dev/random

とすると、乱数列がドウワァァァァって出てくる。
(ターミナルで趣味がばれますね) f:id:morrrry:20181113170245p:plain


乱数生成ライブラリ

普段RailsとかGoとかでWeb開発をしていると、セキュアなところで乱数が必要となるわけですが、以前は脳死で「secure_randomとかcrypto/rand使っとけばいいんじゃろ」とやっていたわけです。 しかし、Java.util.randomが線形合同法と聞いて、多言語のライブラリの実装はどうなんだろうと興味を持ってみたので、普段使っているRubyやGoでポピュラーな乱数生成ライブラリについて少し調べてみました。

Random (Java Platform SE 8)


SecureRandom (Ruby)

よく使うやつです。
サポートしている乱数生成器は openssl と /dev/urandom で、これらが使用できない場合は NotImplementedError が発生する。

docs.ruby-lang.org

crypto/rand (Golang)

これもよく使います。
Linuxでは、/dev/urandom を使用し、使用可能であれば getrandom(2) が使われ、他のUnix-like(Macとか)な環境では、/dev/urandom が使われるとのこと。

rand - The Go Programming Language


おわりに

乱数生成だいじ。

最速でRails APIモードのプロジェクトを作る

最速でやりたいので細かい説明は省きます。
Rubyはすでにインストールしてあるものとします。

やってみよう

とりあえず作業フォルダを作って中に入ります

mkdir hoge
cd hoge


Gemfileを作成します。

bundle init


Gemfileをお好きなエディタで編集します。
railsコメントアウトを外すだけ。

source 'https://rubygems.org'
git_source(:github) { |repo| "https://github.com/#{repo}.git" }

gem 'rails'


vendor配下にgemをインストールしていきます。
なお、グローバルにgemを入れるといろいろ面倒なのでやめたほうがいいです。

bundle install --path vendor/bundle --jobs=4


Railsプロジェクトを作ります。
途中Gemfileを上書きするか聞かれますが、Yで上書きしてください。

bundle exec rails new . --api -B -d mysql


Mysqlを使うためにGemfileを上書きしたので、再度bundle installします。
2回目以降は自動でvendor配下にインストールしてくれます。

bundle install


そのままrails sすると、DBの設定ないぞコノヤローって怒られます。
DBの設定をやってから動作確認しましょう。

bundle exec rails s

YAY!!!!

localhost:3000

おつかれさまでした。

Hi-Ether Meetup #8 Tokyo に行ってきた話

Hi-Ether Meetup Tokyoに行ってきました。

大学の夏休み期間中、インターンのため東京に1ヶ月間来ていたのでこれは行かないわけにはいかない、と。

 

今回、会場は六本木のDMM.comをお借りして開催されました。

おのぼりさんなので、まずビルの根本につくやいなやビルを見上げてすごいなぁとなり、中に入るとビルの改札のデザインがかっこよくて1人エモくなってました。


今回の人数はだいたい40人くらいですかね、さすがに福岡よりは人数多かったです。

福岡と違う点としては発表の様子が録画されていてネットで中継されること。福岡ではやっていなかったので新しいな〜と思いました。 

今回は初めて東京のミートアップに参加したということで、レポート的なものをまとめたいと思います。なお、中身に関しては相変わらず雑です。

 

DApps企業が仮想通貨交換業を検討したら

株式会社ネクストカレンシーの川畑さん(@ku_suke)による「DApps企業が仮想通貨交換業を検討したら」というお話でした。

撮影NG、TwitterNGだったので詳細は書けませんが、兎に角、仮想通貨交換業と犯罪収益移転防止法を頭に叩き込むことが大前提で、会社としてのガバナンスや監査体制など考えることが山ほどあるという感じで大変さがひしひしと伝わってきました...

 

Hi-Ether Conferenceに向けたDApps開発の紹介


DMM.com スマートコントラクト事業部の河西さん(@norinity1103)によるDApps開発の話。河西さんはUI/UXデザイナーということで、サービス設計やユーザビリティの観点から、どのようにDappsのサービス設計やUXデザインをやってきたのかをお話されました。

発表中に、DAppsのサービス設計の中でコントラクトとRDBのデータ型をどこまで合わせるかで悩んだり、独特なユーザーアクションがあるため探りさぐりで開発を進めたという話があり、DAppsの設計をやったことがある身としては痛いほど分かる話でした。 

 

Pact言語によるセキュアなスマートコントラクト開発


DMM.com スマートコントラクト事業部の加嵜さんによるPact言語の紹介です。

Pact言語とはKadenaブロックチェーンコントラクト実装言語でLispライクな非チューリング完全の言語だそうです。

私はLispを読めないので、デモで何が書かれていたのかほぼ分かりませんでしたが、なんかすごいということは伝わってきました。

kadena.io

 

getho ~ Ethereum private nodes, tailored for you. ~


@st_dskさんによるgethoの話。

DAppsを作る時、1人での開発ならまだしも複数人開発となったときにリモートのNode環境を用意するのが面倒くさいよね、ということでワンクリックでEthererumのプライベートノードが手に入るという超絶便利ツールがgethoらしい。

α版ではGanacheのリモート版のような機能を提供するということで、ワンクリックでプライベートノードを立ち上げたり、HTTP経由でどこからでもアクセスすることが可能になるそうです。

getho.io

 

 

experience of blockchain intern


DMM.com スマートコントラクト事業部インターンの前川さん(@arika_nashika)によるインターンで取り組んでいることの紹介です。インターンではブロックチェーン開発とマイニング事業に携わっているということで、軽井沢での開発合宿の話や、金沢のマイニングファームについての話でした。

特にマイニングファームでのエピソードはとても興味深く、いろいろな苦労が垣間見れました。個人的に、冷房は使わずに壁に大きな穴を開けてファンを取り付けて排熱しているというのが意外でした。冷房を使ってもそこまで冷えず、ファンを回しても室温が50度を超えることがあるそうです。ひぇぇ 

 

感想

きてよかった。
Hi-Ether Conferenceがたのしみ。
DMMのオフィスがきれいすぎてやばい(語彙力)