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


おわりに

乱数生成だいじ。

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のオフィスがきれいすぎてやばい(語彙力)

Hi-Ether Meetup Fukuoka #7 で登壇しました

先日、Geek Studioで行われたHi-Ether Meetup Fukuoka #7に参加し、スピーカーとして分散ストレージの話をしてきたので、そのレポートをまとめます。

まとめるといっても、それぞれの発表内容のスライドを貼ってるだけです、手抜きごめんなさい。

 

 

GORMOS: A high performance and scalable design fordecentralized applications

DMMの @shinanonozenji_ さんによるGORMOSの話。 

speakerdeck.com

 

LoomNetwork: DAppChainsについて

北九州市立大学、 @tu__tn さんによるLoomNetworkの話。
スライドは後日公開される...のかな?

loomx.io

 

 

Swarm: The distributed storage platform

私、 @kmorrrryは分散ストレージプラットフォームであるSwarmについて話しました。IPFSとの違いや環境構築、実際に使ってみるところまでデモを交えて発表させていただきました。ところどころ掘りきれていないところがあったので今後も継続的にウォッチしていこうと思います。

 

speakerdeck.com

 

 

LT:「手触り感」からBlockchainの応用を考える

 LT1発目は、ハウインターナショナルの @ran_tan さん。
ブロックチェーンでは、デジタル資産の管理をどこかに委ねるのではなく自身で管理するという「手触り感」を得ることができる、という話。
docs.google.com

 

 

LT:最近のホットトピックや活動の紹介

続いて、同じくハウインターナショナルの @nakajo さん。
最近のEthereum界隈で @nakajo さんが気になっていることの紹介でした。

スライドは後日公開される...のかな?

 

ということで、Hi-Ether Meetup Fukuoka #7のレポート(雑)でした。