さまざまなブロックチェーン技術

##ブロックチェーン技術

ブロックチェーンと呼ばれる技術はかなりの数が存在する。
ただ、実際はブロックチェーンではないものもあげられていることがある。
営業的にはブロックチェーンでなくともブロックチェーンと言った方が売りやすいのだろう。
海外がほとんどだが、企業がSaaS形式で提供しているものも多い。
ピックアップしたものは主にソースコードを解析したものや、実際に動作させてみたもの。基本的にAWSで動作確認している。
オープンソース陣営を見ると、サーバー側の実装はパフォーマンスや並行処理に優れるGo言語が多い。
APIをCallする側のクライアントの言語は問われないが、既存のライブラリなどの存在有無により開発生産性も異なる。

Bitcoinのシェアが圧倒的なのは依然としてかわらず。
その他のブロックチェーン技術の中では２番目にシェアの高いEthereumや、多くの資本が入っているChain、Hyperledger fabricあたりが生き残るのではないかと思うがブロックチェーンそのものが生き残る技術なのかどうかも、現時点では不明である。

##対象リスト

2016年4月時点の資料だが、ブロックチェーンかもしれない技術の一覧表が記載されている。
これをベースに調査をしたが、開発が停止しているもの、SaaS形式のもの、ブロックチェーンではないものも含まれている。
http://www.digitalmoney.or.jp/wp-content/uploads/2016/04/201604_BlockChain2.0_v06.pdf

##ブロックチェーンでない技術

####Ripple
https://ripple.com/
RippleConnectというソリューションが存在するがRippleの手前に設置する別システムであり、国内プレスリリースなどでのRippleはRippleConnectを指す。分散台帳・分散システムであり、ブロックチェーンではない。

####Orb(version2)
https://imagine-orb.com/jp/
version1はブロックチェーン。現行のversion2は分散システム（分散システム関連のオープンソースをベースに開発されている）であり、ブロックチェーンではない。

####Corda
https://github.com/corda/corda
https://docs.corda.net/index.html
https://www.corda.net/
コンソーシアム、プライベート。もともとはクローズドソース。R3主導で進められていたプロジェクト。
Chain同様に、2016年10月オープンソース化が発表され、Hyperledgerプロジェクトを進めているLinux Foundationにソース提供された。
JVM上で動く、Kotlin言語実装。
Ethereum系同様にコントラクト実行機能を保有する。
githubに置かれているサンプルデモはWindowsではエラーで動かず、Linux環境でもGUIがないと動かない（スクリプト内でxtermを起動している）。ubuntuのDesktop環境でもそのままでは動かない。MacOSでは動く。
ただ、MacOS（ローカルPC）で動いても所詮、動作確認と検証程度しかできないのでLinuxOSのServer環境での動作については見直してほしい。
ドキュメントは確かに存在するが、Chainのようにすぐに使えるドキュメントではなく、ソースの解析も必要。ドキュメントはパス記述誤りなどもあり、コードも含め精査されていないので利用はお勧めしない。資本はかなり入っているはずなので残念。
公式Slackで質問を投げたが、整備の必要性は認識していた。

以下の記事では
https://news.bitcoin.com/corda-blasted-r3-fail-funding-goals/

