[TOC]

O desenvolvimento da tecnologia blockchain está impulsionando a negociação quantitativa para a era Web3. Como uma ferramenta líder de negociação quantitativa, a plataforma de negociação quantitativa FMZ vem explorando há muito tempo a direção da Web3 e fornece funções relacionadas ao Ethereum, permitindo que os usuários interajam com contratos inteligentes, gerenciem fundos e executem estratégias de negociação automatizadas diretamente na cadeia.
Hoje, a plataforma FMZ expandiu ainda mais seus recursos de negociação Web3 e oferece suporte à rede Tron (TRX), permitindo que os usuários implementem estratégias de negociação quantitativa nas duas principais cadeias públicas: Ethereum e Tron. Esta atualização não apenas melhora a flexibilidade das transações entre cadeias, mas também oferece aos traders mais possibilidades de gerenciamento de ativos na cadeia.
Neste artigo, abordaremos em detalhes:
Detalhes da introdução do TRX-TRON (citado por Feixiaohao)
A TRON foi fundada por Justin Sun em setembro de 2017 e alcançou muitas conquistas notáveis desde seu lançamento na mainnet em maio de 2018. Em julho de 2018, o ecossistema TRON concluiu sua integração com o BitTorrent, pioneiro no fornecimento de serviços descentralizados da Web 3.0 com mais de 100 milhões de usuários ativos mensais. Nos últimos anos, a rede TRON teve um desempenho brilhante. Dados do TRONSCAN mostram que, em outubro de 2022, o número total de usuários da cadeia pública TRON ultrapassou 115 milhões, o número de transações ultrapassou 4 bilhões e o valor total bloqueado (TVL) ultrapassou US$ 13,2 bilhões. A rede TRON se tornou totalmente descentralizada em dezembro de 2021 e agora é uma organização autônoma descentralizada (DAO) governada pela comunidade. Em maio de 2022, a TRON anunciou o lançamento da stablecoin descentralizada supercolateralizada USDD, que é apoiada pelo banco central de criptomoedas do setor, o TRON Joint Reserve, marcando a entrada oficial da TRON na era das stablecoins descentralizadas. Em outubro de 2022, Dominica anunciou que TRON era sua infraestrutura nacional de blockchain oficialmente designada, tornando TRON uma grande cadeia pública que chegou a um acordo de cooperação com um estado soberano para desenvolver infraestrutura de blockchain. A TRON foi autorizada a emitir o token de fã de Dominica, Dominica Coin (DMC), para aumentar a visibilidade global do patrimônio natural e das atrações turísticas de Dominica. Ao mesmo tempo, os sete principais tokens sob o TRON receberam o status de moeda digital legal e moeda com curso legal na Dominica.
Alto rendimento: O alto rendimento é obtido pela melhoria do TPS no TRON, e sua praticidade para uso diário superou o Bitcoin e o Ethereum.
Escalabilidade: Com base em boa escalabilidade e contratos inteligentes eficientes, os aplicativos podem ter mais métodos de implantação no TRON, e o TRON pode suportar um grande número de usuários.
Alta confiabilidade: o TRON tem uma estrutura de rede mais confiável, ativos de usuário, valor intrínseco e um maior grau de consenso descentralizado, o que traz um mecanismo de distribuição de recompensas aprimorado.
grpc.trongrid.io:50051
Você pode usar nós JSON-RPC, nós REST, etc. de outros provedores de nós (você pode usar HttpQuery para solicitar). As únicas chamadas para o encapsulamento do objeto de troca no FMZ são métodos grpc.
Você precisa preparar uma carteira TRON. Você pode usar OKX, imToken, etc., ou pode gerar uma você mesmo.
Antes de a plataforma FMZ dar suporte ao Tron, ela assumiu a liderança no suporte ao desenvolvimento do Web3 do Ethereum. Você pode revisar artigos anteriores para aprender como se conectar à exchange descentralizada UniSwap. Como o Tron é compatível com o Ethereum e integra alguns recursos do ETH e do EOS, ele tem vantagens únicas na execução de contratos inteligentes e na interação na cadeia. Configurar objetos de troca Tron (carteiras, informações de nós) na plataforma FMZ é quase o mesmo que configurar objetos de troca Ethereum (carteiras, informações de nós).
Na página Adicionar Exchange:

