ブロックチェーンを作ってみました。ブロックチェーンを作ってみました。contentHOME免責事項ブロックチェーンを作ってみました。2018年12月26日0件のコメントGMOアドマーケティングのG.Kです。ブロックチェーンについてお話したいと思います。分散型ネットワークなどといろいろと定義がありますが、一番カンタンな例で説明していこうと思います。あなたが女性だと仮定して、あなたの恋人があなたに高額なバッグもしくはアクセサリーを誕生日にプレゼントすると約束したとします。喜んじゃってませんか?しかし、よく考えるとこの状況では、あなたは途端に非常に不利な立場に置かれてしまいます。それはなぜでしょうか?このような非ブロックチェーン的なやり方では、実際にそのプレゼントをするかどうかは実際100%あなたの恋人の信用に委ねるからです。このような不利な状況を作らないためにも、私達の生活にはブロックチェーンが欠かせないのです。ブロックチェーン的にはどうすればいいでしょうか?まずは、あなたの恋人にその約束をメールで送ってもらいましょう。次に、メールを暗号化しましょう。量子コンピューターを視野にいれてSHA256というアルゴリズムを使用します。ここまで出来たら、あとはあなたの知人、会社の同僚、親戚にその暗号化されたメールを転送します。(※おすすめはしておりません)そして、やがてその暗号化されたメールは全世界に拡散し、一番最初に暗号を解いた人に変動価値を持つ手数料を奨励金としてお支払いしましょう。このわずかな手数料によって、全世界があなたの恋人からの約束を見守るようになり、このブロックチェーンの技術によって、今まで信用で成り立っている医療や金融の透明性を高め、さらにはネット広告分野でのアドフラウド問題などを解決することが期待されています。どのようにブロックチェーンを作ればいいのか?2.ブロックチェーンを作るまずはJAVAのSDKなど基本的な開発環境が必要で、メモ帳でも良いのですが、IDEもインストールしておくと楽になります。オブジェクトをJSONに変換するために、ライブラリーにはGSONが必要です。gson-2.8.2.jarここまで出来たらブロックチェーンの設計をしていきます。ブロックチェーンはその名前の通り、単なるブロックで繋がったチェーンなのです。Hashというのはデジタル署名と呼ばれるもので、暗号化された文字列です。それぞれのブロックにはそのブロック自身のデジタル署名が含まれているだけでなく、その前のブロックのデジタル署名を保存しています。データには何をいれてもよく、取引の詳細や、約束事などをいれることができます。ここで注意しておきたいのは、現在のブロックのHash、つまりデジタル署名は前のブロックのデジタル署名とデータに基づいて計算されていることです。どこかのブロックのデータが変わった場合はHashも変わり、その後にできるすべてのブロックに影響を与え、ブロックチェーンが無効になってしまいます。それでは上記の設計を元に、実際にブロックチェーンを実装していきます。ブロックのクラスから。//ブロックができた時間がわかるようにタイムスタンプも格納されています。//ブロックができた時間がわかるようにタイムスタンプも格納されています。前のブロックのHash、そしてブロックができた時点の時間としてタイムスタンプが格納されます。このBlockクラスにはデジタル署名を格納するString型のhashが格納されるのですが、デジタル署名はどのようにつくればよいのか上図のように、デジタル署名(hash値)というのは、暗号化された文字列です。暗号アルゴリズムであればなんでもよいのですが、今回はビットコインと同じ暗号化アルゴリズムSHA256を使用しようと思います。java.security.MessageDigest;をインポートすることで、暗号化SHA256アルゴリズムを使用することができます。//メッセージ・ダイジェストは、任意サイズのデータを取得して固定長のハッシュ値を出力する安全な一方向のハッシュ機能です。//メッセージ・ダイジェストは、任意サイズのデータを取得して固定長のハッシュ値を出力する安全な一方向のハッシュ機能です。RuntimeException(e);}}上記のようなSHA256のクラスを作り、このクラスの役割は文字列にSHA256アルゴリズムで暗号化することです。それから最初に作ったBlockクラスで、Hashを計算するメソッドを追加します。hashValue;}このメソッドでわかるように、現在のブロックのhashValueは前のブロックのHashの値、データ、さらに時間を足したものを暗号化しています。ブロックチェーンで保存されたデータ自身もHashを計算する一部となっていることで、ブロックで保存されているデータを改ざんすると後のブロックがすべて無効になってしまいます。この性質を利用すれば、例えば今までシェアが不可能だったデータ(健康診断の結果など)を個人情報抜きで全世界にシェアが可能となり(鍵を持つ人だけがアクセス可能)、さらなる発展を促すことができるかもしれません。次は暗号化メソッドをBlockクラスにあるBlockコンストラクタに入れます。//ブロックができた時間がわかるようにタイムスタンプも格納されています。//ブロックができた時間がわかるようにタイムスタンプも格納されています。//ここにいれてます}}これでブロックは完成です。あとはブロックをたくさん生成しておけば、勝手にHashで関係性を持つのでチェーンのようになり、あなただけのブロックチェーンというのが完成です。Blockと呼んでいます。ここまで基本的なブロックチェーンは完成していますが、前述のようにデータの改ざんがあると、ブロックチェーンが無効になるという性質を持っています。そこで、ブロックチェーンが有効かどうかを判定するメソッドを追加しておく必要があります。true;}上記のメソッドをBitcoin2クラスに追加します。これによって、いかなるデータの改ざんでもこのメソッドはfalseを返し、無効なブロックチェーンだと判定します。ビットコインのブロックチェーンネットワークでは、一番長い(ブロック数の多い)有効なブロックチェーンが本物のビットコインのブロックチェーンとして判断されています。Workと呼ばれる仕組みです。いわゆるマイニングです。ビットコインのマイニングでは、まず、データをまとめたブロックを生成し、次にブロックチェーンへの追加権利をかけて、計算問題を解いていき、一番早く答えを出せたマイナーは、答えを他のマイナーに報告し、ほかのネットワーク参加者が、正否を判断、正解ならば、そのマイナーが生成したブロックをブロックチェーンに追加し、報酬が得られる仕組みとなっています。今回計算問題として出すのは、ユーザーに異なる値を入れてもらい、hash値が指定の数の0から始まるまで試し続けます。answerを追加していきます。//マイナーさんは正しいanswerを計算する必要があります。//マイナーさんは正しいanswerを計算する必要があります。hash;}}このように、answerはhash値を出すための一つの変数となっています。このようなマイニングに必要なメソッドもBlockクラスに追加しておく必要があります。hash);}このように、difficultyはマイニングの難易度となっています。ように0が1個から始まっていれば、マイニング成功です。00000AH23KJ...のように0が5つ連続で始まらなければなりません。マイニングマシーンはこのanswerを1つずつ足して答えを見つけなくてはなりません。5,106,422,924,659となっています。上記と同じ計算問題が出されると仮定しますと、マイニングマシーンは5,106,422,924,659個の0が連続で出てくるまで計算を続けなくてはなりません。(わかりやすく説明するために今回はこのような計算問題を選びましたが、実際にビットコインで使われる計算問題はやや異っており、256bitのhashでそんなに0が多く出てくることもないかと思います。)このdifficultyはビットコイン価格で調整され、価格が下がればdifficultyも下がるようになっていて、計算時間が短くなりより電気代が安くなるような仕組みとなっています。マイニングマシーンの性能は採掘速度(ハッシュレート)で評価されています。hash/s(1秒間に1ハッシュの計算)という単位が使われています。兆回ハッシュの計算ができるということになります。最後にBitcoin2クラスにブロックがマイニングされているかどうかを確認するメソッドも追加していきます。true;}次回はイーサリアムのスマートコンタクトについて書こうと思います。(全て見る)ブロックチェーン:Solidityでスマートコントラクトを書いてみました。2019年7月2日ブロックチェーンを作ってみました。@gmoap_engineer本ブログで発信される情報は、各エンジニア個人の見解であり、弊社の公式見解ではありません。本ブログに掲載、引用等をしている商品またはサービス等の名称は、各社の商標または登録商標です。その他の事項について一切責任を負いかねます。発表する情報には注意を払っておりますが、公式発表、見解については、弊社WEBサイトおよびプレスリリースなどをご確認ください。GMOインターネットグループにおけるソーシャルメディア運用ポリシーについては次のページをご確認ください。本ブログに掲載のあるソフトウェアのダウンロードは自己責任で御願い致します。ソフトウェアのダウンロードの結果、ご利用者に何らかの損失・損害が生じたといえども、当社ではその責任を負いかねます。本ブログに掲載のあるソフトウェアを扱う際は、各ソフトウェアの公式リファレンスを参照のもとご使用下さい。ソフトウェアの実行の結果、ご利用者に何らかの損失・損害が生じたといえども、当社ではその責任を負いかねます。