また公開された仕様ではブロックチェーンとは言っておらず、コンセンサスアルゴリズムでは全員がすべてのデータを共有していない（トランザクション関係者のみの同意が必要）。
![diag2.png](https://qiita-image-store.s3.amazonaws.com/0/142538/2e66d9a2-be7e-482c-5aaa-c1c56afe0c25.png)
パフォーマンスを優先しているため、ブロックチェーンの特徴は捨てている。
R3コンソーシアムからはすでにGoldman Sachs,Santander,Morgan Stanley and National Australia Bankが脱退している。
参加している企業にはR3から投資が求められるが、それに見合わないと判断されたのかどうか。今後も脱退企業が出てくるかもしれず、コンソーシアム型が成立しなくなる恐れもある。
将来性の観点からもビジネス利用はお勧めしない。

##ブロックチェーン技術リスト

###Bitcoin

https://bitcoin.org/ja/
パブリック。オープンソース。C++やJava、nodejs、Go言語、pythonなど複数言語実装あり。
代表的な仮想通貨でありブロックチェーン。
取引の承認に10分前後かかるが、仮想通貨の中でもシェアが圧倒的であり、仮想通貨市場の8割強を占める。
データ改ざんは現実的に不可能。
その安全性から、最終的にBitcoinに記録するソリューションやサービスも数多く存在する。
ColoredCoinsやSidechainなどは証明の場としては有用。

###MultiChain

http://www.multichain.com/
プライベート。バイナリ配布で、ソースコードは現在公開されていない為実装技術不明。
Contactをとれば閲覧はできるかもしれない（ただし英語）。
Windows版も出ているので、Go言語かC++か。
環境構築しやすく、扱いやすいブロックチェーン技術。
multisig関連以外は普通に使える。
旧バージョンではbitcoinとの互換性を売りにしていたが、現在は独自の方向に向かっている。
まだアルファバージョンではあるが、開発が続けられている。
アカウントはノード（サーバ）ごとに別管理で、残高などのノード間でのデータ共有はしない。
ただし、別ノードのアドレス宛に送金などは実行できる。
銀行の支店別に口座を持っているようなイメージ。
トランザクション実行パフォーマンスもブロックチェーン技術のなかでは高い部類で、
秒間100トランザクション程度までは簡単にいける。

###Ethereum

https://www.ethereum.org/
パブリック、プライベート。オープンソース。Go言語やC++、Javaなど複数言語実装あり。
bitcoinに次いで有名なブロックチェーン技術。
分散ネットワーク上でプログラムを動作させることができる環境で、通貨の送金が目的ではない。
プログラムはコントラクトと呼ばれ、独自言語Solidityで記述するが、Solidity開発のためのIDEも数種類ある。
bitcoinよりは複雑な処理を書くことができる。プログラムもデータもブロック内に持ち、独自仮想マシン（EVM）上で動作する。
原理上、コントラクト実行のパフォーマンスは悪い。
仮想通貨は送金するためのものではなく、プログラムなどを実行するための燃料(手数料)として使われる。
トランザクション能力は秒間20～50程度。
送金業務の置き換え用途ではなく、価値や証明の場としてはパブリックであれば有用。

###Hyperledger fabric

https://www.hyperledger.org/
プライベート、コンソーシアム。オープンソース。Go言語実装。ブロックチェーンの共同開発プロジェクト。大手が多数参入している。
もともとはIBMの持っていたOpenBlockChainを、Linux Foundationに提供したもの。
IBMのBluemixではblockchainをEnterprise向けに提供しているので、商用で使うとすればこちらを採用したほうがよい。
http://www-935.ibm.com/industries/jp/ja/blockchain/
Ethereumのように、分散ネットワーク環境でプログラムを実行するための環境。
プログラムはチェーンコードと呼ばれ、Go言語やJava言語など汎用言語で記述することができる。
プログラムはノードPCのOS上で実行される為、Ethereumにくらべパフォーマンスに優れる。
ブロックから参照可能なworld stateと呼ばれる独立したKVSをもち、様々な属性のデータの保存が可能。
ほかのブロックチェーンと違い、決済完了点を持つため、即時決済完了済みとみなすことができる。
認証の仕組みも標準で持っている。
既に実証実験の結果がwebで公開されており、課題・問題点が列挙されている。

http://www.jpx.co.jp/corporate/research-study/working-paper/tvdivq0000008q5y-att/JPX_working_paper_No15.pdf

Qiita上にも関連記事はあるので、そちらを参考に構築・検証を行った。

###Hyperledger Sawtooth Lake
http://intelledger.github.io/introduction.html
https://www.hyperledger.org/blog/2016/11/02/meet-sawtooth-lake

もともとはintelの開発していたブロックチェーン技術を、Linux Foundationに提供したもの。
Python実装。

実験用途にしか利用を推奨していない。
独自のコンセンサスアルゴリズムPoETを持つが、これは本来intelが提供するハードウェアを利用して
行われるため完全版ではなく、オープンソース版ではシミュレータが用意されている。

開発は続けられているが、正式なプロダクトへの採用を勧めていない為、選択肢にはならない。
興味があればドキュメントなどを参照のこと。

###Hyperledger Iroha
https://prtimes.jp/main/html/rd/p/000000006.000019078.html
https://www.hyperledger.org/blog/2016/11/01/hyperledger-welcomes-iroha

もともとはソラミツが開発していたブロックチェーン技術を、Linux Foundationに提供したもの。
C++実装。

シンプルさとモバイル用途を前面に出している。
規模的にもstar数でもHypeledgerファミリーのほかのブロックチェーン技術に劣る。
開発は続けられているが、ドキュメントやWebでの情報は不足している。
将来的にHyperledger fablicなどとの連携を目指しているようだ。
現在はDraftバージョン。

###Hydrachain

https://github.com/HydraChain/hydrachain
プライベート、コンソーシアム。オープンソース。python実装。
Ethereum互換であり、コントラクト実行環境だが、コンセンサスアルゴリズムが独自。
環境構築から動作までは比較的容易だが、ノードは6台以上必要。
コントラクトのプログラムをPythonで記述することができる。
EVMを使わずにコントラクトを動作させられるため、Ethereumにくらべコントラクト実行のパフォーマンスはよい。

###Eris(ErisDB)

https://monax.io/docs/documentation/
プライベート。オープンソース。Go言語実装。
コンセンサスアルゴリズムにTendermint Consensus（ほかのオープンソースのブロックチェーン関連技術）を採用。
検証当時、ドキュメント不足で環境構築できず。

###Tendermint

https://github.com/jTMSP/jTMSP
ブロックチェーンプロトコル。単体では機能せず、ベースとなる仕組みであり、API実装が必要。
また、コンセンサスアルゴリズムをほかのブロックチェーン技術に提供している。
EthereumのTendermint版も出ている。

###NXT

https://nxt.org/
https://www.coin-portal.net/2016/06/10/9569/
パブリック、プライベート。オープンソース。Java実装。githubではなく、bitbucketでソース公開している。
日本語の情報はないが、英語の情報も不足しているため、選択肢としては弱い。
まとまった情報としては、wikiが存在する。
https://nxtwiki.org/wiki/Main_Page
トランザクション能力は秒間80程度。

###Rootstock

http://www.rsk.co/
http://media.rsk.co/july2016-pr/
https://github.com/rootstock/ethereumj
パブリック。オープンソース。Java実装。
ethereumjからForkしたソースコードをベースに、bitcoinネットワークの要素を取り入れつつパフォーマンスを改善した技術。
EVM（Ethereumのコントラクト実行仮想環境）のパフォーマンスも改善したとしている。テスト段階。

###BigchainDB

https://www.bigchaindb.com/features/
https://github.com/bigchaindb/bigchaindb
パブリック、プライベート。python実装。
非中央集権型の分散Databaseにブロックチェーンの要素を取り入れている。
KVSであるRethinkDBを内部で使用。
P2Pネットワークでノードが相互接続しつつデータ共有するため、すべてがマスターDBになり、書き込み可能。
マスター＋スレーブではなく、すべてがマスター。

###AntShares

https://www.antshares.org/
https://github.com/AntShares
https://github.com/AntShares/AntShares/wiki/API-Reference
パブリック。オープンソース。C#実装。
中国のブロックチェーン技術。ブロックチェーンの一般的な特徴しか書かれておらず、詳細不明。
英語のドキュメントもあるにはあるが、ほとんどは中国語。

###Chain

https://chain.com/
https://github.com/chain/chain
http://fortune.com/2016/10/24/visas-blockchain-chain-open-source/
コンソーシアム、プライベート。もともとはクローズドソース。
Go言語実装。
2016年10月、Chain Core Developer Editionというエディションに限りオープンソース化された。
VISA主導で進められていたプロジェクトのブロックチェーン技術。
まだオープンソース化されたばかりで情報が少ないが、java用のSDK(jar1つ)もあり、ドキュメントも比較的充実しているため、そちらが参考になる。Rubyのサンプルソースも増えている。
現時点ではコントラクト実行機能は保有していない。まだ研究開発が進められている。
dockerベースであり構築からAPI実行までが容易。
名前のせいでgoogle検索しにくい。

###DragonChain

https://github.com/dragonchain/dragonchain
https://dragonchain.github.io/

パブリックとプライベートのハイブリッド。オープンソース。
python実装。
2016年10月にディズニーが作ったブロックチェーン技術として公開、オープンソース化された。
パブリックネットワークにチェックポイントを記録するタイプのプライベートブロックチェーン。
オープンソース化の時点で話題にはなったが、その後海外でも目立った動きはない。
まだ実装は続けられているが、今採用するメリットはない。
White Paperにはいろいろ書かれているが、あくまでプロジェクト目標。送金APIなどが最初から用意されているわけではない為、APIは自分で実装する必要がある。APIのソースコード生成にApache Thriftを使っているがThriftはすでに開発は停止している。導入にmakeが必要なのでひと手間かかる（MacOSの場合、brew installで入るようだが未確認）。Thriftそのものの情報も少なく、Thrift IDLも覚える必要がある。Thrift IDLで記述したソースをThriftでコンパイルすると、様々なプログラム言語でソースコードを出力でき複数言語で相互連携できる仕組みだが、特にメリットは感じられない。
導入する場合は、Linuxであればredhat系ではなく、ubuntuの方が躓く箇所が少ない。ただ、githubのreadmeに書かれている手順だけでは環境構築できず、ドキュメントは全体的に不足している。環境構築後、transaction_svc.pyなどを動作させても、curlでjsonでのHTTPリクエストを投げて動作確認ができる程度。

###NEM(mijin)

https://www.nem.io/
パブリック、プライベート。Java実装。サーバ側（NISと呼ばれる部分）は非公開でありオープンソースではない。
NEMとmijinはバイナリレベルで同じプログラム。
接続先ネットワークの設定と、接続先メインノードPCのIP指定を変えることでパブリックネットワーク（mainネット・testネット)向けのパブリックブロックチェーンであるNEM、プライベートネットワーク(mijinネット)向けのプライベートブロックチェーンであるmijinとして動作させている。
日本語英語問わず、情報は少ない。NEMのAPIリファレンスも細かい記述があるわけではない。
NEMもmijinもAPI実行時に手数料としてXEMという通貨を消費するため、ユーザーがXEMを所持していないと何もできない仕様であり、プライベートブロックチェーンであるmijinでもXEM手数料は発生する（NEMとmijinは同じプログラムのため、NEMの仕様に引きずられる）。
「mijinのAPI実行時に毎回発生するXEM手数料」を、設定だけでゼロにすることはできない（公式回答＋コード解析による）。
その為、mosaicを使って独自通貨を定義する場合は、標準通貨のXEMと、独自通貨の２種類の残高を同時に管理しておく必要がある。また、mosaic作成時にはnamespaceを指定する必要があり、これは１年間の貸出期限付き。期限切れ１か月前に再度作成（更新）処理をしなければ、ほかの人も同じ名前の通貨を使えてしまう為、更新用年次バッチも必要になる。プライベートであるmijinでも同じ。独自通貨を使う場合はシステムが複雑化する。multisigも特殊で、状態によって使うAPIを切り替えなければならず、ラッパー実装は複雑になる。
同一内容のAPIリクエストを連続して投げるとエラーになり、取引成立しない為、パフォーマンス検証にはリクエスト内容を変える必要がある。
次世代NEMであるカタパルトは2017年1Qリリース予定となっているが、もともと2016年8月にオープンソース化する予定だったのが実際されていないため、2017年もどうなるか不明。
カタパルトの構成は海外Forumによればnode.jsの入り口と、その先のC++実装エンジンから成る。

###key
blockchain,ブロックチェーン,Bitcoin,Ethereum