账户与密钥

TRON 上的地址格式、密钥对及账户激活流程。

TRON 账户由地址标识,并由对应私钥控制。账户可以持有 TRX 和各类 Token,消耗带宽与能量发起链上交易,也可以通过 TRON Power 参与超级代表(SR)投票。

📘

前置阅读


账户类型

TRON 有两类账户:

类型控制方式可持有余额可执行代码
外部账户(EOA)私钥控制
合约账户已部署的智能合约字节码

两类账户都能接收、持有和发送 TRX 及 Token。合约账户没有私钥;当交易调用合约账户时,网络执行该账户中部署的智能合约代码,并按执行结果更新状态。


地址格式

TRON 原始地址长度为 21 字节,首字节固定为 0x41。链外交互中常见两种表示形式。

十六进制格式:42 位十六进制字符串,以 41 开头。

418840E6C5...AECED808

去掉 41 前缀后,剩余 20 字节与同一 ECDSA 公钥派生出的以太坊地址一致。因此,将 TRON 十六进制地址转换为以太坊兼容格式时,只需要去掉前导 41

Base58Check 格式:34 个字符,以大写字母 T 开头,常见于钱包、区块浏览器和用户界面。

TNPeeaaF...8G1NYqeL

TronWeb 可以在两种格式之间转换:

tronWeb.address.toHex("TNPeeaaF...8G1NYqeL")
> "418840E6C5...AECED808"

tronWeb.address.fromHex("418840E6C5...AECED808")
> "TNPeeaaF...8G1NYqeL"

密钥对

TRON 使用 secp256k1 曲线上的 ECDSA 签名算法,与 Bitcoin 和 Ethereum 使用的曲线一致。一个外部账户由私钥、公钥和地址组成:

  1. 生成私钥:使用安全随机数生成 32 字节私钥。
  2. 派生公钥:通过 secp256k1 从私钥派生未压缩公钥。未压缩公钥共 65 字节,首字节 0x04 是格式标识。
  3. 计算地址:去掉公钥首字节 0x04,对剩余 64 字节做 Keccak-256,取哈希最右侧 20 字节,再在左侧拼接 0x41 前缀,得到 21 字节原始地址。最后执行 Base58Check 编码,得到以 T 开头的地址。

交易签名证明交易确实由私钥持有人授权,也防止交易内容在广播过程中被篡改。签名校验细节参见签名校验


创建账户

创建账户本质上是在本地生成 secp256k1 密钥对。常用方式如下:

方法使用场景工具
命令行本地 CLI 或离线生成wallet-cli
SDK应用代码动态创建TronWeb tronWeb.createAccount()
钱包应用终端用户交互式创建TronLink

wallet-cli:

wallet> GenerateAddress
{
    "address": "TU6JdEDQ...4FQrXPCa",
    "privateKey": "b1ba1db5...74376176"
}

TronWeb:

const account = await tronWeb.createAccount();
console.log(account.address.base58);   // "TDpBe64D...hw2wDacE"
console.log(account.address.hex);      // "412A2B9F...8106524B"
console.log(account.privateKey);       // 64-char hex
console.log(account.publicKey);        // 130-char hex

激活账户

本地生成密钥对后,地址还没有链上状态。账户需要被激活后,才能通过节点 API 查询,或在区块浏览器中搜索到。

激活路径有两种:

标准激活:已有账户向新地址发送任意数量的 TRX 或 TRC-10 Token,或调用 wallet/createaccount。发送方需要支付账户创建费用;如果可用带宽不足,还会燃烧 TRX 支付带宽成本。

合约激活:智能合约向未激活地址转移 TRX 或 TRC-10 Token 时,会自动激活接收方。该合约调用除正常 TVM 执行成本外,还会额外消耗能量。

账户创建费用、带宽单价和合约激活能量成本均可能由链上参数控制。查询当前值及参数变更流程,参见网络参数


合约账户

部署智能合约时,网络会返回一个合约账户地址。合约地址与 EOA 地址使用相同的十六进制和 Base58Check 格式:

Base58Check: TR7NHqje...zgjLj6t
Hex:         41A614F8...E6DED13C

合约账户可以持有 TRX 或 Token,但其余额和状态只能通过执行已部署的合约字节码来修改。


API

如何查询账户状态

账户相关接口按“当前状态、已固化状态、资源、Token 余额和历史记录”分工。选择接口时,先判断是否需要最终状态,再判断要查的是账户对象、资源对象、TRC-20 当前余额还是历史流水。

查询目标推荐接口说明
账户当前状态wallet/getaccount返回 FullNode 当前链头视图中的账户对象,适合最新状态展示和开发调试。
账户已固化状态walletsolidity/getaccount返回已固化区块中的账户对象,适合需要最终状态的余额确认和对账。
账户资源wallet/getaccountresource查询 Bandwidth、Energy、TRON Power 及相关资源使用情况。
TRC-20 当前余额wallet/triggerconstantcontract 调用合约 balanceOf(address),或使用 TronGrid 余额接口TRC-20 余额不在账户对象中,需要查询 Token 合约或使用索引服务。
账户历史交易TronGrid V1 API 或自建索引器节点账户接口返回当前状态,不直接提供完整历史流水。

如果要确认一笔交易是否已经改变账户最终状态,应先查询交易 receipt,再读取已固化账户状态。完整流程见 交易签名与广播——API 工作流

API说明
wallet/createaccount激活新地址
wallet/getaccount查询账户状态和余额
wallet/getaccountresource查询带宽、能量和 TRON Power

相关资源