Ir al contenido

Cuentas y Permisos

Las cuentas de TRON utilizan la misma base criptográfica que Ethereum (ECDSA con secp256k1), pero introducen permisos multifirma nativos y un modelo de activación explícito. Esta guía cubre la codificación de direcciones, los requisitos de activación y el sistema de permisos integrado para una gestión de cuentas segura.

Una dirección de TRON se deriva de una clave privada usando el mismo proceso que Ethereum, con una diferencia: los bytes de la dirección se les antepone el prefijo 41 antes de la codificación Base58Check.

Cada dirección de TRON existe en dos representaciones:

FormatoPrefijoLongitudEjemplo
Hex4142 caracteres418840E6C55B9ADA326D211D818C34A994AECED808
Base58CheckT34 caracteresTNPeeaaFB7K9cmo4uQpcU32zGK8G1NYqeL

Ambas hacen referencia a la misma cuenta. El formato hex aparece en las llamadas de API sin procesar y en la codificación ABI interna. El formato Base58Check (prefijo T) es el que los usuarios ven en las billeteras y exploradores.

Address Derivation
# Tarea: Seguir estos pasos para derivar una dirección TRON desde una clave privada.
1. Generar una clave privada aleatoria de 256 bits (64 caracteres hexadecimales)
2. Derivar la clave pública usando ECDSA secp256k1
3. Aplicar hash Keccak-256 a la clave pública, tomar los últimos 20 bytes
4. Anteponer 0x41
5. Codificar con Base58Check → dirección con prefijo T

Este proceso es idéntico a la derivación de claves de Ethereum, salvo que en el paso 4 se antepone 41 en lugar de 00.

address_utils.js
// Tarea: Validar, convertir y derivar direcciones con TronWeb.
// Validar
tronWeb.isAddress('TNPeeaaFB7K9cmo4uQpcU32zGK8G1NYqeL'); // true
// Hex → Base58Check
tronWeb.address.fromHex('418840e6c55b9ada326d211d818c34a994aeced808');
// → 'TNPeeaaFB7K9cmo4uQpcU32zGK8G1NYqeL'
// Base58Check → Hex
tronWeb.address.toHex('TNPeeaaFB7K9cmo4uQpcU32zGK8G1NYqeL');
// → '418840e6c55b9ada326d211d818c34a994aeced808'
// Derivar dirección desde clave privada
tronWeb.address.fromPrivateKey(privateKey);
// Generar un nuevo par de claves
const { address, privateKey } = tronWeb.utils.accounts.generateAccount();

TipoDescripción
EOACuenta de Propiedad Externa. Controlada por una clave privada. Puede contener TRX, tokens y llamar a contratos.
Cuenta de ContratoSe crea cuando se despliega un contrato inteligente. La dirección se deriva del ID de la transacción de despliegue y la dirección del remitente. Sin clave privada.

Una dirección de TRON recién derivada no existe en cadena hasta que es activada. Hasta la activación, la dirección puede tener un par de claves válido, pero la red no tiene registro de ella. Muchas operaciones —incluyendo recibir transferencias TRC-20 por primera vez— desencadenan o requieren la activación.

(Para desarrolladores de Web2: A diferencia de las bases de datos tradicionales donde crear un nuevo registro de usuario es gratuito, las blockchains requieren “activar” una cuenta para prevenir el spam. Piensa en esto como pagar una pequeña comisión única de infraestructura para crear una fila permanente en la base de datos para un nuevo usuario).

Recibir una transferencia de TRX El camino más sencillo. Cuando cualquier cuenta envía TRX a una dirección nueva, la activación ocurre automáticamente. Costo: 1 TRX deducido del remitente.

API CreateAccount

Create Account
# Tarea: Llamar al endpoint wallet/createaccount para activar una dirección.
POST https://api.trongrid.io/wallet/createaccount
{
"owner_address": "TSenderAddress...",
"account_address": "TNewAddress...",
"visible": true
}

Costo: 1 TRX de owner_address.

Transferencia de token mediante contrato inteligente Si un contrato TRC-20 transfiere a una dirección no activada, la activación consume 25,000 Energía del desplegador del contrato. Los desplegadores de DApps deben presupuestar esto al incorporar nuevos usuarios — consulta Modelo de Comisiones para saber cómo configurar origin_energy_limit para cubrirlo.

check_activation.js
// Tarea: Determinar si una dirección ha sido activada en cadena.
const account = await tronWeb.trx.getAccount('TAddress...');
// Dirección no activada → objeto vacío {}
// Dirección activada → objeto con al menos { address: '...', balance: 0 }
const isActivated = Object.keys(account).length > 0;

Para mantener la estabilidad de la red, TRON aplica límites estrictos de tamaño de transacción:

  • Creación de cuenta: Las transacciones que crean una nueva cuenta deben tener estrictamente menos de 1,000 bytes.
  • Transacciones generales: Todas las transacciones (incluidos los resultados de despliegue y ejecución de contratos) tienen un tamaño máximo de 500 KB.

