社内ハッカソンでDappsを作ってみた

はじめに

アプリ開発支援部でiOSエンジニアをやっている小鍋です。

2020年12月の社内ハッカソンに同期のSenさんと参加し、ありがたくもテクニカル賞をいただくことができました。 このハッカソンを通じてDappを2日間で作り上げたことはとても貴重な経験となりました。

エムティーアイハッカソンは、毎年2回のペースで開催されています。 2日間の開発期間が与えられ、その間に与えられたテーマに沿ったアプリケーションを作成してその成果を競い合います。

今回参加したハッカソンは「新生活様式にマッチしたサービス」がテーマです。 tech.mti.co.jp

Senさんは入社する前からブロックチェーン技術にとても興味を持っていたので、「一緒にブロックチェーンで勝負してみないか」と声をかけ一緒に参加しました。

今回2日間で作成したサービスはSanitize Token(直訳:消毒するトークン)です。 僕にはどうしても、コロナ=消毒というイメージしかなく、消毒に関してなにかいいアイデアがないかと考えた結果このサービスが生まれました(笑) もちろんそれだけでは味気ないので、どのようにビジネスとして利用できるか、開発しながら二人でブラッシュアップをしていきました。

どのようにアイデアを考えたのかや、どのような技術を用いたのかについて簡単に紹介します。 今後Dappsを開発する場合の参考になるように書いているのでぜひ読んでみてください。

Dappsについて

まず本記事を理解するための前提知識として簡単に説明します。 Dappsは、Decentralized Applicationsの略です。 日本語では「分散型アプリケーション」と呼ばれています。

英語の"Decentralized"からもわかるように、従来の中央集権的(Centralized)なアプリケーションと対立する立場をとる構想になります。 中央集権的という言葉も見慣れない人が多いかと思いますが、今日でのほとんどのWebアプリケーションはサーバーとクライアントといったはっきりとした区別ができる構造を持っています。 今日ではSREの流行によりわかりづらくはなっていますが、サービスを提供するサーバーがないとアプリケーションとしては成立しません。 ではどうして、中央集権的なアプリケーションに取って代わる分散型アプリケーションが、ひそかに注目されているのでしょうか。

まずはじめにわかりやすい例として、耐障害性が挙げられます。 最近発生したGoogleの大規模障害は、まさに中央集権的なアプリケーションのデメリットといえます。

もし僕たちが中央集権的なアプリケーションを使用している場合、管理者側に問題があった場合はそのサービスが使えなくなってしまいます。 単純に障害だけではなく、企業の存続のためにサービスを中断せざるを得ないなど、サービスが使えなくなる要因は管理者側の都合に依存しています。 従って、ユーザーは管理者側に依存せざるをえなくなります。メールアプリを使っている場合はそのサーバー管理者の都合でいつでもメールが使えなくなる危険性があることになります。

一方Dappsでは中央集権的な存在はありません。 ブロックチェーンと呼ばれるP2Pネットワーク上で管理される仕組みによって、データの操作などが行われます。 つまり、インフラ基盤としてブロックチェーンのネットワークさえあれば、その上で様々なアプリケーションが動いてしまうのです。

実際にP2Pネットワーク上で動作するサービスはいくつかあります。

P2P地震情報は、ユーザーが「地震が起きた」と思ったときにその情報を報告することができ、他人の報告の一覧を見ることができます。 災害に関連するアプリケーションは、中央集権的なサービスですと有事の際にサーバーがダウンしてしまったら使えなくなります。

このサービスでは、ユーザーのパソコンやスマートフォンが起動していればサービスとして成立します。 そのため、災害が起きても機能し続けることが保証されます。 もちろんインターネットやプロバイダー等は動いている前提ですが。

IPFSは、HTTPに変わるメディアのプロトコルとして注目されており、メディアを位置ではなく名前として管理してしまおうという構想に基づいています。 HTTPにとって、メディアのある位置というのは、当然サーバーの在り処であり、これも中央集権的な発想からなるものです。

しかし、IFPSはほしいメディアがどこにあるかは重要ではなく名前を指定すれば取りに行くことができるようになります。 このように分散型アプリケーションは従来の中央集権的なアプリケーションでは簡単に考えられないようなことも実現することができます。 詳しくはIPFSのリンク先を見ていただけると良いと思います。とてもよくまとめられています。

スマートコントラクトと手数料

