Solidity Playground
Escribe, ejecuta y comparte fragmentos de código, sin instalaciones.
Pulsa Ejecutar para ver la salida aquí.
Prueba Solidity en el navegador
Solidity es el lenguaje de los smart contracts de Ethereum. Se ejecuta sobre la EVM — la misma máquina virtual que asegura cientos de miles de millones de dólares en mainnet y que mueve la mayoría de las L2. Este playground te da un editor Monaco conectado a un sandbox con solc + geth EVM, así puedes escribir un contrato, pulsar Run y ver exactamente lo que pasaría on-chain: la salida de console.log, los eventos emitidos y el estado final de tus variables de storage — sin desplegar nada, sin pagar gas y sin tocar una wallet.
Solidity tiene algunas particularidades que conviene tener presentes cuando empiezas. El storage es permanente por defecto — todo lo que asignas a una variable de estado persiste; todo lo que está dentro de una función desaparece al volver de la llamada. Los eventos son la forma que tienen los contratos de hablar con el mundo exterior (tu frontend, tu indexador, The Graph) — cuestan gas, se escriben en los logs de la transacción y se pueden filtrar por parámetros indexed. Y cada función externa recibe sus parámetros a través de ABI encoding, no por stdin — por eso el playground expone un panel de Args tipados que conecta directamente con los parámetros de tu main(...).
Qué hace bien este playground de Solidity
- Ejecución real con solc + EVM, no una simulación con transpilador. console.log usa forge-std y los caminos de emit / storage pasan por semántica real de EVM — opcodes, gas, todo.
- La pestaña Events muestra cada
emitde tu ejecución con los parámetrosindexedmarcados de forma distinta, así ves exactamente lo que recibiría un frontend o un subgraph. - La pestaña Storage muestra el valor final de cada variable de estado que el contrato haya tocado — incluidas entradas de mappings (p. ej.
balances[0xabc...]). Las variables que no escribiste no aparecen. - Panel de Args tipados que pasa valores a un
main(uint256 n, string memory name, ...)parametrizable. El runner los codifica con ABI a partir de la firma de tu función, así42se convierte enuint256y"hello"enstring.
Qué puedes construir en el playground de Solidity
- Contadores / contratos increment-decrement para aprender cómo persisten las variables de estado entre llamadas — escribe en
count, ejecuta y míralo aparecer en la pestaña Storage. - Patrones de flujo de tokens — emite
Transfer(from indexed, to indexed, value)y mira cómo los campos indexed y no-indexed se renderizan distinto en la pestaña Events, igual que aparecen en los topics de los logs reales de EVM. - Casos de fallo con
require/revert— escribe una guarda que falle ante una entrada inválida y mira cómo el mensaje de revert sale por stdout, en lugar de quemar gas en una transacción fallida en mainnet.
Preguntas frecuentes sobre Solidity
¿Qué es Solidity?
¿Necesito una wallet o ETH de testnet para usarlo?
main(...) con los args que hayas indicado y te muestra el stdout, los eventos y el storage de esa llamada. Todo se descarta cuando termina el Run.¿Cómo paso valores de entrada a mi contrato?
main(...) con los parámetros tipados que quieras — function main(uint256 n) external o function main(string memory name, uint256 age, bool active) external view. Luego añade los valores en el panel de Args debajo del editor. El runner inspecciona la firma de la función y codifica con ABI tus strings al tipo correcto, igual que hace cast call en la línea de comandos. Para un address, escribe 0x...; para un bool, true o false; para un uint, el valor decimal.¿Cuál es la diferencia entre las pestañas Output, Events y Storage?
console.log(...) de forge-std/console.sol, más cualquier mensaje de error de revert / require. Events muestra cada evento que tu contrato haya emitido durante la ejecución, en orden, con el valor de cada parámetro (y una pequeña etiqueta "indexed" en los parámetros indexed — esos son los que van a los topics de los logs de EVM y se pueden filtrar con herramientas como The Graph). Storage muestra el valor final de cada variable de estado que se haya escrito, incluyendo entradas individuales de mappings — las variables que no tocaste se quedan fuera de la lista.¿Por qué algunos tutoriales de Solidity no tienen un main()?
main() como convención para que haya algo obvio que ejecutar y un sitio donde pasar argumentos. Fuera del playground, tu contrato típicamente expondrá varias funciones (mint, transfer, withdraw, ...) y tu frontend o una herramienta como cast / ethers / viem elige cuál llamar.