账户与密钥
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...8G1NYqeLTronWeb 可以在两种格式之间转换:
tronWeb.address.toHex("TNPeeaaF...8G1NYqeL")
> "418840E6C5...AECED808"
tronWeb.address.fromHex("418840E6C5...AECED808")
> "TNPeeaaF...8G1NYqeL"密钥对
TRON 使用 secp256k1 曲线上的 ECDSA 签名算法,与 Bitcoin 和 Ethereum 使用的曲线一致。一个外部账户由私钥、公钥和地址组成:
- 生成私钥:使用安全随机数生成 32 字节私钥。
- 派生公钥:通过 secp256k1 从私钥派生未压缩公钥。未压缩公钥共 65 字节,首字节
0x04是格式标识。 - 计算地址:去掉公钥首字节
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 |
相关资源
- 交易 — 账户如何发起链上操作
- 资源模型:带宽与能量 — 账户消耗的资源
- 获取测试网 Token — 激活第一个测试网账户
- 账户权限管理 — 多方账户控制
Updated 5 days ago