Modelo de Comisiones y Delegación
TRON sustituye el gas tradicional por un modelo de recursos dual: Energía para la ejecución de contratos inteligentes y Ancho de banda para los datos de las transacciones. Esta guía explica cómo adquirir estos recursos mediante el staking, el impacto del Modelo de Energía Dinámica (DEM) en los contratos populares y cómo implementar la delegación de comisiones para una experiencia de usuario sin gas.
Energía
Sección titulada «Energía»La Energía se consume durante la ejecución de contratos inteligentes. Cada opcode de la TVM consume Energía, de forma análoga al gas de la EVM.
Cómo Obtener Energía
Sección titulada «Cómo Obtener Energía»| Método | Cómo funciona |
|---|---|
| Hacer Staking de TRX | Congela TRX para obtener Energía. Tu parte: (tu TRX en Staking ÷ total de TRX en Staking en la red) × 180,000,000,000 unidades/día |
| Quemar TRX bajo demanda | 100 sun por unidad de Energía (0.0001 TRX). Se usa automáticamente cuando tu Energía en Staking se agota. |
La red asigna 180 mil millones de Energía por día entre todos los stakers. La Energía en Staking se recupera gradualmente a lo largo de 24 horas.
Staking para Energía (tronweb)
Sección titulada «Staking para Energía (tronweb)»// Tarea: Congelar TRX nativo para obtener Energía para llamadas a contratos inteligentes.// Hacer Staking de 1,000 TRX para Energía (monto en sun: 1 TRX = 1,000,000 sun)await tronWeb.trx.freezeBalanceV2( 1_000_000_000, // sun 1, // tipo de recurso: 0 = Ancho de banda, 1 = Energía);
// Verificar el saldo de Energía resultanteconst resources = await tronWeb.trx.getAccountResources('TYourAddress...');console.log('Energía disponible:', resources.EnergyLimit - resources.EnergyUsed);Prioridad de Consumo
Sección titulada «Prioridad de Consumo»- Energía en Staking (gratuita, se recupera en 24 horas)
- Quema de TRX a 100 sun por unidad
Ancho de Banda
Sección titulada «Ancho de Banda»El Ancho de banda mide el tamaño de la transacción en bytes. Cada transacción consume Ancho de banda proporcional a su longitud en bytes en la base de datos de la red.
Cómo Obtener Ancho de Banda
Sección titulada «Cómo Obtener Ancho de Banda»| Método | Cómo funciona |
|---|---|
| Asignación gratuita | 600 puntos de Ancho de banda por cuenta por día, de forma automática — suficiente para ~2–3 transferencias simples de TRX |
| Hacer Staking de TRX | Ancho de banda adicional del Staking. Pool de la red: 43,200,000,000 unidades/día |
| Quemar TRX bajo demanda | 1,000 sun por unidad de Ancho de banda cuando se agotan las asignaciones gratuitas y en Staking |
Las transferencias de TRX y de tokens TRC-10 solo cuestan Ancho de banda (sin Energía). Las llamadas a contratos inteligentes cuestan ambas: Ancho de banda por los bytes de la transacción, y Energía por la ejecución.
Modelo de Energía Dinámica (DEM)
Sección titulada «Modelo de Energía Dinámica (DEM)»El Modelo de Energía Dinámica (DEM) aplica un multiplicador de penalización a los contratos que consumen más de su parte proporcional del pool diario de Energía de la red. Esto evita que un solo contrato monopolice los recursos de la red.
Cómo Funciona el Escalado Punitivo
Sección titulada «Cómo Funciona el Escalado Punitivo»El modelo introduce una variable llamada energy_factor para cada contrato.
- Estado Normal:
energy_factor = 0. Pagas el costo de Energía base. - Estado Congestionado: Si el consumo de Energía de un contrato supera un umbral (actualmente 5,000,000,000 de Energía por Época de 6 horas), el
energy_factoraumenta para el siguiente período de mantenimiento disponible.
El factor no sube de inmediato. Escala exponencialmente durante cada período de mantenimiento (el evento de 6 segundos al final de cada Época de 6 horas) que el contrato se mantiene por encima del umbral:
- Período 1:
energy_factor = 0.2(Costo total: 1.2× base) - Período 2:
energy_factor = (1 + 0.2) * (1 + 0.2) - 1 = 0.44(Costo total: 1.44× base) - Continuación: Esto continúa hasta alcanzar el límite máximo de
3.4.
Parámetros de la Red Principal
Sección titulada «Parámetros de la Red Principal»| Parámetro | Valor |
|---|---|
| Umbral diario | 5,000,000,000 de Energía |
| Factor de incremento | 0.2 — la penalización aumenta un 20% por período de evaluación por encima del umbral |
| Factor máximo | 3.4 — la penalización puede llegar hasta el 340% del costo base |
| Factor de disminución | 0.25 — la penalización disminuye cuando el contrato cae por debajo del umbral |
Fórmula del Costo Efectivo
Sección titulada «Fórmula del Costo Efectivo»Energía Final = Energía Base × (1 + energy_factor)Las Matemáticas: Penalización 3.4× vs. Costo Total 4.4×
Sección titulada «Las Matemáticas: Penalización 3.4× vs. Costo Total 4.4×»Los desarrolladores y usuarios suelen confundirse sobre si la comisión máxima es 3.4× o 4.4×. Aquí está la distinción:
- El 3.4× (
energy_factor): Este es el valor de la “penalización” en sí. Cuando un contrato se usa intensamente, elenergy_factorsube hasta alcanzar el límite de 3.4. - El 4.4× (Multiplicador Total): Dado que la fórmula total de Energía es
Energía Base × (1 + energy_factor), un factor máximo de 3.4 resulta en un costo final de 4.4× la Energía base (1 (Base) + 3.4 (Penalización) = 4.4).
Cuando ves 3.4×, se refiere a la penalización añadida. Cuando ves 4.4× (o 440%), se refiere al costo total final que se te cobra.
La Energía base para una transferencia de USDT es ~14,650 (titular existente de USDT) o ~29,650 (destinatario con saldo cero). Con energy_factor = 0 (sin congestión): 14,650 de Energía. Con el factor máximo (penalización del 340%, energy_factor = 3.4): 14,650 × 4.4 = ~64,460 de Energía (titular existente) o 29,650 × 4.4 = ~130,460 de Energía (cuenta nueva).
Verificar el Factor Actual de un Contrato
Sección titulada «Verificar el Factor Actual de un Contrato»# Tarea: Consultar el factor de Energía dinámica actual de un contrato específico.curl -X POST https://api.trongrid.io/wallet/getcontractinfo \ -d '{ "value": "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t", "visible": true }'
# La respuesta incluye: el campo "energy_factor"Configuración de Límites de Comisiones
Sección titulada «Configuración de Límites de Comisiones»Toda transacción que cambia de estado requiere un feeLimit — el máximo de TRX que el llamante está dispuesto a quemar si se agota la Energía. (Piensa en esto como establecer un tiempo de espera estricto o un límite de gasto en una consulta de base de datos compleja para asegurarte de que un error no vacíe tu cuenta).
| Propiedad | Valor |
|---|---|
| Unidad | Sun (1 TRX = 1,000,000 sun) |
| Máximo permitido | 15,000 TRX (15,000,000,000 sun) |
| Predeterminado si se omite | Definido por la implementación, a menudo demasiado bajo |
| Si se supera | La transacción revierte; se consume una parte del límite de comisión |
// Tarea: Definir el máximo de TRX a quemar por Energía antes de que revierta una transacción.await contract.someMethod(arg1, arg2).send({ feeLimit: 150_000_000, // máximo 150 TRX shouldPollResponse: true, // esperar confirmación});Estimación de Energía Antes de Configurar Límites
Sección titulada «Estimación de Energía Antes de Configurar Límites»Método 1 — triggerconstantcontract (simular sin transmitir)
# Tarea: Simular la ejecución de un contrato sin transmitir para estimar la Energía.curl -X POST https://api.trongrid.io/wallet/triggerconstantcontract \ -d '{ "owner_address": "TCallerAddress...", "contract_address": "TContractAddress...", "function_selector": "transfer(address,uint256)", "parameter": "000000000000000000000000<recipient_hex_without_41>...", "visible": true }'Devuelve energy_used. Multiplica por 1.5–2.0× como margen al configurar feeLimit (la simulación se ejecuta con el factor actual; el factor en la red principal puede aumentar antes de que tu transacción se confirme).
Método 2 — estimateenergy (java-tron 4.7.0.1+, más preciso)
# Tarea: Usar la API estimateenergy para obtener datos de consumo precisos en tiempo real.curl -X POST https://api.trongrid.io/wallet/estimateenergy \ -d '{ "owner_address": "TCallerAddress...", "contract_address": "TContractAddress...", "function_selector": "transfer(address,uint256)", "parameter": "...", "visible": true }'Regla General
Sección titulada «Regla General»Límite de comisión (TRX) ≈ (Energía estimada × 2) ÷ 10,000Para una transferencia de USDT a un titular existente con DEM máximo (14,650 base × 4.4 = ~64,460 de Energía) con margen de 1.5×:
96,690 ÷ 10,000 ≈ 10 TRX → configurar feeLimit = 10_000_000 (o 20 TRX para cubrir también transferencias a cuentas nuevas).
Delegación de Comisiones
Sección titulada «Delegación de Comisiones»La delegación de comisiones permite que el desplegador de un contrato subsidie parte o la totalidad del costo de Energía para los usuarios que llaman a su contrato. Los usuarios pagan menos o nada; la Energía en Staking del desplegador absorbe el costo. Esta es la base de la experiencia de usuario sin gas en las DApps de TRON.
Dos Parámetros de Despliegue
Sección titulada «Dos Parámetros de Despliegue»| Parámetro | Tipo | Predeterminado | Descripción |
|---|---|---|---|
consume_user_resource_percent | 0–100 | 100 | Porcentaje de Energía a cargo del llamante. Establecer en 0 para que el desplegador pague todo. |
origin_energy_limit | uint | varía | Energía máxima que el desplegador proporcionará por llamada. Actúa como límite por llamada en los subsidios del desplegador. |
El Desplegador Paga Todas las Comisiones
Sección titulada «El Desplegador Paga Todas las Comisiones»// Tarea: Desplegar un contrato donde el desplegador subsidia el 100% de las comisiones de Energía del usuario.const deployed = await tronWeb.contract().new({ abi: compiledAbi, bytecode: compiledBytecode, feeLimit: 1_000_000_000, userFeePercentage: 0, // el usuario paga 0% de la Energía originEnergyLimit: 10_000_000, // el desplegador cubre hasta 10M de Energía por llamada});Con userFeePercentage: 0, los llamantes no necesitan Energía en Staking y pueden establecer feeLimit: 0. Sus transacciones tienen éxito siempre que el pool de Energía del desplegador sea suficiente y la llamada se mantenga dentro del originEnergyLimit.
Comisiones Compartidas (Desplegador 70%, Usuario 30%)
Sección titulada «Comisiones Compartidas (Desplegador 70%, Usuario 30%)»// Tarea: Desplegar un contrato con costos de Energía compartidos (30% usuario, 70% desplegador).const deployed = await tronWeb.contract().new({ abi: compiledAbi, bytecode: compiledBytecode, feeLimit: 1_000_000_000, userFeePercentage: 30, // el usuario paga el 30% de la Energía originEnergyLimit: 5_000_000, // el desplegador cubre hasta 5M de Energía por llamada});Cálculo del Límite de Energía
Sección titulada «Cálculo del Límite de Energía»EnergyLimit total disponible para una llamada = Energía soportable del llamante + Energía soportable del desplegador
Energía soportable del llamante = min( feeLimit ÷ 100 sun, ← convertido a unidades de Energía Energía en Staking del llamante + saldo TRX ÷ 100 sun)
Energía soportable del desplegador = min( origin_energy_limit, ← límite por llamada Energía en Staking actual del desplegador)Si la llamada requiere más Energía que este total, se revierte. El originEnergyLimit del desplegador evita que una sola llamada maliciosa o costosa agote todo el pool en Staking del desplegador.
Dimensionar originEnergyLimit
Sección titulada «Dimensionar originEnergyLimit»Establece originEnergyLimit para cubrir la Energía máxima que puede consumir la función más costosa de tu contrato, incluyendo el multiplicador del Modelo de Energía Dinámica:
originEnergyLimit ≥ costo_energía_base × factor_máximo_energía
Ejemplo para una función DeFi compleja (100,000 base × factor máximo 3.4):originEnergyLimit = 340,000Establécelo generosamente durante el desarrollo y ajústalo después de tener datos reales de llamadas en el historial de transacciones de TRONSCAN.
Delegación de Recursos (Staking y Delegación a Otra Dirección)
Sección titulada «Delegación de Recursos (Staking y Delegación a Otra Dirección)»Independientemente de la delegación de comisiones a nivel de contrato, puedes delegar tus recursos en Staking a otra dirección. Útil para:
- Cubrir los costos de Energía de una billetera activa sin darle acceso a tu TRX
- Proporcionar Energía a una cuenta de contrato para la activación de nuevas direcciones de usuarios
- Patrocinio de gas donde una cuenta de tesorería separada cubre los costos de operación de la DApp
# Tarea: Delegar manualmente Energía en Staking a otra dirección.curl -X POST https://api.trongrid.io/wallet/delegateresource \ -d '{ "owner_address": "TStakerAddress...", "receiver_address": "TOperatorAddress...", "balance": 1000000000, "resource": "ENERGY", "lock": false, "visible": true }'// Tarea: Gestionar la delegación de recursos mediante el SDK de forma programática.// Delegarawait tronWeb.trx.delegateResource( 1_000_000_000, // sun 'TOperatorAddress...', 'ENERGY', 'TStakerAddress...', false,);
// Recuperarawait tronWeb.trx.undelegateResource( 1_000_000_000, 'TOperatorAddress...', 'ENERGY', 'TStakerAddress...',);Delegación Bloqueada
Sección titulada «Delegación Bloqueada»Establecer lock: true con un lock_period (en bloques, aproximadamente 3 segundos cada uno) evita que el staker recupere los recursos por la duración especificada — útil para acuerdos de nivel de servicio donde el receptor necesita disponibilidad garantizada de recursos:
{ "lock": true, "lock_period": 86400 // ~3 días (86,400 bloques × 3s ≈ 259,200 segundos)}API de Staking en Solidity
Sección titulada «API de Staking en Solidity»Los contratos pueden hacer Staking, delegar y votar directamente desde Solidity usando extensiones de precompilados de la TVM. Útil para contratos que gestionan fondos de usuarios y necesitan optimizar los costos de recursos de forma programática.
// Tarea: Ejecutar Staking y delegación directamente desde la lógica del contrato usando precompilados.// Hacer Staking de TRX para Energía desde dentro de un contratoaddress(0x100000b).delegatecall( abi.encode(uint(amount), uint(1)) // freezeBalanceV2);
// O usar sintaxis de alto nivel (tvm-solc 0.8.18+)address payable receiver = payable(receiverAddress);receiver.delegateResource(amount, 1); // 1 = Energíareceiver.unDelegateResource(amount, 1);
// Votar por Super Representantesaddress[] memory srList = new address[](1);uint[] memory tpList = new uint[](1);srList[0] = srAddress;tpList[0] = votingPower;address(srList[0]).vote(srList, tpList);Lista de Verificación Previa al Despliegue
Sección titulada «Lista de Verificación Previa al Despliegue»| Verificación | Notas |
|---|---|
Ejecutar triggerconstantcontract en un fork de la red principal | Obtener Energía base, no estimación de la red de prueba |
| Multiplicar por 1.5–2.0× para el límite de comisión | Margen para la variación del DEM |
Verificar energy_factor del contrato objetivo | USDT y otros contratos populares suelen tener un factor superior a 0 |
Establecer originEnergyLimit si se usa delegación de comisiones | Debe cubrir la peor llamada posible incluyendo la penalización dinámica |
| Presupuestar para la activación del primer usuario (25,000 de Energía) | Requerido cuando el contrato transfiere a direcciones no activadas |
| Asegurarse de que la billetera del desplegador tenga Energía en Staking suficiente | Un desplegador con poco Staking = los usuarios pagan comisiones inesperadamente |