Solidity 在线编译器
编写、运行和分享代码片段,无需任何配置。
点击运行,在这里查看输出。
在浏览器中试试 Solidity
Solidity 是编写以太坊智能合约的语言。它运行在 EVM 上,这台虚拟机在主网上守护着数千亿美元的资产,大多数 L2 也基于它。这个在线编辑器提供一个 Monaco 编辑器,连接到沙盒中的 solc 和 geth EVM,你可以写一个合约,点击运行,准确看到它上链后会发生什么:console.log 输出、触发的事件,以及存储变量的最终状态。整个过程不用部署任何东西,不用付 gas,也不用碰钱包。
刚开始学时,Solidity 有几处与众不同,值得留意。存储默认是永久的:赋给状态变量的值会一直保留,而函数内部的变量在调用返回后就消失了。事件是合约与外界(你的前端、索引器、The Graph)沟通的方式:它们消耗 gas,被写入交易日志,并且可以按 indexed 参数过滤。此外,每个外部函数都通过 ABI 编码接收输入,而不是标准输入,所以编辑器提供了一个带类型的参数面板,直接对应你的 main(...) 参数。
这个 Solidity 在线编辑器的强项
- 真正的 solc 编译和 EVM 执行,不是转译出来的模拟。console.log 使用 forge-std,emit 和存储操作都遵循真实的 EVM 语义:操作码、gas,一样不少。
- “事件”标签页会显示本次运行中的每一个
emit,并单独标出indexed参数,让你准确看到前端或子图会收到什么。 - “存储”标签页会显示合约改动过的每个状态变量的最终值,包括 mapping 中的条目(例如
balances[0xabc...])。没有写入过的变量不会出现。 - 带类型的参数面板会把值传给带参数的
main(uint256 n, string memory name, ...)。运行器会根据函数签名对它们进行 ABI 编码,所以42会变成uint256,"hello"会变成string。
可以在 Solidity 在线编辑器里做什么
- 计数器(加一、减一)合约,学习状态变量如何在多次调用之间保留:写入
count,运行,然后在“存储”标签页里看到它。 - 代币转账模式:触发
Transfer(from indexed, to indexed, value),看看 indexed 字段和普通字段在“事件”标签页里如何以不同方式显示,和它们在真实 EVM 日志 topic 中的样子一致。 require和revert的失败情况:写一个遇到错误输入就失败的检查,看着 revert 信息出现在标准输出中,而不是在主网上为一笔失败的交易白白烧掉 gas。
Solidity 常见问题
Solidity 是什么?
Solidity 是以太坊和兼容 EVM 的链(Polygon、Arbitrum、Optimism、Base 等)上使用最广泛的智能合约语言。它编译成 EVM 字节码,这是一套由网络中每个节点执行的栈式机器指令集。它的语法借鉴了 JavaScript 和 C++,但语义大不相同:存储昂贵且永久,每次调用都按 gas 计费,也没有异步。这个在线编辑器提供一个沙盒 EVM,让你不碰真实的链就能练习这门语言。
使用它需要钱包或测试网 ETH 吗?
main(...) 函数,然后展示这一次调用的标准输出、事件和存储。运行结束后,一切都会被丢弃。怎样给合约传入输入?
main(...) 的函数,参数类型随你定,例如 function main(uint256 n) external 或 function main(string memory name, uint256 age, bool active) external view。然后在编辑器下方的参数面板中填入值。运行器会检查函数签名,把你输入的字符串 ABI 编码成正确的类型,方式和命令行中的 cast call 一样。地址参数输入 0x...;bool 参数输入 true 或 false;uint 参数输入十进制数值。“输出”“事件”和“存储”标签页有什么区别?
forge-std/console.sol 中的 console.log(...) 写到标准输出的内容,以及 revert 或 require 的错误信息。“事件”按顺序显示合约在运行中触发的每一个事件和每个参数的值(indexed 参数旁有一个小小的“indexed”标记,这些参数会进入 EVM 日志 topic,可以被 The Graph 等工具过滤)。“存储”显示运行后每个被写入的状态变量的值,包括 mapping 中的单个条目,没有改动过的变量不会出现在列表里。为什么我读过的一些 Solidity 教程里没有 main()?
main(),这样就有一个明确的运行入口和填写参数的地方。在编辑器之外,你的合约通常会公开多个函数(mint、transfer、withdraw 等),由前端或 cast、ethers、viem 之类的工具决定调用哪一个。适合 Solidity 的实用工具
与 Solidity 在线编辑器搭配使用的免费浏览器工具,全部来自 Coddy。