こんにちは、Gincoの永田(@nagatkaz116)です。
先日、Tezosについての紹介記事を書きましたが、今回は同じPoSのアルゴリズムを持つEnigmaについて紹介したいと思います。 Enigmaは現在(2018年12月執筆時点)25億円程度の時価総額をもつERC20トークンです。 まだ開発段階ではありますが、イーサリアムの弱点を克服するプラットフォームとして期待されています。
Enigmaについて
Enigmaの特徴
ずばり、Enigmaの最大の特徴はプライベート情報を扱えることです。 イーサリアムではスマートコントラクトを記述することでDAppsを展開できますが、プライベート情報の扱いには注意が必要です。 一方、Enigmaはそんなイーサリアムの弱点を克服すべく、シークレットコントラクトという概念を導入し、プライベート情報を扱うことを可能にしました。 DAppsの処理を行う前にプライベート情報は暗号化され、処理単位ごとに複数のノードへ送られます。 ここで、処理を負担するノードでさえ元の情報を復元することはできません。 こうした特徴からプライベート情報を伴う重要な契約などにも応用することができると期待されています。
Enigmaプロジェクトの構成
公式Webサイト[1]によると、Enigmaは次の3つの層で構成されています。
- プロトコル層 Enigmaプロトコルの主な役割は次の2つです。
- 分散型ストレージ機能 ブロックチェーンは汎用データベースではないので、DAppsは全てのデータを分散的に保存している訳ではありません。Enigmaはそうしたストレージ機能を提供し、より分散的なデータ管理を目指します。
- シークレットコントラクト 先述の通り、プライベート情報を扱うことのできるスマートコントラクトです。
- プラットフォーム層 プラットフォーム層は簡単にいうとプラットフォーム系のDAppsです。 具体例を挙げて説明するとわかりやすいと思うので、データマーケットプレイスというプラットフォームを紹介します。 データマーケットプレイスは非中央集権的で安全なデータプラットフォームで、データのプロバイダーとキュレーターをデータの消費者とマッチングさせるものです。 ここで流通するデータを利用してさらにDAppsを開発することができるので、プラットフォームと呼ばれます。 詳しくはEnigma Data Marketplaceを参照してください。
- アプリケーション層 要はDAppsです。 例えば、カタリストというアプリケーションがEnigmaチームによって開発されました。 カタリストは仮想通貨のトレーディングプラットフォームで、データマーケットプレイスから取得したマーケット情報を元にアルゴトレードをすることができます。 詳しくはCatalystを参照してください。
(『enigmaの構造』公式Webサイトより抜粋https://enigma.co)
ロードマップ
実はEnigmaは開発段階であり、当初のロードマップではDiscoveryのメインネットが2018年Q3にリリースされる予定でしたが、現在は見送られているようです。 最初はイーサリアム上でオフチェーンネットワークとして機能しますが、後々自前のブロックチェーンが開発されたりと、設計がリリースごとに大きく変わるため、あらかじめロードマップを理解することが重要だと思います。 将来的には、次の4つの段階を経てネットワークをリリースする予定です。
- Discovery 最初のリリースであり、シークレットコントラクトの概念を導入し、オフチェーンでプライベート情報を含むDAppsを処理します。 ただし、全てのシークレットコントラクトはTEE(Trusted Execution Environment)で行うため、ノードを立てるにはIntel SGXが使用可能なマシンを用意する必要があります。
- Vovager 2番目のリリースであり、MPC(Multi-party Computations)を行う分散型仮想マシンを採用することでシークレットコントラクトを強化します。 DAppsの開発者はTEE(secret contract 1.0)とMPC(secret contract 2.0)のどちらを使うか選ぶことができます。 また、Ethereumから独立した自前のブロックチェーンを導入する予定となっています。
- Valiant 3番目のリリースであり、シャーディングを行うことでスケーラビリティ問題を解決します。
- Defiant 最後のリリースであり、MPC周りの暗号プロトコルをアップデートする予定とのことです。
Proof-of-Stakeによるコンセンサス
Enigmaではシークレットコントラクトの処理を行うノードのことをシークレットノードと呼び、実際に選出されたシークレットノードをワーカーと呼びます。 処理を負担する対価として報酬を受け取るので、ビットコインでいうところのマイナーに相当します。 ある処理に対してどのシークレットノードがワーカーとして選出されるかにProof-of-Stakeが用いられており、ワーカー選出確率がトークン(ENG)のステーク量に比例します。
シークレットノード
シークレットコントラクトの処理を行うノードであり、処理の負担量に応じて報酬を手にすることができます。 具体的な報酬額等はまだ公開されていません。 また、シークレットノードは担保としてトークンを預託しなければいけないとホワイトペーパー[2]に書いてありますが、これもその具体的な額は公開されていません。
コンセンサスノード(Voyager以降)
処理結果を検証してEnigmaブロックチェーンの状態を変化させるノードです。 Discoveryリリースはオフチェーン実装なので、コンセンサスノードを持ちません。
ENG
Enigmaで使用されるトークンで、次の二つの機能を担います。
- 処理手数料の支払い Ethereumのガスと同様に、DAppsのエンドユーザーはEnigmaでプライベート情報を扱った処理を行う時に、ENGを手数料として支払います。
- シークレットノードとコンセンサスノードのステーキング ワーカーに選出される確率はENGのステーク量に比例します。
結局ワーカーに選出されるには何が必要か?
さて、ここまでEnigmaの概要を説明してきましたが、結局報酬を獲得するためには何が必要なのかを説明します。 現在のところ、次の2つの条件を満たす必要があります。
- Intel SGXが使えるマシン(Discoveryリリースに限り) 先述の通り、Discoveryリリースではシークレットコントラクトの実行にIntel SGXを使用します。 ですから、自分のPCのCPUとマザーボードがIntel SGXに対応しているものである必要があります。 SGX-harwareでIntel SGXに対応しているか確認することができます。
- ENGトークン PoSなのでワーカーに選出されるためにはENGトークンをステークする必要があります。 最低ステーク量があるようですが、今のところ細かい数字は公表されていません。
Enigma Docker Network上でDAppsをデプロイする
現在、パブリックなネットワークはテストネット含め稼働していませんがEnigma Docker Networkというものがリリースされています。 これは、DAppsの開発者がローカルでテストネットを構築してシークレットコントラクトのテストを行うことを目的としたものです。
以下、Enigma Docker Networkの起動手順と、その上にHello Worldを表示する簡単なDAppsのデプロイ方法を説明したいと思います。
事前準備
まずは、以下の項目がインストールされていることを確認し、適宜インストールしてください。
- Docker
- Docker Compose
- npm
- scrypt
- nodejs
- node-gyp
Enigma Docker Networkの起動
次のコマンドでenigma-docker-networkレポジトリをローカルにクローンしてください。
git clone <https://github.com/enigmampc/enigma-docker-network.git> && cd enigma-docker-network
enigma-docker-networkを起動するのですが、その前に自分の環境でIntel SGXを使用できるのかを確認してください。 SGX-harwareでIntel SGXに対応しているか確認することができます。
Intel SGXに対応している場合
Intel SGXに対応しているマシンを使用している場合は、ハードウェアモードで起動することができます。 次のコマンドを実行してください。
sudo ./launch.bash
Intel SGXに対応していない場合
Intel SGXに対応していない場合は、ソフトウェアモード(シミュレーションモード)で起動する必要があります。 次のコマンドを実行してください。
sudo ./launch.bash -s
ここで、筆者の環境ではenigma_contract_1というコンテナの起動時にIPアドレスの取得に失敗し、処理が止まるという現象が起きました(該当しない方はスキップしてください)。 その場合は、/enigma-docker-network/enigma-contract/wrapper.bashを以下のように書き換えてください(2行目のaddrを削除する)。
#!/bin/bash
#export CONTRACT_IP=`/sbin/ifconfig eth0 | awk '/inet addr/ {gsub("(addr:)?", "", $2); print $2}'`
export CONTRACT_IP=`/sbin/ifconfig eth0 | awk '/inet / {gsub("(addr:)?", "", $2); print $2}'`
echo "My IP address is " $CONTRACT_IP
sed -i'' -e ':a;N;$!ba;' -e "s/ganache: {[^}]*}/ganache: { host: \\"$CONTRACT_IP\\", port: 8545, network_id: \\"*\\"}/" ~/enigma-contract/truffle.js
cd ~/enigma-contract && ganache-cli -h $CONTRACT_IP
DAppsをデプロイする
まずは次のコマンドでenigma-template-dappというレポジトリをローカルにクローンします。
git clone <https://github.com/enigmampc/enigma-template-dapp.git> && cd enigma-template-dapp
パッケージのインストールをします。
npm i
cd client
npm i
darq-truffleパッケージをグローバルインストールします。
npm install -g darq-truffle@next
最後に、/enigma-template-dapp/clientディレクトリで次のコマンドを実行するとDAppsがデプロイされます。
npm run start
リンクが表示されるのでブラウザで開いて次の画面が表示されていれば成功です。
まとめ
今回は、Enigmaの概要説明を行い、その後Engima Docker Network上でHello Worldを表示するDAppsのデプロイ方法を説明しました。 Enigma自体の開発はまだ途中ではありますが、Enigma Docker Networkでシークレットコントラクトのイメージを掴んでいただければと思います。 また、興味のある方はデータマーケットプレイスやカタリストについても調べてみると良いかもしれません。
Tip us!
エンジニアチームのブログを書くモチベーションが上がります!