DApp(分散型アプリケーション)とは何か#
現在一般的な Web アプリケーション、例えば微博、豆瓣、百度はすべてクライアント - サーバーモデルに基づいており、すべてのリソースは中央サーバーによって制御されています。微博にアクセスする例を挙げると、ブラウザに www.weibo.com という URL を入力すると、DNS サーバーが URL を解決し、微博サーバーの IP アドレスをブラウザに返します。ブラウザはこの IP アドレスを通じて微博サーバーにリクエストを送信し、微博サーバーは対応するコンテンツをブラウザに返します。ブラウザはコンテンツを受け取った後、ユーザーに結果を表示します。このプロセスの中で、微博サーバーは主要な役割を果たし、クライアント(ブラウザ)はサーバーとの接続と表示の役割を果たすだけです。中央サーバーはクライアントにとっては不透明であり、クライアントはサーバー側の動作を知ることができず、個人のプライバシーやデータの漏洩を引き起こす可能性があります。さらに、中央サーバーの運用に伴う高額なコストは最終的にユーザーが負担する必要があり、中央サーバーに問題が発生すると、システム全体のアプリケーションが正常に使用できなくなる可能性があります。中央サーバーの欠点を回避するために、分散型アプリケーションの概念が生まれました。
分散型アプリケーション(Decentralized Application、DApp)は、分散型ネットワーク上で動作するアプリケーションです。従来のアプリが中央サーバーに依存しているのとは異なり、DApp の動作はブロックチェーンおよびブロックチェーン上のスマートコントラクトに依存しています。現在、DApp は主に Ethereum、EOS、Steem、TRON などのブロックチェーンプラットフォームに基づいて開発されています。また、DApp はウォレット機能を持つ環境(詳細は 3.2.2 節ウォレットの紹介を参照)で動作する必要があります。例えば、Ethereum に基づいて開発された DApp は、Ethereum ブラウザ Mist、Ethereum クライアント Parity、モバイルブラウザ Status、および MetaMask ウォレットプラグインがインストールされたブラウザで動作できます。
DApp はスマートコントラクトとユーザーインターフェース(UI)で構成されています。スマートコントラクトはブロックチェーン上で動作するコードであり、ブロックチェーンと対話する役割を果たします。一方、UI は HTML と JavaScript で実装されたフロントエンドページで、ユーザーが操作するためのものです。Ethereum では、ユーザーインターフェースは Web3.js ライブラリを通じてスマートコントラクトを呼び出すことができます。DApp の構造は以下の図のようになります。
ここで、Mist や Parity などは前述の DApp をサポートするウォレットです。EVM(Ethereum Virtual Machine)とは、Ethereum におけるスマートコントラクトの実行環境であり、Java 仮想マシン(JVM)が Java プログラムを実行するのと似ています。EVM はスマートコントラクトを実行するために使用されます。DApp の実行中には、Ethereum 上の暗号通貨である Ether を消費する必要がある場合があります。Ether の価格は変動が大きいため、実行コストを相対的に安定させるために、Ethereum では Gas という別の計量単位が使用されています。したがって、DApp の開発過程で Gas という言葉が出てきた場合、それは Ether を指します。HTML と JavaScript はウェブページを開発するための言語であり、Web3.js は Ethereum が提供する JavaScript ライブラリで、Ethereum の JSON RPC API をラップしており、ネットワークの状態を確認したり、ローカルアカウントを確認したり、取引やブロックを確認したり、取引を送信したり、スマートコントラクトをコンパイル / デプロイしたり、スマートコントラクトを呼び出したりするための一連の JavaScript オブジェクトと関数を提供します。その中でも最も重要なのは、スマートコントラクトと対話するための API です。
DApp の特徴#
一般的な中央集権型アプリケーションとは異なり、DApp は通常以下の特徴を持っています。
●公開透明、信頼不要。DApp の基盤は一般的にブロックチェーン技術に依存しており、そのデータもブロックチェーンと同様に公開透明で信頼不要の特性を持っています。
●中央故障点なし。DApp は分散型であり、中央サーバーがないため、単一のノードの故障によってアプリケーションが正常に動作しなくなることはありません。
●コンセンサス機構。中央集権型アプリケーションでは、データの更新と有効化は中央サーバーによって決定されます。しかし、ブロックチェーン技術上で動作する DApp では、ブロックチェーン内のすべてのノードがコンセンサス機構に基づいてどのデータが有効でどのデータが無効かを共同で決定し、単一のノードがデータをブロックチェーン全体で更新して有効にすることはできません。
●報酬機構。ブロックチェーン内では、システム全体がすべてのノードによって生成され、維持されています。DApp でも同様であるため、DApp を運営することで一定の暗号通貨の報酬を得ることができます。
有名な DApp#
これらの特徴に基づいて、開発者たちは Ethereum 上に多数の DApp を作成しました。ここでは、比較的有名で広く使用されている DApp をいくつか挙げます。例えば、Augur、Golem、Aragon などです。
1.Augur
Augur は分散型の市場予測プラットフォームと見なすことができ、ユーザーが潜在的な取引の利益を予測することを許可します。現実世界の専門家の予測と比較して、Augur は「群衆の知恵」を利用して現実世界のイベントを予測します。このアプリケーションが予測する結果は、時には専門家の予測よりも正確です。ユーザーがイベントを正しく予測すると、プラットフォームは一定の報酬を与えます。また、市場の創設者やイベントを報告するユーザーも一定の報酬を得ることができます。Augur の公式ウェブサイトのホームページは以下の図のようになります。
2.Golem
Golem はコンピュータとデータセンターを利用して、外部に貸し出すことができるスーパーコンピュータを作成します。世界中の誰でもレンタルを申請できます。このプロジェクトは中央サーバー群に依存せず、計算負荷を自分のコンピュータを貸し出すことを希望する「プロバイダー」に分配します。これらのプロバイダーは、コンピュータリソースを共有することで暗号通貨の報酬を得ます。集中型プロジェクトと比較して、Golem のような分散型の計算能力提供方式は計算速度が速く、コストが低くなります。Golem の公式ウェブサイトのホームページは以下の図のようになります。
3.Aragon
Aragon は Ethereum 上のアプリケーションで、分散型自治組織を管理するためのものです。ユーザーが分散型組織を作成し、Aragon 財団によって管理されることを許可します。このプラットフォームは DAO(分散型自治組織)を構築し、管理するために作成されました。このアプリケーションは暗号通貨を通じて投票し、製品の将来の発展方向を決定します。Aragon の分散型特性は、あらゆる組織や会社、さらには非営利の財団にも利用できます。これにより、株主名簿、トークンの移転、投票、職務の任命、資金調達、会計などの組織機能の基本機能が実現されます。Aragon 上で作成された組織の行動は、定款を変更することでカスタマイズできます。また、Aragon はスマートコントラクトを通じて他の必要な機能を拡張することもできます。Aragon の公式ウェブサイトのホームページは以下の図のようになります。
DApp の応用はまだまだ多く、用途はますます広がり、発展の可能性は非常に大きいです。DApp の開発能力を習得することは非常に価値があります。次に DApp の開発を学び始めましょう。まずはスマートコントラクトの開発と使用です。
Ethereum には Python、Go、C++、Java などの多様な言語に基づくバージョンがあります。どの言語に基づいて開発しても、Ethereum のブロックチェーンアーキテクチャはコアライブラリ、通信ライブラリ、クライアントの 3 つの部分で構成されています。
●コアライブラリ:コアライブラリの主な機能は、ブロックチェーン、EVM(Ethereum 仮想マシン)およびコンセンサス機構の実装です。Python バージョンのコアライブラリに対応するプログラムは pyethereum、Go 言語バージョンは go-ethereum、C++ バージョンは cpp-ethereum、Java バージョンは ethereumj です。
●通信ライブラリ:通信ライブラリは P2P ネットワークライブラリで、主な機能はノード間の発見、接続、データ同期を実現し、分散型ネットワーク内のデータ転送サービスを提供します。Python バージョンに対応する通信ライブラリプログラムは pydevp2p であり、Go 言語バージョンの通信ライブラリは go-ethereum の P2P モジュールにパッケージ化されています。
●クライアント:クライアントの役割は Ethereum に接続し、相互作用することです。これには、Ethereum ブロックチェーンネットワークのデータを取得し、ネットワーク上に取引を送信したり、契約をデプロイしたり、スマートコントラクトをコンパイルしたりすることが含まれます。クライアントは JSONRPC を介して外部ポートを開放し、メッセージを受信した後に対応する操作を行います。Python バージョンのクライアントに対応するプログラムは pyethapp で、デフォルトで 4000 ポートをリッスンします。Go 言語に対応するプログラムは geth で、デフォルトで 8545 ポートをリッスンします。
ここで構築するスマートコントラクト開発環境は、実際には適切なクライアントを選択して Ethereum ネットワークに接続することです。Ethereum のパブリックチェーン上で操作を行うには Ether(ETH)を消費する必要があり、コストが高いため、開発者にとってはローカルで Ethereum ブロックチェーンネットワークのテスト環境を構築することが非常に重要です。
ローカル Ethereum 環境の構築#
Ethereum コミュニティは、開発者が迅速にローカルの Ethereum 開発環境を構築するための一連のツールを提供しています。ここでは、Ganache(以前は testRPC と呼ばれていました)を選択してローカル Ethereum テスト環境を構築します。
DApp がどのように機能するか、Ethereum の状態変化を確認することができます。アカウントの残高、契約、Gas コストを確認できます。Ganache のマイニングコントロールを調整して、自分の開発する DApp により適した環境を整えることができます。Ganache のインストール手順は以下の通りです。
まず、Ganache をダウンロードしてインストールします。Ganache のダウンロードリンクはhttps://truffleframework.org/ganache/ です。Ganache のホームページにアクセスし、自分のオペレーティングシステムに対応するバージョンの Ganache ソフトウェアインストーラをダウンロードします。ダウンロードが完了したら、インストーラをダブルクリックしてインストールを開始します。指示に従ってインストールが完了したら、生成された Ganache アイコンをダブルクリックすると、Ganache のグラフィカルなメインインターフェースが表示されます。
図に示すように、Ganache のメインインターフェースには 4 つのタブがあり、アカウント情報、ブロック情報、取引情報、ログ情報が表示されます。Ganache が起動すると、ローカルの 7545 ポートでリッスンし、自動的に 10 個のテストアカウントを作成します。各テストアカウントには 100 の Ether がテスト開発用に提供されます。「BLOCKS」アイコンをクリックしてブロック情報に切り替えると、現在のブロックチェーンには 1 つのブロック、すなわち創世ブロックしかないことが確認できます。
2. Ethereum ウォレットのインストールと使用#
ここでは、MetaMask プラグインを Ethereum ウォレットとして使用します。MetaMask はブラウザで使用するプラグイン型の Ethereum デジタルウォレットで、ダウンロードは不要で、ブラウザに対応する拡張機能を追加するだけで非常に便利です(現在、Firefox ブラウザと Google ブラウザをサポートしています)。MetaMask の公式ウェブサイトにアクセスしてインストールします。ブラウザに以下の URL を入力します:https://metamask.io/。MetaMask の公式ウェブサイトのホームページが開きます。
MetaMask の公式ウェブサイトのホームページに入ったら、「プラグインを取得」をクリックすると、対応するブラウザのプラグインライブラリに移動してインストールできます。インストールが完了すると、ブラウザ上に MetaMask の狐のアイコンが表示されます。このアイコンをクリックして MetaMask を開きます。初めて使用する際にはプライバシーに関する通知が表示され、「Accept」を選択して利用規約に同意し、ログインページに入ります。
ここには 2 つの入口があります。1 つ目は新しい DEN を作成するための「CREATE」ボタン(DEN は MetaMask でパスワードで暗号化して保存されるウォレット形式)で、2 つ目は既存の DEN をインポートするための「Import Existing DEN」リンクです。ここでは新しい DEN を作成する例を示します。上のパスワードボックスにパスワードを入力し、下の行の入力ボックスに再度入力して確認し、「CREATE」ボタンをクリックすると、MetaMask ウォレットが成功裏に作成されます。MetaMask はユーザーのために 12 の英単語のリカバリーフレーズを自動的に生成します。これらのリカバリーフレーズは必ず保存しておく必要があります。安全な場所にコピーして保存することをお勧めします。リカバリーフレーズはウォレットアカウントの所有者を確認するための証明書であり、他のウォレットにこの新しく作成したアカウントをインポートする際や変更する際に必要になることがあります。また、「SAVE SEED WORDS AS FILE」ボタンを直接クリックすると、リカバリーフレーズファイルが自動的に生成され、ローカルに保存されます。「I'VE COPYED SOMEWHERE SAFE」ボタンをクリックすると、MetaMask のメインインターフェースに入ります。
メインインターフェースに入ったら、右上のアイコンをクリックしてログアウト、アカウントの切り替え、アカウントの作成、アカウントのインポート、その他の設定を行うことができます。
MetaMask のメインインターフェース
MetaMask は自動的にユーザーのためにウォレットアドレスを作成し、ウォレット残高は 0 の Ether です。アカウントの左側のメニューボタンをクリックすると、アカウントの詳細情報とアドレスが表示されます。
MetaMask はデフォルトで Ethereum のメインネットワークに接続されていますが、ここではネットワークを Ganache のローカルネットワークに切り替えます。MetaMask ページの上部にある「Main Etherum Network」の右側のドロップダウンボタンをクリックし、「Custom RPC」オプションを選択します。
新しくポップアップした画面にローカル RPC アドレスhttp://127.0.0.1:7545 を入力し、「Save」ボタンをクリックします。この時点でローカルの Ethereum テスト環境に接続されました。
Ganache のアカウントインターフェースに切り替え、アカウントの後ろにある鍵のアイコンをクリックすると、そのアカウントの秘密鍵情報が表示されます。
上記の秘密鍵をコピーし、再度 MetaMask を開き、「Import Account」を選択します。コピーした秘密鍵を秘密鍵の入力ボックスに貼り付けます。インポートが成功すると、新しいアカウント Account 3 に切り替わり、新しいアカウントには 100 の Ether があります。
これで Ethereum のテスト環境が構築されました。次にスマートコントラクトの開発を開始できます。
スマートコントラクトの開発には、Solidity(JavaScript に似た構文)、Serpent(Python に似た構文)、LLL(Lisp に似た構文)など、さまざまな言語を使用できます。現在最も人気があるのは Solidity で、Solidity はスマートコントラクトの公式プログラミング言語です。したがって、次に Solidity 言語を使用してスマートコントラクトの開発を行います。
Solidity はスマートコントラクトを書くための高級言語で、Ethereum 仮想マシン(EVM)上で動作します。その構文は JavaScript に近く、オブジェクト指向の言語です。JavaScript に慣れている読者はすぐに学ぶことができるでしょう。以下では Solidity の基本構文について説明します。