いくつかサービスを紹介しましたが、じゃあネットワークは誰が管理するの?という話だと思います。 P2Pネットワークを管理すること自体にコストがかかりますし、管理者がいなくなってしまったら動かなくなってしまうかもしれません。 その問題に対応できると期待されているもののうちの一つが、仮想通貨であるイーサリアムが提供するスマートコントラクトです。

最近話題に上がることが多くご存知の方も多いイーサリアムはブロックチェーン上で管理される仮想通貨のことです。 ところがイーサリアムはお金だけではなく、Dappsのプラットフォームとしての側面も持っています。 そのプラットフォームを利用するのに必要なのがスマートコントラクトと呼ばれる仕組みです。

「じゃあネットワークは誰が管理するの?」の答えはインセンティブです。何かメリットがないと人は動きません。 スマートコントラクトにはガスという仕組みがあります。

ユーザーがアプリケーションを操作すると、スマートコントラクトが自動的にガスを支払わせます。 いわゆる手数料のようなものです。Dappsの面白いところは、その手数料がアルゴリズムの複雑さに基づいて自動的に計算されるということです。

なにかのサービスを利用したとき、手数料を払ったことがあると思いますが、実際のその使い道は不明なことが多いです。 ですが、Dappsは合理的に計算された手数料をユーザーに請求するようになっています。 この手数料がサービスの持ち主に自動的に渡るようになっています。

当然高い手数料のサービスは使われないので開発者はそこで差別化を図ろうとし、 必然的に良いサービスが競争によって生まれていくことも想像に難くありません。

また、スマートコントラクトはイーサリアムというお金を扱うプラットフォームの上で動くので、 お金に関するセンシティブな開発も安全に行うことができるという利点を持っています。

サービスの概要紹介

今回開発したサービスは「Sanitize Token」です。施設などで設置されている消毒用アルコールで消毒をするたびに報酬がもらえる仕組みを提供しています。

f:id:mti-techblog-writer:20210817123707p:plain
ビジネス構想

インセンティブを仮想通貨で

このサービスの根幹のアイデアは「消毒用のアルコールにインセンティブを与える」です。 コロナウイルスのパンデミックにより感染拡大防止や予防への関心が高まっています。 ところが実情は、感染は広まる一方でなかなか収束しません。

心理学的にも「悪いことを避けるためにしなければならない」ことは行動に起こしづらく、それよりも「良いことを手に入れるために自分からする」方が行動に起こしやすいことが知られています。 インセンティブを与える仕組みがきちんとあれば、より多くの人が感染拡大防止を進んで行うようになり結果として感染の収束にも貢献ができると考えました。

このインセンティブの仕組みを構築するためには、考えなければいけないことがたくさんあります。

代表的なものが、セキュリティです。 扱うものがインセンティブなので、悪意を持った人が他人のインセンティブを盗むことが想定されますし、他人になりすましてインセンティブを不正に取得しようとすることも考えられます。 そこで、インセンティブを何で扱うかを考える必要が出てきます。 ポイントとしてサーバーで管理する方法や、決済として扱う方法もあります。

もう一つ考えられるのが仮想通貨です。 仮想通貨はブロックチェーンという実用的には書き換え不可能なネットワークの上にあり、それを利用することで上記の問題は同時に解決されることになります。 また、先ほど説明した通り、スマートコントラクトの仕組みによってビジネスロジックなどをネットワーク上に載せることができるので開発も容易に行うことができます。

ビジネス戦略

良いものを持続的に運用していくには、お金を生み続ける仕組みが必要不可欠です。

そこで、僕たちはビジネスをどう展開していくかについても考えました。 ブロックチェーンはガスという仕組みで手数料を支払うため、利用する人が多ければ多いほど収入になるからです。

まず、得られたインセンティブはお店と連携して、決済の時の割引ポイントとして使えるようにします。 それと同時に、お店に設置されているアルコール消毒の管理を自動化する仕組みを提供します。 アルコール消毒がされたことを検知してアルコール残量などを監視します。 それをブロックチェーン上に蓄積することでデータとして利用することができるようになります。

このデータを利用すれば、アルコール残量が残りわずかだった場合は自動的に発注して補充できるような仕組みを作ったり、行政がそのデータを閲覧することで消毒の実績などを確認したりすることができます。

技術について

今回のプロダクトの開発に用いた技術スタックは以下になります。 全てイーサリアムネットワーク上にスマートコントラクトを構築して作るプロダクトに必要なツールです。

  • ganache
  • Solidity
  • Truffle
  • Vue.js
  • web3.js
  • drizzle
  • MetaMask