Configure a carteira, selecione TRON como ChainType e use o endereço do nó RPC padrão.
Podemos usar as ferramentas de depuração da plataforma para testar.
Ferramentas de depuração: https://www.fmz.com/m/debug
Como o nome sugere, esse método é exatamente o mesmo que o método do Ethereum, e suas funções são exatamente as mesmas. Este método é usado para ler o saldo TRX na carteira Tron especificada.
curl https://docs-demo.tron-mainnet.quiknode.pro/jsonrpc \
-X POST \
-H "Content-Type: application/json" \
--data '{"method":"eth_getBalance","params":["0x41f0cc5a2a84cd0f68ed1667070934542d673acbd8", "latest"],"id":1,"jsonrpc":"2.0"}'
Os dados de saldo solicitados são um valor hexadecimal muito grande, o que requer a função de conversão que usamos na estratégia anterior relacionada ao Ethereum.
function toAmount(s, decimals) {
return Number((BigDecimal(BigInt(s)) / BigDecimal(Math.pow(10, decimals))).toString())
}
function toInnerAmount(n, decimals) {
return (BigDecimal(n) * BigDecimal(Math.pow(10, decimals))).toFixed(0)
}
Como o endereço da carteira copiado da carteira Tron é um endereço codificado em base58, ele precisa ser convertido em um parâmetro codificado em hexadecimal antes de poder ser usado.
function base58ToHex(base58Str) {
const ALPHABET = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"
var num = BigInt(0)
for (var char of base58Str) {
var digit = BigInt(ALPHABET.indexOf(char));
if (digit === BigInt(-1)) throw new Error("Invalid Base58 character: " + char)
num = num * BigInt(58) + digit
}
var hex = num.toString(16)
if (hex.length % 2 !== 0) {
hex = "0" + hex
}
return "0x" + hex
}
Depois de converter o endereço, podemos chamar issoeth_getBalanceMétodo.
O código de teste completo:
function toAmount(s, decimals) {
return Number((BigDecimal(BigInt(s)) / BigDecimal(Math.pow(10, decimals))).toString())
}
function toInnerAmount(n, decimals) {
return (BigDecimal(n) * BigDecimal(Math.pow(10, decimals))).toFixed(0)
}
function base58ToHex(base58Str) {
const ALPHABET = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"
var num = BigInt(0)
for (var char of base58Str) {
var digit = BigInt(ALPHABET.indexOf(char));
if (digit === BigInt(-1)) throw new Error("Invalid Base58 character: " + char)
num = num * BigInt(58) + digit
}
var hex = num.toString(16)
if (hex.length % 2 !== 0) {
hex = "0" + hex
}
return "0x" + hex
}
function main() {
var tronAddress = "Tron 钱包地址"
var hexAddress = base58ToHex(tronAddress).substring(2, 44)
var jsonrpcBase = "https://go.getblock.io/xxx/jsonrpc" // 具体的JSON-RPC节点
var body = {
"method": "eth_getBalance",
"params": [hexAddress, "latest"],
"id":1,
"jsonrpc":"2.0"
}
var options = {
method: "POST",
body: JSON.stringify(body),
headers: {"accept": "application/json", "content-type": "application/json"},
timeout: 1000
}
var ret = JSON.parse(HttpQuery(jsonrpcBase, options))
var balance = ret.result
return toAmount(balance, 6)
}
A precisão do token do TRX é 6, então preencha o parâmetro 6 ao processar bigNumber.
Teste na ferramenta de depuração da plataforma FMZ:

