こんにちは なまはげ(@_namahagesan)と申します。
Enigmaというブロックチェーンを用いた秘匿計算プラットフォームのテスト用環境が提供され始めました。
まだ、ブロックチェーンのネットワークにはなっていないのですがシークレットコントラクトと呼ばれる秘匿計算を行うコントラクトを実行したり、これを用いたアプリケーションを作れるようになりました。
このシリーズではEnigmaの開発チームが公開している「くじ引き」アプリを実装していこうと思います。
Enigmaとは
ブロックチェーンの問題点の一つとしてブロックチェーン上のトランザクションのデータが全て見ることができてしまうという問題点がありました。それに対策すべく、ゼロ知識証明を用いて送金などのデータを秘匿化したMoneroなどの通貨が生まれています。しかし、これらのゼロ知識証明では送金などの決められた処理しか秘匿化できず、Ethereumのスマートコントラクトのような柔軟な処理は不可能です。
そこでEnigmaではTEEと呼ばれる耐タンパ性のあるハードウェア内でコントラクトを実行し、入出力を暗号化することでコントラクトを実行したアカウントなど一部のアカウントのみがコントラクトの入力と出力を知ることができるようになります。これによって送金に限らない様々な処理を秘匿化して行うことが可能になります。
今回はこのEnigmaの環境設定を行っていきます。
まだテストネットもパブリックなものは存在していないので今回はローカル環境で行っていきます。
Enigmaの環境設定
事前にdockerを使えるようにインストールしておきましょう。
NodeJSの設定
NodeJSのバージョンは10.17.0で固定しましょう。
もしかしたらそれ以外のバージョンでも動くかもしれませんが、現状最新版と安定版では動きません。(エラーが出てきます)
今後、最新版でも動くようになったり、他にNodeJSを使う場面もあると思うので未インストールの人でもNodeJSのバージョン管理ツール、Nodebrewなどを使ってNodeJSのバージョンの切り替えをできるようにしておくといいと思います。
NodebrewはHomebrewインストール済みのMacなら
$ brew install nodebrew
$ nodebrew install v10.17.0
$ nodebrew use v10.17.0
ここまでできたらnodeのバージョンを確認します。
$ node -v
v10.17.0
となれば成功です。
Discovery CLIのインストール
続いてDiscovery CLIをインストールします。Discoveryというのは現在開発中のEnigmaのバージョン名のようなものです。
インストール自体は
$ npm i -g @enigmampc/discovery-cli
で完了です。
次に開発用のディレクトリを用意して、そこに先ほどインストールしたDiscoveryを適用します。
これによってEnigmaアプリケーションを作る準備が整います
$ mkdir enigma-test-dapp
$ cd enigma-test-dapp
$ discovery init
途中で15GBくらいのdocker imageをダウンロードしてくるので注意しましょう。
途中で何か聞かれたら基本的にはyesを回答しましょう。
また、途中でHW/SW?
と聞かれます。これはSGXを利用したハードウェアモードかSGXを利用せず、SGXが動いているようにシミュレーションするソフトウェアモードを利用するか聞いています。今回はソフトウェアモードを選択し、sw
と答えておきます。
Enigmaアプリケーションのファイル構成
さて、これでEnigmaアプリケーションを作る準備が整いました。
ここでファイル構成を見ておきましょう。
$ tree -L 1
├── build
├── client
├── config
├── docker-compose.cli-hw.yml
├── docker-compose.cli-sw.yml
├── docker-compose.yml -> docker-compose.cli-sw.yml
├── migrations
├── node_modules
├── package-lock.json
├── package.json
├── secret_contracts
├── smart_contracts
├── test
└── truffle.js
smart_contracts
フォルダにはSolidityで書いたEthereum用のスマートコントラクトを格納します。
これはEnigmaアプリケーションではシークレットコントラクトによるEnigma上での処理の他にEthereum上でも処理を行う場合があるからです。(ETHの受け渡しなど)
また、シークレットコントラクトからスマートコントラクトを呼び出すことができます。
secret_contracts
フォルダでシークレットコントラクトを編集します。
コンパイルされたコントラクトたちはabiやwasmファイルになって build
フォルダに移動します。
Reactによって書かれたフロントエンドはclient
フォルダで編集します。
また、テストはtest
フォルダで編集します。
なので主にsmart_contracts
フォルダ、secret_contracts
フォルダ、client
フォルダ、test
フォルダの4つを編集します。
と、ここまででとりあえず終了です。
次回はいよいよシークレットコントラクトを書いていきます。
Enigma Developer Guildの宣伝
弊社turingumではEnigma開発を行う開発者のコミュニティであるEnigma Developer Guildを作っています。
まだEnigmaが正式ローンチ前なのでほとんど活動していませんが、今後Enigma開発に関する議論や質問、イベントなどを行っていくつもりです。
参加はもちろん無料で入退会自由なコミュニティです。
このリンクからslackチャンネルに登録できます。(準備中)