Menu
Coddy logo textTech

Solidity Playground

コードスニペットを書いて、実行して、共有できます — セットアップ不要。

Contract.sol
出力を表示するには、実行をクリックしてください。
ArgsValues passed to your contract’s main(...) function. The runner ABI-encodes them based on the parameter types.
No arguments. Click "Add arg" to pass one.

ブラウザで Solidity を試す

Solidity は Ethereum スマートコントラクトの言語です。実行は EVM 上で行われます — mainnet で数千億ドル規模の資産を守り、ほとんどの L2 を動かしているのと同じ仮想マシンです。この playground では、sandbox 化された solc + geth EVM につながった Monaco エディタを提供します。コントラクトを書いて Run を押せば、on-chain で何が起きるかをそのまま確認できます: console.log の出力、emit された event、そして storage 変数の最終状態 — デプロイも、gas の支払いも、wallet も不要です。

Solidity には始めるときに気に留めておきたい独特な点がいくつかあります。Storage はデフォルトで永続的です — state 変数に代入したものはずっと残り、関数の中の変数は呼び出しから戻った時点で消えます。Event はコントラクトが外の世界(フロントエンド、インデクサ、The Graph)と話す手段で、gas を消費し、トランザクションのログに書き込まれ、indexed パラメータでフィルタできます。そして external 関数の入力は stdin ではなく ABI encoding で渡されます — そのため playground では main(...) のパラメータに直接つながる型付きの Args パネルを用意しています。

この Solidity playground の強み

  • トランスパイラによるシミュレーションではなく、本物の solc + EVM 実行。console.log は forge-std を経由し、emit / storage のパスは実際の EVM セマンティクス — opcode、gas、すべて — を通ります。
  • Events タブは実行中の emit をすべて表示し、indexed パラメータは別マークで示されるので、フロントエンドや subgraph が受け取る内容をそのまま確認できます。
  • Storage タブはコントラクトが触れたすべての state 変数の最終値を表示します — mapping のエントリ(例: balances[0xabc...])も含めて。書き込んでいない変数は表示されません。
  • 型付きの Args パネルが、パラメトリックな main(uint256 n, string memory name, ...) に値を渡します。Runner は関数のシグネチャをもとに ABI エンコードするので、42uint256 に、"hello"string になります。

Solidity playground で作れるもの

  • カウンタや increment-decrement コントラクトで、呼び出し間で state 変数がどう永続するかを学ぶ — count に書き込み、実行し、Storage タブに現れるのを見る。
  • トークン送金パターン — Transfer(from indexed, to indexed, value) を emit し、indexed と非 indexed のフィールドが Events タブで異なる見た目で描画されるのを確認できます。実際の EVM ログトピックで見えるのとまったく同じ形です。
  • require / revert の失敗ケース — 不正な入力で失敗する guard を書き、mainnet で失敗トランザクションに gas を燃やす代わりに、revert メッセージが stdout に流れるのを見られます。

Solidity に関するよくある質問

Solidity とは何ですか?
Solidity は、Ethereum および EVM 互換チェーン(Polygon、Arbitrum、Optimism、Base など)で最も広く使われているスマートコントラクト言語です。EVM バイトコード — ネットワーク上のすべてのノードが実行するスタックマシンの命令セット — にコンパイルされます。構文は JavaScript と C++ から借りていますが、セマンティクスはかなり違います: storage は高価で永続的、すべての呼び出しは gas で計測され、async はありません。Playground は sandbox 化された EVM を提供するので、実際のチェーンに触れずに言語を練習できます。
これを使うのに wallet や testnet の ETH は必要ですか?
いいえ。Playground はサーバ側の EVM(geth に同梱されているエンジン)の中で、リクエストごとに隔離されたコンテナでコントラクトを実行します。on-chain トランザクションはなく、実際の ETH で gas を払うこともなく、wallet の署名も不要です。Run を押すと runner は新規のインメモリチェーンにコントラクトをデプロイし、渡された args で main(...) を呼び出して、その一回分の stdout、event、storage を表示します。Run の後はすべて破棄されます。
コントラクトに入力をどう渡しますか?
コントラクトに main(...) という関数を、好きな型付きパラメータと一緒に用意してください — function main(uint256 n) externalfunction main(string memory name, uint256 age, bool active) external view のように。そしてエディタの下の Args パネルに値を入れます。Runner は関数のシグネチャを見て、コマンドラインの cast call と同じ要領で文字列を正しい型に ABI エンコードします。address なら 0x...、bool なら truefalse、uint なら 10 進値を入れてください。
Output、Events、Storage タブの違いは?
Output は forge-std/console.solconsole.log(...) で stdout に書き出した内容と、revert / require のエラーメッセージを表示します。Events は実行中にコントラクトが emit したすべての event を順番に、各パラメータの値とともに表示します(indexed パラメータには小さな "indexed" バッジが付きます — これらは EVM のログトピックに入り、The Graph などのツールでフィルタ可能なフィールドです)。Storage は書き込みのあった state 変数の実行後の値を表示します。mapping の個々のエントリも含みますが、触っていない変数はリストに出てきません。
Solidity のチュートリアルによっては main() がないのはなぜ?
実際のチェーンでは Solidity コントラクトに単一のエントリポイントはありません — クライアントは 4 バイトのセレクタで識別される、任意の public 関数を呼びます。Playground では、実行する対象と引数を置く場所を分かりやすくするための慣習として main() を使っています。Playground の外では、コントラクトは複数の関数(mint、transfer、withdraw など)を公開するのが普通で、フロントエンドや cast / ethers / viem のようなツールがどれを呼ぶかを選びます。