Tron 钱包开发详细教程丨区块链技术培训课程 #19

  • Dapplink
  • 更新于 2024-06-28 10:43
  • 阅读 2117

Tron(波场) 是一个兼容 EVM 的区块链平台

作者丨Seek

Tron 简介

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

  • 存储层: 包括区块存储和状态存储,支持多种存储机制。

  • 核心层: 实现了智能合约、账户管理和共识机制(目前使用的是DPoS,即委托权益证明)。

  • 应用层: 为开发者提供API和SDK,支持开发去中心化应用(DApps)。

    01 主要组件和功能

  • ron虚拟机(TVM): 兼容以太坊虚拟机(EVM),使开发者可以轻松将以太坊上的应用迁移到Tron上。一组 Sui Move 字节码模块。每个模块都有一个在包含包内唯一的名称。包的链上 ID 和模块名称的组合唯一地标识了模块。当您将智能合约发布到 Sui 时,包是发布的单位。发布包对象后,它是不可变的,永远无法更改或删除。包对象可以依赖于之前发布到 Sui 的其他包对象。

  • 智能合约: 支持Solidity语言编写的智能合约。

  • TRC-20和TRC-721标准: TRC-20是Tron的代币标准,类似于以太坊的ERC-20;TRC-721则是非同质化代币标准,类似于ERC-721。

02 共识机制

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

03 生态系统

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

  • TronLink: 官方钱包,支持TRX和TRC-20代币的存储和交易。

  • JustSwap: 去中心化交易所,支持TRC-20代币的交易。

  • Sun Network: 侧链扩展方案,旨在提升Tron主网的扩展性。

  • BitTorrent: Tron收购的去中心化文件共享协议,与Tron网络深度集成。

  • DApps: 大量去中心化应用在 Tron 平台上运行。

04 代币(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 钱包开发相关接口

01 获取账户信息

  • 请求示范
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:账户资源

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

03 获取 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 为单位的能源单价。

04 获取最新块高

  • 请求示范
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"
    }
}

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

06 广播交易

  • 请求示范
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

中心化钱包开发

01 离线地址生成

  • 调度签名机生成密钥对,签名机吐出公钥

  • 使用公钥匙导出地址

02 充值逻辑

  • 获得最新块高;更新到数据库

  • 从数据库中获取上次解析交易的块高做为起始块高,最新块高为截止块高,如果数据库中没有记录,说明需要从头开始扫,起始块高为 0;

  • 解析区块里面的交易,to 地址是系统内部的用户地址,说明用户充值,更新交易到数据库中,将交易的状态设置为待确认。

  • 所在块的交易过了确认位,将交易状态更新位充值成功并通知业务层。

03 提现逻辑

  • 获取离线签名需要的参数,给合适的手续费

  • 构建未签名的交易消息摘要,将消息摘要递给签名机签名

  • 构建完整的交易并进行序列化

  • 发送交易到区块链网络

  • 扫链获取到交易之后更新交易状态并上报业务层

04 归集逻辑

  • 将用户地址上的资金转到归集地址,签名流程类似提现

  • 发送交易到区块链网络

  • 扫链获取到交易之后更新交易状态

05 转冷逻辑

  • 将热钱包地址上的资金转到冷钱包地址,签名流程类似提现

  • 发送交易到区块链网络

  • 扫链获取到交易之后更新交易状态

06 冷转热逻辑

  • 手动操作转账到热钱包地址

  • 扫链获取到交易之后更新交易状态

HD 钱包开发

01 离线地生成和离线签名

参考上面的代码

02 和链上交互的接口

  • 获取账户余额

  • 获取 nonce

  • 根据地址获取交易记录

  • 获取预估手续费

总结

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

01 密钥管理方式不同

  • HD 钱包私钥在本地设备,私钥用户自己控制

  • 交易所钱包中心化服务器(CloadHSM, TEE 等),私钥项目方控制

02 资金存在方式不同

  • HD 资金在用户钱包地址

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

03 业务逻辑不一致

  • 中心化钱包:实时不断扫链更新交易数据和状态

  • HD 钱包:根据用户的操作通过请求接口实现业务逻辑

附录

点赞 0
收藏 1
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
Dapplink
Dapplink
0xBdcb...f214
首个模块化、可组合的Layer3协议。