わかりやすくブロックチェーンを説明してみる(第8回):DAppsの概要
はじめに
ブロックチェーンの本質は「データ分散(コピー)」技術です。
前回(第7回)はビットコインとは別の暗号資産であるイーサリアムの概要について説明しました。その中でイーサリアムはブロックチェ―ンにプログラムコードを保存する、という説明をしました。
今回(第8回)は、「ブロックチェーンにプログラムコードを保存する」とはどういうことなのかについて説明します。今回はなんらかのプログラミング言語の使用経験がないと理解するのは難しいかも知れません。
なお本連載はビットコインやブロックチェーンを技術的な側面から解説することを目的としています。ビットコインへの投資を勧める連載では決してありません。
DApps
DAppsはDecentralize Applicationsの略で、日本語では「分散型アプリケーション」と訳されています。「アプリケーション」はスマホでいうところの「アプリ」に相当する、いわゆるソフトウェアです。
「分散型アプリケーション」と聞くと、何か大きなな処理を複数の処理に分けて分散処理をする、というイメージを持つ方がいるかも知れませんがDAppsの場合は違います。
DAppsでいう「分散」はビットコインのブロックチェーンと同じく、全員で同じデータをコピーすることです。
もう少しだけ詳しく言うと、イーサリアムのネットワークに参加している人(コンピュータ)全員で同じアプリケーションをブロックチェーンに保存し(コピーし)、全員で同じ実行をし、全員で同じ実行結果をブロックチェーンに保存します。またイーサリアムではビットコインと同様に送金情報もブロックチェーンに保存します。
なおビットコインでは保存するデータがアプリケーションではなく送金情報のみとなります。
DAppsはアプリケーションということなので、アプリケーションの開発環境(記述言語、コンパイラ等)は何かという疑問がすぐに出てきますが、それについては後ほど説明します。まずはDAppsがネットワーク上でどう流れるにかについて概要を説明したいと思います。
下図はAさんがDAppsを開発した場合の例を示しています。この場合は複数形である「DApps」ではなく単数形である「DApp」という表現の方が正しいかも知れませんが、細かいことは置いておいて以降は「DApps」という表現を使うことにします。
Aさんは作成したプログラムコードをトランザクションとしてネットワークに送出します。このトランザクションには送金情報を含めることも可能です。トランザクションの概念はビットコインでのトランザクションと同じです。ビットコインではトランザクションには送金情報だけが書かれていますが、イーサリアムの場合はDAppsのプログラムコードもトランザクションに書かれています。
なお上図ではDAppsがブロックチェーンに書かれるようになっていますが、正確には「コントラクト」と呼ばれれるプログラムコードが書かれます。これについては後でもう少し説明します。
イーサリアムのDAppsはSolidityなどのイーサリアム専用言語で記述します。
送信されたトランザクションはビットコインのブロックチェーンと同じようにマイニングされ、イーサリアムのブロックチェーンに書き込まれます。この時点で世界中のイーサリアムネットワークのすべてのコンピュータにAさんのプログラムコードが保存されます。
なお前回も触れたとおり、現在(2021年5月5日)イーサリアムはPoWを採用しておりマイニングを実施していますが、近々にPoS(Proof Of Stake)に移行する予定です。
次にAさんの開発したDAppsをBさんが使う様子を下図に示します。Aさんの開発したDAppsには以下の特徴があります。
- イーサリアムに参加している人であれば誰でも実行できる
- DApps内部で利用する一部のデータ(変数)の読み書きはイーサリアムに参加している人であれば誰でもできる。なおアクセス制限を付けることも可能。
Bさんは自分の保存しているブロックチェーンにあるAさんが開発したDAppsを起動し実行します。起動の仕掛けについて後ほど説明します。
BさんはAさんが開発したDAppsを実行した後、以下の2つの情報をトランザクションとして隣接するコンピュータに送信します。
- DApps起動時の引数(DAppsへの入力パラメータ)
- DApps実行後に変化したデータ(DApps内の変数の値)
ここでいうデータとはディスクに保存すべきデータを指します。
Bさんからトランザクションを受信したCさんは、Bさんと全く同じようにDAppsを実行し、実行結果を確認します。実行結果がBさんが転送してきた結果と異なる場合は不正なトランザクションとして破棄します。これによりBさんの実行結果はブロックチェーンに書かれることはありません。実行結果がBさんと同じであれば、Cさんは隣接するコンピュータに実行結果を転送します。
ここで疑問を持った方もいるかと思います。「BさんがAさんの開発したDAppsを使うだけなのに、世界中のコンピュータで同じ実行をするのか?」と。はい、その通りです。イーサリアムネットワークに接続しているすべてのコンピュータにおいて同じDAppsを実行することになります。
これを資源の無駄使いととらえるか、データベース管理のための必要コストと考えるかは意見の分かれるところのような気もします。
DAppsのメリット
なんとも無駄な気もしますが、なぜわざわざこんなことをするのでしょうか?従来通りサーバー/クライアント型のアプリケーションを開発すればいいじゃないか、という人も多数いるかと思います。しかしDAppsには以下のようなメリットがあります。
1番目のメリットはサーバーを立てる(準備する)がないという点です。通常なら自分でサーバー用のコンピュータを用意して、サーバー用のプログラムを開発(準備)する必要があります。なぜなら今回Aさんが開発するDAppsはネットワーク上の誰でもデータの読み書きができるようにする必要があるためです。
しかしイーサリアムのDAppsではサーバーを立てる必要はありません。なぜならイーサリアムのDApps開発環境にはAPIが用意されており、ブロックチェーン(イーサリアムネットワーク)に対してread()/write()と言った感じで簡単に読み書きができるようになっているからです。つまりブロックチェーン・ネットワーク全体がサーバーの役目をしてくれるわけです。
2番目のメリットはバックアップを取る必要がないという点です。理由は明らかで、イーサリアムネットワークに接続されている世界中のコンピュータにブロックチェーンのコピーが存在するからです。
3番目のメリットはデータ等の改ざんやセキュリティについて対策を取る必要がないという点です。基本的なセキュリティ対策はイーサリアムのブロックチェーンがすでにカバーしてくれているからです。
DAppsには以上のようなメリットがあるため、サーバー/クライアント型として開発していたアプリを、より簡単に個人レベルでも開発および配布ができるようになります。
逆を言うと以下の人達はDAppsつまりブロックチェーンを利用するメリットはあまり無いと考えられます。
- サーバーは自分で立てます。サーバーは自分で管理します。サーバーサイドのプログラムも自分で作成します。
- バックアップは自分でとります。
- セキュリティ対策はバッチリです。
GUIアプリは巨大では?
ここで1つ疑問に思うかも知れません。GUIを含むアプリとなるとプログラムのサイズもかなり大きくなります。そのような大きなプログラムのコピーを世界中のコンピュータで保存するのはいくらなんでも無駄ではないでしょうか?また巨大なプログラムをブロックチェーンに書かれてはたまったものではありません。ディスク容量がいくらあっても足りません。
イーサリアムのDAppsでは以下の2つのアプローチによりこの問題を解決しています。
- GUI部分(フロントエンド)はJavaScriptで記述する
- DAppsをデプロイする場合、あるいはDAppsを実行する際はDAppsの規模に応じ手数料としてイーサが必要。この手数料はガス(gas)と呼ばれる。
仮に悪意を持って大量のデータをブロックチェーン書こうとしても大量のイーサが必要となる。
JavaScriptとDAppsの関係について下図に示しました。DAppsの専門家からは多数の突っ込みがきそうですがだいたいの感じで、ということで。
図中の緑の四角はgethというソフトウェアです。gethは常駐プログラムであり、ネットワーク上で隣接するコンピュータから転送されるトランザクションを受信します。
またgethはJavaScriptとも通信ができるようになっています。
JavaScriptで記述されたGUI(DAppsフロントエンド)からブロックチェーン内の関数を呼び出し、その関数が実行されるまでの流れは以下の通りです。
- JavaScript内からAPIを使って関数(正確にはコントラクト内の関数)を呼ぶ。「コントラクト」については後述。
- JavaScriptからのリクエストをgethが受信する
- gethはブロックチェーンから該当する関数(正確にはコントラクト内の関数)を呼び出し実行する。
関数の実行はEMV(Ethereum Virtual Machine)と呼ばれるプログラムにより実行される。
上図ではブロックチェーン内にある関数を実行したときにデータをすぐブロックチェーンに書いているよう見えますが、実際はマイニングをした後ブロックチェーンに書かれることになります。
コントラクトとは?
上図にもあるようにイーサリアムではブロックチェーンに保存するプログラムコード部分は「コントラクト(contract)」と呼んでいます。「コントラクト」はDAppsのバックエンドだと思って頂いてもいいかもしれません。
ただこの「コントラクト」という表現は誤解を招きやすいのではと個人的には思っています。
イーサリアム専用のプログラミング言語Solidityを使って記述した簡単なサンプルコードを以下に示します。以下に出てくるキーワード「contract」はSolidityにおける予約語です。
contract MyUtility {
uint data;
function my_set(uint x) public{
data = x;
}
function my_get() public constant returns (uint retVal){
return data;
}
}
SolidityはC++などと非常に似ています。上記の「contract」はC++でのクラスに相当します。またSolidityの「function」はC++ではメソッドに相当します。上記記述を見て、これと「契約」と何の関係があるの?と思ってしまうわけです。Solidityで記述する各種プログラムと「契約」とは何の関係もありません。
Solidityでは様々な種類のプログラムを記述することができます。その中の1つとして「契約」に関係するプログラムも作成できる、というくらいの意味かと思っています。「契約」に関係するプログラムとは、「何かが起きたら、何かをする」といったようなプログラムのことです。
Solidityにはイベントという概念があります。コントラクト内でイベントを発生させ、JavaScript(フロントエンド)がそのイベントを受信します。そしてそのイベントを受信したJavaScriptが必要に応じて何等かの処理をしたり、別のコントラクトを呼び出したりすることになります。このあたりになってくると「契約」に関連しそうな気もしますが、イベントの概念も他のプログラミング言語にもある話です。
ということで「コントラクト」とはざっくり言うとイーサリアム専用のプログラミング言語Solidityで記述したプログラム全般のことであり、ブロックチェーンに保存されるもの、という程度の理解でよいかと思います。
DAppsの特徴
以下にDAppsの特徴をまとめてみました。
次回
今回(第8回)はイーサリアムのDAppsについて簡単に説明しました。
次回(第9回)は弊社で開発中のDAppsである「Kokorobakari」について紹介する予定です。「Kokorobakari」は旅先での感動をその場でブロックチェーンに刻んで思い出として残すと同時に、感動への感謝として地域に寄付ができるアプリです。