昨今はビットコインが話題になり、1年で20倍以上の値上がりをしていますね。
そんなビットコインですが、このサービスの技術はブロックチェーンという技術が使われています。

この技術はビットコイン以外にも、証券の取引物流のトレーサビリティなどでも様々なシチュエーションで使われることが期待されています。
今回はそんな世の中の技術革新といっても過言ではない、「ブロックチェーン」技術についてまとめてみました。

ではまず、ブロックチェーンとはどんなサービスでしょうか?

■ブロックチェーンとは

・概要

分散型ネットワークでデータを管理する技法/概念のことを指します。
ブロックと呼ばれるデータをタイムスタンプと合わせて記録すると1つのブロックとして存在し、
他にはないユニークなデータとして扱われます。このデータをユーザー同士で署名(独自のキー)を付加し、次のブロックとして生成することで、
鎖(チェーン)のようなデータになり、元のデータは堅牢なデータとして改ざんや不正ができなくなります。
ビットコインではこの仕組みを利用して、取引の履歴を管理しています。

・技術の特徴

特徴として、データを様々な場所(端末や処理)で分散して管理することで、従来の中央集権型システムのようにある会社/システムによって管理されることがありません。
分散管理手法にすることで、データの改善が実質不可能になります。
この技術を使うことで、商取引における既存の動き(従来の仲介を介した取引)が必要でなくなり、決められたルール(プログラム)上で自動で取引が可能になります。
これをスマートコントラクト(賢い契約)と呼ばれています。
この概念により、証券の取引や物流のトレーサビリティの技術革新が起きようとしています。

ブロックチェーンにおける覚えとくべきキーワードをまとめます。

【スマートコントラクト】
上述した通り、スマートに契約をするプロトコルのことを指します。
ブロックチェーンの技術により取引の信頼性が担保できるため、取引プロセスを自動化することが可能です。
結果、ユーザー同士が直接取引を行うことができるようなシステムが可能になり、この概念も注目されています。


【分散型取引台帳、P2P(Peer to Peer)】
複数の端末間で通信を行う手法です。
普段ホームページを閲覧するときは、クライアントサーバー方式(サーバーを中心にデータがある)と対比した考えで、
クライアント(ユーザー)同士で通信をすることです。
以前から使われていた技術ですが、違法行為やウィルスソフトを送りつけるような悪徳業者も多くありました。
ただし、ブロックチェーンの技術により分散型台帳(P2P)による通信方式が信頼でき、効果的に使われることが期待されています。

【ハッシュ値】
取引のデータ情報(商品の情報など)を暗号化するときに、ハッシュ関数(暗号化手法)が使われ、
不可逆性(元のデータは読み取れない)データとして存在する値になります。
ITの世界ではパスワードをデータベースに保存するときに使われています。(データの内容はわからず、一致確認のみできるため)
ブロックチェーンでも、このハッシュを行い、取引データをハッシュ値として保持させます。
ブロックチェーンにおいて、初めての取引データはハッシュ値を作成することから始まります。

【ブロック】
ブロックチェーンでは、初めの取引のハッシュ値を次のクライアント(データを受け取った端末)で、
新たに情報(xx日に取引が行われたなど)を付加しハッシュ化します。
この取引情報のハッシュ化された値をブロックと呼びます。
そしてその取引が次々と行われるためにブロックが複数で来ていく形になります。
ビットコインでは3つの0からはじまるハッシュが有効なブロックとするというルールとしています。
そうすると、連鎖されたブロックが改ざんしにくいものとなります(詳細は割愛)

■ブロックチェーンを触ってみる(Mac編)

オープンソースのブロックチェーン ethreumを使い、実際にブロックチェーンを触って見ました。

・イーサリアム(Ethereum)

https://www.ethereum.org/
イーサリアムでは、分散アプリケーションのためのスマート・コントラクトを構築するためのプラットフォームの総称のことをさし、
イーサリアム・ネットワークと呼ばれるP2Pのネットワーク上でスマート・コントラクトの記述などが可能になっています。
今回はこの環境を触って見ました。

他にも”Hyperledger Fabric”など様々なプラットフォームが台頭して来ています。
・Hyperledger fabric
https://www.hyperledger.org

では早速Ethereumを触って見ます。
以下参考にしました。
https://qiita.com/amachino/items/b59ec8e46863ce2ebd4a

