Menu

Solidity Playground

Escribe, ejecuta y comparte fragmentos de código, sin instalaciones.

Contract.sol
Pulsa Ejecutar para ver la salida aquí.
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.

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 emit de tu ejecución con los parámetros indexed marcados 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í 42 se convierte en uint256 y "hello" en string.

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?
Solidity es el lenguaje de smart contracts más usado para Ethereum y las cadenas compatibles con EVM (Polygon, Arbitrum, Optimism, Base, etc.). Se compila a bytecode de EVM — un conjunto de instrucciones de máquina de pila que ejecuta cada nodo de la red. Sintácticamente toma prestado de JavaScript y C++, pero la semántica es muy diferente: el storage es caro y permanente, cada llamada se mide en gas y no hay async. El playground te da una EVM en sandbox para practicar el lenguaje sin tocar una cadena real.
¿Necesito una wallet o ETH de testnet para usarlo?
No. El playground ejecuta tu contrato dentro de una EVM en el servidor (el mismo motor que trae geth) en un contenedor aislado por petición. No hay transacción on-chain, no se paga gas con ETH real, no hay firma de wallet. Cuando pulsas Run, el runner despliega tu contrato en una cadena en memoria recién creada, llama a tu función 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?
Dale a tu contrato una función llamada 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?
Output muestra lo que hayas escrito en stdout con 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()?
En una cadena real, los contratos de Solidity no tienen un único punto de entrada — los clientes llaman a la función pública que quieran, identificada por su selector de 4 bytes. El playground usa 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.