Web 以外でも期待される WebAssembly – Blockchain との親和性について

はじめに

こんにちは。Blockchain Lab の高瀬(loloicci)です。

先日 gihyo.jp にて『Webエンジニアの新しい道 ~LINE Blockchain Labが拓くブロックチェーンの世界』 で取り上げて頂いたとおり、LINE Blockchain では WebAssembly (WASM) 形式のスマートコントラクトを実行する機能を開発しています。
WebAssembly は名前の通り Web で使用することを想定して開発され始めた言語ですが、いくつかの特長から Web 以外の様々な分野からも注目を集めています。
また、Blockchain におけるスマートコントラクトも WebAssembly に注目している分野の一つです。

この記事ではブロックチェーンにおけるスマートコントラクトの紹介と、スマートコントラクト分野がなぜ WebAssembly を注目しているのかを紹介します。

多くの分野から注目される WebAssembly

WebAssembly は、JavaScript のみでは実現が困難であるような高い計算性能が必要となるウェブアプリケーションを実現することを目的として開発され始めました。例として、2019 年には 3D ゲームの Doom3 を WebAssembly に移植し、ブラウザ上でプレイ可能にしたもの (http://www.continuation-labs.com/projects/d3wasm/) が注目を集めました。

ウェブアプリで WebAssembly を利用して高効率なプログラム実行を可能にする

また、現在では、WebAssembly の様々な特長がクロスプラットフォームアプリケーション分野や、組み込みアプリケーション分野など、ウェブ以外の分野からも注目を集めています。2019 年には Docker の創設者である Solomon Hykes 氏が「2008 年に WASM+WASI 技術があれば我々が Docker を作る必要はなかっただろう」(https://twitter.com/solomonstre/status/1111004913222324225) と述べ、大きな注目を浴びました。

ブロックチェーンのスマートコントラクト分野も WebAssembly に注目する分野の一つです。

スマートコントラクトとは何か

スマートコントラクトとは、広義には契約やその履行がコンピュータとプログラムによって自動で行われる仕組みのことを言います。ブロックチェーン分野では特に、プログラムをチェーンにデプロイし、それをトランザクションから実行・利用できるようにする技術をスマートコントラクトと呼びます。トランザクションを通じたプログラムの実行の履歴やその結果は、送金などと同様にチェーンに記録されます。

スマートコントラクトを利用すると、チェーン上での (ほとんど) チューリング完全な計算が利用可能になります。これにより、チェーン上で通貨の単なる送受信や簡単なロジックでの取引を超えたアプリケーションを実装することが可能になります。スマートコントラクトを利用したアプリケーションとしては、プログラムによって管理される保険や、募った投資の使用法を投資元の意見を総合して決定する DAO (自律分散型組織) などが開発されています。

スマートコントラクトの機能を持つブロックチェーン

ブロックチェーンにスマートコントラクトの実行系を追加することは、ブラウザに WebAssembly の実行系を実装することと対応しています。このことは、後述するスマートコントラクトと WebAssembly の親和性につながっています。

スマートコントラクトの要件

スマートコントラクトの実現のために、単にチェーンにバイナリをデプロイする機能を実装しただけでは、様々な問題が発生します。これらのために様々な機能や制限を設ける必要があります。ここではスマートコントラクトの実現に際し、一般に問題となる項目を紹介します。

また、スマートコントラクトの先駆けである Ethereum では、独自の言語とその実行系である VM を開発することでこれらの要件を満たしています。

実行可能性・決定性

一般的にブロックチェーンでは、参加する全てのノードが同一のトランザクションから同様の結果を得られることを前提とした合意形成を行っています。

合意形成のために、デプロイされたバイナリは、環境に依存せずに実行することができるべきです。このため、スマートコントラクトが利用可能なチェーンでは、ノードと一緒にスマートコントラクトのための VM を指定・配布しています。

また、ネットワークでのノード同士の合意形成のためには、プログラムの実行結果が環境やランダムな要素によって左右されてはいけません。このため、プログラムの検査や仕様によって、デプロイできるプログラムを制限する必要があります。

実行効率

ブロックチェーンではトランザクションの処理・承認にかかる時間の短さが、チェーンの許容できるトランザクション量やチェーン使用者の利便性に関わってきます。合意形成の方法によっては、スマートコントラクトの実行が一番重い処理になることも十分に考えられます。そのため、スマートコントラクトの機能はその実行効率の良さが重要になってきます。

安全性

スマートコントラクトはブロックチェーンの参加者なら自由にデプロイ・実行できるように設計されていることがほとんどです。そのため、悪意のあるプログラムや致命的なバグを含むプログラムによってノードが停止したり、ノード・ネットワークが破壊されることがないように対策を行う必要があります。また、デプロイされているプログラムの内容をチェーンの参加者全員が読めること、デバッグできることが好ましいです。

スマートコントラクトの要件・課題に親和性のある WebAssembly

WebAssembly には実行速度の他にも様々な目標を持って開発されており、様々な特長があることが知られています。この中のいくつかの特長はブロックチェーンで利用する際に大きな利点となっていることから、スマートコントラクトの形式として WebAssembly を採用することが考えられています。

ここでは、https://webassembly.org/ や https://webassembly.org/docs/non-web/ , https://webassembly.org/docs/high-level-goals/ などで紹介されている利点のうち、特にブロックチェーンと親和性の高い特長を紹介します。

スマートコントラクトと親和性の高い WebAssembly の特長

Portable

様々なホスト環境で動作するという特長です。WebAssembly はウェブアプリとしての利用を前提とするため、JavaScript などと同様にホストを選ばずに実行が可能であるように設計されています。また、この特長から WebAssembly のための様々な VM が作成・考案されています。

前章で述べたとおり、スマートコントラクトは VM によって実行されることが多く、VM はノードと共に配布する必要があります。WebAssembly をスマートコントラクトの形式として採用すれば、VM や専用の言語を作成しなくて済みます。また、従来の VM 関連の toolchain を使用することも利点の一つです。

Deterministic

実行が Deterministic である (決定的・決定性がある) とは、実行環境の違いになどからプログラムの動作に違いがないことが保証されているということです。WebAssembly では、一部の機能を除いて実行が Deterministic であることが保証されています。また、使用できる演算子を制限すると、実行が完全に Deterministic であることを保証できるように設計されています。

前章で述べたとおり、ブロックチェーンで用いられる合意形成では、プログラムの実行が環境やランダムな要素によらず同様の結果となる必要があります。そのため、プログラムの実行が Deterministic であることが保証されていることは WebAssembly をスマートコントラクトとして利用する際に非常に良い性質と言えます。

Fast and Efficient

実行が早く、また十分に効率的であるという特長です。
WebAssembly では JavaScript では実現が困難である、複雑なウェブアプリを実現するためにホストのネイティブ水準での実行を目標としています。

前章で述べたとおり、プログラムの実行が高速であることはブロックチェーン・スマートコントラクトにおいても大きな利点になります。

Safe

実行に伴うホスト環境への攻撃が不可能であるという特長です。WebAssembly はサンドボックス環境で実行されるように設計されており、メモリの安全性や意図しないホストへの作用がないことが保証されています。

前章で述べた通り、ブロックチェーンではデプロイされたプログラムの実行が安全であることを保証する仕組みが必要になります。WebAssembly の設計が安全性を保証していることはこのことと非常よくマッチしており、ブロックチェーン開発においてこの性質をそのまま利用することができます。

API Usable

WebAssembly では API へのアクセス方法と権利を与えて、それをコード中で使用することができます。これは WebAssembly が JavaScript と同様に Web API を使用することを可能にする他、Web に限らず様々な場面で利用されることを想定して設計されています。また、どのような API が使われているかは WebAssembly のコードから簡単に判別できるように設計されているため、WebAssembly の機能を安全に拡張することができます。

ブロックチェーンにおいてこの性質は、署名アルゴリズムや Hash 関数などのブロックチェーンに必要な機能を API として安全に追加できる点で優れているといえます。

Open and Debuggable

バイナリを人間が読める形式のコード表現に簡単に変換することが可能であるという性質です。また、これによりバイナリのデバッグを容易にしています。

この性質はチェーン上のスマートコントラクトを検証・デバッグする際に役に立つと考えられています。

Language Independent

WebAssembly は様々な言語からコンパイルしやすいように設計されています。

WebAssembly をスマートコントラクトとして使用できるようになると、開発者がスマートコントラクト分野独自の言語を習得する必要がなく、また各言語の知見/ツールをそのまま活かせるようになります。

まとめ

WebAssembly はもともとウェブアプリケーションの開発のために考えられた言語ですが、その様々な性質がブロックチェーン・スマートコントラクトとマッチしています。そのため、WebAssembly Runtime を VM として使用し、WebAssembly 形式でのスマートコントラクトをサポートするチェーンが議論・検討され、また現れ始めています。

LINE でも LINE Blockchain Mainnet でのスマートコントラクトのサポートを予定しています。その際に VM として EVM を使用し、現行の Ethereum のスマートコントラクトとの互換性を確保することも検討しましたが、上記の特長や今後の期待を踏まえ、WebAssembly 形式のスマートコントラクトをサポートすることにしました。

そのため、現在 LINE Blockchain Lab ではブロックチェーンやスマートコントラクトだけでなく、WebAssembly / WebAssembly VM に興味のある方も募集しています。詳しくはこちらの採用ページをご覧ください。