はじめに
皆様、Tendermintという技術をご存知でしょうか? これはCosmosというブロックチェーンで用いられている技術なんです。「ブロックチェーンって仮想通貨とかそういうやつ?」
「Cosmosなんてブロックチェーンは知らない」
「イーサリアムくらいなら知ってる!」
ブロックチェーンに関して詳しくご存じの方も、そうでない方も、ぜひ一度目を通していただけたら幸いです。
ブロックチェーン開発におけるアーキテクチャ
まずTendermintに関して詳細にご紹介する前に、
ブロックチェーンを構成しているレイヤー(層)に関して以下をご覧ください。
ブロックチェーンは主に3つのレイヤーから構成されており、上から
・アプリケーション層→トランザクションを処理する
・コンセンサス層→ブロックの生成
・ネットワーク層→トランザクション伝搬
という構成になっています。
Tendermintが出来る以前は「ブロックチェーンを開発するぞ」と言えば、それは「上のレイヤー3つを作るぞ」という意味を表していました。
しかしながら熟練したエンジニアでも上記の3層を万遍なく開発するのは難しく、また手間が多くかかってしまうという問題がありました。
その解決を目指して開発されたブロックチェーンとしては、例えばイーサリアムがあります。イーサリアムはスマートコントラクトを記述することで簡単にDapps(分散型アプリケーション)の開発を可能にしたのです。
しかしここでもまだ問題があり、イーサリアムではブロックチェーンに固有の問題である「スケーラビリティ(拡張性)」や「相互運用性」という問題を解決できていないのです。
そこでTendermintによってブロックチェーンの開発を容易にし、ブロックチェーンに固有の問題である上記の2つを解決するために開発されたのがCosmosでした。
Tendermintの技術的要約図
https://tendermint.com/docs/introduction/what-is-tendermint.html#consensus-overview
公式ドキュメントにTendermintを技術的に要約した図が載っています
この図の全てではありませんが、詳細は以下の寄稿内容をご覧ください
ABCIの利用
TendermintはCosmosブロックチェーンにおいてコンセンサス部分を担っており、申請プロセスと合意プロセスの間に非常に単純なAPI(つまりABCI)を提供することによってブロックチェーン設計を分解することができます。
ABCIとはApplication-BlockChain-Interfaceの略で、Tendermintではこれを通じてアプリケーション層とブロックチェーンエンジン(Tendermint Core)を接続します。詳細は以下の弊社CEO木村の説明をご覧ください
"コンセンサスの部分などを担うTendermintに対して、ブロックチェーンのロジック部分から情報を伝える窓口となるのがABCIです。つまり、好きなようにブロックチェーンのロジック部分をつくり、ABCIという窓口を経由してTendermint側に情報を伝えれば、あとはTendermint側がコンセンサスなどをすべてやってくれて、ブロックチェーンとして機能するのです。言わば、Tendermintを利用しつつも特有のロジックを持つブロックチェーンを簡単に作るための、Tendermintへの伝達窓口となります。"
BFT合意プロトコルとバリデータ
Tendermintは簡易的に理解可能な非同期中心のBFT(Byzantine Fault Tolerance)合意プロトコルですが、以下のようなステートマシン図(オブジェクトの状態が相互作用の中でどのように遷移していくのかを表現するための図)で表現可能です。
このプロトコルへの参加者は「バリデータ」と呼ばれ、順番にトランザクションのブロックを提案・投票します
ブロックは各高さに1ブロックずつ連鎖してコミットされますが、ブロックがコミットされない可能性もあります。その場合、プロトコルは次の ラウンドに進み、新しいバリデータがその高さのブロックを提案します。(ラウンドはラウンドロビン方式のラウンド)
正常にブロックをコミットするには2段階の投票が必要で、それぞれpre-vote(投票前)とpre-commit(コミット前)と呼ばれています。
同じラウンドで同じブロックに対して2/3を超えるバリデータがプリコミットすると、ブロックはコミットされます。