Zilliqaによるセキュアでスケーラブルなコントラクトの実現 第2回Scilla言語の概要

Zilliqaによるセキュアでスケーラブルなコントラクトの実現 第2回Scilla言語の概要

はじめに


本記事は、過去にコンセンサス・ベイスが主宰していたオンラインサロンの記事です。記事は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)。

図1. Scilla IDEの動作画面

Zilliqaテストネットのウォレット付属のIDE


Zilliqaテストネットのウォレットに付属しているコントラクトのIDEでも、Scillaの検証やテストネットへのデプロイが可能です(図2)。利用するためには、あらかじめZilliqaテストネットでアカウントを作成し、ZILトークンを入手する必要があります。

Zilliqaテストネットのトークンは、専用のフォームから配布に応募することができますが、即座にもらえるわけではありません。すぐにZILトークンを入手する方法として、Gitterなどで呼びかけて開発者から送付してもらうことも可能です。

図2. Zilliqaテストネットのウォレット付属のIDE

まとめ


全3回でお送りする「Zilliqaによるセキュアでスケーラブルなスマートコントラクトの実現」。第2回目となる今回はスマートコントラクトを記述するときに必要なScilla言語の概要、開発環境について紹介しました。

次回は、Scilla言語を用いたコントラクト開発の詳細について解説します。

参考文献

     

免責事項

本記事に掲載されている記事の内容につきましては、正しい情報を提供することに務めてはおりますが、提供している記事の内容及び参考資料からいかなる損失や損害などの被害が発生したとしても、弊社では責任を負いかねます。実施される際には、法律事務所にご相談ください。

技術・サービス・実装方法等のレビュー、その他解説・分析・意見につきましてはblock-chani.jp運営者の個人的見解です。正確性・正当性を保証するものではありません。本記事掲載の記事内容のご利用は読者様個人の判断により自己責任でお願いいたします。

     

コンセンサス・ベイス(株)とブロックチェーン事業を行なってみませんか?

当サイトを運営するコンセンサス・ベイス株式会社は、2015年設立の国内で最も古いブロックチェーン専門企業です。これまでに、大手企業の顧客を中心に、日本トップクラスのブロックチェーンの開発・コンサルティング実績があります。

ブロックチェーンに関わるビジネスコンサル・システム開発・教育・講演などご希望でしたら、お気軽にお問い合わせください。

     
     

ブロックチェーン学習に最適の書籍の紹介

図解即戦力 ブロックチェーンのしくみと開発がこれ1冊でしっかりわかる教科書

ブロックチェーン イーサリアムへの入り口 第二版 (ブロックチェーン技術書籍)

本書は、ブロックチェーン技術に興味を持ったエンジニアや、その仕組みを学び、自分の仕事に活かしたいビジネスパーソンを対象にして、ブロックチェーンのコア技術とネットワーク維持の仕組みを平易な言葉で解説しています。この本を読んだうえで、実際にコードを書くような専門書、ブロックチェーンビジネスの解説書を読むことで、理解度が飛躍的に高まるでしょう。(はじめにより)

Blockchainカテゴリの最新記事