API 签名和广播示例
# 介绍
TRON 网络具有各种 API 调用,允许用户与区块链进行交互。可以在<a href="https://cn.developers.tron.network/reference/background" target="_blank">API 参考页</a>中找到这些API 调用,其中分别列出了调用FullNode节点的API、调用SolidityNode节点的API和通过TronWeb代码库进行调用的方式。有些API调用是用于查询链上数据,并不会创建交易,但有些API调用是可以创建交易并广播上链的,从而引发链上数据的状态修改。本篇指南主要讲解的是后面的这一类交易,通过引导用户完成TRX Balance Freeze 的例子,来展示通过API完成交易创建、交易签名和交易广播的三步流程。
# 质押TRX交易示例
### 1. **创建交易**
创建质押TRX交易使用的API是`/wallet/freezebalancev2`。这个交易的功能是将用户地址中一定数量的TRX质押起来,以获取带宽或能量,以及投票权,调用此API将创建一个质押TRX类型的交易。此API有3个参数,分别是:
* `owner_address` 是Hex string格式的钱包地址。
* `frozen_balance` 是整数格式的质押的TRX数量。
* `resource` 是质押TRX以期望获取资源的类型,可以是字符串格式的 "ENERGY"或"BANDWIDTH",但只能选择其中一种。
通过调用 API 来获取 JSON 数据来质押余额:

下面是执行该API后得到的JSON输出示例。此 JSON 输出将用于下一步的交易签名。
```shell
{
"visible": false,
"txID": "f947f1283f7b43c111eba662ab5d27b31dc906b77fdb0b3e52ee626335b21108",
"raw_data": {
"contract": [
{
"parameter": {
"value": {
"resource": "ENERGY",
"frozen_balance": 1000000,
"owner_address": "41e552f6487585c2b58bc2c9bb4492bc1f17132cd0"
},
"type_url": "type.googleapis.com/protocol.FreezeBalanceV2Contract"
},
"type": "FreezeBalanceV2Contract"
}
],
"ref_block_bytes": "a59c",
"ref_block_hash": "aef359052c4aa176",
"expiration": 1681117668000,
"timestamp": 1681117610802
},
"raw_data_hex": "0a02a59c2208aef359052c4aa17640a0c5afd3f6305a59083612550a34747970652e676f6f676c65617069732e636f6d2f70726f746f636f6c2e467265657a6542616c616e63655632436f6e7472616374121d0a1541e552f6487585c2b58bc2c9bb4492bc1f17132cd010c0843d180170b286acd3f630"
}2. 交易签名
发送交易前,必须由发送方使用私钥对其进行签名。交易签名过程如下:
- 计算交易的哈希
- 使用发送者账户的私钥对该交易哈希进行签名
- 将生成的签名结果添加到交易对象中
为了方便开发者使用,大多数的SDK都实现了上述交易签名流程,并封装成了接口,以tronweb为例,用户可以直接调用sign方法完成交易的签名。
const signedTxn = await tronWeb.trx.sign(unsignedTxn, privateKey);
> {
"signature":[
"8e6582cead9ef92d7731e356b0131dca2dfe18d701bdaecb5591781af5493391127d10b4864cf45a0f56b10ed97af102864cff8205e14c8bf29b0e50d85f681801"
],
"txID":"ddcbaf061eaa2454975ae8faefbeb0b410329ef9e5bb43b64d4065a7d66720c7",
"raw_data":{
"contract":[
{
"parameter":{
"value":{
"resource":"ENERGY",
"frozen_duration":3,
"frozen_balance":1000000,
"owner_address":"41928c9af0651632157ef27a2cf17ca72c575a4d21"
},
"type_url":"type.googleapis.com/protocol.FreezeBalanceContract"
},
"type":"FreezeBalanceContract"
}
],
"ref_block_bytes":"ee08",
"ref_block_hash":"7b2480cc92edd8a2",
"expiration":1540253364000,
"timestamp":1540253304828
}
}3. 广播交易
/wallet/broadcasttransaction API 调用接受一个参数,即签名后的交易:
下面是调用广播交易后的JSON输出示例,确认交易已经广播成功。
{"result": true}Updated 9 months ago