交易所和钱包对接TRON网络
钱包和交易所集成TRON网络时一般考虑如下几个问题:
- 如何实时判断一个地址有资金转入?
- 如何获取一个地址上历史交易记录?
- 如何查询余额和转账?
有的钱包和交易所会给用户提供TRON的质押服务,一般需要考虑如下几个问题:
- 如何质押?
- 如何投票?
- 如何提取奖励?
- 如何取消质押?
上述需求可以通过访问TronGrid API服务或者搭建一个全节点实现,TronGrid服务由于资源有限会设置访问频率和每日总量限制:20QPS和每日10万次访问,对访问频率和总量有较高要求的场景,建议搭建全节点。
TronGrid API服务除了提供全节点的所有API以外,还新增了更加方便的查询API,比如查询一个账户历史交易记录,通过不断轮询这样的API,即可监控一个地址的实时转入和转出交易,这对钱包和交易所集成有很大的帮助。
搭建全节点后,通过解析历史区块可以获取一个账户的历史交易记录,解析最新区块可以实时监控一个地址的转出和转入交易。全节点还提供转账和广播交易的API。
搭建TRON网络全节点
如果您希望搭建一个自己的节点,请参考节点搭建教程来完成节点的部署。
配置节点
在启动节点之前,请先检查节点配置文件config.conf,一般您需要重点关注如下配置项:
- vm.supportConstant 节点是否支持调用只读合约函数。建议将其设置成true,因为一般交易所和钱包的业务场景都涉及到查询TRC20代币的余额,查询TRC20代币余额必须要调用TRC20代币合约的balanceOf只读函数。
- vm.saveInternalTx 节点是否存储内部交易,合约中向调用其他合约或者向其他地址转账的交易记录称为内部交易。建议设置成true,因为交易所和钱包的业务场景都涉及到区块解析,开启该选项后才能确保所有交易记录都能被获取。
- vm.maxTimeRatio 节点在验证智能合约交易时,对交易的超时时间的容忍度。如果机器的配置在推荐的配置以下时,建议设置成20.0以上,否则可能会导致节点停止同步。
查询余额
下表列出TRX、TRC10和TRC20代币余额的查询API和示例。
| 功能 | 接口 | 示例 |
|---|---|---|
| 查询TRX余额 | /wallet/getaccount | TRX余额 |
| 查询TRC10余额 | /wallet/getaccount | TRC10代币余额 |
| 查询TRC20代币余额 | /wallet/triggerconstantcontract | TRC20代币余额 |
转账
发送转账交易的过程包括创建交易体、签名、广播交易三个步骤,交易的生命周期请参考 交易 章节。
下表列出创建TRX、TRC10和TRC20三种代币转账交易体的API以及签名和广播示例。不同语言的SDK都包含离线签名的方法。
| 功能 | 接口 | 示例 |
|---|---|---|
| TRX转账 | wallet/createtransaction | TRX转账 |
| TRC10转账 | wallet/transferasset | TRC10转账 |
| TRC20转账 | wallet/triggersmartcontract | TRC20转账 |
解析区块获取交易记录
通过解析历史区块可以获取一个账户的历史交易记录,解析最新区块可以实时监控一个地址的转出和转入交易。
解析区块获取TRX、TRC10和TRC20历史记录,可以参考如下步骤:
-
获取区块信息 根据区块号从固化块中获取区块信息: /walletsolidity/getblockbynum
-
获取区块内的所有交易transactions
-
遍历transactions,获取 raw_data.contract[0]
-
根据raw_data.contract[0].type判断交易类型
-
TRX转账: raw_data.contract.type == transferContract 检查地址和金额是否满足入账条件。
- raw_data.contract[0].parameter.value.owner_address 是TRX汇款地址
- raw_data.contract[0].parameter.value.to_address 是TRX收款地址
- raw_data.contract[0].parameter.value.amount 是转账数额
-
TRC10转账: raw_data.contract.type == TransferAssetContract 检查token id、地址和金额是否满足入账条件。
- raw_data.contract[0].parameter.value.owner_address 是TRC10汇款地址
- raw_data.contract[0].parameter.value.to_address 是TRC10收款地址
- raw_data.contract[0].parameter.value.asset_name 是TRC10 代币的token id或者name。由于第14号委员会提议允许通证同名,因此,在该提议生效前,采用token name作为TRC10代币的唯一标识,在该提议生效后,采用token id作为TRC10代币的唯一标识。也就是在5537806之前的区块中,该字段表示TRC10 token name,在5537806及其之后的区块中,该字段表示TRC10 token id。
- raw_data.contract[0].parameter.value.amount 是转账数额
-
智能合约交易:raw_data.contract.type == TriggerSmartContract 一笔智能合约交易中,可能同时存在 TRC20转账、TRX转账,TRC10转账,处理过程如下:
- 判断交易是否执行成功,如果交易执行失败,则忽略该交易。
调用
/walletsolidity/gettransactioninfobyid查询到receipt.result == SUCCESS,则交易执行成功。 - 判断该交易中是否包含TRC20转账:
调用
/walletsolidity/gettransactioninfobyid查询交易中是否包含"Transfer"事件,如果包含Transfer事件,则逐个解析Transfer事件(一笔智能合约交易中可能存在多个TRC20转账),获取事件中的合约地址、转账地址、金额,判断是否入账条件。事件解析规则请参考:这里 - 智能合约中的TRX和TRC10转账:判断交易是否包含内部交易,如果包含,则遍历内部交易:
- 如果 internal_transactions.callValueInfo != null & internal_transactions.callValueInfo[i].tokenId == null 说明是合约中进行的是TRX转账,交易示例
- internal_transactions.caller 是汇款地址
- internal_transactions.transferTo_address 是收款地址
- internal_transactions.callValueInfo[i].callValue 是转账额
- 如果 internal_transactions.callValueInfo != null & internal_transactions.callValueInfo[0].tokenId != null 说明是合约中进行的是TRC10转账,交易示例
- internal_transactions.caller是汇款地址
- internal_transactions.transferTo_address 是收款地址
- internal_transactions.callValueInfo[i].tokenId是TRC10 token ID
- internal_transactions.callValueInfo[i].callValue 是转账额
- 如果 internal_transactions.callValueInfo != null & internal_transactions.callValueInfo[i].tokenId == null 说明是合约中进行的是TRX转账,交易示例
- 判断交易是否执行成功,如果交易执行失败,则忽略该交易。
调用
-
使用TronGrid API服务
TronGrid API服务提供TRON网络全节点所有的API和其特有的扩展API。但是为了保证请求资源的合理分配,所有的请求都需要提供API Key,以https://api.shasta.trongrid.io/v1开头的域名均为v1扩展API,详细v1扩展API请参考Trongrid v1 API。
TronGrid API Endpoint
主网:https://api.trongrid.io Shasta 测试网:https://api.shasta.trongrid.io Nile 测试网: https://nile.trongrid.io
查询余额
下表列出TRX、TRC10和TRC20代币余额的查询API和示例。
转账
发送转账交易的过程包括创建交易体、签名、广播交易三个步骤,交易的生命周期请参考 交易 章节。
下表列出创建TRX、TRC10和TRC20三种代币转账交易体的API以及签名和广播示例。不同语言的SDK都包含离线签名的方法。
获取交易记录
TronGrid v1扩展API支持查询一个账户历史交易记录,通过不断查询一个地址上历史交易记录,也可以监控一个地址的实时转入和转出交易。
下表列出查询一个地址上TRX、TRC10和TRC20代币转账记录的API.
| 功能 | 接口 | 说明 |
|---|---|---|
| 查询账户历史TRX及TRC10交易记录 | v1/accounts/{address}/transactions?only_confirmed=true | 返回值中包含了TRX和TRC10交易记录,通过交易中的type字段来区分交易类型,TransferContract表示TRX转账,TransferAssetContract表示TRC10记录 |
| 查询账户历史TRC20交易记录 | v1/accounts/{address}/transactions/trc20?only_confirmed=true | 返回值中包含了TRC20交易记录 |
质押和投票
钱包和交易所还可能提供质押服务,质押TRX除了可以获取到相应的带宽或能量资源外,还将同时获得投票权,投票权可以用来为超级代表投票以获取投票收益,质押获取到的带宽或者能量还可以代理给其它账户,下面是质押、资源代理和投票相关的API。
| 功能 | 接口 |
|---|---|
| 质押TRX | wallet/freezebalancev2 |
| 解锁质押的TRX | wallet/unfreezebalancev2 |
| 解锁在Stake 1.0阶段质押的TRX | wallet/unfreezebalance |
| 资源代理 | wallet/delegateresource |
| 取消资源代理 | wallet/undelegateresource |
| 提取已过锁定期的解质押本金 | wallet/withdrawexpireunfreeze |
| 查看剩余解质押次数 | wallet/getavailableunfreezecount |
| 查看可提取的已过锁定期的解质押本金 | wallet/getcanwithdrawunfreezeamount |
| 查看可代理的资源份额数量 | wallet/getcandelegatedmaxsize |
| 查看某地址代理给目标地址的资源情况 | wallet/getdelegatedresourcev2 |
| 查看某地址资源代理情况与资源被代理情况 | wallet/getdelegatedresourceaccountindexv2 |
| 查看账户质押情况、资源份额、解质押情况、投票情况 | wallet/getaccount |
| 查看资源总量、已使用量、可用数量 | wallet/getaccountresource |
| 投票 | wallet/votewitnessaccount |
| 查询未提取的投票奖励 | wallet/getReward |
| 提取投票奖励 | wallet/withdrawbalance |
Updated 7 months ago