Solidity Playground
コードスニペットを書いて、実行して、共有できます — セットアップ不要。
出力を表示するには、実行をクリックしてください。
ブラウザで 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 エンコードするので、42はuint256に、"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 とは何ですか?
これを使うのに wallet や testnet の ETH は必要ですか?
main(...) を呼び出して、その一回分の stdout、event、storage を表示します。Run の後はすべて破棄されます。コントラクトに入力をどう渡しますか?
main(...) という関数を、好きな型付きパラメータと一緒に用意してください — function main(uint256 n) external や function main(string memory name, uint256 age, bool active) external view のように。そしてエディタの下の Args パネルに値を入れます。Runner は関数のシグネチャを見て、コマンドラインの cast call と同じ要領で文字列を正しい型に ABI エンコードします。address なら 0x...、bool なら true か false、uint なら 10 進値を入れてください。Output、Events、Storage タブの違いは?
forge-std/console.sol の console.log(...) で stdout に書き出した内容と、revert / require のエラーメッセージを表示します。Events は実行中にコントラクトが emit したすべての event を順番に、各パラメータの値とともに表示します(indexed パラメータには小さな "indexed" バッジが付きます — これらは EVM のログトピックに入り、The Graph などのツールでフィルタ可能なフィールドです)。Storage は書き込みのあった state 変数の実行後の値を表示します。mapping の個々のエントリも含みますが、触っていない変数はリストに出てきません。Solidity のチュートリアルによっては main() がないのはなぜ?
main() を使っています。Playground の外では、コントラクトは複数の関数(mint、transfer、withdraw など)を公開するのが普通で、フロントエンドや cast / ethers / viem のようなツールがどれを呼ぶかを選びます。