Menu
CoddyTech

Solidity 在线编译器

编写、运行和分享代码片段,无需任何配置。

Contract.sol
点击运行,在这里查看输出。
参数传给合约 main(...) 函数的值。运行器会根据参数类型对它们进行 ABI 编码。
没有参数。点击“添加参数”来传入一个。

在浏览器中试试 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 吗?
不需要。编辑器在服务器端的 EVM(与 geth 自带的引擎相同)中运行你的合约,每个请求都有独立的隔离容器。没有链上交易,不用真实 ETH 支付 gas,也没有钱包签名。点击运行时,运行器会把合约部署到一条全新的内存链上,用你提供的参数调用 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()?
在真实的链上,Solidity 合约没有唯一的入口:客户端想调用哪个公开函数就调用哪个,通过 4 字节的函数选择器来识别。编辑器约定使用 main(),这样就有一个明确的运行入口和填写参数的地方。在编辑器之外,你的合约通常会公开多个函数(mint、transfer、withdraw 等),由前端或 cast、ethers、viem 之类的工具决定调用哪一个。

适合 Solidity 的实用工具

与 Solidity 在线编辑器搭配使用的免费浏览器工具,全部来自 Coddy。