Solidez en TRON: redacción de contratos inteligentes para TVM
La solidez es el lenguaje dominante para los contratos inteligentes TRON. Los desarrolladores familiarizados con los patrones Ethereum ERC-20 y DeFi pueden trasladar gran parte de su conocimiento a TRC-20 y TVM, prestando atención a los formatos de direcciones, los costos de energía y las diferencias en la cadena de herramientas.
Esta guía cubre las convenciones de Solidity en TRON, la implementación de tokens estándar, los errores comunes y el camino desde el código hasta la red principal.
Solidez → Tubería TVM
- Escriba archivos
.solconpragma solidity - Compile a través de TronBox / TronIDE → código de bytes + ABI
- Implementar con migración o TronWeb
- Interactúe a través de TronWeb o activador HTTP
- Verifique la fuente en TronScan
Entorno de ejecución: TVM explicado.
plantilla TRC-20
Token fungible estándar usando OpenZeppelin:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
contract ExampleToken is ERC20, Ownable {
constructor() ERC20("Example", "EXM") Ownable(msg.sender) {
_mint(msg.sender, 1_000_000 * 10 ** decimals());
}
function mint(address to, uint256 amount) external onlyOwner {
_mint(to, amount);
}
}
mint con onlyOwner es conveniente pero peligroso si la clave del propietario está comprometida - guía de seguridad.
Manejo de direcciones
- El tipo
addressen cadena es hexadecimal de 20 bytes internamente - TronWeb convierte Base58
T...↔ hexadecimal para API msg.senderes la dirección de la persona que llama por contrato en TVM
Valide siempre las entradas:
require(to != address(0), "zero address");
Diferencias con Ethereum Solidity
| Tema | Hábito de Ethereum | Ajuste TRON |
|---|---|---|
| Gas | gasleft() | Medición de energía mediante cadena |
block.timestamp | ~12s de resolución | ~3s bloques |
tx.origin | Antipatrón | Todavía antipatrón en TRON |
| Oráculos de eslabones de cadena | Ampliamente utilizado | Verificar la disponibilidad de Oracle TRON |
feeLimit | N/A | Establecer en TronWeb opciones de envío |
Vuelva a probar los protectores de reentrada, los patrones call y delegatecall en Shasta.
Patrones de eficiencia energética
- Variables de almacenamiento de paquetes.
- Minimizar las cadenas en cadena (nombre/símbolo aceptable en la implementación)
- Evite bucles ilimitados sobre matrices de usuarios
- Utilice
immutableyconstantsiempre que sea posible
Los contratos costosos aumentan los costos de transferencia USDT para los integradores.
Flujo de trabajo de prueba
- TronBox compilar
- Implementar Shasta
- Script TronWeb: transferir, aprobar, transferirDesde
- Casos extremos difusos: cantidad cero, unidad máxima, intento de reentrada
Vulnerabilidades comunes en TRON
Misma clase que EVM:
- Reentrada
- Desbordamiento de enteros (Solidity 0.8+ tiene comprobaciones integradas)
- Falta control de acceso en
mint/withdraw - Lista negra de Honeypot (tokens maliciosos)
Los auditores aplican metodologías de Ethereum al código de bytes de TVM.
Integración con dApps
Llamadas frontend a través de TronLink-inyectado TronWeb:
const contract = await tronWeb.contract(abi, contractAddress);
await contract.transfer(to, amount).send({ feeLimit: 100_000_000 });
Backend: enviar USDT mediante programación.
Verificar y publicar ABI
Después de la implementación:
- TronScan verificación de contrato
- Publicar ABI en documentos para integradores.
- Funciones y propiedad de administración de documentos.
Fijación de versión del compilador
Fije la versión exacta de solc en la configuración de TronBox. La verificación TronScan requiere que la configuración del compilador coincida, incluidas las ejecuciones de optimización. Las configuraciones no coincidentes fallan en la verificación incluso con el código fuente correcto.
Importar rutas y OpenZeppelin
Utilice las versiones @openzeppelin/contracts probadas en TVM. Algunos patrones específicos de Ethereum (por ejemplo, ciertas interfaces de Oracle) necesitan adaptación. Pruebe SafeERC20 para las interacciones TRC-20 en sus contratos: existen tokens no estándar en TRON con un comportamiento de tarifa por transferencia que rompe las integraciones ingenuas.
Lista de verificación para solucionar problemas
Si algo sale mal en TRON, trátelo como un problema de depuración estructurado: confirme el txid exacto en la cadena, verifique la dirección del contrato de destino y solo entonces decida si la falla es recuperable. En TRON, muchos problemas "misteriosos" son simplemente uno de: red incorrecta (mainnet vs testnet), contrato de token incorrecto (falso USDT/tokens con nombres similares), recursos insuficientes (OUT_OF_ENERGY/ancho de banda) o retraso en la interfaz de usuario/indexador entre la billetera y el explorador.
Comience con estas comprobaciones en cadena:
- Copie siempre el txid/hash completo de su billetera o explorador.
- Confirme el estado del resultado del tx en TronScan (SUCCESS, REVERT, OUT_OF_ENERGY o aún pendiente).
- Compruebe si la dirección del destinatario/contrato coincide con la que desea enviar.
- Si se trata de una llamada de contrato, confirme que el selector de función y los parámetros coincidan con el estándar de token que cree que está utilizando (TRC-20 vs TRC-10 vs BEP-20 en BSC).
Luego aplique la ruta de corrección para su categoría:
- Confirmar el estado y los parámetros de la transacción.
- Verificar direcciones (contrato de token, destinatario, enrutador/gastador).
- Agregar o delegar recursos (Energía/Ancho de banda) cuando el fallo esté basado en recursos.
Errores comunesEstos patrones causan la mayoría de los errores a nivel de usuario:
- Usar direcciones de mainnet en testnet (o al revés).
- Copiar un símbolo de token en lugar de la dirección del contrato TRC-20 real.
- Firmar la dirección de aprobación/gastador incorrecta porque el enlace de la interfaz de usuario es malicioso o está desactualizado.
- Reintentar sin cambiar la entrada fallida (por ejemplo, REVERT sigue revirtiéndose hasta que corrija el parámetro).
Si no está seguro, no “simplemente envíe de nuevo”. Realice un cambio controlado, verifique en TronScan y luego continúe.
Preguntas frecuentes
¿Cómo sé si una transacción está realmente confirmada?
Utilice TronScan y verifique el estado del resultado del tx. Las etiquetas "pendientes" de la billetera pueden retrasarse; El estado de la cadena es la fuente de la verdad. Copie txid y verifique SUCCESS/REVERT/OUT_OF_ENERGY, no solo el texto de la interfaz de usuario.
¿Por qué la interfaz de usuario difiere de TronScan?
Algunas billeteras y dApps utilizan diferentes indexadores o capas de caché. Es normal que haya un breve retraso entre la transmisión y la indexación; compare txid y espere a que la cadena se estabilice antes de concluir que hay una falla.
¿Qué debo hacer después de un REVERT?
Detenga y decodifique la llamada fallida. La mayoría de los REVERT se deben a parámetros no válidos, dirección de contrato incorrecta, aprobaciones faltantes o una falta de coincidencia entre el estándar del token y el método. Solucione la causa y luego vuelva a firmar.
¿Es seguro firmar una aprobación ilimitada?
Las aprobaciones ilimitadas son seguras solo para direcciones de gastadores confiables que usted haya verificado (fuente verificada, enrutador correcto y contrato de token esperado). Para las pruebas, prefiera aprobaciones limitadas y revoque una vez que haya terminado.
¿Qué recursos requiere TRON para las llamadas de contrato?
La ejecución de contratos inteligentes consume principalmente energía, mientras que los bytes de transacciones consumen ancho de banda. Si recibe OUT_OF_ENERGY, agregue/congela/delegue energía. Si se agota el ancho de banda, concéntrese en mantener suficiente líquido TRX para bytes y asignación de recursos.
¿Cómo puedo reducir los tickets de soporte?
Muestre a los usuarios un mensaje claro de "qué sucedió" basado en el estado de la cadena y vincule directamente a la guía relevante (pendiente, fallida, sin energía o verificación). Guarda txid para que puedas conciliar rápidamente.
Guías relacionadas
- TVM explicado
- Contratos inteligentes de TronBox
- Verificar contrato inteligente TRON
- Implementar TRC-20 TronWeb
Preguntas frecuentes
¿Qué versión de Solidity debo usar en TRON?
Haga coincidir la versión admitida por su compilador TronBox o TronIDE, comúnmente 0.8.x. Anclar versiones en producción y verificar con el mismo compilador en TronScan.
¿Puedo utilizar contratos OpenZeppelin en TRON?
Sí. Importe OpenZeppelin ERC20, Ownable, etc. y compílelo con TronBox. Verifique la compatibilidad de licencia y versión.
¿Es Solidity la única opción?
Predomina la solidez. Algunas herramientas experimentan con otros lenguajes que se compilan en TVM: los tokens de producción son casi todos Solidity.
¿Cómo invoco otro contrato?
Patrón interface + Contract(addr).method() idéntico a Ethereum.
TRC-20 ¿mismo nombre de archivo que ERC20.sol?
Los nombres de los paquetes OpenZeppelin dicen ERC20 pero se implementan en TRON como comportamiento estándar TRC-20.
Gracias — tu feedback nos ayuda a mejorar la documentación.