Solidez en TRON: redacción de contratos inteligentes para TVM — TRON Wiki

Solidez en TRON: redacción de contratos inteligentes para TVM

11 min de lectura · ⌘K buscar

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

  1. Escriba archivos .sol con pragma solidity
  2. Compile a través de TronBox / TronIDE → código de bytes + ABI
  3. Implementar con migración o TronWeb
  4. Interactúe a través de TronWeb o activador HTTP
  5. Verifique la fuente en TronScan

Entorno de ejecución: TVM explicado.

plantilla TRC-20

Token fungible estándar usando OpenZeppelin:

Código
// 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 address en cadena es hexadecimal de 20 bytes internamente
  • TronWeb convierte Base58 T... ↔ hexadecimal para API
  • msg.sender es la dirección de la persona que llama por contrato en TVM

Valide siempre las entradas:

Código
require(to != address(0), "zero address");

Diferencias con Ethereum Solidity

TemaHábito de EthereumAjuste TRON
Gasgasleft()Medición de energía mediante cadena
block.timestamp~12s de resolución~3s bloques
tx.originAntipatrónTodavía antipatrón en TRON
Oráculos de eslabones de cadenaAmpliamente utilizadoVerificar la disponibilidad de Oracle TRON
feeLimitN/AEstablecer 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 immutable y constant siempre que sea posible

Los contratos costosos aumentan los costos de transferencia USDT para los integradores.

Flujo de trabajo de prueba

  1. TronBox compilar
  2. Implementar Shasta
  3. Script TronWeb: transferir, aprobar, transferirDesde
  4. 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:

Código
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

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.