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

Solidityコンパイラとは

Daniel Idowu headshot

執筆者 Daniel Idowu

2022年10月4日 公開読了時間 1 分

Solidityでスマートコントラクトを書くEthereum開発者は、**Ethereum Virtual Machine(EVM)**が適切なコマンドを理解して実行できるように、コードをコンパイラに通す必要があります。Solidityコンパイラは、コードをバイトコード命令の集合に変換します。

Solidityは、時価総額第2位の暗号通貨であるEthereumのプログラミング言語です。Solidityは、スマートコントラクトを実装するために特別に作られた高水準プログラミング言語です。さらに、Solidityは静的型付けオブジェクトを持つ、コントラクト指向かつオブジェクト指向の言語です。

この記事では、Solidityコンパイラ、Solidityコンパイラのインストール方法、Solidityコンパイラツール、そして公開されているデコンパイラについて解説します。

Solidityコンパイラとは

Solidityコンパイラにはsolcと、solcから派生したsolc.jsの2種類があります。実際のSolidityコンパイラであるsolcはC++で書かれており、本記事執筆時点でバージョン0.8.16です。solc.jsはEmscriptenを使ってC++コードをJavaScriptにコンパイルしたものです。solcはバージョンごとにJavaScriptにコンパイルされています。

Solidityファイルは、solcjsというNode.jsライブラリおよびコマンドラインツールを使ってアセンブルされます。solcコマンドラインコンパイラとは異なりJavaScriptのみを使ってコンパイルを行うため、solcよりもインストールが簡単です。

スマートコントラクトをデプロイする前に、EVM(Ethereum Virtual Machine)向けにバイトコードへコンパイルする必要があります。バイトコードとは、Solidityコードが「翻訳」された情報であり、バイナリのコンピュータ命令を含んでいます。

Ethereumでは、このバイトコードがブロックチェーンにデプロイされます。コンパイル時にはABI(Application Binary Interface)も生成されます。ABIは2つのプログラムモジュール間、多くの場合オペレーティングシステムとユーザープログラムの間のインターフェースです。

SolidityコンパイラがソースコードをbytecodeとABIに変換する図
Solidityコンパイラ - 出典:Intellipat

コントラクトはEVM上で実行されるバイトコードにコンパイルされます。このバイトコードはブロックチェーンにデプロイされ、あるアドレスに保存されます。それにより公開され、誰でも操作できるようになります。アドレスはデプロイされたコントラクトインスタンスを識別し、そのコントラクトの内部状態を維持するための永続的なストレージも保持します。EtherはEthereumのネイティブ暗号通貨であり、価値の保存手段、ブロックチェーン上でスマートコントラクトを実行するための支払い手段、そしてEthereumネットワークの安全性を維持するマイナーへの報酬として使われます。

以下は、コントラクトがどのようにコンパイルされるかを示す簡単な例です。

ローカルマシンにツールをインストールせずに済むよう、人気のあるオンラインEthereum IDEであるRemixを使ってこのコードをコンパイルします。

下の画像では、画像下部にあるピンクと紫の矢印が、それぞれABIとバイトコードを指していることが確認できます。ABIはJSONとして表現されます。

ABIとbytecodeの出力箇所を矢印で示したRemix IDEのコンパイラパネル
ABIとBytecodeが利用可能です。

Solidityコンパイラのインストール方法

Solidityを学ぶ際、Solidityコンパイラをインストールしたい場合があります。Solidityコンパイラのインストールにはさまざまな便利な方法があります。簡単な方法はRemixを使うことで、オンラインで利用する選択肢があります。ただし、これは小規模なコントラクト向けに設計されており、コンパイルオプションはほとんどありません。

より大規模なコントラクトの場合は、npm/Node.js、Docker、Linux、MacOSパッケージ、静的バイナリを使ってSolidityコンパイラをインストールできます。

方法1:npm/node.jsを使ってインストールする

solcとも呼ばれるSolidityコンパイラは、npmを使ってインストールできます。以下のコマンドを実行すると、solcjsプログラムがインストールされ、システム全体で利用可能になります。

これでSolidityコンパイラを次のコマンドでテストできます。

これでsolcjsを使う準備が整いました。標準のSolidityコンパイラより機能は少ないですが、良い出発点となります。

方法2:Dockerを使ってインストールする

Solidityプログラミングを始めるには、Dockerイメージをダウンロードして使用することもできます。Dockerイメージはコンパイラの実行可能ファイルを実行するため、任意のコンパイラ引数を渡すことができます。

Solidity Dockerイメージをプルするコマンドは以下の通りです。

Dockerイメージをダウンロードした後、以下のコマンドを実行して確認します。

ホストマシン上でDockerイメージを使ってSolidityファイルをコンパイルするには、入出力用のローカルフォルダをマウントし、コンパイルするコントラクトを指定します。

方法3:バイナリパッケージを使ってインストールする(MacOS、Linux)

MacOSでのインストール

MacOSではHomebrewを使ってSolidityをインストールできます。これによりソースからビルドされたmacOSパッケージが得られ、あとはインストール手順に従うだけです。

実行が完了したら、以下のコマンドを実行してSolidityが正常にインストールされたことを確認できます。

以下のような出力が得られるはずです。

