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.
Formato de Dirección
Sección titulada «Formato de Dirección»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:
| Formato | Prefijo | Longitud | Ejemplo |
|---|---|---|---|
| Hex | 41 | 42 caracteres | 418840E6C55B9ADA326D211D818C34A994AECED808 |
| Base58Check | T | 34 caracteres | TNPeeaaFB7K9cmo4uQpcU32zGK8G1NYqeL |
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.
Pasos de Derivación
Sección titulada «Pasos de Derivación»# 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 secp256k13. Aplicar hash Keccak-256 a la clave pública, tomar los últimos 20 bytes4. Anteponer 0x415. Codificar con Base58Check → dirección con prefijo TEste 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.
Utilidades de Dirección (tronweb)
Sección titulada «Utilidades de Dirección (tronweb)»// Tarea: Validar, convertir y derivar direcciones con TronWeb.// ValidartronWeb.isAddress('TNPeeaaFB7K9cmo4uQpcU32zGK8G1NYqeL'); // true
// Hex → Base58ChecktronWeb.address.fromHex('418840e6c55b9ada326d211d818c34a994aeced808');// → 'TNPeeaaFB7K9cmo4uQpcU32zGK8G1NYqeL'
// Base58Check → HextronWeb.address.toHex('TNPeeaaFB7K9cmo4uQpcU32zGK8G1NYqeL');// → '418840e6c55b9ada326d211d818c34a994aeced808'
// Derivar dirección desde clave privadatronWeb.address.fromPrivateKey(privateKey);
// Generar un nuevo par de clavesconst { address, privateKey } = tronWeb.utils.accounts.generateAccount();Tipos de Cuenta
Sección titulada «Tipos de Cuenta»| Tipo | Descripción |
|---|---|
| EOA | Cuenta de Propiedad Externa. Controlada por una clave privada. Puede contener TRX, tokens y llamar a contratos. |
| Cuenta de Contrato | Se 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. |
Activación de Cuenta
Sección titulada «Activación de Cuenta»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).
Métodos de Activación
Sección titulada «Métodos de Activación»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
# 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.
Verificar Estado de Activación
Sección titulada «Verificar Estado de Activación»// 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;Límites de Tamaño de Transacción
Sección titulada «Límites de Tamaño de Transacción»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.
Permisos y Multifirma
Sección titulada «Permisos y Multifirma»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)
Tres Niveles de Permisos
Sección titulada «Tres Niveles de Permisos»| Permiso | ID | Predeterminado | Controla |
|---|---|---|---|
| Owner (Propietario) | 0 | Umbral 1, clave propia de la cuenta | Todas las operaciones, incluyendo actualizaciones de permisos |
| Witness (Testigo) | 1 | Solo en cuentas SR | Firma de producción de bloques para Super Representantes |
| Active (Activo) | 2–9 | Creado automáticamente con operaciones estándar | Uso 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.
Estructura de Permisos
Sección titulada «Estructura de Permisos»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
Configurar una Multifirma 2-de-3
Sección titulada «Configurar una Multifirma 2-de-3»// 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.
Firmar una Transacción Multifirma
Sección titulada «Firmar una Transacción Multifirma»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:
// Tarea: Firmar una transacción secuencialmente con múltiples claves privadas.// El Firmante 1 añade su firmaconst partialSigned = await tronWeb.trx.multiSign(unsignedTx, privateKey1);
// El Firmante 2 añade su firma al mismo objetoconst fullySigned = await tronWeb.trx.multiSign(partialSigned, privateKey2);
// Umbral alcanzado — transmitirconst 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.
Bitmap de Operaciones
Sección titulada «Bitmap de Operaciones»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:
# Tarea: Anotar el bitmap predeterminado para permisos activos completos.7fff1fc0033efb07000000000000000000000000000000000000000000000000Esto 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.
Recursos de Cuenta de un Vistazo
Sección titulada «Recursos de Cuenta de un Vistazo»// Tarea: Obtener todos los recursos disponibles y consumidos de una cuenta.const resources = await tronWeb.trx.getAccountResources('TAddress...');
// Energíaconsole.log(resources.EnergyLimit); // Energía total disponible del Stakingconsole.log(resources.EnergyUsed); // Energía consumida en el período actualconsole.log(resources.TotalEnergyLimit); // Tu parte del pool de Energía de la red
// Ancho de bandaconsole.log(resources.NetLimit); // Ancho de banda disponible del Stakingconsole.log(resources.NetUsed); // Ancho de banda del Staking consumidoconsole.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 votosconsole.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.