This page may contain third-party content, which is provided for information purposes only (not representations/warranties) and should not be considered as an endorsement of its views by Gate, nor as financial or professional advice. See Disclaimer for details.
Web3開発者必修課:スマートコントラクト言語全面解析
Web3開発者の自己修養——スマートコントラクト言語
基本的な紹介
スマートコントラクトは、ブロックチェーンプラットフォーム上で実行される自動実行プロトコルであり、契約当事者が仲介者や信頼できる第三者なしで直接信頼できる取引を行うことを可能にします。これらの取引は追跡可能であり、不可逆的です。スマートコントラクトにはコード関数が含まれており、他の契約と相互作用することもできます。定義された条件が満たされると、スマートコントラクトは契約内で指定されたコード関数を自動的に実行します。
スマートコントラクトの概念は、コンピュータ科学者Nick Szaboによって1990年代に提唱されましたが、イーサリアムブロックチェーンの登場によって、スマートコントラクトが広く利用されるようになりました。イーサリアムは2015年に導入され、スマートコントラクトの展開と実行をサポートし、ビットコインが主に暗号通貨の単純な取引に使用されるのとは異なり、チューリング完全なプログラミング言語を使用してイーサリアムプラットフォーム上で分散型アプリケーションを構築できるため、第二世代のブロックチェーンと称されています。
スマートコントラクト言語は、スマートコントラクトを作成するためのプログラミング言語であり、バイトコードにコンパイルされた後、ブロックチェーンのスマートコントラクトプラットフォームの仮想マシン上で実行され、定められたロジックのコードを実現します。スマートコントラクト言語は、開発者が安全かつ効率的に契約のルールを表現できるようにし、通常、ブロックチェーンのトランザクションおよび状態を処理するためのツールや抽象の一連を提供します。
! Web3開発者のための自己啓発 – スマートコントラクト言語
スマートコントラクト言語
スマートコントラクト開発者の大多数はイーサリアムおよびEVM互換のブロックチェーン上で開発を行っていますが、ソラナは非EVM互換ブロックチェーンエコシステムの中で最も多くの開発者がいます。ムーブはブロックチェーンスマートコントラクトを安全に開発するために特別に構築されています。
他にもTON/FunC、Cardano/Plutus、ICP/Motoko、Flow/Cadence、Starknet/Cairoなど、専用のスマートコントラクト言語を持つ多くの他のパブリックチェーンがありますが、あまりにも断片化しています。
したがって、この記事ではスマートコントラクト言語をEVM系、Solana系、Move系に分類して紹介します。
EVMシステム
EVMはイーサリアムのコアであり、スマートコントラクトを実行し、取引を処理する役割を担っています。イーサリアムプロトコルは、EVM上で実行されるバイトコードを規定しており、その上に中間言語YulやYul+を構築し、中間言語の上に再びSolidty/Vyper/Feなどの高級言語を構築しています。高級言語はフロントエンドユーザー向けにスマートコントラクトの開発難易度を下げることを目的としています。多層階層の利点は、中間言語が機械語への翻訳に適しているだけでなく、全プログラムの最適化にも適しており、手動チェックや形式的検証などのチェックが容易であることです。しかし、層が増えるほど、証明可能な信頼性を保証するコストが高くなります。各層には対応する検証が必要ですが、もちろん、より低いレベルの言語はより簡単なため、検証コストは低くなります。
イーサリアムおよびEVM互換のブロックチェーン上では、開発者はさまざまな高級プログラミング言語を使用できます。現在、最も人気があり、メンテナンスが行き届いている言語はSolidityとVyperであり、さらにYul、Yul+、Fe、Huffを選択することもできます。
Solidityは、最初にEthereumのCTOであるGavin Woodによって2014年に提案され、その後、Christian Reitwiessnerが率いるEthereumチームが開発を引き継ぎました。Solidityはオブジェクト指向プログラミング言語であり、C++、Python、JavaScriptの影響を強く受けており、EVM向けに設計されています。Solidityはコードの再利用を目的としており、スマートコントラクトはクラスオブジェクトとして扱われ、多重継承を利用しています。特に、Solidityは契約と相互作用するためのアプリケーションバイナリインターフェイス(ABI)標準を定めています。現在、Solidity ABIはEVM DSLの事実上の標準と見なされています。
Vyperは、イーサリアムの創設者の一人であるVitalik Buterinのチームによって開発され、Solidityの代替選択肢として2017年にリリースされました。Vyperは、契約指向のPythonに似たプログラミング言語であり、EVMのために設計されています。Vyperは、安全性、可読性、監査能力、Gas効率に最適化されています。Vyperはオブジェクト指向モデルを採用せず、インラインアセンブリも使用できません。
Yulは、高度な制御フローと豊富な抽象を持つアセンブリ言語で、Solidityツールチェーンの一部です。Yulのほとんどの機能は、Solidityでインラインアセンブリブロックを使用して公開され、Solidityがサポートしていない機能を利用したり、ストレージ、メモリ、calldataをカスタマイズしたりすることができます。Yul+はYulの拡張であり、Yulの実験的なアップグレードと見なすことができます。
FeはRustに似た高級言語で、2021年1月に発行されました。Feはオブジェクト指向のパターンを使用せず、モジュールベースのシステムを通じてコードを再利用します。モジュール内で変数、型、関数を宣言でき、Rustに似た方法でインポートできます。
Huffは、手動スタック制御とEVM命令セットへの最小限の抽象を持つアセンブリ言語です。「#include」命令を使用することで、コンパイル時に含まれているHuffファイルを解析し、コードの再利用を実現できます。
イーサリアム上では、Solidityに基づいて開発されたスマートコントラクトが圧倒的多数を占めており、約90%で、2位のVyperの10倍です。一方で、Feeは始まったばかりで、開発者が使うことはほとんどありません。YulとYul+は通常、Solidityのインラインアセンブリブロックとして使用され、EVM命令セットへの低レベルのアクセスを可能にし、通常はGasの最適化に使用されます。HuffはYul/Yul+よりもさらに低レベルで、スタックを手動で操作したりEVM命令を呼び出したりでき、通常はGasの極限最適化に使用されます。
! [Web3開発者のための自己啓発 – スマートコントラクト言語](https://img-cdn.gateio.im/webp-social/moments-9ff15a82725b58c6fc8cc0612174c101.webp0192837465674839201
)ソラナデパートメント
SolanaはそのPoH(Proof of History)メカニズムと低遅延・高スループットで知られており、最も著名な「イーサリアムキラー」の一つです。Solanaは過去1年間で時価総額とエコシステムの発展が最も速いパブリックチェーンの一つであり、その開発者コミュニティの顕著な成長を促進しました。
Solanaはスマートコントラクトをチェーン上のプログラム(Program)と呼び、主にRust言語で作成されていますが、他のRust言語を使用するパブリックチェーンとは異なり、SolanaはWASMランタイムを使用していません。Solanaには独自の仮想マシンSVMとバイトコードSBFがあります。
SVMはSolanaネットワーク上でスマートコントラクトを実行し、取引を処理するランタイムであり、重要なコンポーネントはSealevelです。Sealevelは、複数のスマートコントラクトが同時に実行されてもお互いのパフォーマンスに影響を与えないようにすることで、Solanaランタイムにおける並行処理を実現します。Solanaのスマートコントラクトは、ランタイムでどの状態(アカウント)を読み取るかまたは書き込むかを指定しており、これにより競合のない取引が並行して実行され、データの一貫性が保証されます。
SBFはeBPFに基づいており、その前身はBPF(Berkeley Packet Filter、バークレー・パケット・フィルター)で、元々はネットワークデータパケットの効率的なフィルタリングに使用されていました。eBPFはより豊富な命令セットを提供し、ソースコードを変更することなくオペレーティングシステムのカーネルに動的に介入し、その動作を変更することを可能にします。高性能、安全性、可搬性を兼ね備えています。SBFはeBPFに対してカスタムバリデーターを使用しており、プログラムが一定の命令数内で終了する必要があること(有名な停滞問題)を検証するだけでなく、命令が正しいかどうか、および越境ジャンプがあるかどうかもチェックします。バリデーターの他に、スマートコントラクトのコンパイルにとって問題があるeBPFの詳細も解決しています。
LLVM(Low Level Virtual Machine)は、現代のコンパイラアーキテクチャとツールチェーンです。コンパイラはRustを中間言語LLVM IRに翻訳し、その後LLVM IRを利用してバックエンドがターゲットプラットフォームのeBPFに翻訳します。理論的には、LLVM IRにコンパイルをサポートするプログラミング言語であれば、Solanaのスマートコントラクトを作成できますが、実際にはSolana LabsはRustとeBPF LLVMバックエンドに対していくつかの変更を行っており、その中には本質的に上流(RustとLLVM)で利用できないものもあります。Solanaのコントラクト開発は現在RustとSolangのみに対応しています。
RustはMozillaが主導して開発し、2011年にリリースされ、文法はC++に似ている、性能と安全性、特に安全性のために設計された汎用の静的コンパイル型言語であり、スマートコントラクトプログラムに限定されていません。Solidityと比較すると、Rustは低レベルの多様なプログラミング言語であり、高い性能とメモリ安全性を持っています。Rust公式のコンパイラはrustcで、rustcはRustソースコードを字句解析、構文解析、意味解析を行い、最終的にコードをLLVM IRにコンパイルします。
SolangはHyperlege Labsによって開発され、2023年にリリースされました。これはSolanaとPolkadotのLLVMアーキテクチャに基づくSolidityのコンパイラであり、Solidityを使用してスマートコントラクトを書くことをサポートしますが、実際の構文はSolanaとPolkadotのアーキテクチャに合わせていくつかの変更が加えられています。Solangの目的は、開発者がSolanaまたはPolkadotに移行する際の簡素化を図り、Solidityの開発範囲を拡大することです。
RustはSolanaの公式に主要なサポート言語であり、安定性が高いです;Solangの主な利点はSolidity言語との互換性にあります。
! [Web3開発者のための自己啓発 – スマートコントラクト言語]###https://img-cdn.gateio.im/webp-social/moments-fbaf6d4bc14a478dc8382c66d8ed82f0.webp(
)ムーブシステム
Moveは新しいスマートコントラクトプログラミング言語で、2019年に発表され、最初はMetaのDiemブロックチェーンプロジェクトのために開発されました。Moveは資産と取引における安全性の問題を解決することを目的としており、資産と取引が厳密に定義され、制御されるように設計されています。その言語の特徴は:
一等リソースタイプの保護(Frist Class Resources):一等リソースタイプはまず変数タイプであり、その後このタイプの変数を規定します:コピーできない;暗黙的に破棄できない;異なるプログラムアドレスでのみ「Move」できる;
柔軟性:Moveバイトコードは直接実行でき、他の公開されたModulesコードを呼び出すこともでき、1つの取引で複数のプログラムを呼び出すことができ、1回の取引で複数の人に送金することを柔軟に実現できます;
安全性、検証可能性:Moveコーディングシステムはリソースに対して特化したセキュリティ保護を提供します。Moveリソースはコピーできず、再利用や破棄もできません。リソースタイプは、そのタイプを定義するモジュールによってのみ作成または破棄できます。Move仮想マシンは静的バイトコードの検証を行い、バイトコード検証に合格しなかったプログラムの実行を拒否することで、その安全性を確保します。
Diemプロジェクトが解散した後、その創設チームが立ち上げたAptosとSuiも、Moveをコアスマートコントラクト言語として採用しました。AptosはDiem Move(Core Move)を継承し、Suiは独自のカスタマイズ版であるSui Moveを使用してスマートコントラクトを作成します。
Moveにおいて、各スマートコントラクトはモジュールであり、関数と構造定義から構成されています。構造は関数内でインスタンス化され、関数呼び出しを通じて他のモジュールに渡すことができます。Sui MoveはCore Moveに比べて、オブジェクトベースのデータモデルを採用しています。Suiには、所有者オブジェクト、共有オブジェクト、不変オブジェクトの3種類の異なるオブジェクトがあります。Suiの並行化戦略はSolanaに似ており、取引はどのオブジェクトを操作するかを指定する必要があります。この設計により、Suiは従来のブロックチェーンに必要なグローバルソートなしで並行処理能力を効率的に処理できます。
Moveのコンパイラ、バリデータ、そして仮想マシンはすべてゼロから設計されています。その中でバリデータはMoveの核心的なセキュリティメカニズムの一つであり、Moveのリソース中心のプログラミングモデルを維持するために使用されます。Moveのバリデータは静的分析ツールであり、Moveバイトコードを分析し、必要なタイプ、メモリ、リソースのセキュリティルールを遵守しているかどうかを判断します。チェーンにアップロードされるすべてのモジュールはバリデータを通過する必要があります。
Solidityなどの言語と比べて、Moveは形式的検証に優しい言語であり、動的ディスパッチなどの特性をサポートしていません。すべてのコントラクトパスはコンパイル時に決定され、コントラクト実行時に実行する必要がある関数を決定する必要がないため、十分に分析と検証を行うことができます。
Moveには、スマートコントラクト用の形式化検証ツール、Move Proverがあります。開発者はスマートコントラクトに対して検証条件(アサーションの形式で)を書く必要があり、Move Proverはバックグラウンドでこれらの検証条件をSMT式に変換し、その後SMTソルバーを使用してチェックを行います。
! [Web3開発者のための自己啓発 – スマートコントラクト言語]###https://img-cdn.gateio.im/webp-social/moments-cc606f60dc614e51c03a3099ed233217.webp0192837465674839201
スマートコントラクト開発ツール
Web3に入門したい、あるいはEthereumや他のEVM互換ブロックチェーンの契約開発を学びたい開発者にとって、Solidityは最適な選択です。また、Solidityの人気により、開発ツールもより成熟しており、代表的なものには以下があります:
Hardhatは、Ethereumアプリケーションのコンパイル、デプロイ、テスト、およびデバッグを行う開発環境です。開発者がスマートコントラクトやDAppsの構築プロセスに固有の反復タスクを管理および自動化するのを助け、このワークフローの周りにさらに多くの機能を簡単に導入することができます;
OpenZeppelinは、安全なスマートコントラクトを構築するための、Solidityで書かれたオープンソースのOpenZeppelin Contractsを提供します。 OpenZeppelin Contractsは、