El sistema de permisos de TRON permite que una cuenta requiera múltiples firmantes para las transacciones, y que restrinja qué operaciones puede autorizar cada clave. Esto está integrado en el protocolo — no se necesita ningún contrato de multifirma. (Para desarrolladores de Web2: Piensa en esto como Control de Acceso Basado en Roles (RBAC) nativo, similar a requerir múltiples aprobaciones de administradores antes de ejecutar un despliegue crítico en producción).

Usos comunes:

  • Billeteras activas de exchanges que requieren aprobación M-de-N para retiros
  • Tesorería de DAO que requiere que múltiples miembros del consejo firmen
  • Separar claves operativas (uso diario) de claves administrativas (operaciones poco frecuentes y de alta confianza)
PermisoIDPredeterminadoControla
Owner (Propietario)0Umbral 1, clave propia de la cuentaTodas las operaciones, incluyendo actualizaciones de permisos
Witness (Testigo)1Solo en cuentas SRFirma de producción de bloques para Super Representantes
Active (Activo)2–9Creado automáticamente con operaciones estándarUso diario: transferencias, llamadas a contratos, Staking

Una cuenta nueva comienza con un permiso Owner y un permiso Active, ambos controlados por la propia clave de la cuenta con umbral 1.

Cada permiso define:

  • threshold — peso total mínimo de firmas requerido
  • keys — hasta 5 pares dirección/peso; cada firmante contribuye con su peso al firmar
  • operations — un bitmap de 32 bytes que especifica cuáles de los 60 tipos de transacción de TRON puede autorizar este permiso
setup_multisig.js
// Tarea: Actualizar los permisos de la cuenta para requerir 2 de 3 firmantes.
const tx = await tronWeb.transactionBuilder.updateAccountPermissions(
'TOwnerAddress...', // cuenta que se está configurando
{ // permiso owner — mantener como clave única
type: 0,
threshold: 1,
keys: [{ address: 'TOwnerAddress...', weight: 1 }],
},
null, // permiso witness (null si no es un SR)
[{ // permisos activos — requieren 2 de 3 firmantes
type: 2,
threshold: 2,
operations: '7fff1fc0033efb07000000000000000000000000000000000000000000000000',
keys: [
{ address: 'TSigner1...', weight: 1 },
{ address: 'TSigner2...', weight: 1 },
{ address: 'TSigner3...', weight: 1 },
],
}],
);
const signed = await tronWeb.trx.sign(tx);
await tronWeb.trx.sendRawTransaction(signed);

Costo: 100 TRX por la transacción de actualización de permisos.

Una vez establecido el umbral de multifirma, las transacciones de esa cuenta deben ser firmadas por suficientes titulares de claves para alcanzar el umbral antes de ser transmitidas:

sign_multisig.js
// Tarea: Firmar una transacción secuencialmente con múltiples claves privadas.
// El Firmante 1 añade su firma
const partialSigned = await tronWeb.trx.multiSign(unsignedTx, privateKey1);
// El Firmante 2 añade su firma al mismo objeto
const fullySigned = await tronWeb.trx.multiSign(partialSigned, privateKey2);
// Umbral alcanzado — transmitir
const result = await tronWeb.trx.sendRawTransaction(fullySigned);

Cada firmante adicional más allá del primero añade 1 TRX a la comisión de la transacción.

El campo operations es una cadena hexadecimal de 256 bits donde cada bit controla uno de los 60 tipos de contrato de TRON. El valor predeterminado del bitmap de permisos activos:

Operations Bitmap
# Tarea: Anotar el bitmap predeterminado para permisos activos completos.
7fff1fc0033efb07000000000000000000000000000000000000000000000000

Esto otorga todas las operaciones comunes excepto AccountPermissionUpdateContract (reservada para Owner). Si necesitas un permiso activo restringido —por ejemplo, una clave de operador que solo pueda enviar TRX pero no desplegar contratos—, puedes calcular un bitmap personalizado a partir de la tabla de índices de tipos de contrato en la documentación TIP de TRON.


resources_summary.js
// Tarea: Obtener todos los recursos disponibles y consumidos de una cuenta.
const resources = await tronWeb.trx.getAccountResources('TAddress...');
// Energía
console.log(resources.EnergyLimit); // Energía total disponible del Staking
console.log(resources.EnergyUsed); // Energía consumida en el período actual
console.log(resources.TotalEnergyLimit); // Tu parte del pool de Energía de la red
// Ancho de banda
console.log(resources.NetLimit); // Ancho de banda disponible del Staking
console.log(resources.NetUsed); // Ancho de banda del Staking consumido
console.log(resources.freeNetLimit); // Asignación gratuita (600/día)
console.log(resources.freeNetUsed); // Ancho de banda gratuito consumido hoy
// TRON Power (peso de voto del Staking)
console.log(resources.tronPowerUsed); // TP actualmente asignado a votos
console.log(resources.tronPowerLimit); // TP total (= TRX total en Staking)

Para la mecánica del Staking y cómo incrementar estos límites, consulta Modelo de Comisiones y Delegación.