はじめに
本記事は、過去にコンセンサス・ベイスが主宰していたオンラインサロンの記事です。記事は2017年~2018年にかけて執筆されたため、一部は、既に古くなっている可能性があります。あらかじめご了承ください。
今回の内容
本稿では、シャーディングを実装したパブリックチェーンであるZilliqa(ジリカ)を用いた、セキュアでスケーラブルなスマートコントラクトの実現について、全3回で解説します。
第2回では、Zilliqaのスマートコントラクトを実装するためのScilla言語の概要について紹介します。
第1章 スマートコントラクト言語の課題
Ethereumをはじめとしたスマートコントラクトのプラットフォームの登場により、ブロックチェーン技術を用いた分散アプリケーション(DApps)の開発はとても手軽に実現できるものとなりました。
Ethereumの代表的なコントラクト開発言語であるSolidityは、JavaScriptに似た文法を持ち、RemixなどのオンラインIDEやTruffleなどのフレームワークを用いれば、数分から数時間でオリジナルのプログラムをブロックチェーン上にデプロイできます。
しかし、一度ブロックチェーンにデプロイしたプログラムは、二度と改変することができず、Webアプリケーションなどのようにプロトタイプをすばやくリリースして素早い検証サイクルで精錬していくといった開発プロセスを適用することができません。
また、スマートコントラクトでは、各ユーザの所有する通貨や資産をトークンとして表現し、オンラインで価値を交換することができますが、裏を返せばプログラムのバグが金銭的な損失に直結するということでもあります。
これまでにも、Ethereum上の分散型投資ファンドであったThe DAOから巨額の資産が盗まれる事件や、Parityウォレットのコントラクトのバグによりユーザーの資産が凍結される事件などが発生しています。
さらに、悪意を持ったコントラクトを用いてユーザの資産を奪おうとするスキャムコントラクトも増加しています。一般に公開されたソースコードと同じインターフェイスを持ちながら、不正に残高を引き出せてしまうコードを含んだコントラクトを用いて、ICOやクラウドファンディングなどを行い、投資された資産を持ち逃げする、といった悪質なコントラクトも存在します。
そこで、プログラムのバグを生みにくく、不正利用の困難なスマートコントラクト開発言語の必要性が高まっています。
第2章 Scilla言語の提案
Zilliqaでは、スマートコントラクトを実装するための独自言語として、Scillaと呼ばれる言語を開発しています。
Scillaは、OCamlに似た文法を持つ関数型プログラミング言語です。グローバルな状態を持ったオートマトンとしてコントラクトを表現し、関数として表現されたtransitionによってコントラクトの状態を変化させていきます。
オートマトンとは、外部からの入力によって内部状態が遷移し結果の出力を行う概念のことを言います。
コード1に、Scilla言語によるHelloWorldコントラクトのサンプルコードの抜粋を紹介します。
コード1. Sciila言語によるHelloWorldコントラクトコード(抜粋)
contract HelloWorld
(owner: ByStr20)
field welcome_msg : String = ""
transition setHello (msg : String)
is_owner = builtin eq owner _sender;
match is_owner with
| False =>
msg = {_tag : "Main"; _recipient : _sender; _amount : Uint128 0; code : not_owner_code};
msgs = one_msg msg;
send msgs
| True =>
welcome_msg := msg;
msg = {_tag : "Main"; _recipient : _sender; _amount : Uint128 0; code : set_hello_code};
msgs = one_msg msg;
send msgs
end
end
HelloWorldコントラクトでは、イミュータブル(変更不可)な値として owner を持ち、ミュータブル(変更可)な変数として welcome_msg を持ちます。transitionとして、setHelloという関数を持ち、transitionの送り手が owner の場合に、引数で与えられた msg で welcome_msg を書き換えます。
Scillaは、Solidityなどとは異なりチューリング完全な言語ではなく、無限ループなどを記述することはできません。実装されている組み込み関数(すでに用意されている関数)やシンタックスシュガー(プログラミング構文の省略した書き方)も少ないため、ある程度冗長な記述になりがちです。
一方で、表現力を制限することでバグや脆弱性の発生を抑え、プログラムの静的な検証を可能としています。Scillaのプログラムの形式検証は、Coqと呼ばれるプログラム検証のための証明支援システムを用います。
また、Scillaのコードはデプロイ時にそのまま文字列としてブロックチェーンに記述され、実行時に評価されます。そのため、ユーザーが認識するコードと実行されるバイトコードに差異が発生しにくくなっています。
第3章 Scilla言語の開発環境
Scillaによるコントラクトの開発には、ローカルでScillaの実行環境を構築するか、Web IDEを用いる方法があります。
ローカル環境の構築
ローカルでScillaのビルドを行うには、OCaml 4.06.1の実行環境が必要です。下記に、UbuntuとMac OS XでのOpam(Ocamlのパッケージマネージャ)のセットアップ手順を示します。
コード2. UbuntuでのOpamセットアップ手順
# 必要なパッケージのインストール
$ sudo apt-get update
$ sudo apt-get install -y curl build-essential m4 ocaml opam pkg-config zlib1g-dev libgmp-dev libffi-dev libssl-dev libboost-system-dev
# Opamのセットアップ
$ opam init -y
$ opam switch create 4.06.1
$ opam switch -y 4.06.1
$ opam install -y ocaml-migrate-parsetree core cryptokit ppx_sexp_conv yojson batteries angstrom hex ppx_deriving ppx_deriving_yojson menhir oUnit dune stdint fileutils ctypes ctypes-foreign
コード3. Mac OS XでのOpamセットアップ手順
# 必要なパッケージのインストール
$ brew install ocaml opam pkg-config libffi openssl boost
# Opamのセットアップ
$ opam init
$ opam switch create 4.06.1
$ opam switch -y 4.06.1
$ opam install angstrom batteries core cryptokit fileutils hex num oUnit ppx_deriving ppx_deriving_yojson ppx_let ppx_sexp_conv stdint yojson menhir dune ctypes ctypes-foreign
Windowsの場合は、Dockerなどの仮想環境か、Windows Subsystem for Linux (WSL)を用いてUbuntuと同様の手順で環境を構築するのが簡単です。
WSLは、Windows 10以降であればMicrosoft Store経由で導入できます。
Opamによるセットアップが完了したら、Scillaのレポジトリからファイルをダウンロードしてmakeします。
コード4. Sciilaのビルドとテスト実行
# Scillaのビルド
$ git clone git@github.com:Zilliqa/scilla.git
$ cd scilla
$ make clean
$ make
# eval-runnerのテスト
$ ./bin/eval-runner tests/eval/exp/good/let.scilla src/stdlib
(Int32 42),
{ [a -> (Int32 42)],
[y -> (Int32 42)],
[f -> ],
[x -> (Int32 42)] }
$ ./bin/eval-runner tests/eval/exp/bad/let-error.scilla src/stdlib
Failed execution:
Identifier "oops" at tests/eval/exp/bad/let-error.scilla:4:9 is not bound in environment:
Web IDE(統合開発環境)
ScillaのWeb IDEはいくつか提供されていますが、古いIDEは動作が不安定なため、下記の2種類がおすすめです。
Scilla IDE
新しく開発中のScilla IDEは、開発用の擬似的なブロックチェーンでアカウントや残高がすでに用意されており、コントラクトのデプロイやテストがしやすいIDEとなっています(図1)。
Zilliqaテストネットのウォレット付属のIDE
Zilliqaテストネットのウォレットに付属しているコントラクトのIDEでも、Scillaの検証やテストネットへのデプロイが可能です(図2)。利用するためには、あらかじめZilliqaテストネットでアカウントを作成し、ZILトークンを入手する必要があります。
Zilliqaテストネットのトークンは、専用のフォームから配布に応募することができますが、即座にもらえるわけではありません。すぐにZILトークンを入手する方法として、Gitterなどで呼びかけて開発者から送付してもらうことも可能です。
まとめ
全3回でお送りする「Zilliqaによるセキュアでスケーラブルなスマートコントラクトの実現」。第2回目となる今回はスマートコントラクトを記述するときに必要なScilla言語の概要、開発環境について紹介しました。
次回は、Scilla言語を用いたコントラクト開発の詳細について解説します。
参考文献
- The Zilliqa Project:A Secure, Scalable Blockchain Platform
https://docs.zilliqa.com/positionpaper.pdf - Scilla: a Smart Contract Intermediate-Level LAnguage
https://arxiv.org/pdf/1801.00687.pdf - The Not-So-Short ZILLIQA Technical FAQ
https://docs.zilliqa.com/techfaq.pdf