Comparando o saldo TRX na carteira consultada no tronscan, os dados são consistentes.

O principal conteúdo de prática na plataforma FMZ é a chamada de método do nó grpc. Devido ao espaço limitado, apenas as chamadas de método comumente usadas são listadas aqui.
Chamando protótipo:exchange.IO("api", "tron", "method name", ...). “nome do método” é o nome do método a ser chamado.
Consultar informações da conta da carteira.
function main() {
var account = exchange.IO("api", "tron", "GetAccount", "tron 钱包地址") // tron 钱包地址 :填写实际的钱包地址。
return account
}
Informações sobre a chamada de retorno (trecho):
{
"address": {},
"balance": 72767348, // 即钱包的TRX余额:72.767348
"asset_optimized": true,
"create_time": 1693463943000,
...
Verifique as transferências.
function main() {
return exchange.IO("api", "tron", "GetTransactionInfoByID", "305f0c2487095effcf9e2db61f021f976707611424cba57e1d6464736f7f49e7")
}
Dados retornados:
{"id":{},"fee":1100000,"blockNumber":70192360,"blockTimeStamp":1741229766000,"contractResult":[{}],"receipt":{"net_fee":100000}}
Retorna todas as informações do nó.
function main() {
return exchange.IO("api", "tron", "ListNodes")
}
Consultar as informações de precisão dos tokens TRC20
function main() {
return exchange.IO("api", "tron", "TRC20GetDecimals", "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t") // USDT
}
Consultar o saldo de um determinado token TRC20 em um determinado endereço de carteira.
function main() {
return exchange.IO("api", "tron", "TRC20ContractBalance", "TRX 钱包地址", "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t")
}
Retorna as informações mais recentes do bloco no blockchain atual.
function main() {
return exchange.IO("api", "tron", "GetNowBlock")
}
Dados retornados:
{
"transactions": [
{
"transaction": {
"raw_data": {
"ref_block_bytes": {},
"ref_block_hash": {},
"expiration": 1741489083000,
"contract": [
{
"type": 1,
"parameter": {
"type_url": "type.googleapis.com/protocol.TransferContract",
"value": {}
...
Consulte as informações de largura de banda da conta TRON.
function main() {
return exchange.IO("api", "tron", "GetAccountNet", "TWTbnQuiWvEg...")
}
Dados retornados:
{
"freeNetLimit": 600,
"TotalNetLimit": 43200000000,
"TotalNetWeight": 26982826755
}
Crie uma conta Tron.
function main() {
return exchange.IO("api", "tron", "CreateAccount", "TWTbnQ...", "TKCG9...")
}
Tentar criar uma conta existente retornará um erro:
Futures_OP 4: Contract validate error : Account has existed
Obtenha informações sobre blocos com base na altura do bloco.
function main() {
return exchange.IO("api", "tron", "GetBlockByNum", 70227286)
}
Dados retornados:
{
"transactions": [
{
"transaction": {
"raw_data": {
"ref_block_bytes": {},
"ref_block_hash": {},
"expiration": 1741334628000,
"contract": [
...
TRC20GetName, consulta o nome do token TRC20 com base no endereço do contrato. TRC20GetSymbol, consulta o símbolo do token TRC20 de acordo com o endereço do contrato
function main() {
Log("TRC20GetName:", exchange.IO("api", "tron", "TRC20GetName", "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t"))
Log("TRC20GetSymbol:", exchange.IO("api", "tron", "TRC20GetSymbol", "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t"))
}
Dados retornados:
2025-03-09 11:18:43.083 信息 TRC20GetSymbol: USDT
2025-03-09 11:18:43.006 信息 TRC20GetName: Tether USD
function main() {
// 例如某个转账数据中的Data,转换为可读数值
Log("ParseTRC20NumericProperty:", exchange.IO("api", "tron", "ParseTRC20NumericProperty", "0x00000000000000000000000000000000000000000000000000000001a13b8600")) // 7000000000
// 例如某个转账数据中的Data,转换为可读字符串
Log("ParseTRC20StringProperty:", exchange.IO("api", "tron", "ParseTRC20StringProperty", "0x0000000000000000000000000000000000000000000000000000000055534454")) // USDT
}
Para chamar o contrato TRC20, usamos o método balanceOf do contrato TRC20, primeiro o codificamos e depois o chamamos usando TRC20Call.
function main() {
var data = exchange.IO("pack", "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t", "balanceOf", "TWTbnQuiWvEg...")
var tx = exchange.IO("api", "tron", "TRC20Call", "TWTbnQuiWvEg...", "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t", data, true, 0)
return tx.constant_result
}
Métodos constantes não requerem transmissão. O resultado da chamada é registrado em tx.constant_result.
Construir um dado trans.
function main() {
var trans = exchange.IO("api", "tron", "Transfer", "TWTb...", "TKCG9FN...", 1000000)
return trans
}
TWTb...: O endereço da carteira TRX A.TKCG9FN...: O endereço da carteira TRX B.Dados retornados:
{
"transaction": {
"raw_data": {
"ref_block_bytes": {},
"ref_block_hash": {},
"expiration": 1741493085000,
"contract": [
{
"type": 1,
"parameter": {
"type_url": "type.googleapis.com/protocol.TransferContract",
"value": {}
}
}
],
"timestamp": 1741493025759
}
},
"txid": {},
"result": {
"result": true
}
}
Obtenha o ABI do contrato com base no endereço do contrato.
function main() {
var usdtABI = exchange.IO("api", "tron", "GetContractABI", "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t")
return usdtABI
}
Dados retornados:
{
"entrys": [
{
"constant": true,
"name": "name",
"outputs": [
{
"type": "string"
}
],
"type": 2,
"stateMutability": 2
},
{
"constant": true,
"name": "deprecated",
"outputs": [
{
"type": "bool"
}
],
"type": 2,
"stateMutability": 2
},
...
Em direção aTKCG9FN1j...Transfira 1TRX para o endereço da carteira tron.
function main() {
var ownerAddress = exchange.IO("address")
var ret = exchange.IO("api", "tron", "Transfer", ownerAddress, "TKCG9FN1j...", 1000000)
return ret
}
Chame o método do contrato inteligente.
function main() {
var tx = exchange.IO("api", "tron", "TriggerConstantContract", "TWTbnQu...", "TSUUVjysXV8YqHytSNjfkNXnnB49QDvZpx", "token0()", "")
var ret2 = Encode("raw", "raw", "hex", tx.constant_result[0])
Log(ret2) // 000000000000000000000000891cdb91d149f23b1a45d9c5ca78a88d0cb44c18
}
Os dados retornados são o endereço do token token0 do pool de negociação sunSwap.
Chame o método de contrato inteligente na cadeia tronbalanceOf,TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6tparaUSDTO endereço do contrato inteligente do token.
function toAmount(s, decimals) {
return Number((BigDecimal(BigInt(s)) / BigDecimal(Math.pow(10, decimals))).toString())
}
function main() {
var balance = exchange.IO("api", "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t", "balanceOf", "Tron 钱包地址")
return toAmount(balance, 6)
}
Você pode verificar o saldo de USDT em sua carteira: 0,000019

Plataforma FMZWeb3 tronObjeto de trocaexchange.IOA função implementa as seguintes funções.
function main() {
var ret = exchange.IO("api", "tron", "send", "目标TRX钱包地址", 1) // 需要注意,参数1 表示 0.000001 TRX ,需要转换数值为链上数值。
return ret // 转账hash: 305f0c2487095effcf9e2db61f021f9767076114...
}
exchange.IO("base", "rpc address") // rpc address 替换为具体的节点地址
// 或者
exchange.IO("rpc", "rpc address")
exchange.IO("abi", "contract ABI") // contract ABI 替换为具体的合约ABI内容
exchange.IO("address") // 返回tron钱包地址
pack / encode: codificar/empacotar dados, chamada de método.
function main() {
// 打包TRC20合约的balanceOf方法调用
var data1 = exchange.IO("pack", "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t", "balanceOf", "TWTbnQu...") // TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t 为USDT合约地址
Log(data1)
var data2 = exchange.IO("encode", "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t", "balanceOf", "TWTbnQu...")
Log(data2)
Log("data1 == data2:", data1 == data2) // true
// 编码数据为uint256
var data3 = exchange.IO("pack", "uint256", 19) // 数据为: 19
Log(data3)
var data4 = exchange.IO("encode", "uint256", 19)
Log(data4)
Log("data3 == data4:", data3 == data4)
}
encodePacked: codificado e empacotado
function main() {
var data1 = exchange.IO("encodePacked", "address", "TWTbnQu...")
Log(data1)
// e0c12e16a9f713e5f104c...
var data2 = exchange.IO("encode", "address", "TWTbnQu...")
Log(data2)
// 000000000000000000000000 e0c12e16a9f713e5f104c...
}
descompactar/decodificar: descompactar/decodificar dados, chamada de método.
function main() {
var data = exchange.IO("pack", "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t", "balanceOf", "TWTbnQu...")
Log(data)
var tx = exchange.IO("api", "tron", "TRC20Call", "TWTbnQu...", "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t", data, true, 0)
var ret = Encode("raw", "raw", "hex", tx.constant_result[0])
Log(ret)
// 解码
var usdtBalance = exchange.IO("decode", "uint256", ret)
Log("usdtBalance:", usdtBalance)
// 解码
return exchange.IO("unpack", "uint256", ret)
}
exchange.IO("key", "xxx") // xxx 为私钥
exchange.IO("hash", algo, inputFormat, outputFormat, data)Assine com a chave privada configurada no momento e retorne os dados assinados.
var signature = exchange.IO("hash", "sign", "string", "hex", "txHash") // txHash: 具体hash值
Prática inicial na bolsa DEX na cadeia Tron: sunSwap. Chamamos o contrato de fábrica sunSwap, solicitamos os índices de todos os pares de negociação e, em seguida, solicitamos o endereço do par de negociação com índice 1.
function main() {
var poolIndexs = exchange.IO("api", "TThJt8zaJzJMhCEScH7zWKnp5buVZqys9x", "allPoolsLength")
Log("poolIndexs:", poolIndexs) // 交易对索引总数
var hexAddress = exchange.IO("api", "TThJt8zaJzJMhCEScH7zWKnp5buVZqys9x", "allPools", exchange.IO("encode", "uint256", 1))
Log("hexAddress:", hexAddress) // 索引为1的交易对地址
}
Devido ao espaço limitado, compartilharemos o conteúdo detalhado do sunSwap com os leitores no próximo artigo. Obrigado pelo seu apoio.
A plataforma de negociação quantitativa FMZ continua a inovar na era Web3, oferecendo aos traders quantitativos um espaço de negociação on-chain mais amplo. Ao oferecer suporte à rede Tron, a FMZ não apenas aprimora os recursos de transações entre cadeias, mas também permite que os usuários executem com eficiência interações de contratos inteligentes, gerenciamento de fundos e estratégias de negociação automatizadas no ecossistema Tron.
Neste artigo, apresentamos o suporte da plataforma FMZ para a rede Tron e implementamos as chamadas de método de contrato do SunSwap DEX na cadeia Tron. Com o desenvolvimento da tecnologia blockchain, as possibilidades de transações quantitativas da Web3 continuarão a se expandir. A FMZ continuará a otimizar e melhorar seus recursos Web3 para fornecer aos traders quantitativos um ambiente de negociação mais flexível, seguro e eficiente, ajudando os usuários a obter maiores vantagens no mercado on-chain.
Obrigado pela leitura e pelo seu apoio.