スマートコントラクト・プログラミング言語の新星「Move」
MoveはスタックベースのWeb3プログラミング言語で、カスタムリソースタイプを定義することで、Solidityなどの先行製品の弱点を補いつつ、柔軟性を高めます。
はじめに
2022年1月、Silvergate銀行は、Meta社のDiemブロックチェーンIPに2億ドル近くを支払うことを発表しました。Diem(旧Libra)は、ブロックチェーンプロジェクト向けのスマートコントラクト言語としてMoveの作成から開始したため、開発期間が大方の予想より長くかかったとされています。
プログラミング言語としての歴史は浅いですが、現在ではDiem以外にもAptosやSuiといったブロックチェーンなど、いくつかのプロジェクトがMove言語を使って開発を進めています。急速に需要と人気が高まっていることから、Moveでコードを書くことが開発者にとってどのような意味を持つのかについて理解を深めることが必要となります。
この記事では、Moveの特徴、仮想マシン(VM)としての用途、スマートコントラクトプロトコルの展開にMoveの利用が広まると予想される理由をまとめます。
Move言語とは?
まず、Moveはスタックベースの言語であり、基本的には計算の実行に伴ってスタック操作をpush、popさせることで動作します。その実行モデルでは、アカウントは0個以上のモジュールと1個以上のリソースタイプを持つことになっており、特定のリソースタイプ内では1つのリソースしか持つことができません。必要であれば、同じタイプの複数のリソースインスタンスを含むカスタムリソースタイプを作成することが可能です。このリソースタイプのカスタマイズが、Moveが開発者のスキルセットとして急速に普及した主な理由の1つです。
Diemのホワイトペーパーによると、Moveの実行形式は「アセンブリよりも高レベルで、ソース言語よりも低レベルのバイトコードであり、バイトコードは、バイトコードベリファイアによってリソース、型、メモリの安全性をオンチェーンでチェックされ、バイトコードインタープリタによって直接実行される。」とされています。また、Moveは、トランザクションにコンパイルのコストをかけずに安全性を最大化し、既存のネットワークと比べ、トランザクション手数料を最小化するような設計がなされています。
Moveには多くの組み込み関数が用意されており、開発者はリソースの値を参照したり、リソースを破壊したりすることも可能です。ただし、ビルトインは現在のモジュールで宣言されたリソースに対してのみ使用できます。つまり、開発者がビルトインを使用してリソース値を参照する手続きを宣言し忘れた場合、その後そのリソースの閲覧や変更ができなくなるという点に注意です。
以下に、Move言語の主要な構成要素を示します:
Primitive Types
- ブーリアン
- アドレス (256ビット)
- 符号なし整数 (64ビット)
- 固定サイズバイト配列
Struct
- 種類(リソース)
- 無制限(ジェネラルストラクチャ)
Procedures
非環状モジュール依存によるリエントランシー攻撃の緩和
- パブリック
- 内部
Bytecode Verifier
モジュール実行前にコード安全性の特性をチェック
プログラムは段階的にデプロイされる前に検証を通過
- 制御グラフの構築
- スタックバランスチェック(操作後にスタックサイズが変更されていないことを確認)
- タイプチェック
- カインド/リソースチェック
- リファレンスチェック及びグローバルステートとのリンク
Bytecode Interpreter
スマートコントラクトは、ガス料金のパラメータで測定
- リエントランシー攻撃やその他の無限ループの実行を緩和
Moveには安全機能が組み込まれており、モジュールの実行前にバイトコードが安全であることを検証します。ネイティブな形式検証はMove言語の特徴であり、基本的なレベルから確立された安全性を保証しています。
Move仮想マシン(MVM)
ブロックは複数のトランザクションを含み、トランザクションが実行されることでトランザクション効果を生み出します。
モジュール間の呼び出しはバイトコードベリファイアによるチェックを経て管理されます。
- モジュールはオンチェーン相互作用に対してのみ課金されるため、検証の低コスト化が可能
グローバルステートの更新を生成します。
- 効果と状態遷移の分離を実現
Move言語はカスタムリソース型を定義する
Moveは他のスマートコントラクト向けのプログラミング言語と異なり、線形論理から派生したリソースを使用します。線形論理の数式は、一度だけ使用できる基本的なリソースとして扱われます。Move言語では、リソースはコピーされたり捨てられたりすることはなく、プログラムの格納場所間で移動されます。言い換えれば、コードに「気密性」の要素があり、カスタム「ファーストクラス」リソースタイプによって本質的により安全がもたらされる仕組みです。
これはMoveの静的システムによって実現されており、作成された変数は特定の型として定義される必要があります。Moveでは、実行前にコードがコンパイルされ、このシステムがリソースのファーストクラス性を保護し、失敗したプログラムの配信を防ぎます。また、Moveのリソースは、他の保護されていない要素と同様に、データ構造に格納されたり、プロシージャの引数として渡されたりして使用されます。
基本的にMoveのリソースは、表現力とセキュリティ保証の両面で優位性を持っています。リソースはコード内で保護されつつも、あらゆる操作に自由に利用できるため、Move言語はブロックチェーンのトリレンマである「セキュリティ」と「スケーラビリティ」の2つの側面から取り組むことを目的としています。
Web3言語の発展形としてのMove
前述の通り、Diemのエンジニアリングチームは、既存のブロックチェーン言語、特にビットコインのScriptやイーサリアムのSolidityに問題を見出しており、多くの問題点を指摘しています。まず、他のプログラミング言語は要素を整数で表現することが多く、プログラムエラーが発生しやすいため、Move言語の設計者はデジタル資産を代わりにファーストクラスのリソースとして表現することにしました。これにより、Move言語を使用して作成されたデジタル資産の希少性を守る、言語レベルでの強固な基盤が提供されます。
デジタル資産そのものは別として、Move言語は他の要素やアクセスレベルを簡単にカスタマイズすることができます。つまり、アクセス制御が言語自体に組み込まれているということです。Moveで書かれた資産はデフォルトでより洗練されたものとなり、開発者が作業しやすい機能を備えます。リソースとモジュールの使用に関するMoveのカスタマイズ性は、同種のスマートコントラクト言語よりもスケーラブルであることは間違いありませんが、それは明確に判明しているわけではありません。
Move言語のデメリット
Move言語は、高いセキュリティ保証と引き換えに、スピードとパフォーマンスのトレードオフを行っています。つまり、Moveのコードは実行時に評価されるため、Solidityや他の言語で起こりうるコンパイラのバグに悩まされることはないはずです。
その他の潜在的なデメリットは以下の通りです:
- Moveのコードは、他のブロックチェーンに簡単に移植することはできないため、サードパーティツールの開発が必要
- 歴史が浅いためSolidityなどの言語と比較して、リソースやコードライブラリが少ない
- 同様に、情報、研究レポート、開発者トレーニングなどの材料も少ない
- 新言語であることから、欠点が発見されていない可能性がある
数年経って、他の言語と同じように試行錯誤が繰り返されるにつれて、Web3開発者の間で普及し、実績とともに人気を博すようになるでしょう。Moveは既に多くの可能性を示しており、多くの開発者がMoveの使用を考え始めています。今後、Moveに関する多くのコンテンツを目にする機会が増えていくでしょう。
Supra Oraclesは、今後も継続的に暗号/ブロックチェーン分野に関する教育材料を提供していきます。この分野は特定のプロジェクトのみが生き残る世界ではなく、分野全体の成長が必須となります。また、理解もせずにトークンのみを追うというのは非常にナンセンスです。
Supra Oraclesはオラクルソリューションという枠を超えて発展し続けていきますので、今後のSupra Oraclesにご期待ください。
Supra Oraclesについて