・gethのインストール

「geth」と言われるCUIクライアントを使うと、イーサリアムのネットワーク環境に接続が可能です。
その環境で、
・etherの採掘、送金
・スマート・コントラクトの生成
・トランザクションの生成
などが可能になります。

Home brewでインストール可能です。
コマンド

$ brew tap ethereum/ethereum
$ brew install ethereum

これでOKです。
実行環境が整いました。

gethを実行してみる

ディレクトリを作り、gethコマンドで環境を実行します。

$ mkdir my_eth_chain
$ cd my_eth_chain
$ geth --dev --datadir .//環境の起動

バージョンによっても実行方法が違うので、詳細は最新の公式ドキュメントを確認してください。
–devは開発用の実行オプション
参考)
https://github.com/ethereum/go-ethereum/wiki

これで、ローカル環境にプライベートなイーサリアム環境が立ち上がりました。

次に、イーサリアム環境で様々なコマンドをやりとりする(アタッチ)ために以下コマンドを実行します。
※geth.ipc があるディレクトリで実行が必要です

$ geth attach geth.ipc //アタッチ
Welcome to the Geth JavaScript console!

instance: Geth/v1.7.3-stable/darwin-amd64/go1.9.2
...省略...
> //ここで実行可能

これで、アタッチされました。
ここではWeb3 APIと言われるイーサリアム環境で実行されるAPIが実行できます。(クライアント間の通信で実行可能)
https://github.com/ethereum/wiki/wiki/JavaScript-API

アタッチ後は様々なコマンドが可能です。
以下のようなコマンドでethreumで用意しているハッシュの発行ができます。

$ >personal.newAccount() //アカウント作成
$ >eth.accounts  //アカウントの確認
$ >eth.getBalance(eth.accounts[0]) //現在の残高 (Balance) 
$ >miner.start() //マイニングスタート
$ >miner.stop() //マイニングストップ
■Solidityでスマートコントラクトを作ってみる

イーサリアム環境でコンパイルできる言語でもっともメジャーな言語がSolidityです。
このsolidityを使うと、普段のプログラミングのようにスマートコントラクトを作りことができます。
・solidityをインストール

$ brew install solidity

あとは以下ドキュメントにそってプログラムを記載すると、任意のコントラクトが作成可能です。
http://solidity.readthedocs.io/en/latest/

・実行方法

$ solc --bin --abi test.sol

ここでは”test.sol”をコンパイルします。
そうすると、イーサリアム上でコントラクトを登録する情報が表示されます。

・上記コマンド実行結果

======= test.sol:Test =======
Binary:
606060…. //ハッシュされたバイナリの情報。この値を登録
Contract JSON ABI
[{"constant":false,"inputs":[{"name":"_message","type":"string"}],... //インターフェイース情報。この値を登録

この情報を以下に実行します。
・Gethにアタッチされた状態で実行


$ >bin = "0x"+"solidityで発行されたバイナリー情報" //※先頭に0Xを追加が必要
$ >abi ="solidity発行されたABI情報"
$ >contract = eth.contract(abi) //contractオブジェクトを作成
$ >Test = contract.new({ from: eth.accounts[0], data: bin, gas: 1000000 }) //Testというスマートコントラクトをブロックチェーンに登録

※ abiとはApplication Binary Interfaceの略で、コントラクタのインターフェース情報になります

登録した情報でコマンド実行すると、情報が返信されます。

$ >Test
//結果
{
  abi: [{
      constant: false,
      inputs: [{...}],
      name: "setMessage",
      outputs: [],
      payable: false,
      stateMutability: "nonpayable",
      type: "function"
  }, {
      constant: false,
      inputs: [],
      name: "sayHello",
      outputs: [{...}],
      payable: false,
      stateMutability: "nonpayable",
      type: "function"
  }],
  address: undefined,
  transactionHash: "0x410a2a2e53be5d15a51647fa4c5af78b0917f2f377a78d1e112f8d96c9b497dc"
}

このコントラクト情報のメソッドを確認できます。
このコントラクトオブジェクトに実装しているメソッドに対して様々なアクション(リクエスト)が可能です。
送金以外にも独自の商品情報などを付加させる際に使用できます。

まとめ

簡単ですが、実際にブロックチェーン技術にふれることで技術に対する理解が深まったと思います。
今後の技術発展に乞うご期待です。