Smart Contracts en Solidity: Guía Completa para Desarrolladores Web3
Aprende a desarrollar smart contracts en Solidity desde cero. Conceptos fundamentales, mejores prácticas y deploy en Ethereum/Polygon.
¿Qué es un Smart Contract?
Un smart contract es un programa que se ejecuta en una blockchain. Una vez desplegado, su código es inmutable y se ejecuta exactamente como fue programado, sin intermediarios.
Características principales:
- Inmutables: No se pueden modificar después del deploy
- Transparentes: Cualquiera puede ver el código
- Determinísticos: Misma entrada = misma salida, siempre
- Autónomos: Se ejecutan solos cuando se cumplen condiciones
Empezando con Solidity
Solidity es el lenguaje más usado para smart contracts en Ethereum y blockchains compatibles (Polygon, BSC, Arbitrum, etc.).Tu primer contrato
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
contract MiPrimerContrato {
string public mensaje;
address public owner;
constructor(string memory _mensajeInicial) {
mensaje = _mensajeInicial;
owner = msg.sender;
}
function actualizarMensaje(string memory _nuevoMensaje) public {
require(msg.sender == owner, "Solo el owner puede actualizar");
mensaje = _nuevoMensaje;
}
}
Desglose del código:
pragma solidity ^0.8.19: Versión del compiladorcontract: Define el smart contract (similar a una clase)public: Variables/funciones accesibles externamenteconstructor: Se ejecuta una sola vez al deploymsg.sender: Dirección que llama la funciónrequire: Valida condiciones (revierte si falla)
Tipos de Datos en Solidity
Tipos de valor
uint256 numero = 100; // Entero sin signo (0 a 2^256-1)
int256 numeroNegativo = -50; // Entero con signo
bool activo = true; // Booleano
address wallet = 0x123...; // Dirección Ethereum (20 bytes)
bytes32 hash = 0xabc...; // Bytes fijos
Tipos de referencia
string nombre = "Kevin"; // Texto dinámico
uint[] numeros = [1, 2, 3]; // Array dinámico
mapping(address => uint) balances; // Key-value store
Patrones Comunes en Smart Contracts
1. Control de Acceso (Ownable)
modifier onlyOwner() {
require(msg.sender == owner, "No autorizado");
_;
}
function funcionAdmin() public onlyOwner {
// Solo el owner puede ejecutar
}
2. Pausable
bool public paused;
modifier whenNotPaused() {
require(!paused, "Contrato pausado");
_;
}
function pause() public onlyOwner {
paused = true;
}
3. Reentrancy Guard
bool private locked;
modifier noReentrant() {
require(!locked, "Reentrancy detectado");
locked = true;
_;
locked = false;
}
Herramientas de Desarrollo Web3
| Herramienta | Uso |
| Hardhat | Framework de desarrollo y testing |
| Foundry | Testing ultrarrápido en Rust |
| Thirdweb | Deploy simplificado + SDKs |
| OpenZeppelin | Contratos auditados y seguros |
| Remix | IDE online para prototipos |
Deploy con Thirdweb
Thirdweb simplifica el deploy y la interacción con contratos:
import { ThirdwebSDK } from "thirdweb";
const sdk = ThirdwebSDK.fromPrivateKey(PRIVATE_KEY, "polygon");
// Deploy de un contrato
const contractAddress = await sdk.deployer.deployNFTCollection({
name: "Mi Colección",
primary_sale_recipient: "0x...",
});
// Interactuar con el contrato
const contract = await sdk.getContract(contractAddress);
await contract.erc721.mint({ name: "NFT #1", image: "ipfs://..." });
Mejores Prácticas de Seguridad
1. Usa OpenZeppelin
No reinventes la rueda. Usa contratos auditados:import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
2. Valida todas las entradas
function transferir(address to, uint amount) public {
require(to != address(0), "Direccion invalida");
require(amount > 0, "Monto debe ser mayor a 0");
require(balances[msg.sender] >= amount, "Saldo insuficiente");
}
3. Haz auditorías antes de mainnet
- Slither (análisis estático)
- Mythril (detección de vulnerabilidades)
- Auditoría profesional para proyectos serios
4. Usa testnets primero
Siempre prueba en Sepolia, Mumbai o Goerli antes de mainnet.Recursos para Seguir Aprendiendo
- CryptoZombies: Curso interactivo gratuito
- Solidity by Example: Patrones con código
- Ethereum Yellow Paper: Para los más técnicos
- OpenZeppelin Docs: Referencia de contratos seguros
Conclusión
El desarrollo Web3 abre oportunidades únicas: DeFi, NFTs, DAOs, gaming on-chain. Solidity es tu puerta de entrada a este ecosistema.
¿Necesitas ayuda con un proyecto blockchain? Hablemos sobre cómo implementar smart contracts para tu caso de uso.
Preguntas Frecuentes
¿Qué lenguaje se usa para programar smart contracts?
¿Cuánto cuesta desarrollar un smart contract?
¿Es seguro usar smart contracts?
¿Puedo modificar un smart contract después de desplegarlo?
¿Qué blockchain es mejor para mi proyecto?
¿Necesitas ayuda con tu proyecto?
En Soluciones Web desarrollamos soluciones de IA, automatización y desarrollo web. Consultoría inicial gratuita.