java-tron 快速入门¶
本指南将引导您完成一系列 java-tron 的基础操作。我们建议按以下顺序学习:
- 创建 TRON 账户:
- 获得您在区块链世界的数字身份。学习如何安全地生成和管理您的地址与私钥,这是您持有 TRX 资产、发送交易以及与智能合约交互的唯一凭证。
- 启动并运行一个 java-tron 节点(可选):
- 搭建您与 TRON 网络连接的专用网关。将您的计算机接入 TRON 网络,使其成为网络的一部分。这对于希望成为网络维护者或需要本地、高可用 API 服务的开发者至关重要。
- 使用 java-tron 节点与 TRON 网络交互:
- 学习如何通过客户端工具(如
wallet-cli或cURL)发送交易、查询链上数据(此技能不要求您自己运行节点,您可以使用公共节点服务完成操作)。
- 学习如何通过客户端工具(如
核心概念¶
java-tron 是用 Java 语言编写的 TRON 网络客户端,运行 java-tron 会将您的计算机转变为一个 TRON 网络节点。TRON 网络是一个分布式网络,信息在节点之间共享,而非通过中心化服务器管理。当超级代表(Super Representative)的节点产出一个新区块后,会将其广播至网络中的其它节点。每个节点在接收到新区块时会对其进行校验,校验通过后便将其存入本地数据库。java-tron 通过同步区块来持续更新其“状态”——即 TRON 网络上所有账户的实时余额。
与任何区块链交互的第一步都是连接到正确的网络。TRON 网络主要分为:
- Mainnet (主网):用于处理真实资产交易的生产环境。
- Nile/Shasta Testnet (测试网):供开发者免费测试应用和智能合约的公共环境。
对于开发和学习,我们必须使用测试网,以避免任何实际的资产损失。本指南使用的网络是 TRON Nile 测试网。
技能一:创建 TRON 账户¶
TRON 网络上有两种主要类型的帐户:
- 外部账户 (Externally Owned Accounts): 由用户通过其本地管理的公私钥对来控制。每个外部账户都是一个公私密钥对,其中公钥用于派生出独一无二的账户地址,而私钥则用于保护帐户和安全地签署、授权交易。您在本教程中创建的便是这种类型的账户。
- 合约账户 (Contract Accounts): 当收到交易时,这类账户会执行其中包含的智能合约代码。
要开始与 TRON 网络交互,您需要创建一个外部账户(以下简称“帐户”)。创建 TRON 账户有多种方式,例如通过软件开发工具包 (SDK) (如 Trident-java,TronWeb) 或各类钱包应用(如浏览器插件钱包 TronLink)。
在本指南中,我们将使用 wallet-cli 来创建您的 TRON 账户。
关于
wallet-cli
wallet-cli提供 Java 和 TypeScript 两种实现:Java 版采用交互式命令行,通过 gRPC 连接节点;TypeScript 版通过 npm 安装,面向脚本和自动化,通过 FullNode HTTP 接口访问节点。两者都可以在本地管理钱包、签名和广播交易,以及查询链上数据。本指南使用 Java 版。在继续之前,请务必完成
wallet-cli的下载与编译。本指南仅引用wallet-cli的几个基础命令作为示例,完整说明参见 Java CLI 环境准备。
现在,请按顺序完成以下三个准备步骤。
步骤 A:启动工具并配置网络¶
1. 启动 wallet-cli
在您的终端中通过命令 java -jar wallet-cli.jar 启动一个 wallet-cli 实例:
java -jar wallet-cli.jar
Welcome to TRON wallet-cli
Please type one of the following commands to proceed.
Login, RegisterWallet or ImportWallet
You may also use the Help command at anytime to display a full list of commands.
wallet>
2. 配置网络
wallet-cli 默认的工作环境是 TRON 主网 (Mainnet)。请先将环境切换至 Nile 测试网,以避免在本指南的后续操作中与真实资产交互。
您可使用 switchnetwork 命令切换网络,并用 currentnetwork 命令验证网络状态。当提示选择网络时,输入 2 选择 NILE。
wallet> switchnetwork
Please select network:
1. MAIN
2. NILE
3. SHASTA
Enter numbers to select a network (1-3): 2
Now, current network is : NILE
SwitchNetwork successful !!!
wallet> currentnetwork
currentNetwork: NILE
步骤 B:创建账户¶
1. 注册新账户
在提示符后输入 registerwallet 命令,并根据提示设置一个安全的密码。此命令会生成一对公钥和私钥,并从公钥派生出账户地址。它会将加密后的私钥保存在本地,以便后续对交易进行签名,但不会激活链上账户。步骤 C 将介绍如何通过接收 TRX 转账,在主网或 Nile 测试网上为地址充值并激活账户。
wallet> registerwallet
Please input password.
password:
Please input password again.
Please enter the number of mnemonic words
Default: 12 mnemonic words,
Enter 24 to use 24 mnemonic words
Press Enter to use the default (12).
Valid inputs are "12" or "24"
mnemonic file : ./Mnemonic/(your wallet address).json
Please name your wallet:
register a wallet successful, keystore file : ./Wallet/(your wallet address).json
(Note: If you delete an account, make sure to delete the wallet file and mnemonic file)
wallet>
2. 登录并查看地址:
首先,在 wallet-cli 中使用 login 命令。系统会列出当前已有的账户供您选择。
wallet> login
如您有多个账户,请根据提示,输入您希望登录的账户所对应的序号(例如 2),然后输入该账户的密码。
Please choose between 1 and 3
2
Please input your password.
password:
Login successful !!!
wallet>
看到 Login successful !!! 提示即表示登录成功。您可使用 getaddress 命令查看当前账户的地址。
wallet> getaddress
GetAddress successful !!
address = TQXjm2J8K2DKTV49MdfT2anjUehbU3WDJz
wallet>
3. 备份私钥 (重要):
我们强烈建议您在完成账户创建后立即备份私钥,并将其存放在绝对安全的地方。使用 backupwallet 命令,并按提示输入密码,即可查看账户的私钥。
步骤 C:为账户充值 TRX 并激活账户¶
新地址接收 TRX 转账时,会在转账所在的网络上创建链上账户记录并激活账户。主网和 Nile 的账户记录相互独立:在一个网络上激活地址,不会激活另一个网络上的同一地址。
链上交易会消耗带宽,智能合约执行还会消耗能量。账户的免费额度可用于支付带宽消耗,额外的带宽和能量可通过质押或接收他人代理的资源获得。可用资源不足时,可能需要燃烧 TRX 来支付费用。发送交易前,请确保有足够的资源,以及足以支付转账金额和相关费用的 TRX。本教程使用测试 TRX 激活地址并完成示例转账。TRX 的获取方式因网络而异:
-
在 TRON 网络主网 (Mainnet),TRX 是真实资产,主要通过以下方式获得:
- 作为超级代表获得出块奖励,或通过为超级代表投票获得奖励
- 从其他的 TRON 网络账户接收 TRX 转账
- 从加密货币交易所购买
要激活主网上新生成的地址,请让一个已有的主网账户向该地址转入 TRX。
-
在 Nile 测试网 (Testnet),TRX 没有实际价值。您可以通过访问 水龙头 (Faucet) 免费获取。详细流程可参考 如何获取测试币。
接收水龙头的 TRX 转账会激活您在 Nile 上的地址。您也可以通过接收已有 Nile 账户的 TRX 转账来激活地址。
完成以上所有准备工作后,您现在拥有了一个配置正确、网络环境安全且持有测试币的 TRON 账户。
技能二:启动并运行一个 java-tron 节点¶
本模块为可选步骤。如果您使用公共节点,可以跳过节点部署,直接进入技能三:使用 java-tron 节点与 TRON 网络交互。
本模块将指导您启动一个 java-tron 节点。运行自己的节点可让您自行管理 API 访问和限流设置。java-tron 提供可配置的 API 限流,您可以在运行自己的节点时进行管理。本模块使用 TRON 的 Nile 测试网。
提示:
- 执行本教程中的操作前,请确保已安装 java-tron 及相关的开发工具。如果您尚未安装,请参考 部署 页面了解具体步骤。
- 教程中的启动命令仅为基础演示。关于更详细的部署与配置,请参考 Nile 官方节点部署指南。
- Nile 测试网不支持从创世区块(区块 0)开始同步数据。为快速启动节点,请下载官方提供的数据快照。具体操作可参阅 使用数据快照部署节点 指南。
1. 启动节点¶
启动命令请参考启动全节点连接 Nile 测试网。
2. 验证节点状态¶
2.1 查看启动与同步日志
启动过程中,java-tron 会打印网络配置。以下日志展示了 Nile 使用的配置值,但不能证明节点已完成启动或已连接到其他节点。日志中的类名、内容和行号可能因版本而异:
11:07:58.758 INFO [main] [app](Args.java:1143) ************************ Net config ************************
11:07:58.758 INFO [main] [app](Args.java:1144) P2P version: 201910292
11:07:58.758 INFO [main] [app](Args.java:1145) Bind IP: 192.168.20.101
11:07:58.758 INFO [main] [app](Args.java:1146) External IP: 203.12.203.3
11:07:58.758 INFO [main] [app](Args.java:1147) Listen port: 18888
11:07:58.758 INFO [main] [app](Args.java:1148) Discover enable: true
接下来,节点会寻找对等节点并请求缺失的区块,以更新本地区块链数据。以下日志展示了对等节点握手后开始同步区块的过程;日志内容可能因版本而异:
11:08:42.547 INFO [TronJClientWorker-1] [net](Channel.java:116) Finish handshake with /123.56.3.74:18888.
11:08:42.547 INFO [TronJClientWorker-1] [net](ChannelManager.java:161) Add active peer /123.56.3.74:18888 | fea80a0298b465a54fd332ff36819545d850115e77b327858b5306c9a58c6b8c2e7c08df76ab508a7594ed3577a8f4157727108442877077ab499b102b488467, total active peers: 1
11:08:42.549 INFO [TronJClientWorker-1] [net](Channel.java:208) Peer /123.56.3.74:18888 status change to SYNCING.
11:08:42.566 INFO [TronJClientWorker-1] [DB](Manager.java:1636) headNumber:23113867
11:08:42.566 INFO [TronJClientWorker-1] [DB](Manager.java:1638) syncBeginNumber:23113867
11:08:42.567 INFO [TronJClientWorker-1] [DB](Manager.java:1642) solidBlockNumber:23113849
11:08:42.567 INFO [TronJClientWorker-1] [net](SyncService.java:179) Get block chain summary, low: 23113867, highNoFork: 23113867, high: 23113867, realHigh: 23113867
11:08:42.572 INFO [TronJClientWorker-1] [net](MessageQueue.java:106) Send to /123.56.3.74:18888, type: SYNC_BLOCK_CHAIN
size: 1, start block: Num:23113867,ID:000000000160b08b510b6c501c980a2567bff1229eed62ca79874c9ca7828e9c
11:08:42.631 INFO [TronJClientWorker-1] [net](MessageQueue.java:121) Receive from /123.56.3.74:18888, type: BLOCK_CHAIN_INVENTORY
size: 2001, first blockId: Num:23113867,ID:000000000160b08b510b6c501c980a2567bff1229eed62ca79874c9ca7828e9c, end blockId: Num:23115867,ID:000000000160b85b587ef18d00a1905d8022ec0a8fd174f3980b78f6aacf0ede
......
11:08:43.478 INFO [pool-49-thread-1] [net](MessageQueue.java:106) Send to /123.56.3.74:18888, type: FETCH_INV_DATA
invType: BLOCK, size: 100, First hash: 000000000160b08c6eeba60eced4fb13d7c56e46a3c5220a67bb2801a05e5679, End hash: 000000000160b0efd90560e389d1f6e5b3c8d3877709ce375a8e063f5db73af9
11:08:43.502 INFO [TronJClientWorker-1] [net](MessageQueue.java:121) Receive from /123.56.3.74:18888, type: BLOCK
Num:23113868,ID:000000000160b08c6eeba60eced4fb13d7c56e46a3c5220a67bb2801a05e5679, trx size: 1
11:08:43.504 INFO [TronJClientWorker-1] [net](MessageQueue.java:121) Receive from /123.56.3.74:18888, type: BLOCK
Num:23113869,ID:000000000160b08d231e450ae1993a72ba19eb8f3c748fa70d105dadd0c9fd5f, trx size: 0
11:08:43.504 INFO [TronJClientWorker-1] [net](MessageQueue.java:121) Receive from /123.56.3.74:18888, type: BLOCK
Num:23113870,ID:000000000160b08e37cb9951d31a4233f106c7e77e0535c597dbb6a16f163699, trx size: 0
接收消息中的区块号持续增长,说明区块数据正在到达,但不能仅凭这一点证明区块已通过验证并应用到本地区块链。请检查 /wallet/getnowblock 返回的本地最新区块高度是否持续增长。如果网络仍在出块,而本地最新区块高度长时间不再增长,或日志反复出现错误,请检查节点的连接和同步状态。
2.2 使用 API 确认同步状态
要与 TRON 网络进行交互,您的 java-tron 节点必须保持运行,并处于同步正常的状态。
您可向 java-tron 节点发送如下 HTTP 请求,来验证其是否已成功启动,并查看当前状态:
- 通过
/wallet/getnodeinfoAPI 获取节点概况:curl http://127.0.0.1:8090/wallet/getnodeinfo - 通过
/wallet/getnowblockAPI 获取当前区块高度:curl http://127.0.0.1:8090/wallet/getnowblock
将本地节点的区块高度与 Nile Tronscan 区块浏览器 上的最新高度进行比较。请使用与节点属于同一网络的区块浏览器。两次查询之间可能产生新区块,因此暂时出现较小的高度差是正常的。请多次检查,确认本地最新区块高度持续增长并接近网络最新高度;单次高度相同不足以证明同步状态正常。
3. 关闭节点¶
如果要关闭 java-tron,请通过kill -15 <进程ID>来停止节点。
技能三:使用 java-tron 节点与 TRON 网络交互¶
本模块的核心是学习如何使用 java-tron 节点提供的 API 接口与 TRON 网络进行通信。java-tron 节点是您与区块链交互的网关,它通过开放强大的 HTTP 和 gRPC 接口,让任何客户端应用都能够查询链上数据或广播交易。
在开始交互前,您可以选择两种节点连接方式:
- 使用公共节点(推荐新手):无需等待同步,立即开始体验
- 使用自有节点(如已完成技能二):自行管理 API 访问,并配置限流
wallet-cli 示例使用技能一中选择的公共 Nile 节点。cURL 示例使用位于 http://127.0.0.1:8090 的本地 Nile 全节点,需要先完成技能二的部署。如果您跳过了节点部署,可以继续使用 wallet-cli,或将 HTTP 示例中的基础 URL 替换为所选公共 Nile 节点服务的地址。
方式一:使用 wallet-cli (推荐)¶
查询账户信息¶
您可以使用 getaccount <地址> 命令查询指定地址的详细信息。执行该命令时,wallet-cli 会在后台向 java-tron 节点发送请求,然后将获取到的账户数据呈现在终端界面。
wallet> getaccount TUoHaVjx7n5xz8LwPRDckgFrDWhMhuSuJM
返回结果如下:
{
"address": "TUoHaVjx7n5xz8LwPRDckgFrDWhMhuSuJM",
"balance": 5,
"create_time": 1663487574000,
"net_window_size": 28800000,
"net_window_optimized": true,
"account_resource": {
"energy_window_size": 28800000
"energy_window_optimized": true
},
......
}
查询账户余额¶
使用 getbalance 命令可快速查看当前登录账户的 TRX 余额。
wallet> getbalance
Balance = 93642857919
wallet>
转账 TRX¶
使用 sendcoin <接收方地址> <转账金额> 命令发起一笔 TRX 转账。金额单位为 sun(1 TRX = 1,000,000 sun)。
wallet> sendcoin TUznHJfHe6gdYY7gvWmf6bNZHuPHDZtowf 1000000
{
"raw_data":{
"contract":[
{
"parameter":{
"value":{
"amount":1000000,
"owner_address":"TUoHaVjx7n5xz8LwPRDckgFrDWhMhuSuJM",
"to_address":"TUznHJfHe6gdYY7gvWmf6bNZHuPHDZtowf"
},
"type_url":"type.googleapis.com/protocol.TransferContract"
},
"type":"TransferContract"
}
],
"ref_block_bytes":"cbc3",
"ref_block_hash":"8581ae7e29258a52",
"expiration":1656917577000,
"timestamp":1656917518232
},
"raw_data_hex":"0a02cbc322088581ae7e29258a5240a89aefbf9c305a67080112630a2d747970652e676f6f676c65617069732e636f6d2f70726f746f636f6c2e5472616e73666572436f6e747261637412320a1541ce8a0cf0c16d48bcf22825f6053248df653c89ca121541d0b69631440f0a494bb51f7eee68ff5c593c00f018c0843d7098cfebbf9c30"
}
before sign transaction hex string is 0a85010a02cbc322088581ae7e29258a5240a89aefbf9c305a67080112630a2d747970652e676f6f676c65617069732e636f6d2f70726f746f636f6c2e5472616e73666572436f6e747261637412320a1541ce8a0cf0c16d48bcf22825f6053248df653c89ca121541d0b69631440f0a494bb51f7eee68ff5c593c00f018c0843d7098cfebbf9c30
Please confirm and input your permission id, if input y/Y means default 0, other non-numeric characters will cancel transaction.
此命令会返回一笔未签名的交易。请按以下步骤完成签名和广播:
- 确认交易:核对交易详情无误后,输入
y或Y,使用默认权限 ID0。 - 选择签名账户:选择发送方账户的钱包来签名交易。本教程使用账户的默认权限。
- 输入密码授权:输入所选钱包的密码,
wallet-cli会对交易签名并将其广播至 java-tron 节点。广播成功不代表交易已被打包进区块或已确认,请按照下文查询交易状态。
Please confirm and input your permission id, if input y/Y means default 0, other non-numeric characters will cancel transaction.
y
Please choose your key for sign.
No. Address Name
1 (your wallet address)
2 (your wallet address)
3 (your wallet address)
Please choose between 1 and 3, or enter search to search wallets
3
Please input your password.
password:
after sign transaction hex string is 0a85010a02cbc322088581ae7e29258a5240dbfc91ca9c305a67080112630a2d747970652e676f6f676c65617069732e636f6d2f70726f746f636f6c2e5472616e73666572436f6e747261637412320a1541ce8a0cf0c16d48bcf22825f6053248df653c89ca121541d0b69631440f0a494bb51f7eee68ff5c593c00f018c0843d7098cfebbf9c301241241a3ce4797ccc2fedf49ae41af28b49df1e15a476e4948af4df5aadf23a1e940ad5cc2133f501c08f2bab6a2231cdc82a745fed0fc6a012dc19310532d9138600
txid is 21851bcf1faf22c99a7a49c4f246d709cf9f54db2f264ca145adcd464ea155a4
Send 1000000 Sun to TUznHJfHe6gdYY7gvWmf6bNZHuPHDZtowf successful !!
wallet>
根据交易 ID 查询交易详情¶
当您发送一笔交易后,wallet-cli 终端会返回一个唯一的交易ID(txid)。通过这个 txid,您可以查询到关于这笔交易的所有信息。
- 使用
gettransactionbyid <txid>查看交易的原始内容:
wallet> gettransactionbyid 21851bcf1faf22c99a7a49c4f246d709cf9f54db2f264ca145adcd464ea155a4
返回的 JSON 数据包含合约类型(TransferContract)、转账金额、发送方和接收方地址等交易详情。"contractRet":"SUCCESS" 表示交易执行成功。
{
"ret":[
{
"contractRet":"SUCCESS"
}
],
"signature":[
"241a3ce4797ccc2fedf49ae41af28b49df1e15a476e4948af4df5aadf23a1e940ad5cc2133f501c08f2bab6a2231cdc82a745fed0fc6a012dc19310532d9138600"
],
"txID":"21851bcf1faf22c99a7a49c4f246d709cf9f54db2f264ca145adcd464ea155a4",
"raw_data":{
"contract":[
{
"parameter":{
"value":{
"amount":1000000,
"owner_address":"TUoHaVjx7n5xz8LwPRDckgFrDWhMhuSuJM",
"to_address":"TUznHJfHe6gdYY7gvWmf6bNZHuPHDZtowf"
},
"type_url":"type.googleapis.com/protocol.TransferContract"
},
"type":"TransferContract"
}
],
"ref_block_bytes":"cbc3",
"ref_block_hash":"8581ae7e29258a52",
"expiration":1656939118171,
"timestamp":1656917518232
},
"raw_data_hex":"0a02cbc322088581ae7e29258a5240dbfc91ca9c305a67080112630a2d747970652e676f6f676c65617069732e636f6d2f70726f746f636f6c2e5472616e73666572436f6e747261637412320a1541ce8a0cf0c16d48bcf22825f6053248df653c89ca121541d0b69631440f0a494bb51f7eee68ff5c593c00f018c0843d7098cfebbf9c30"
}
wallet>
- 使用
gettransactioninfobyid <txid>查看交易的处理结果和回执信息(即交易是否已经被打包进区块,执行的结果和资源消耗情况):
wallet> gettransactioninfobyid 21851bcf1faf22c99a7a49c4f246d709cf9f54db2f264ca145adcd464ea155a4
blockNumber 字段表示包含该交易的区块高度。交易入块本身不能证明执行成功或已固化确认:执行失败的智能合约交易也可能被打包进区块。请检查执行结果和回执,并通过本指南末尾介绍的固化状态查询方式检查确认状态。receipt 对象还记录了带宽(net_usage)等资源消耗。
{
"id": "21851bcf1faf22c99a7a49c4f246d709cf9f54db2f264ca145adcd464ea155a4",
"blockNumber": 27773932,
"blockTimeStamp": 1656917586000,
"contractResult": [
""
],
"receipt": {
"net_usage": 267
}
}
wallet>
方式二:使用 cURL(直接调用 HTTP API)¶
虽然 wallet-cli 提供了友好的交互式命令,但对于更进阶的开发者或在自动化脚本场景中,直接通过 HTTP API 与 java-tron 节点交互会更加灵活高效。本章节将展示如何使用 cURL (一个发送 HTTP 请求的命令行工具),调用 java-tron 节点的 HTTP API, 来实现查询账户余额、发送交易等核心功能。
与 wallet-cli 自动完成签名和广播不同,直接调用 API 发送一笔交易,需要您手动完成一个标准的“三步走”流程:创建 -> 签名 -> 广播。本章节将向您展示如何执行这个流程。
准备工作:查询账户余额¶
在发送交易前,我们先用通过节点 HTTP 接口 wallet/getaccount 来查询一个账户的 TRX 余额。
本地 Nile 全节点启动并完成同步后,向其 8090 端口发送一个 POST 请求,请求体中包含您要查询的地址。
curl -X POST http://127.0.0.1:8090/wallet/getaccount \
-H 'Content-Type: application/json' \
-d '{"address": "TPswDDCAWhJAZGdHPidFg5nEf8TkNToDX1",
"visible": true
}'
返回的 JSON 数据中,balance 字段即为该地址的 TRX 余额,单位为 sun (1 TRX = 1,000,000 sun)。
{
"account_name": "testacc2",
"address": "TPswDDCAWhJAZGdHPidFg5nEf8TkNToDX1",
"balance": 1000000000000000,"account_resource": {}
}
发送交易的三步流程¶
现在,让我们以 TRX 转账为例说明如何向 java-tron 发送交易,完整地演示“创建-签名-广播”这三个步骤。
第一步 - 创建一笔交易
通过 FullNode HTTP 的 wallet/createtransaction 接口,创建一笔未签名的 TRX 转账交易。在请求体中,指明发送方 (owner_address)、接收方 (to_address) 和金额 (amount)。
curl -X POST http://127.0.0.1:8090/wallet/createtransaction \
-H 'Content-Type: application/json' \
-d '{
"to_address": "TUznHJfHe6gdYY7gvWmf6bNZHuPHDZtowf",
"owner_address": "TPswDDCAWhJAZGdHPidFg5nEf8TkNToDX1",
"amount": 10000000,
"visible":true
}'
节点会返回一个未签名的 TRX 转账交易。请记下其中的 txid 和 raw_data_hex,它们将在后续步骤中使用。
{
"visible": true,
"txID": "c558bd35978267d8999baf6148703cbc94786f3f2e22893637588ca05437d7f0",
"raw_data": {
"contract": [
{
"parameter": {
"value": {
"amount": 10000000,
"owner_address": "TPswDDCAWhJAZGdHPidFg5nEf8TkNToDX1",
"to_address": "TUznHJfHe6gdYY7gvWmf6bNZHuPHDZtowf"
},
"type_url": "type.googleapis.com/protocol.TransferContract"
},
"type": "TransferContract"
}
],
"ref_block_bytes": "193b",
"ref_block_hash": "aaecd88e4e0e7528",
"expiration": 1656580476000,
"timestamp": 1656580418228
},
"raw_data_hex": "0a02193b2208aaecd88e4e0e752840e098909f9b305a68080112640a2d747970652e676f6f676c65617069732e636f6d2f70726f746f636f6c2e5472616e73666572436f6e747261637412330a154198927ffb9f554dc4a453c64b2e553a02d6df514b121541d0b69631440f0a494bb51f7eee68ff5c593c00f01880ade20470b4d58c9f9b30"
}
第二步 - 对交易进行签名
使用发送方账户的私钥,对交易 ID(txID)进行签名。txID 是序列化后的 raw_data 的 SHA-256 哈希。
重要提示:
- 为保障私钥安全,请在本地或安全的服务器环境中,使用
TronWeb或Trident-java等 TRON SDK 完成签名。 cURL无法执行签名操作。此步骤仅作流程说明。
已签名交易的 signature 数组中包含十六进制编码的签名。
第三步 - 广播交易
调用 wallet/broadcasttransaction 接口,并传入第二步得到的已签名交易对象。节点会验证交易(包括签名),并尝试将其传播给对等节点。成功响应表示节点已接受广播,不代表交易已入块、链上执行成功或已固化确认。广播后请分别查询这些状态。
curl --location --request POST 'http://127.0.0.1:8090/wallet/broadcasttransaction' \
--header 'Content-Type: application/json' \
--data-raw '{
"visible": true,
"signature": [
"e12996cfaf52f8b49e64400987f9158a87b1aa809a11a75e01bb230722db97a26204334aea945b1ece0851a89c96459872e56229b0bd725c4f6a0577bfe331c301"
],
"txID": "c558bd35978267d8999baf6148703cbc94786f3f2e22893637588ca05437d7f0",
"raw_data": {
"contract": [
{
"parameter": {
"value": {
"amount": 10000000,
"owner_address": "TPswDDCAWhJAZGdHPidFg5nEf8TkNToDX1",
"to_address": "TUznHJfHe6gdYY7gvWmf6bNZHuPHDZtowf"
},
"type_url": "type.googleapis.com/protocol.TransferContract"
},
"type": "TransferContract"
}
],
"ref_block_bytes": "193b",
"ref_block_hash": "aaecd88e4e0e7528",
"expiration": 1656580476000,
"timestamp": 1656580418228
},
"raw_data_hex": "0a02193b2208aaecd88e4e0e752840e098909f9b305a68080112640a2d747970652e676f6f676c65617069732e636f6d2f70726f746f636f6c2e5472616e73666572436f6e747261637412330a154198927ffb9f554dc4a453c64b2e553a02d6df514b121541d0b69631440f0a494bb51f7eee68ff5c593c00f01880ade20470b4d58c9f9b30"
}'
如果返回结果中的 "result": true,则代表您的交易已成功广播:
{
"result": true,
"txid": "c558bd35978267d8999baf6148703cbc94786f3f2e22893637588ca05437d7f0"
}
根据交易 ID 查询交易¶
通过 HTTP API 查询已广播的交易,原理与 wallet-cli 相同。
wallet/gettransactionbyid
当交易已被打包进节点已知的区块后,可通过 HTTP 接口 wallet/gettransactionbyid 获取交易数据。刚广播的交易可能暂时查不到,请在入块后重试。在请求体中,通过 value 字段传入要查询的交易 ID:
curl --location --request POST 'http://127.0.0.1:8090/wallet/gettransactionbyid' \
--header 'Content-Type: application/json' \
--data-raw '{
"value": "c558bd35978267d8999baf6148703cbc94786f3f2e22893637588ca05437d7f0"
}'
返回结果的数据结构与 wallet-cli 的 gettransactionbyid 命令基本一致:
{
"ret": [
{
"contractRet": "SUCCESS"
}
],
"signature": [
"e12996cfaf52f8b49e64400987f9158a87b1aa809a11a75e01bb230722db97a26204334aea945b1ece0851a89c96459872e56229b0bd725c4f6a0577bfe331c301"
],
"txID": "c558bd35978267d8999baf6148703cbc94786f3f2e22893637588ca05437d7f0",
"raw_data": {
"contract": [
{
"parameter": {
"value": {
"amount": 10000000,
"owner_address": "4198927ffb9f554dc4a453c64b2e553a02d6df514b",
"to_address": "41d0b69631440f0a494bb51f7eee68ff5c593c00f0"
},
"type_url": "type.googleapis.com/protocol.TransferContract"
},
"type": "TransferContract"
}
],
"ref_block_bytes": "193b",
"ref_block_hash": "aaecd88e4e0e7528",
"expiration": 1656580476000,
"timestamp": 1656580418228
},
"raw_data_hex": "0a02193b2208aaecd88e4e0e752840e098909f9b305a68080112640a2d747970652e676f6f676c65617069732e636f6d2f70726f746f636f6c2e5472616e73666572436f6e747261637412330a154198927ffb9f554dc4a453c64b2e553a02d6df514b121541d0b69631440f0a494bb51f7eee68ff5c593c00f01880ade20470b4d58c9f9b30"
}
wallet/gettransactioninfobyid
通过 HTTP 接口 wallet/gettransactioninfobyid 查看交易的处理结果和回执信息(即交易是否已经被打包进区块,执行的结果和资源消耗情况)。
在请求体中传入目标 txid:
curl --location --request POST 'http://127.0.0.1:8090/wallet/gettransactioninfobyid' \
--header 'Content-Type: application/json' \
--data-raw '{
"value": "c558bd35978267d8999baf6148703cbc94786f3f2e22893637588ca05437d7f0"
}'
blockNumber 字段表示包含该交易的区块高度。要检查执行是否成功,请使用上文的 wallet/gettransactionbyid:ret 数组中的 "contractRet":"SUCCESS" 表示执行成功。交易入块不代表已固化确认。receipt 字段记录带宽用量(net_usage)等资源消耗。
要检查固化确认状态,请使用同一个交易 ID 查询 /walletsolidity/gettransactionbyid。此接口读取固化状态。本地节点启用 Solidity HTTP 服务后,其默认端口为 8091;公共节点服务可能在与其他 API 相同的基础 URL 下提供此路径。接口返回交易后,请检查 ret 数组中的 contractRet 是否为 SUCCESS,以确认执行成功。
{
"id": "c558bd35978267d8999baf6148703cbc94786f3f2e22893637588ca05437d7f0",
"blockNumber": 27662687,
"blockTimeStamp": 1656580470000,
"contractResult": [
""
],
"receipt": {
"net_usage": 268
}
}
总结与展望¶
恭喜您完成了 java-tron 的入门之旅!您已经亲手操作并掌握了运行节点、创建账户和发送交易等核心技能,为深入探索 TRON 生态打下了坚实的基础。