具体的にどのように実装するかについては、それぞれのツールの変化が激しいことが予測されるのでこの記事では割愛させていただきます。 この記事では、ツールの立ち位置や組み合わせについてのみ説明します。

バックエンド編

ganache

ganache(ガナッシュ)はイーサリアムのネットワークを取り扱うツールです。 REST APIでいうところのPostmanに相当するツールと考えて差し支えありません。 実際にブロックの値がどのように変化しているかや、スマートコントラクトがどのように実行されているかを確認することができます。 また、仮想的なイーサリアムネットワークを簡単に構築することができるので実際にイーサリアムを所持していなくてもスマートコントラクトを試すことができます。

Solidity

Solidity(ソリディティ)はスマートコントラクトを記述する専用の言語です。 基本的にはオブジェクト指向プログラミングを模倣したような言語といえます。 クラスの代わりにコントラクトという単位を利用して開発を進めることになります。

実際は常にブロックチェーン上の振る舞いについて考えながらスマートコントラクトを構築する必要があるのですが、 Solidityの仕組みをうまく使うことができれば自然な振る舞いができるスマートコントラクトを記述することができるように設計されています。

CryptZombiesというサイトがとてもわかりやすく、スマートコントラクトがどのようなものかを簡単に学ぶことができるので非常におすすめです。

Truffle

Truffle(トリュフ)はスマートコントラクトの開発環境です。 先述したSolidityで開発したスマートコントラクトをコンパイルしてイーサリアムネットワークにデプロイしたり、テストしたりすることに利用できます。

フロントエンド編

Vue.js

これはいうまでもなく、有名なコンポーネント指向のJSフレームワークです。 ブロックチェーンというと、遠い存在のように感じてしまいVue.jsで開発することに違和感があると思います。 後述するdrizzleというプラグインを利用することで、馴染みの深いVue.jsやReact.jsなどでスマートコントラクトのアプリケーションを作成できるようになります。

web3.js

web3.js(ウェブスリージェーエス)はイーサリアムネットワークへ接続するためのJSのAPIです。 ウェブアプリケーションのUI側からデータを持ってきたり、データを送ったりするときに使うことができます。

drizzle

drizzle(ドリズル)はweb3.jsのラッパーでもあり、React.jsやVue.jsのプラグインでもあるという立ち位置のライブラリです。npmを使って簡単にインストールすることができます。 今回のハッカソンの開発では基本的にweb3.jsの挙動は知らずにdrizzleの使い方を調べるだけで十分開発することができました。

MetaMask

MetaMask(メタマスク)はブラウザ拡張で利用できる仮想通貨のウォレットです。 ウォレットは基本的に仮想通貨の受け渡しに使うためのクライアントで、web3.jsの実行を検知する仕組みが備わっています。

まとめ

まず開発のために仮想のイーサリアムネットワークを構築する必要があり、そのためにganacheを使用します。 そして、実際にスマートコントラクトをsolidityを使って記述し、truffleでコンパイルして先ほど構築したネットワークにデプロイします。 これでバックエンド側の開発は完結します。

フロントエンドは、BoxからdrizzleとJSフレームワークがセットになったボックスを選んでインストールするだけで、あとはほとんど通常のJSフレームワークの実装と変わりません。

課題

ブロックチェーンに透明性があるということは、秘密情報が守られないという問題があります。 そもそも透明性はブロックチェーンをはじめとする分散型アプリケーションでは重要なものとして位置づけられているため、避けて通ることができません。

今回のプロダクトではユーザーの消毒の実績を公開している状態になっていて、どこにその人が住んでいるかやどこにいたのかなどのプライバシーを守ることができない状態になっていました。 ブロックチェーンの情報を適切に暗号化するための仕組みがあるので、それを用いることでこの問題の解決ができると考えています。

さいごに

ハッカソンで開発するまでは、ニッチな分野だから素人にはできないんじゃないかと誤解していましたが、そうではないんだと気づくことができました。 実際にやってみると、オープンソースの界隈が非常に盛り上がっているおかげで、ライブラリもきちんと整備されていて開発もスムーズにできました。

ブロックチェーンは導入障壁が非常に大きくあまり実用的ではありませんが、分散型アプリケーションのスピリットを含めて面白い業界だなと感じました。

Solidityについて学ぶだけでもだいぶブロックチェーンの感覚が掴めるようになるのでぜひCryptZombiesをお試しください!