Ir al contenido

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.


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.

MétodoCómo funciona
Hacer Staking de TRXCongela 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 demanda100 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.

stake_energy.js
// 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 resultante
const resources = await tronWeb.trx.getAccountResources('TYourAddress...');
console.log('Energía disponible:', resources.EnergyLimit - resources.EnergyUsed);
  1. Energía en Staking (gratuita, se recupera en 24 horas)
  2. Quema de TRX a 100 sun por unidad

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.

MétodoCómo funciona
Asignación gratuita600 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 TRXAncho de banda adicional del Staking. Pool de la red: 43,200,000,000 unidades/día
Quemar TRX bajo demanda1,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.


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.

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_factor aumenta 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ámetroValor
Umbral diario5,000,000,000 de Energía
Factor de incremento0.2 — la penalización aumenta un 20% por período de evaluación por encima del umbral
Factor máximo3.4 — la penalización puede llegar hasta el 340% del costo base
Factor de disminución0.25 — la penalización disminuye cuando el contrato cae por debajo del umbral
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, el energy_factor sube 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).

Terminal
# 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"

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).

PropiedadValor
UnidadSun (1 TRX = 1,000,000 sun)
Máximo permitido15,000 TRX (15,000,000,000 sun)
Predeterminado si se omiteDefinido por la implementación, a menudo demasiado bajo
Si se superaLa transacción revierte; se consume una parte del límite de comisión
fee_limit.js
// 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)

Terminal
# 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)

Terminal
# 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
}'
Límite de comisión (TRX) ≈ (Energía estimada × 2) ÷ 10,000

Para 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).


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.

ParámetroTipoPredeterminadoDescripción
consume_user_resource_percent0–100100Porcentaje de Energía a cargo del llamante. Establecer en 0 para que el desplegador pague todo.
origin_energy_limituintvaríaEnergía máxima que el desplegador proporcionará por llamada. Actúa como límite por llamada en los subsidios del desplegador.
deploy_delegated.js
// 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%)»
deploy_split.js
// 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
});
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.

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,000

Establé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
Terminal
# 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
}'
delegate_sdk.js
// Tarea: Gestionar la delegación de recursos mediante el SDK de forma programática.
// Delegar
await tronWeb.trx.delegateResource(
1_000_000_000, // sun
'TOperatorAddress...',
'ENERGY',
'TStakerAddress...',
false,
);
// Recuperar
await tronWeb.trx.undelegateResource(
1_000_000_000,
'TOperatorAddress...',
'ENERGY',
'TStakerAddress...',
);

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:

Ventana de terminal
{
"lock": true,
"lock_period": 86400 // ~3 días (86,400 bloques × 3s 259,200 segundos)
}

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.

staking_api.sol
// 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 contrato
address(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ía
receiver.unDelegateResource(amount, 1);
// Votar por Super Representantes
address[] memory srList = new address[](1);
uint[] memory tpList = new uint[](1);
srList[0] = srAddress;
tpList[0] = votingPower;
address(srList[0]).vote(srList, tpList);

VerificaciónNotas
Ejecutar triggerconstantcontract en un fork de la red principalObtener Energía base, no estimación de la red de prueba
Multiplicar por 1.5–2.0× para el límite de comisiónMargen para la variación del DEM
Verificar energy_factor del contrato objetivoUSDT y otros contratos populares suelen tener un factor superior a 0
Establecer originEnergyLimit si se usa delegación de comisionesDebe 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 suficienteUn desplegador con poco Staking = los usuarios pagan comisiones inesperadamente