Solidity vs. Vyper:知っておくべきこと
執筆者 Alchemy
appsの根底にあるのは、スマートコントラクトの継続的な実行です。もともとはコンピュータ科学者で暗号学者のNick Szaboによって提唱されたもので、スマートコントラクトとは、ブロックチェーン上のアカウントの振る舞いを制御する、プログラム可能なコードとデータのことです。スマートコントラクトのコードはブロックチェーン上に存在し、Ethereumのブロックチェーンの状態を変化させるメカニズムの1つです。
スマートコントラクトは、Ethereum上のプログラムを可能にしている重要な要素です。Vitalik Buterinのオリジナルのホワイトペーパーでは、Ethereumは「次世代のスマートコントラクト…プラットフォーム」と説明されています。スマートコントラクトは一般的に資産の移転を実行するようにプログラムされますが、その用途はそれよりはるかに広く、トークンの発行、アプリやDeFiプロダクトの構築、NFTの取引なども含まれます。
スマートコントラクトを書くためのプログラミング言語はいくつも存在し、どの言語を選ぶかはユースケース次第です。それぞれのweb3言語は異なるニーズ、利点、トレードオフに合わせて最適化されているためです。
まず、開発者は高水準言語か低水準言語かを選択します。高水準言語は実装の細かい詳細を抽象化するため、開発者はバイトコードを理解していなくてもスマートコントラクトを容易に作成できます。
EthereumおよびEthereum Virtual Machine(EVM)互換のブロックチェーンで使われている高水準言語の代表例が、SolidityとVyperです。
Solidityとは
Solidityは、Ethereum Virtual Machine上でスマートコントラクトを書くための高水準でチューリング完全なプログラミング言語であり、分散型金融(DeFi)、NFT、ウォレットなど幅広いユースケースに対応しています。
Solidityは構文にC++とJavaScriptの強い影響が見られ、Pythonと同じ多重継承アルゴリズムを使用しています。最もよく知られているのはEthereumとの関連ですが、SolidityはPolkadotやAvalancheなど複数のブロックチェーンプラットフォーム上でも動作します。
Ethereum CTOのGavin Woodによって提案されたSolidityは、柔軟なスマートコントラクトベースの開発者向けプラットフォームへの需要に応えるために開発されました。Solidityを使うことで、開発者は多様なユースケース向けにスマートコントラクトを書くことができ、今日Ethereum上で稼働している活気ある分散型アプリケーションのエコシステムを生み出しています。
Vyperとは
VyperはSolidityに似た高水準プログラミング言語で、EVM互換ブロックチェーンで使われるスマートコントラクトのセキュリティを高めることを目的として設計されています。
Pythonライクな構文を用いている(そのため蛇を意味する名前がついている)Vyperのコードは可読性を重視しており、開発者はコントラクトをデプロイする前にコード内のバグや脆弱性を容易に検出できます。
スマートコントラクトのセキュリティをさらに高めるため、Vyperは強い型付けと計算可能な決定可能性(decidability)を採用しています。Vyperで宣言される各変数には明示的な型を与える必要があり、コントラクトの決定可能性により、開発者はコントラクトのデプロイ前にガス消費量の上限を計算できます。
SolidityとVyperの比較
SolidityとVyperはどちらもEVM互換のスマートコントラクトの作成に使用できますが、この2つのweb3コーディング言語には独自の設計思想があるため、dApp開発にどちらが最適なプログラミング言語かを決める際には利点とトレードオフが存在します。
この違いをより理解するために、まずSolidityとVyperが重なり合う部分を見てみましょう。
SolidityとVyperの共通点は何か
どちらも高水準言語であり、SolidityとVyperのコンパイラはコードをEVMが実行可能なシステムレベルのバイトコードに変換します。つまり、デプロイ後、SolidityとVyperのスマートコントラクトは同じバイトコード言語で実行されるということです。その結果、SolidityとVyperのコントラクトは同一のアプリケーション内で併用できます。
VyperとSolidityのスマートコントラクトの構造にはいくつかの共通点があります。
- バージョンプラグマ - 各スマートコントラクトに対して意図されたコンパイラのバージョン、またはバージョンの範囲
- 状態変数 - スマートコントラクトのストレージに永続的に保存される値
- 構造体(Structs) - 複数の変数を1つの型にまとめるためにカスタム定義できる
- 関数(Functions) - コントラクトの内外で状態変化を行うことができる実行可能なコード行
- イベント - EVMを通じてアクションをログとして記録し、発行後に効率的に検索できる
- オーバーフローチェック - 配列アクセスや算術演算をチェックすることでデータ型の意図しないオーバーフローを防ぎ、変数のストレージの安全性を確保する
スマートコントラクトのコア構造の大部分は、SolidityとVyperのスマートコントラクトで共有されています。しかし、SolidityとVyperはどちらも、web3開発者がスマートコントラクトを書くための方法が大きく異なります。
SolidityとVyperはどう違うのか
VyperとSolidityの決定的な違いは、Vyperがセキュリティを設計思想の根幹に据えていることに起因します。これには決定可能性(decidability)や、修飾子(modifiers)、継承、インラインアセンブリ、関数のオーバーロード、再帰呼び出しをサポートしないことが含まれます。
Vyperは、Solidityに比べてこの追加のセキュリティを実現するために、機能を追加すると同時にSolidityのリスクの高いいくつかの性質を省いています。
1. 決定可能性(Decidability)
決定可能性により、開発者は各コントラクトのガス消費量の上限を計算でき、ガスリミット攻撃から保護されます。ガスリミット攻撃は、サービス拒否(DoS)攻撃の一種で、悪意のある攻撃者がコントラクトを通じてトランザクションを送信し、ブロックのガスリミットを超過させることで、他のすべてのトランザクションを失敗またはリバートさせるものです。
2. 修飾子(Modifiers)
Solidityでは、関数定義の前に修飾子を付けることができ、修飾子はコードの別の場所で定義することができ、スマートコントラクトの実行前後にチェックを行ったり、状態変化を起こしたりすることができます。
修飾子の性質上、誤解を招くコードを書くのは容易であり、一見無害に見える関数修飾子が実は脆弱性を生む処理を行っている、ということが起こり得ます。Vyperは可読性と危険なコードの検出を向上させるために、修飾子をサポートしていません。
3. クラス継承
クラス継承を使ったコードを読むには、コントラクトの動作を理解するために複数の異なるコードファイルを読み通す必要があります。さらに、Solidityは多重継承を許可しているため、読み手は競合がどう解決されるかを知るために優先順位のルールを理解する必要があります。
同じ名前を持つ複数の関数が継承されている場合、コントラクトが実際に使用するのはどれでしょうか。
Vyperは継承を許可しないため、監査すべきファイル数が少なくなり、コードの監査が容易になります。
4. インラインアセンブリ
Vyperからインラインアセンブリの仕組み(Solidityコードを機械語に変換する機能)を除外することで、変数名をコード内で検索すれば、その変数が読み取られたり変更されたりしている箇所をすべて確認できます。
5. 関数のオーバーロード
Solidityで関数をオーバーロードできることは、有害なコードを隠すことを可能にしてしまうため、Vyperではサポートされていません。例えば、関数\{sendToken(address)\}は安全である一方、\{sendToken(address, “Hello!”)\}はウォレットの資産を抜き取る、ということがあり得ます。
関数のオーバーロードを省くことで、Vyperはどの関数がいつ呼び出されているのかを正確に理解しやすくしています。
6. 再帰呼び出しと無限長ループ
再帰呼び出しと無限長ループは、ガスリミットの上限を計算することを不可能にします。これはVyperの決定可能性という特徴と相反するため、Vyperでは再帰呼び出しがサポートされていません。
SolidityよりVyperを使う利点は何か
Vyperの6つの主な違いにより、Solidityと比較してVyperには2つの明確な利点があります。セキュリティと監査可能性です。
1. セキュリティ
数多くの安全機能により、Vyperは開発者がバグや悪用可能な攻撃対象を見逃したまま脆弱なコードを書いてしまうことを防ぎます。
2. 監査可能性
Vyperのコードは、スマートコントラクトのセキュリティ監査者がスマートコントラクトの動作を正確に読み解くのを容易にします。つまり、あなたのスマートコントラクトを読むすべての関係者が、ブロックチェーン上で資産がどのように操作されるかを素早く把握できるということです。
最後に、Vyperを学ぶ過程で身につくその可読性は、他のアプリの既存のスマートコントラクトを読む作業を楽にしてくれます。
SolidityよりVyperを使うトレードオフは何か
Vyperでは、Solidityでできることは何でもできるように見えますが、追加のセキュリティ保護が加わっている分、SolidityではなくVyperを選ぶことには2つの主なトレードオフが伴います。柔軟性とコミュニティです。
1. 柔軟性
Vyperのドキュメントには、VyperはSolidityの完全な代替となることを意図していないと記載されています。Solidityではできることでも、Vyperでコーディングする際には明示的に禁止されていることがあるためです。したがって、SolidityではなくVyperを選ぶことは、スマートコントラクトの柔軟性を犠牲にし、応用範囲を制限することになります。
2. 開発者コミュニティ
数の上では、SolidityはVyperよりもはるかに人気のあるweb3プログラミング言語です。GitHubでVyperで書かれたすべてのファイル(.vy)とSolidityで書かれたすべてのファイル(.sol)を簡単に検索してみると、それぞれの言語を使用している開発者の数を把握することができます。本稿執筆時点で、Vyperで書かれたファイルは約10,300件だったのに対し、GitHub上のSolidityファイルは830万件でした。
その結果、Vyperでコーディングする人向けのガイドやリソースは少なくなっています。公式ガイド以外では、Vyperで開発する際に直面する困難について議論しているコミュニティを見つけるのは難しいでしょう。
SolidityとVyper - どちらの言語を選ぶべきか
VyperとSolidityには互換性があるため、どちらか一方の言語を選ぶという二者択一の話ではありませんが、より基本的で柔軟性が求められるスマートコントラクトはSolidityで書くべきであり、確固たるセキュリティ保証が必要なアプリケーションにはVyperを選ぶべきです。
どちらの言語もそれぞれ異なるユースケースを持っているため、一方が明確にもう一方より優れているというわけではありません。柔軟性の欠如と開発者コミュニティの層の薄さから、Vyperは最高レベルのセキュリティが必要な用途に最適であり、web3開発を始めたばかりの開発者はまずSolidityを学ぶべきです。
SolidityとVyperの学習を始めるには
Vyperの開発者コミュニティはそれほど盤石ではありませんが、この2つのプログラミング言語を学ぶための、公式・非公式を問わず豊富で有用なリソースが存在します。以下のリソースはSolidity開発者になるための助けとなります。
Solidity学習リソース
Solidityを学ぶ最良の方法は、Solidityブートキャンプに参加することです。ChainShot出身のweb3エンジニアたちによる優秀なチームが率いるAlchemy UniversityのEthereum Developer Bootcampは、現在利用できる中で最も包括的な7週間のオンラインSolidityコースです。AlchemyによるChainShotの最近の買収に伴い、AlchemyはChainShotの3,000ドルのブートキャンプを完全無料で提供しています。
今すぐAlchemy UniversityのEthereum developer bootcampに申し込んで、Ethereumアプリの開発方法を学びましょう。
ブートキャンプ以外にも、Solidityを学ぶ方法はいくつかあります。
- 公式ドキュメント - Solidityのドキュメントは、型からスマートコントラクト、コンパイラに至るまであらゆる内容を詳しく説明しています
- Solidity by Example - わかりやすい解説付きのSolidityコード例集
- Clean Contracts - 安全で予測可能なSolidityスマートコントラクトの書き方を学べます
- Ethernaut by OpenZeppelin - このスマートコントラクトベースのウォーゲームでスマートコントラクトをハックしてみましょう
開発全般が初めての方にとっては、Alchemyの3週間のJavaScriptクラッシュコースは、Ethereumブートキャンプを始める前の前提知識として良い選択です。
Vyper学習リソース
ブートキャンプでSolidityを学び終えたら、Vyperを学ぶ最良の方法は、公式ドキュメントを読み、チュートリアルを作り、GitHub上の.vyファイルを調べることです。
まとめ
ほとんどの開発者にとって、Solidityは自分たちのスマートコントラクトのニーズを満たすのに十分な能力を持っていますが、極めて高いレベルのセキュリティを必要とする場合には、Vyperは優れた選択肢です。VyperとSolidityは、どちらもEthereumブロックチェーン上での構築の可能性を最大限に引き出すためのツールであり、明確な優劣はありません。VyperとSolidityは互いを補い合う、Ethereum開発者にとって習得必須の2つのプログラミング言語です。
関連する概要

ブロックチェーンで魔法を生み出す
Alchemyは、最も強力なweb3開発者向けプロダクトとツールを、豊富なリソース、コミュニティ、そして卓越したサポートと組み合わせて提供します。


