無料でSolidityを学ぶ最良の方法(2025年版)
執筆者 Frederik B
Solidityは、スマートコントラクトをプログラミングするためのオブジェクト指向の高水準言語です。Solidityを学ぶことで、スマートコントラクトや分散型アプリケーションを作成できるようになります。
この記事では、Solidityを学ぶための一般的な方法を紹介し、Ethereum開発者になるために学ぶべき重要なSolidityの概念について解説します。
なぜSolidityを学ぶことが重要なのか
EthereumおよびEVM互換ブロックチェーン上でスマートコントラクトを記述するためのプログラミング言語であるSolidityは、ブロックチェーン開発者にとって最も重要なスキルの一つです。Ethereumや他のスマートコントラクトプラットフォームを取り巻くエコシステムの成長に伴い、Solidity開発者への需要も高まっています。
シニアSolidity開発者の平均年収は、トークンベースのエクイティやストックオプションを除いて年間120,000ドルから225,000ドルです。cryptocurrencyjobs.co によると、米国のSolidity開発者の平均基本給は127,500ドルで、最低基本給は80,000ドル、最高基本給は180,000ドルです。一方、リモート開発者の年収は111,000ドルから200,000ドルです。米国の開発者の平均給与である103,000ドルと比較すると、ブロックチェーン分野の専門知識が高い需要を持っていることがわかります。
以下は、地域別のSolidity開発者の年収構造の一覧です(米ドル):
- 北米 - $125K〜$200K
- ヨーロッパ - $80K〜$135K
- アジア - $46K〜$116K
- オセアニア - $85K〜$120K
- 南米 - $49K〜$150K
- アフリカ - $49K〜$75K
- リモート - $111K〜$200K
Solidityを学ぶことは、大きな金銭的機会をもたらすだけでなく、世界に大きな影響を与えうる素晴らしいアプリを構築することも可能にします。実際、Ethereumだけでも、金融包摂から持続可能なエネルギーまで、さまざまな目的に応える約3,000のアプリが存在します。
Solidityを学ぶ方法
オンラインコース、ブートキャンプ、チュートリアル、Hardhatなどの人気のあるSolidity開発ツールのドキュメントを読むなど、Solidityを学ぶ方法は数多くあります。
オンラインコースでSolidityを学ぶ
チュートリアルよりも構造とガイダンスを求める場合、オンラインコースはSolidityを学ぶのに適した方法です。Alchemy Universityの無料Solidity開発コースをはじめ、多くの質の高いコースが利用可能です。
チュートリアルが自分のペースで進められるのに対し、オンラインコースには設定されたレッスンや締め切りがあることが多く、学習者が計画通りに進めるための期限付きの動機付けとなります。加えて、Solidityコースには、学習の進捗を確認するためのクイズや課題が含まれていることが多くあります。
EthereumブートキャンプでSolidityを学ぶ
構造化された没入型の環境でSolidityやその他のブロックチェーン開発スキルを学びたい場合、Solidityブートキャンプが適した選択肢かもしれません。ブロックチェーンブートキャンプは、実務対応可能なブロックチェーン開発者になるための集中的かつ実践的なトレーニングを提供します。
AlchemyがChainShotを買収した後、AlchemyはChainShotの7週間・3,000ドルのEthereum開発者ブートキャンプを再設計し、Alchemy Universityのもとで無料で一般公開しています。専門的な講師のもとで、意欲的な仲間と共にSolidityを学ぶには、Alchemy UniversityのEthereumブートキャンプの順番待ちリストに登録してください。
開発全般が初めての開発者には、Ethereumブートキャンプを始める前の前提条件として、Alchemy Universityの3週間のJavaScript集中講座が適しています。
チュートリアルでSolidityを学ぶ
自主的に取り組み、自分のペースで学びたい場合、チュートリアルはSolidityを学ぶのに適した方法です。オンラインには初心者から上級者まで対応する、質の高いSolidityチュートリアルが数多く存在します。
公式のEthereum開発者向けリソースには、「Solidity」というタグが付けられた53のチュートリアルが含まれており、スマートコントラクトの基礎から、ガス最適化や安全な署名といったより高度なトピックまでカバーしています。
学ぶべき重要なSolidityの概念
学習方法を決めたら、次はSolidityでコーディングする方法を学ぶ番です。効果的なコードを書くためには、いくつかの中核となるSolidityの概念を理解しておくことが重要です。
Solidity ABI
Application Binary Interface(ABI)は、2つの異なるソフトウェアが互いにやり取りするためのルールの集合です。Solidityの文脈では、ABIによってスマートコントラクト同士、またウォレットなどの外部ソフトウェアとのやり取りが可能になります。
ABIを使うことで、ソースコードの有無にかかわらず、どのコントラクトともやり取りできるコードを書くことができます。これは、コントラクト間でやり取りされるデータをエンコード・デコードするために必要な情報が、すべてABIに含まれているために可能となっています。
スマートコントラクト
スマートコントラクトとは、Ethereumブロックチェーン上で動作し、一定の条件が満たされたときに特定のアクションを実行するコードです。スマートコントラクトは、デジタルトークンや分散型アプリケーションなどの作成に使用できます。
一般的なスマートコントラクトの使用例として、ERC20トークンの作成が挙げられ、これはわずか数行のコードで実現できます。より複雑なスマートコントラクトには、トークンスワップ、イールドファーミング、合成資産などがあります。これらのコントラクトは、Solidityコンパイラによってコンパイルされ、コントラクトのデプロイに使用されるバイトコードが出力されます。
ERC20トークン
ERC20トークンは、Ethereumブロックチェーン上で動作するデジタル資産の一種です。コモディティや法定通貨などの実世界の資産を表現するためによく使われます。
ERC20トークンは、Ethereum上で最も一般的な種類のデジタル資産です。ERC20トークンは書き方が最も簡単なコントラクトの一つでもあるため、作成方法を学ぶことは重要なスキルです。
コントラクトインターフェース
インターフェースとは、コントラクトが持つべき関数を指定する方法です。インターフェースを使うことで、簡単に再利用・拡張できるコントラクトを作成できます。例えば、トークンコントラクト用のインターフェースを作成すれば、そのインターフェースを実装するどのコントラクトもトークンとして使用できます。
継承
継承は、Solidityでコードを再利用するための方法です。継承によって、「親」コントラクトからすべてのコードを引き継ぐ「子」コントラクトを作成できます。これにより、開発者はコードの重複を避けることができ、スマートコントラクトの保守が格段に容易になります。
継承はオブジェクト指向プログラミングにおける重要な概念であり、Solidityを強力なものにしている要素の一つです。簡単に拡張・変更可能な標準化されたコントラクトを作成する方法を学ぶことは、Solidityにおいて重要な学習項目です。
関数
他のプログラミング言語と同様、関数はSolidityの重要な要素です。Solidityの関数は、入力を受け取り、何らかの処理を実行し、出力を返すコードの単位です。
関数はSolidityのスマートコントラクトに記述することで、トークンの送信からデータの保存まで、あらゆる種類のアクションを実行できます。再利用を目的とした関数の集合はライブラリと呼ばれます。
コーディングにおける基本原則の一つに「D.R.Y.原則」というものがあり、これは「Don't Repeat Yourself(繰り返しを避けよ)」を意味します。この原則は、開発者は同じコードを二度書くべきではないというものです。代わりに、開発者は関数を一度書き、そのアクションを実行する必要があるたびにその関数を呼び出すべきです。
関数の可視性
Solidityの関数について注意すべき重要な点の一つは、可視性の設定があることです。可視性は、誰がその関数を見て実行できるかを決定します。Solidityには、public、external、internal、privateの4つの可視性レベルがあります。
- public関数は誰でも見ることができ、実行できます。
- external関数は誰でも見ることができますが、他のコントラクトからのみ実行できます。
- internal関数は、同じコントラクト内の他の関数からのみ見ることができ、実行できます。
- private関数は、そのコントラクト自身からのみ見ることができ、実行できます。
call関数
_call_関数を使うと、別のコントラクト内のコードを実行できます。これがEthereum上でコントラクト同士がやり取りする方法です。
_call_関数を使うことで、ソースコードの有無にかかわらず、どのコントラクトともやり取りできるコードを書くことができます。これは、コントラクト間でやり取りされるデータをエンコード・デコードするために必要な情報が、すべてABIに含まれているために可能となっています。
delegatecall関数
_delegatecall_関数は_call_メソッドに似ていますが、一つ重要な違いがあります。それは、呼び出し元のコンテキストでコードを実行するという点です。つまり、呼び出されたコントラクトによって行われたストレージの変更は、呼び出し元のストレージに対して行われることになります。
_delegatecall_関数を使うことで、他のコントラクトから再利用できるコントラクトを書くことができます。例えば、あるインターフェースを実装したコントラクトを書けば、他のコントラクトがそのコントラクトを_delegatecall_することで、そのインターフェースを使用できます。
修飾子(Modifiers)
修飾子は関数に似ていますが、いくつかの重要な違いがあります。まず、修飾子は関数にのみ使用できます。次に、修飾子は関数が実行される前に呼び出されます。修飾子の一例がpayableで、これによって関数がコントラクトにEtherを受け取れるようになります。
修飾子を使うことで、実際のコードに手を加えることなく関数の動作を変更できます。例えば、ある修飾子を使って、関数を実行する前にユーザーが十分な残高を持っているかを確認したり、関数が呼び出されたときにトリガーされるイベントを追加したりすることができます。
配列
配列は、同じデータ型の要素を固定サイズで格納する線形データ構造で、連続した隣接するメモリ位置に格納されます。配列は固定サイズにも動的サイズにもできます。動的配列のサイズは宣言時に事前定義されませんが、固定配列は事前に定義されたサイズを持ちます。
開発者がデータのグループを(例えばループを使って)反復処理する必要がある場合は、配列を使用してください。データセットを反復処理する必要がなく、既知のキーに基づいて値を取得できる場合は、mappingの使用を検討してください。
構造体(Structs)
構造体は、Solidityのコントラクト内でデータを格納する方法です。構造体は、複数のプロパティを持つより複雑なデータ型を作成するのに役立ちます。
マッピング(Mappings)
mappingは、Solidityのコントラクト内でデータを格納する方法です。mappingは配列に似ていますが、キーは整数だけでなく任意の型を使用できます。この特徴により、mappingは汎用性が高く強力なものになっています。mappingを使うことで、柔軟かつ使いやすい形でコントラクト内にデータを格納できます。
イベント
イベントは、特定の条件が満たされたときにコードの実行をトリガーする方法です。例えば、開発者は、ユーザーがトークンを購入したときや、ブロックチェーン上でトランザクションが確認されたときにトリガーされるイベントを書くことができます。
Solidityのイベントを使うことで、開発者は実世界のイベントに応じて実行されるコードを書くことができます。これにより、多くのアプリが、条件が満たされたときにメールやSMSを送信するなどの方法で、実世界とやり取りすることが可能になっています。
require(エラーハンドリング)
"require"キーワードは、require、assert、_revert_という3つの特別な関数の一つです。requireは条件が真であるかを確認し、そうでない場合はトランザクションをロールバックし、エラーメッセージを返します。
_require_を使うことで、コントラクト内でエラーが発生するのを防ぐことができます。例えば、ユーザーが購入するのに十分な残高を持っているかを確認したり、トランザクションを送信する前にアドレスが有効かどうかを確認したりするために_require_を使用できます。
アップグレード可能なスマートコントラクト
アップグレード可能なスマートコントラクトは、コントラクトを再デプロイすることなくアップグレードできる種類のコントラクトです。アップグレード可能なスマートコントラクトを使うことで、デプロイ後にコントラクトへ変更を加えることが、ブロックチェーン上に既に存在するデータやコードに影響を与えることなく可能になります。
プロキシコントラクト
プロキシコントラクトとは、関数呼び出しを最新の実装へと振り分けるように設計された、更新可能なルーティングコントラクトです。
これにより、プロトコルは、すべてのユーザーに新しいアドレスへコードを更新させることなく、実装をアップグレードできます。プロキシを使うことで、開発者は自分の関数が見つけられる静的なアドレスを持つことができます。
プロキシコントラクトには、チームが呼び出すことで関数のルーティング先を新しい実装コントラクトのアドレスに更新できる更新関数があります。
マルチシグコントラクト
マルチシグコントラクトとは、そのコードを実行するために複数の署名を必要とするコントラクトの一種です。Solidityのマルチシグコントラクトは、トランザクションが実行される前に複数の人の承認を必要としたい場合に有用です。
マルチシグコントラクトは、一定期間内に使用できる金額を制限したい場合にも有用です。例えば、マルチシグコントラクトを使って、1,000ドルを超えるトランザクションには2つの署名を必要とするようにすることができます。
リエントランシー攻撃
リエントランシー攻撃とは、あるコントラクトが別のコントラクトを呼び出し、その後、呼び出された2つ目のコントラクトが最初のコントラクト、あるいは他の信頼できないコントラクトを呼び返す(多くの場合、最初のコントラクトの実行が完了する前に)ことで、Solidityのコントラクトにおいて発生しうる攻撃の一種です。
リエントランシー攻撃は、コントラクトの脆弱性を悪用するために使用されることがあります。例えば、攻撃者はリエントランシー攻撃を使って、コントラクトからすべてのEtherを引き出すことができます。
Solidityを学ぶ最良の方法
目標が何であれ、自分のニーズに合ったSolidityの学び方が必ずあります。手早く簡単に始めたい場合は、チュートリアルが良い選択肢です。私たちのSolidity入門記事もぜひご覧ください。より多くの構造とガイダンスを求める場合は、オンラインコースの方が適しているかもしれません。そして、没入型で実践的な経験を求める場合は、ブートキャンプが正しい選択かもしれません。
学習方法を決めたら、スマートコントラクト、関数、イベントなど、押さえておくべき重要な概念が数多くあります。これらの概念を理解することで、Solidity開発者として熟達するための道を着実に進むことができるでしょう。
関連する概要

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


