Tron 钱包开发详细教程

一. Tron 简介

Tron(波场) 是一个兼容 EVM 的区块链平台, Tron的技术架构由三层组成:

  • 存储层:包括区块存储和状态存储,支持多种存储机制。
  • 核心层:实现了智能合约、账户管理和共识机制(目前使用的是DPoS,即委托权益证明)。
  • 应用层:为开发者提供API和SDK,支持开发去中心化应用(DApps)。

1.主要组件和功能

  • Tron虚拟机(TVM):兼容以太坊虚拟机(EVM),使开发者可以轻松将以太坊上的应用迁移到Tron上。
  • 智能合约:支持Solidity语言编写的智能合约。
  • TRC-20和TRC-721标准:TRC-20是Tron的代币标准,类似于以太坊的ERC-20;TRC-721则是非同质化代币标准,类似于ERC-721。

2.共识机制

Tron采用委托权益证明(DPoS)机制。TRX持有者可以投票选举超级代表(Super Representatives,SR),这些SR负责验证交易和维护网络的安全。

3.生态系统

Tron生态系统包含多个重要组件和项目:

  • TronLink:官方钱包,支持TRX和TRC-20代币的存储和交易。
  • JustSwap:去中心化交易所,支持TRC-20代币的交易。
  • Sun Network:侧链扩展方案,旨在提升Tron主网的扩展性。
  • BitTorrent:Tron收购的去中心化文件共享协议,与Tron网络深度集成。
  • DApps:大量去中心化应用在 Tron 平台上运行。

4. 代币(TRX)

Tron的原生代币是TRX,主要用于以下几个方面:

  • 交易费用:支付网络上的交易费用。
  • Staking和投票:TRX持有者可以质押代币并参与超级代表的选举。
  • DApp支付:在Tron平台上的去中心化应用中进行支付和交易。

二. 离线地址生成

export function createTrxAddress (seedHex: string, addressIndex: string): string {
  const node = bip32.fromSeed(Buffer.from(seedHex, 'hex'));
  const child = node.derivePath("m/44'/195'/0'/0/" + addressIndex + '');
  const privateKey = child.privateKey.toString('hex');
  const publickKey = child.publicKey.toString('hex');
  const address = pkToAddress(privateKey).toString('hex');
  return JSON.stringify({
    privateKey,
    publickKey,
    address
  });
}

三. 离线签名

export async function signTrxTransaction (params: any): Promise<string> {
  const { privateKey, from, to, amount, energyLimit, energyPrice, refBlock, tokenAddress, tokenTRC10, expiration } = params;
  const time = Date.now();
  const feeLimit = energyLimit * energyPrice; // SUN
  const rawTx = buildTronTransaction({
    from,
    to,
    amount,
    feeLimit,
    refBlock,
    tokenAddress: tokenAddress || NULLTOKENADDR,
    tokenTRC10,
    expiration,
    permissionId: 0,
    time
  });
  const signedTx: any = signTx(privateKey, rawTx);
  return signedTx.hex;
}

注意:完整代码可以联系 The Web3 社区帮助您,联系方式 github 上和 The Web3Dao 公众号上面有。

四. Tron 钱包开发相关接口

1.获取账户信息

  • 请求示范
curl --location 'https://api.trongrid.io/wallet/getaccount' \
--header 'Content-Type: application/json' \
--data '{
  "address": "TZ4UXDV5ZhNW7fb2AMSbgfAEZ7hWsnYS2g",
  "visible": true
}'
  • 返回值
{
    "address": "TZ4UXDV5ZhNW7fb2AMSbgfAEZ7hWsnYS2g",
    "balance": 68623166,
    "create_time": 1675582485000,
    "latest_consume_time": 1712481906000,
    "net_window_size": 28800000,
    "net_window_optimized": true,
    "account_resource": {
        "latest_consume_time_for_energy": 1714295640000,
        "energy_window_size": 28800000,
        "energy_window_optimized": true
    },
    "owner_permission": {},
    "active_permission": [],
    "frozenV2": [
        {},
        {
            "type": "ENERGY"
        },
        {
            "type": "TRON_POWER"
        }
    ],
    "assetV2": [
        {
            "key": "1004977",
            "value": 8888880000
        },
        {
            "key": "1005026",
            "value": 8888880000
        }
    ],
    "free_asset_net_usageV2": [
        {
            "key": "1004977",
            "value": 0
        },
        {
            "key": "1005026",
            "value": 0
        }
    ],
    "asset_optimized": true
}
  • balance: 账户余额
  • account_resource:账户资源

2. 根据账户地址获取交易信息

  • https://developers.tron.network/reference/get-transaction-info-by-account-address
  • https://developers.tron.network/reference/get-trc20-transaction-info-by-account-address

3. 获取 energyPrice

  • 请求示范
curl --location 'https://api.trongrid.io/wallet/getenergyprices' --data ''
  • 返回值
{
    "prices": "0:100,1542607200000:20,1544724000000:10,1606240800000:40,1613044800000:140,1635422400000:280,1670133600000:420"
}
  • prices - 字符串:所有历史能源单价信息。每次单价变化由逗号分隔。冒号前是毫秒时间戳,冒号后是以 sun 为单位的能源单价。

4. 获取最新块高

  • 请求示范
