コンテンツへスキップ
0%

Solidityとは?

Alchemy team headshot

執筆者 Alchemy

2023年9月22日 公開読了時間 1 分

web3業界の成長に伴い、開発者が選択できるweb3プログラミング言語は増えている。各言語はスマートコントラクトを書く上で異なる利点とトレードオフを持つように設計されている。言語ごとに、特定のブロックチェーンをサポートしているか、速度、可読性、セキュリティなどの特性が異なる場合がある。

Ethereumブロックチェーンのスマートコントラクト言語として開発されたSolidityは、ブロックチェーン業界最大の開発者エコシステム向けに分散型アプリケーションを作成するために使われる強力なプログラミング言語である。

この記事では、Solidityの歴史、言語としての影響関係、用途を通じてSolidityの入門を提供する。最後に、無料のSolidityコースやweb3開発を学ぶためのリソースを通じて学習を続けるための、優れた開発者向けリソースをいくつか紹介する。

Solidityとは何か

2014年に提案されたSolidityは、Ethereum Virtual Machine(EVM)上で動作するスマートコントラクトを実装するためのオブジェクト指向の高水準プログラミング言語である。 SolidityはC++やJavaScriptのような広く知られたプログラミング言語から影響を受けている。web3開発者にとって、Solidityを扱うことはweb3開発を学ぶ上で有益である。

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

Solidityを作ったのは誰か

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

Ethereumの創設者であるVitalik Buterinは、Bitcoinが切り拓いたブロックチェーンの機能を拡張するプロトコルとしてEthereumを提案し、そこにスマートコントラクトの機能を加えた。彼の構想では、Ethereumはスマートコントラクトの精巧なネットワークを実行できるようになるはずだった。スマートコントラクトとは、分散されたグローバルなコンピュータネットワーク上で動作する、条件付きで実行されるコードの断片である。スマートコントラクトにより、開発者は新しい暗号通貨を作成したり、DeFiアプリを構築したりすることなどが可能になる。

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

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

Solidityはどのプログラミング言語に基づいているか

Solidityは開発過程で、C++、Python、JavaScriptを含む複数の既存プログラミング言語に基づき、影響を受けている。

SolidityとC++の類似点

Solidityは変数宣言とfor文において、C++と同一の構文を使用する。さらに、2つの関数が同じ名前を持ちながら受け取るパラメータが異なる場合に必要となる、C++スタイルの関数オーバーロードのサポートもある。

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

SolidityとJavaScriptの類似点

Solidityはかつて、JavaScriptから大きな影響を受けていた。現在、目に見える主な類似点は、関数を定義する際のSolidityの「function」キーワードの使用である。

Solidityに大きな影響を与えた言語に馴染みのある開発者にとって、Solidityを習得することはかなり容易だろう。加えて、Solidityは静的型付けであり、ライブラリの使用や複雑な型の作成も可能である。

SolidityとPythonの類似点

SolidityがPythonから受けた影響は構文面ではあまり明らかではないが、Pythonと同様にSolidityはC3線形化、多重継承を使用し、「super」キーワードを維持している。

Pythonの構文を用いるVyperは Solidityに似ており、EVM互換ブロックチェーン上で使用されるスマートコントラクトのセキュリティを高めることを目的として設計されている。

Solidityはどのように使われているか

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

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

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

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

Solidityのコントラクトはバイトコードにコンパイルされ、EVMによって読み取られる。コンパイル後、SolidityのコントラクトはVyperやHuffなど他のEVMスマートコントラクト言語で書かれたものと見た目上の違いはなくなる。

他の開発者向けツールと同様、Solidityも定期的にバージョンが更新される。スマートコントラクトは一度デプロイされ、ブロックチェーンに参加した後は不可逆であるため、Solidityのバージョン制約は作成時にのみ関係する点に注意が必要である。

理論上、Solidity開発者はEthereumのスマートコントラクトをバイトコードで直接書くこともできるが、Solidityのような高水準言語を使うことで、エンジニアは低レベルの操作を行うことなく、より効率的にコントラクトを書くことができる。

SolidityはEVMとどのように連携するか

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

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

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

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

EVMオペコードにエンコードされた多数のEVM操作が、これらのグローバル状態への変更を引き起こす。各EVMオペコードは、あるアドレスから別のアドレスへのトークン送信、トークンのミント、あるいはスマートコントラクトの破棄といった、特定の種類の状態変更をEVMに促すように設計されている。

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

