---
title: "Solidityとは?"
description: "Solidity入門:Web3で最も普及しているプログラミング言語"
---

# Solidityとは?

web3業界の成長に伴い、開発者は[web3プログラミング言語](https://www.alchemy.com/overviews/web3-programming-languages)の選択肢が増えています。各言語はスマートコントラクトを書く上で異なるメリットとトレードオフを持つよう設計されています。言語によって、特定のブロックチェーンをサポートしていたり、速度、読みやすさ、セキュリティといった特性が異なったりします。

Ethereumブロックチェーン向けのスマートコントラクト言語として開発された[Solidity](https://www.alchemy.com/dapps/solidity)は、ブロックチェーン業界最大の開発者エコシステム向けに[分散型アプリケーション](https://www.alchemy.com/dapps/top/defi-dapps)を作成するために使われる強力なプログラミング言語です。

この記事では、Solidityの歴史、言語的影響、用途を通じてSolidityの入門を提供します。最後に、[無料のSolidityコース](https://www.alchemy.com/university/courses/solidity)や[web3開発を学ぶためのリソース](https://www.alchemy.com/overviews/learn-solidity)を通じて学習を続けるための、最良の開発者向けリソースをいくつか紹介します。

## **Solidityとは何か？**

**2014年に提案されたSolidityは、[Ethereum Virtual Machine（EVM）](https://www.alchemy.com/overviews/what-is-the-ethereum-virtual-machine-evm)上で動作するスマートコントラクトを実装するためのオブジェクト指向の高水準プログラミング言語です。** SolidityはC++やJavaScriptといったよく知られたプログラミング言語から着想を得ています。web3開発者にとって、Solidityを扱うことは[web3開発](https://www.alchemy.com/overviews/how-to-learn-web3-development)を学ぶ上で有益です。

このセクションでは、Solidityの歴史を紹介し、Solidityと他のプログラミング言語との類似点を示し、Solidityの主な用途を説明します。

### **Solidityを作ったのは誰か？**

**2014年、EthereumのCTOであるGavin Woodは、スマートコントラクトを書くためのチューリング完全なプログラミング言語というEthereumのニーズを満たす言語としてSolidityを考案しました。**

Ethereumの創設者である**Vitalik Buterin**は、Bitcoinが切り開いたブロックチェーンの機能を拡張し、[スマートコントラクトの機能](https://www.alchemy.com/overviews/solidity-smart-contract)を加えたプロトコルとしてEthereumを提案しました。彼のビジョンでは、Ethereumはスマートコントラクトの精巧なネットワークを実行できるようになるはずでした。スマートコントラクトとは、分散されたグローバルなコンピュータネットワーク上で実行される、条件付きで実行されるコードの断片です。スマートコントラクトにより、開発者は新しい暗号通貨を作成したり、DeFiアプリを構築したりすることが可能になります。

Solidityプロジェクトチームは**Christian Reitwiessner**が率い、スマートコントラクトを実装するためのチューリング完全なオブジェクト指向プログラミング言語の作成に成功しました。高水準言語であるということは、開発者が計算を行うためにメモリやバイトコードといったシステムレベルの情報を操作することなくスマートコントラクトを作成できることを意味します。

チューリング完全性とは、データ操作システム（この場合はプログラミング言語）がチューリングマシンの挙動をシミュレートできる能力を指します。理論上、Solidityは開発者が必要とするあらゆる計算を実行できる必要がありました。

### **Solidityはどのプログラミング言語をベースにしているか？**

Solidityは開発の過程で、C++、Python、JavaScriptを含む複数の既存プログラミング言語から影響を受け、それらをベースにしています。

#### **SolidityとC++の類似点**

Solidityは変数宣言やforループにおいてC++と同一の構文を使用します。加えて、2つの関数が同じ名前を持ちながら受け取るパラメータが異なる場合に必要となる、C++スタイルの[関数オーバーロード](https://www.alchemy.com/overviews/solidity-functions)のサポートもあります。

さらに、Solidityは暗黙的な型変換と明示的な型変換の両方を許容します。つまり、変数の型は開発者が明示的なコードによってキャストすることも、計算上必要であれば自動的に変換されることもあります。

#### **SolidityとJavaScriptの類似点**

Solidityはかつて、JavaScriptから強い影響を受けていました。現在、目に見える主な類似点は、関数定義における'function'キーワードの使用です。

Solidityの主要な影響元に馴染みのある開発者にとって、Solidityを理解することは比較的容易です。加えて、Solidityは静的型付けであり、ライブラリの使用や複雑な型の作成も可能です。

#### **SolidityとPythonの類似点**

構文の面ではPythonからの影響はあまり明白ではありませんが、Pythonと同様にSolidityはC3線形化、多重継承を使用し、'super'キーワードを維持しています。

Pythonライクな構文を用いる[Vyperは、Solidityに似ており](https://www.alchemy.com/overviews/solidity-vs-vyper)、EVM互換ブロックチェーンで使用されるスマートコントラクトのセキュリティを高めることを目的として意図的に設計されています。

### **Solidityはどのように使われるか？**

ブロックチェーン向けコーディング言語としての性質上、Solidityは明示的にEthereum Virtual Machine（EVM）上でコンパイルされることを目的として作られました。そのため、Solidityは任意のEVM互換ブロックチェーン向けに、安全でEthereum互換なスマートコントラクトを書くことができます。

この広範な互換性は、理解のしやすさと柔軟な機能性と相まって、Solidityを業界で最も広く使われているブロックチェーン開発言語にしています。

## **Solidityはどのように動作するか？**

Solidity開発者は、EVM上で動作するプログラムであるスマートコントラクトを書きます。他の言語のクラスと同様に、スマートコントラクトは複数の関数、内部状態、パブリックな宣言を持つことができます。

Solidityコントラクトは、EVMが読み取れるように[バイトコードにコンパイル](https://www.alchemy.com/overviews/solidity-compiler)されます。コンパイル後、Solidityコントラクトは、Vyperや**Huff**のような他のEVMスマートコントラクト言語で書かれたものと見た目上の違いはなくなります。

他の開発者向けツールと同様に、Solidityも定期的にバージョンアップデートを経ています。スマートコントラクトは一度デプロイされ、ブロックチェーンに参加した後は取り消しができないため、Solidityのバージョン制約は作成時にのみ問題になる点に注意してください。

理論上、[Solidity開発者](https://www.alchemy.com/overviews/how-to-become-a-solidity-developer)はEthereumのスマートコントラクトを直接バイトコードで書くこともできますが、Solidityのような高水準言語を使えば、低水準の操作なしにエンジニアがより効率的にコントラクトを書くことができます。

### **SolidityはEVMとどのように相互作用するか？**

以下は、SolidityがEVMの状態を変更する仕組みの概要です。

1. Solidityでスマートコントラクトを書く
1. Solidityのスマートコントラクトがバイトコードにコンパイルされる
1. バイトコードがEVMオペコードに変換される
1. EVMオペコードがEVMの状態を変更する

EVMは*仮想ステートマシン*であり、Ethereumの「グローバルコンピュータ」の記録係です。最も単純に言えば、EVMはアドレス、アカウント残高、トークン保有量を含むネットワークのグローバルな状態を維持します。

Solidityのスマートコントラクトは、EVMのグローバルな状態を変更するために書かれます。EVMのグローバルな状態は、トークンのミント、トークンの送受信、資産の解放といったアクションによって変更されます。

[EVMオペコード](https://ethereum.org/en/developers/docs/evm/opcodes/)にエンコードされた多数のEVM操作が、これらのグローバルな状態への変更を促します。各EVMオペコードは、あるアドレスから別のアドレスへのトークン送信、トークンのミント、あるいはスマートコントラクトの破棄といった、特定の種類の状態変更をEVMに促すよう設計されています。

最後のステップでは、EVMがスマートコントラクトのバイトコードをEVMオペコードに変換し、それがブロックチェーンに必要な変更を加えます。

各オペコードには特定の*ガス手数料*が伴い、これはETHで課金され、悪意のあるアクターが過度な量のリクエストでネットワークを詰まらせるリスクを軽減するためのものです。したがって、トランザクションの総ガスコストは、ガス1単位あたりの価格とトランザクションのオペコードの総ガスコストを掛け合わせて算出されます。

## **どのEVM互換ブロックチェーンがSolidityをサポートしているか？**

Solidityは、Polygon、Arbitrum、OptimismといったL2を含む、任意のEVM互換ブロックチェーン向けにスマートコントラクトを書くことができます。Solidityは柔軟で使いやすいため、他の多くのブロックチェーンでもサポートされています。ここでは、Solidityをサポートしている大規模なプロジェクトのいくつかを紹介します。

### 1. Polkadot

Polkadotは、リレーチェーンを使って複数のブロックチェーン（すなわちパラチェーン）を1つのチェーンに統合することに重点を置いたチェーンです。Polkadotの目標は、パラチェーンが相互運用可能になることで、スケーラビリティを可能にし、帯域幅を増やすことです。Polkadotパラチェーンの一例が[Astar](https://www.alchemy.com/astar)で、これはAlchemyによってサポートされています。

### **2. Avalanche**

AvalancheはSolidity開発をサポートするEthereumの競合です。Avalancheのアーキテクチャは、資産の発行と取引を行うチェーン（X Chain）、ネットワークのバリデータを調整するチェーン（P-Chain）、スマートコントラクトの作成を可能にするチェーン（C Chain）という3つのブロックチェーンからなるネットワークに基づいています。

### **3. BNB chain（旧Binance Smart Chain）**

[Binance](https://www.alchemy.com/dapps/binance) Smart ChainはEthereum上のERC-20トークンとして始まり、成長するアプリのエコシステムをサポートするために、Binance Smart Chain（BSC）ネットワークが作られました。BSCとそのトークンは、スマートコントラクトにSolidityを使用しています。現在、Binance Smart ChainはBNB Chainと呼ばれています。

## **Solidityはどれほど普及しているか？**

Solidityは、ブロックチェーン業界において最も普及しているスマートコントラクトプログラミング言語です。SolidityはEVM互換のスマートコントラクトを作成するためのネイティブ言語です。EVMの外側でも、Neon Labsの[Solana EVM](https://www.alchemy.com/overviews/solana-evm)のように、EthereumのVirtual Machineへの組み込みサポートを備えたプロジェクトがあります。

ブロックチェーン業界はまだ成長段階にあるため、Solidityは他の全てのプログラミング言語と比べて使用頻度が低いように見えるかもしれません。しかし、業界内では、Solidityは最も広く応用可能なスマートコントラクト言語です。Solidityは多くのチェーン上で、そして最も急成長しているweb3 dAppエコシステムにおいて、強力なユースケースを持っています。

**The Next WebのHard Fork**によるレポートによると、Solidityはブロックチェーンタグの付いた質問において、2番目に近い競合の2倍の頻度で登場しています。JavaScriptはSolidityの9.5%に対し、わずか4.8%の出現量にとどまっています。

## SolidityはEthereumでどのように使われているか？

EthereumにおけるSolidityの使用例をいくつか見ることで、柔軟なスマートコントラクトを作成する上でのSolidityコードのシンプルさを実感できるでしょう。公式の[Solidityドキュメント](https://docs.soliditylang.org/en/v0.8.16/)にあるコード例は、この言語への良い入門となります。

### **スマートコントラクト**

以下は、Ethereum上にシンプルな通貨を作成する、Solidityドキュメントからのシンプルなコード例です。

<ImageBlock
  src="https://media.alchemy.com/1704182488-solidity-code-example.png"
  alt="Ethereum上のシンプルな通貨スマートコントラクトのSolidityコード例"
  width={836}
  height={1384}
  caption="このコードは通貨を作成します。"
/>

コントラクトの関数宣言、プライベート変数とパブリック変数に注目してください。関数により、コントラクトはオンチェーンで様々なアクションを実行できます。この例では、あるアドレスから別のアドレスへのトークン送信と、トークンのミントです。

パブリック変数はコントラクトの外部からアクセス可能で、それらの変数の値を取得するための**ゲッター関数**を自動的に生成します。*event*キーワードにより、クライアントアプリケーションが[コントラクトによって引き起こされた変更をリッスンする](https://www.alchemy.com/overviews/solidity-events)ことができます。

この例では、クライアントは*sent*イベントを見ることになります。これは、アドレス*msg.sender*がアドレス*receiver*に*amount*のトークンを送信したことをリスナーに示します。

### **Solidity ERC標準とは何か？**

**Solidityスマートコントラクトの設計の根底にあるのが、ERC（Ethereum Request for Comment）標準であり、これは様々な種類のEthereumトークンの実装を改善し標準化するために作られたガイドラインです。**

ERC標準はEIP（Ethereum Improvement Proposals）によって提案されます。ERC標準が承認され確定すると、それはSolidityコントラクトを書くための標準となります。これにより、スマートコントラクトを構築するための共通の[Solidityインターフェース](https://www.alchemy.com/overviews/solidity-interface)テンプレートが可能になります。Solidity開発者が既存のERC標準に準拠したトークンを構築する際、彼らはそのトークンがブロックチェーン上で適切にどう振る舞うかを把握できます。

最も広く使われているERC標準のいくつかを以下に挙げます。

- [ERC-20](https://www.alchemy.com/overviews/solidity-events) - 代替可能トークン標準
- [ERC-721](https://www.alchemy.com/docs/how-to-interact-with-erc-721-tokens-in-solidity) - 非代替性トークン標準
- [ERC-1155](https://www.alchemy.com/blog/comparing-erc-721-to-erc-1155) - 半代替性トークン標準
- [ERC-4626](https://www.alchemy.com/overviews/erc-4626) - 利回り付与型ボールト標準

## **Solidityプログラミングを学ぶ方法**

Solidityが何かは分かったところで、どのようにSolidityの学習を始めればよいのでしょうか？最も普及しているスマートコントラクト言語であるため、Solidity開発の学習を始めるためのオンラインリソースが豊富に用意されています。

Solidityを学ぶ最良の方法の一つは、Alchemy Universityの[7週間のSolidityブートキャンプ](https://university.alchemy.com/?a=0950a65be4)です。これはもともとweb3エンジニアの一流チームであるChainShotによって作られ、Alchemyが2022年8月にChainShotを買収した後に再設計されたものです。

このEthereum開発者向けブートキャンプは、もともと3,000ドルの認定コースでしたが、現在は無料です。Alchemy Universityに参加するための順番を確保してください。

## **Solidityのリソース**

このセクションでは、Solidity開発を学ぶためのオンライン上の最良のリソースをいくつか紹介します。

1. 公式Solidityドキュメント - Solidity開発を学ぶための主要なリソースとしてドキュメントを活用してください。
1. Solidity by Example - 'Hello World'プログラムからウォレットアプリケーション、DeFiに至るまでの、Solidityの例をまとめたもの。
1. **Clean Contracts** - Solidityのコード例を用いて、安全で予測可能なスマートコントラクトの書き方を解説するガイド。
1. [OpenZeppelin](https://www.alchemy.com/dapps/openzeppelin)によるEthernaut - スマートコントラクトを題材にした戦争ゲームで、各レベルはスマートコントラクトをハッキングすることで構成されています。

## **Solidityでの開発を始める**

この記事では、Solidityを紹介し、Solidity開発の学習を始めるためのリソースを提供しました。Solidityは、EthereumやEVM互換ブロックチェーン上で分散型アプリケーションを開発するための、非常に柔軟で強力な言語です。

知識に自信がついたら、ためらわずにGoerliテストネット上でアプリケーションをデプロイし、web3ハッカソンに参加し、web3スタートアップの立ち上げに挑戦してみてください。