curl --location 'https://api.trongrid.io/walletsolidity/getblock' --data ''
  • 返回值
{
    "blockID": "0000000003b6b891043be54ac0ae1ef579fad5e6e1732cb0ac4237a873b8453e",
    "block_header": {
        "raw_data": {
            "number": 62306449,
            "txTrieRoot": "7cb6ddff8ada79c91baf6667cc8ead757b39205a8dc8ae097298dbb0587bddb7",
            "witness_address": "4114f2c09d3de3fe82a71960da65d4935a30b24e1f",
            "parentHash": "0000000003b6b890d8e1d886520dcad1820f4313a435ad593a80c549ea883054",
            "version": 30,
            "timestamp": 1717563117000
        },
        "witness_signature": "82cd722206df1bd86be854605514f5a45f4914dba2097de6fd59b8c45a07721d5af9a60ec567ecdd48921aec5d458fa26f359315b6561b3d98bedd11910f777601"
    }
}
  • number:为最新块高,也可以使用 curl --location 'https://api.trongrid.io/wallet/getnowblock' --data ''

4. 根据区块号获取里面的交易

  • https://developers.tron.network/reference/gettransactioninfobyblocknum-1

  • https://developers.tron.network/reference/gettransactioncountbyblocknum

获取交易笔数

5.根据交易 Hash 获取交易详情

  • https://developers.tron.network/reference/gettransactionbyid
  • https://developers.tron.network/reference/gettransactioninfobyid-1

6. 广播交易

  • 请求示范
curl --location 'https://api.trongrid.io/wallet/broadcasthex' \
--header 'Content-Type: application/json' \
--data '{
  "transaction": "0A83010A0261B72208C487C467E75A3B8E40A4B7D099FE315A65080112610A2D747970652E676F6F676C65617069732E636F6D2F70726F746F636F6C2E5472616E73666572436F6E747261637412300A1541CF55FB918FB606E00B521868D06B02B261CF18E0121541EDFE83892A43773E7FF65440B72EB3A6AFE37A9B180170A4FD9896FE31124194602BD38AECC0E0AA8F4E417B5C969C840D6D9A4B2310E35A0162EBB7BFED4238AF68321B82C48EE0DCE0F42675DE477A388DA45E2DF9ABFF3A324D5B1E377C00"
}'
  • 返回值
{
    "result": false,
    "code": "TRANSACTION_EXPIRATION_ERROR",
    "txid": "cfc03ca018cb79aff19bafe67a81221f2295b2de3402ca4b92293ff3c78e46fe",
    "message": "Transaction expired",
    "transaction": "{\"raw_data\": {\"ref_block_bytes\": \"61b7\",\"ref_block_hash\": \"c487c467e75a3b8e\",\"expiration\": 1717503794084,\"contract\": [{\"type\": \"TransferContract\",\"parameter\": {\"type_url\": \"type.googleapis.com/protocol.TransferContract\",\"value\": \"0a1541cf55fb918fb606e00b521868d06b02b261cf18e0121541edfe83892a43773e7ff65440b72eb3a6afe37a9b1801\"}}],\"timestamp\": 1717496594084},\"signature\": [\"94602bd38aecc0e0aa8f4e417b5c969c840d6d9a4b2310e35a0162ebb7bfed4238af68321b82c48ee0dce0f42675de477a388da45e2df9abff3a324d5b1e377c00\"]}"
}
  • txid: 交易 hash

五. 中心化钱包开发

1. 离线地址生成

  • 调度签名机生成密钥对,签名机吐出公钥
  • 使用公钥匙导出地址

2.充值逻辑

  • 获得最新块高;更新到数据库
  • 从数据库中获取上次解析交易的块高做为起始块高,最新块高为截止块高,如果数据库中没有记录,说明需要从头开始扫,起始块高为 0;
  • 解析区块里面的交易,to 地址是系统内部的用户地址,说明用户充值,更新交易到数据库中,将交易的状态设置为待确认。
  • 所在块的交易过了确认位,将交易状态更新位充值成功并通知业务层。

3. 提现逻辑

  • 获取离线签名需要的参数,给合适的手续费
  • 构建未签名的交易消息摘要,将消息摘要递给签名机签名
  • 构建完整的交易并进行序列化
  • 发送交易到区块链网络
  • 扫链获取到交易之后更新交易状态并上报业务层

4.归集逻辑

  • 将用户地址上的资金转到归集地址,签名流程类似提现
  • 发送交易到区块链网络
  • 扫链获取到交易之后更新交易状态

5. 转冷逻辑

  • 将热钱包地址上的资金转到冷钱包地址,签名流程类似提现
  • 发送交易到区块链网络
  • 扫链获取到交易之后更新交易状态

6.冷转热逻辑

  • 手动操作转账到热钱包地址
  • 扫链获取到交易之后更新交易状态

六 HD 钱包开发

1.离线地生成和离线签名

参考上面的代码

2.和链上交互的接口

  • 获取账户余额
  • 获取 nonce
  • 根据地址获取交易记录
  • 获取预估手续费

七. 总结

HD 钱包和交易所钱包不同之处有以下几点

1.密钥管理方式不同

  • HD 钱包私钥在本地设备,私钥用户自己控制
  • 交易所钱包中心化服务器(CloadHSM, TEE 等),私钥项目方控制

2.资金存在方式不同

  • HD 资金在用户钱包地址
  • 交易所钱包资金在交易所热钱包或者冷钱包里面, 用户提现的时候从交易所热钱包提取

3.业务逻辑不一致

  • 中心化钱包:实时不断扫链更新交易数据和状态
  • HD 钱包:根据用户的操作通过请求接口实现业务逻辑

八.附录

  • Official Website: https://www.tron.network
  • Github: https://github.com/tronprotocol
  • Tron docs: https://developers.tron.network/
  • Tron 接口文档: https://developers.tron.network/reference/background
  • Tron 浏览器: https://tronscan.org/
  • 关于 Tron 的问题列表:https://developers.tron.network/docs/faq

留言
全部评论(0)