各オペコードには一定の_ガス代_が伴い、ETHで課金される。これは、悪意ある行為者が過剰な量のリクエストでネットワークを詰まらせるリスクを軽減するためのものである。したがって、トランザクションの総ガスコストは、ガス単位あたりの価格に、そのトランザクションのオペコードの総ガスコストを乗じたものとして計算される。

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

Solidityは、Polygon、Arbitrum、OptimismといったL2を含む、あらゆるEVM互換ブロックチェーン向けにスマートコントラクトを書くことができる。Solidityは柔軟で使いやすいため、他の多くのブロックチェーンでもサポートされている。以下は、Solidityをサポートする代表的なプロジェクトのいくつかである。

1. Polkadot

Polkadotは、リレーチェーンを使って複数のブロックチェーン(すなわちパラチェーン)を1つのチェーンに統合することに焦点を当てたチェーンである。Polkadotの目標は、パラチェーン同士が相互運用可能になることで、スケーラビリティを実現し帯域幅を増やすことである。Polkadotパラチェーンの一例がAstarであり、Alchemyによってサポートされている。

2. Avalanche

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

3. BNB chain(旧称Binance smart chain)

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のように、EthereumのVirtual Machineへの組み込みサポートを持つプロジェクトが存在する。

ブロックチェーン業界はまだ成長途上にあるため、Solidityが他のあらゆるプログラミング言語と比べてあまり使われていないように見えるかもしれない。しかし、この業界の中では、Solidityは最も広く応用されているスマートコントラクト言語である。Solidityは多くのチェーン上で、そして最も急成長しているweb3のdAppエコシステムにおいて、強い用途を持っている。

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

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

Solidityが Ethereumでどのように使われているか、いくつかの例を見ることで、柔軟なスマートコントラクトを作成する上でのSolidityコードのシンプルさをよく理解できるだろう。公式のSolidityドキュメントにあるコード例は、この言語への優れた入門となる。

スマートコントラクト

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

Ethereum上のシンプルな通貨スマートコントラクトのSolidityコード例
このコードは通貨を作成します。

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

パブリック変数はコントラクトの外部からアクセス可能であり、それらの変数の値を取得するためのgetter関数を自動的に生成する。_event_キーワードは、クライアントアプリケーションがコントラクトによって引き起こされた変更をリッスンすることを可能にする。

この例では、クライアントは_sent_イベントを見ることになる。これは、アドレス_msg.sender_がアドレス_receiver_に対してある_amount_のトークンを送信したことをリスナーに示すものである。

SolidityのERC規格とは何か

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

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

最も広く使われているERC規格には、以下のようなものがある。

  • ERC-20 - 代替可能トークン規格
  • ERC-721 - 非代替性トークン規格
  • ERC-1155 - 半代替性トークン規格
  • ERC-4626 - 利回り生成型ボールト規格

Solidityプログラミングの学び方

Solidityとは何かは分かったが、では実際にどうやって学び始めればよいのか。最も人気のあるスマートコントラクト言語であるため、Solidity開発を学び始めるためのオンラインリソースは豊富にある。

Solidityを学ぶ最良の方法の一つが、Alchemy Universityの7週間のSolidityブートキャンプである。これはもともと、web3エンジニアの有力チームであるChainShotによって作られ、2022年8月にAlchemyがChainShotを買収した後、Alchemyによって作り直されたものである。

このEthereum開発者向けブートキャンプは、もともと3,000ドルの認定コースだったが、現在は無料である。Alchemy Universityへの参加待ちリストに、今のうちに席を確保しておこう。

Solidityのリソース

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

  1. 公式Solidityドキュメント - Solidity開発を学ぶ際の主要なリソースとして使用する。
  2. Solidity by Example - 「Hello World」プログラムからウォレットアプリケーションやDeFiまで、幅広いSolidityの例をまとめたもの。
  3. Clean Contracts - Solidityのコード例とともに、安全で予測可能なスマートコントラクトの書き方を解説するガイド。
  4. OpenZeppelinによるEthernaut - 各レベルがスマートコントラクトのハッキングで構成される、スマートコントラクトベースの戦争ゲーム。

Solidityで構築を始めよう

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

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

Background gradient

ブロックチェーンで魔法を生み出す

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