はじめに
Ethereumのスマートコントラクトを書いてみようと思ったとき、最初にぶつかる壁は「環境構築」ではないでしょうか。Node.jsを入れて、HardhatやTruffleをnpm installして、ネットワーク設定を書いて、MetaMaskをつないで……とセットアップだけで一日が終わってしまうこともあります。
Remix(Remix Project、通称Ethereum Remix)は、そうした準備を一切すっ飛ばして、ブラウザを開くだけでSolidityのコード作成・コンパイル・デプロイ・デバッグまでを完結させられるIDEです。GitHub上ではApache-2.0ライセンスで公開されており、3,000を超えるスターを集める、Ethereumエコシステムでは定番のツールとなっています。
この記事では、Remixがなぜ便利なのか、実際にどう使うのかを、コード例を交えて紹介します。
Remix(Remix Project)とは
Remixは、Ethereum向けのブラウザベースのコンパイラ兼IDEです。Solidityでスマートコントラクトを書き、その場でコンパイルし、ブラウザ内でシミュレートしたEVM(Ethereum仮想マシン)やテストネット、本番ネットワークにデプロイし、トランザクションをステップ実行でデバッグするところまでを、単一のWebアプリで行えます。
TypeScript製で、remix-project-org/remix-projectとしてGitHub上にモノレポで公開されています。提供形態は主に3つです。
主な特徴
- インストール不要 -
remix.ethereum.orgにアクセスするだけで、ブラウザ上でSolidityの編集・コンパイル・デプロイが完結します - プラグインアーキテクチャ - Solidityコンパイラ、Deploy & Run、デバッガ、静的解析、ユニットテストといった機能はすべてプラグインとして実装されており、Plugin Managerから必要なものだけを有効化できます
- Remix VM - ブラウザ内でEVMをシミュレートする仮想環境です。テストネットへの接続もウォレットも不要で、書いたコントラクトを即座にデプロイして関数を呼び出せます
- オプコード単位のデバッガ - 実行したトランザクション(失敗したものも含む)をステップ実行し、スタック・メモリ・ストレージの変化を追跡できます
- 静的解析(Static Analysis) - reentrancyや
tx.originの誤用、未チェックの外部呼び出しといった典型的な脆弱性パターンをコンパイル時に警告します
デスクトップ版やVSCode拡張機能も用意されており、ローカルのエディタや使い慣れたワークフローと組み合わせることも可能です。
インストール
Web版はインストール不要で、ブラウザでhttps://remix.ethereum.orgを開くだけで利用できます。
ローカルのファイルシステムと同期して、普段使いのエディタやgitと組み合わせたい場合は、Remix公式が提供するNode.js製CLIツールremixdをグローバルインストールします。
npm install -g @remix-project/remixd
デスクトップ版はGitHubリポジトリのReleasesページから、VSCode拡張は拡張機能マーケットプレイスで「Ethereum Remix」を検索してインストールできます。
基本的な使い方
RemixでのSolidity開発は、大きく分けて「編集」「コンパイル」「デプロイ・実行」の3ステップです。まずはシンプルなカウンターコントラクトを例に見てみます。
// contracts/Counter.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
contract Counter {
uint256 public count;
function increment() public {
count += 1;
}
function decrement() public {
require(count > 0, "count is already zero");
count -= 1;
}
}
このファイルをRemixの左側にあるファイルエクスプローラーで作成し、コードを貼り付けます。左サイドバーの「Solidity Compiler」プラグインを開き、pragmaで指定したバージョン(この例では0.8.24系)を選んで「Compile」を押すとコンパイルが完了します。
続いて「Deploy & Run Transactions」プラグインを開き、Environmentに「Remix VM (Cancun)」を選んだ状態で「Deploy」を押すと、ウォレット接続もガス代も不要でコントラクトが即座にデプロイされます。デプロイ後はincrement・decrement・countが自動生成されたボタンとして表示され、クリックするだけで関数呼び出しと状態の確認ができます。
実践的なユースケース
remixdでローカルエディタと同期する
ブラウザ上のエディタは手軽ですが、普段VSCodeやgitに慣れている場合は、ローカルのファイルをそのままRemixのコンパイラ・デバッガと組み合わせたくなります。remixdはそのためのブリッジで、指定したローカルフォルダをRemix IDEの「localhost」ワークスペースとして公開します。
# contracts フォルダをRemixから参照できるようにする
remixd -s ./contracts --remix-ide https://remix.ethereum.org
コマンド実行後、ブラウザのremix.ethereum.org側でワークスペースを「localhost」に切り替えると、ローカルのファイルがそのままRemixのファイルエクスプローラーに表示されます。編集はローカルのエディタで行い、コンパイルとデバッグだけRemixに任せる、という分担が可能になります。
静的解析でデプロイ前に脆弱性を洗い出す
スマートコントラクトはデプロイ後の修正が難しいため、デプロイ前の脆弱性検出が重要です。Remixの「Solidity Static Analysis」プラグインは、コンパイル済みのコードを解析し、典型的な問題パターンを警告してくれます。
// 外部呼び出しの後で状態を更新している = reentrancyのリスクがある例
function withdraw() public {
uint256 amount = balances[msg.sender];
(bool ok, ) = msg.sender.call{value: amount}("");
require(ok, "transfer failed");
balances[msg.sender] = 0; // 本来はcallの前に0にすべき
}
このようなコードをコンパイルして「Analysis」タブを開くと、外部呼び出し(call)の後で状態変数を更新している点がreentrancyの疑いとして指摘されます。指摘に従ってbalances[msg.sender] = 0;をcallの前に移動する、いわゆるChecks-Effects-Interactionsパターンに書き換えることで警告が解消されます。
トランザクションをステップ実行でデバッグする
requireに引っかかって失敗したトランザクションや、意図しない結果を返す関数呼び出しは、原因を特定するのに手間がかかります。Remixのデバッガは、実行済みのトランザクションをターミナルログから選んで「Debug」ボタンを押すだけで、オプコード単位のステップ実行画面を開けます。
先ほどのCounterコントラクトでcountが0の状態のままdecrement()を呼び出すと、require(count > 0, ...)で失敗します。この失敗したトランザクションをデバッガで開くと、REQUIRE命令に到達した時点でのスタックとストレージの値を確認でき、「なぜrevertしたのか」をコードを読み返さなくても特定できます。
実ネットワークへのデプロイとソースコード検証
開発がひと段落したら、テストネットや本番ネットワークへのデプロイに移ります。「Deploy & Run Transactions」のEnvironmentを「Injected Provider - MetaMask」に切り替えると、MetaMaskで選択中のネットワークに対して実際のトランザクションでデプロイできます。
デプロイ後は「Contract Verification」プラグインからSourcifyやEtherscanと連携し、デプロイ済みバイトコードとソースコードを紐づけて公開できます。これにより、他の開発者やユーザーがブロックエクスプローラー上でコントラクトのソースコードを確認できるようになります。
まとめ
Remixは、環境構築の手間を取り除き、ブラウザだけでSolidityコントラクトの作成からデプロイ、デバッグまでを完結させられるIDEです。Remix VMによる即座の動作確認、静的解析による脆弱性の早期発見、オプコードレベルのデバッガといった機能がプラグインとして一体化されており、学習用の小さなコントラクトから本番デプロイ前の検証まで幅広く使えます。
ローカル環境との連携が必要になったらremixdを、開発体験をエディタに寄せたくなったらVSCode拡張やデスクトップ版を検討してみてください。まずはremix.ethereum.orgを開いて、この記事のサンプルコントラクトを貼り付けるところから始めてみるのがおすすめです。