macOSでのSolidityコンパイラのインストール成功を示すターミナル出力
macOSでのsolidityインストール

Linuxでのインストール

Linuxパッケージのインストールは非常に簡単な手順で、数ステップで完了します。まず、リポジトリをリポジトリリストに追加します。

次にパッケージリストを更新し、solcをインストールします。最新の安定版ではなくnightlyビルドを使いたい場合は、リポジトリエントリをethereum/ethereum-devに変更してください。

サンプルSolidityスマートコントラクトのコンパイル

以下のコードは、上記で提供したサンプルコントラクトを使用しています。

コントラクトをコンパイルするには、以下のコードを実行します。

特定のEVMバージョンを使ってコントラクトをコンパイルするには、以下のようにバージョンを設定します。

Solidity-upgradeとは

solidity-upgradeを使うと、破壊的な言語変更を反映するようコントラクトをアップグレードできます。 すべての破壊的リリースに対して必要な調整をすべて行えるわけではありませんが、それでも、行わなければ多くの面倒な手作業が必要になるような調整をサポートします。

Solidity-upgradeの仕組み

_libsolidity_をベースにしたSolidity-upgradeは、ソースファイルを解析、コンパイル、分析して、適用可能なソースアップグレードを見つけることができます。ソースアップグレードは、ソースコードに対する小さなテキストの変更とみなされます。これらは提供されたソースファイルのインメモリ複製に適用されます。

このアップグレードには2つのフェーズがあります。

第1フェーズ

まず、ソースファイルの解析中はそのレベルでソースコードをアップグレードすることができないため、エラーが収集され、—verboseフラグを指定することでログに記録できます。現時点で利用可能なソースアップグレードはありません。

第2フェーズ

第2フェーズでは、すべてのソースがコンパイルされ、有効化されたすべてのアップグレード分析モジュールがコンパイルと並行して実行されます。デフォルトでは、利用可能なすべてのモジュールが有効化されています。

solidity-upgradeからコンパイルの問題が発生することがあり、ソースアップデートによって解決できる可能性があります。問題がなければ、報告されるソースアップグレードもなく、そこで完了です。問題が発生し、アップグレードモジュールがソースアップグレードを報告した場合、最初に報告されたソースアップグレードが適用され、提供されたすべてのソースファイルに対して再コンパイルが開始されます。

Solidityデコンパイラとは

Solidityデコンパイラは、コンパイル済みのスマートコントラクトEVMコードを入力として受け取り、Solidityライクなソースコードにデコンパイルするツールです。 このデコンパイラは、コントラクトの挙動の検証と理解に役立ちます。

Solidityデコンパイラは、元のコードが入手できないスマートコントラクトのデバッグに役立ちます。ただし、EVMバイトコードをデコンパイルする技術はまだ発展途上にあり、利用可能なデコンパイラの中には複雑なコントラクトを部分的にしかデコンパイルできないものもあり、低レベルコードの多くがデコンパイル結果から失われていることがよくあります。

Ethereum仮想マシン(EVM)デコンパイラ

以下は、代表的なSolidityデコンパイラの一覧です。

1. Ethervm.io

Ethervm.ioは無料のオンラインデコンパイラで、Ethereumコントラクトのバイトコードをより読みやすいSolidityライクなコードにデコンパイルします。

始める: https://ethervm.io/decompile

2. JEBデコンパイラ

JEBデコンパイラは、ABIにアクセスせずにメソッドを特定するコード解析など、独自の機能を提供します。JEBは、Ethereumプラットフォーム上で動作する不透明なスマートコントラクトを調査するセキュリティ監査人、脆弱性研究者、リバースエンジニアにとって好んで使われるツールとなっています。

始める:https://www.pnfsoftware.com/jeb/manual/ethereum/

3. Etherscanオンラインデコンパイラ

Etherscanオンラインデコンパイラは、Ethereum Virtual Machine(EVM)向けのデコンパイラで、ランタイムバイトコードから情報を抽出し、より人間が読みやすい形式で提示します。

4. Nick JohnsonによるEvemedis

EvemedisはEVMディスアセンブラです。生のEVM操作よりも高い抽象度を提供するため、バイトコードに対して静的解析を実行します。

始める:https://github.com/Arachnid/evmdis

5. Decurity

Decurityは、関数名を含むEVMスマートコントラクトのABIを復元するためのシンプルなツールを実装したABIデコンパイラです。

始める:https://github.com/Decurity/abi-decompiler

まとめ

これで、Solidityコンパイラとは何か、そのインストール方法、簡単なコントラクトのコンパイル方法について理解できたはずです。Solidityコンパイラについてのさらなる情報は、Solidityのドキュメントに記載されています。

Solidityを学び始めたばかりの方は、ぜひAlchemy Universityの7週間のSolidity開発者ブートキャンプに参加して、無料でインタラクティブかつ包括的なオンラインコースでEthereum開発の基礎を習得してください。開発全般が初めての方には、Ethereumのブートキャンプを始める前の前提知識として、Alchemy Universityの3週間のJavaScriptクラッシュコースがおすすめです。基礎はすでに理解していて、より深く学びたい方は、Alchemyの新しいSolidityコースをご覧ください。

Background gradient

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

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