avatar of 发明者量化-小小梦 发明者量化-小小梦
focar em Mensagem privada
4
focar em
1271
Seguidores

Expansão FMZ Quantitative Web3: Suporte Tron adicionado, capacidades de transação on-chain expandidas

Criado em: 2025-02-28 17:20:12, atualizado em: 2025-03-11 18:04:16
comments   0
hits   687

[TOC]

Expansão FMZ Quantitative Web3: Suporte Tron adicionado, capacidades de transação on-chain expandidas

Prefácio

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:

  • Discuta a ecologia, aplicações, desenvolvimento e outros conteúdos técnicos do Tron na direção Web3 da plataforma FMZ.
  • Pratique a configuração baseada na rede Tron na plataforma FMZ.
  • Recursos e materiais utilizados na prática
  • Pratique a chamada de métodos em nós Tron.
  • SunSwap, uma prática DeFi baseada no ecossistema Tron.

Introdução ao Tron

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.

Recursos e materiais utilizados na prática

  • Nó grpc oficial da rede principal TRON

grpc.trongrid.io:50051

  • Outros nós:

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.

  • Carteira TRON

Você precisa preparar uma carteira TRON. Você pode usar OKX, imToken, etc., ou pode gerar uma você mesmo.

  • tronscan

https://tronscan.org/

  • Protocolo Tron

https://github.com/tronprotocol

  • SunSwap

https://sun.io/?lang=zh-CN#/v3/swap

https://github.com/sunswapteam

Configurar objetos de troca WEB3 no FMZ

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).

Adicionar objeto de troca

Na página Adicionar Exchange:

https://www.fmz.com/m/platforms/add

Expansão FMZ Quantitative Web3: Suporte Tron adicionado, capacidades de transação on-chain expandidas

Configure a carteira, selecione TRON como ChainType e use o endereço do nó RPC padrão.

Práticas comuns do método de nó JSON-RPC

Podemos usar as ferramentas de depuração da plataforma para testar.

Ferramentas de depuração: https://www.fmz.com/m/debug

eth_getBalance

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:

Expansão FMZ Quantitative Web3: Suporte Tron adicionado, capacidades de transação on-chain expandidas

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

Expansão FMZ Quantitative Web3: Suporte Tron adicionado, capacidades de transação on-chain expandidas

Prática do método do nó gRPC

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.

GetAccount

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,
    ...

GetTransactionInfoByID

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}}

ListNodes

Retorna todas as informações do nó.

function main() {
    return exchange.IO("api", "tron", "ListNodes")
}

TRC20GetDecimals

Consultar as informações de precisão dos tokens TRC20

function main() {
    return exchange.IO("api", "tron", "TRC20GetDecimals", "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t")  // USDT
}

TRC20ContractBalance

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")
}

GetNowBlock

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": {}
                                ...

GetAccountNet

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
}

CreateAccount

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

GetBlockByNum

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 / TRC20GetSymbol

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

ParseTRC20…

function main() {
    // 例如某个转账数据中的Data,转换为可读数值
    Log("ParseTRC20NumericProperty:", exchange.IO("api", "tron", "ParseTRC20NumericProperty", "0x00000000000000000000000000000000000000000000000000000001a13b8600"))  // 7000000000

    // 例如某个转账数据中的Data,转换为可读字符串
    Log("ParseTRC20StringProperty:", exchange.IO("api", "tron", "ParseTRC20StringProperty", "0x0000000000000000000000000000000000000000000000000000000055534454"))    // USDT
}

TRC20Call

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
}
  • “TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t”: endereço do contrato TRC20 USDT.
  • “TWTbnQuiWvEg…”: Parâmetro, o endereço da carteira TRX do saldo solicitado pelo método balanceOf.
  • “balanceOf”: O nome do método que precisa ser codificado.

Métodos constantes não requerem transmissão. O resultado da chamada é registrado em tx.constant_result.

Transfer

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.
  • 1000000: Transferir 1TRX.

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
    }
}

GetContractABI

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
        },
        ...

Transfer

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
}

TriggerConstantContract

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.

Chamada de método de contrato inteligente

  • Verifique o saldo do USDT

Chame o método de contrato inteligente na cadeia tronbalanceOfTR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6tparaUSDTO 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

Expansão FMZ Quantitative Web3: Suporte Tron adicionado, capacidades de transação on-chain expandidas

Outros recursos do exchange.IO

Plataforma FMZWeb3 tronObjeto de trocaexchange.IOA função implementa as seguintes funções.

  • Transferência TRX
  function main() {
      var ret = exchange.IO("api", "tron", "send", "目标TRX钱包地址", 1)  // 需要注意,参数1 表示 0.000001 TRX ,需要转换数值为链上数值。
      return ret   // 转账hash: 305f0c2487095effcf9e2db61f021f9767076114...
  }
  • Endereço do nó do switch
  exchange.IO("base", "rpc address")  // rpc address 替换为具体的节点地址
  // 或者
  exchange.IO("rpc", "rpc address")
  • Registrar contrato inteligente ABI
  exchange.IO("abi", "contract ABI")  // contract ABI 替换为具体的合约ABI内容
  • Obter o endereço da carteira vinculada ao objeto de troca atual
  exchange.IO("address")  // 返回tron钱包地址
  • pack / encode / encodePacked

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...
  }
  • unpack / decode

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)
  }
  • Atualizar/Importar Chave Privada
  exchange.IO("key", "xxx")  // xxx 为私钥
  • Calculando hash Chamando protótipo: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值

Uma primeira olhada no SunSwap

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.

THE END

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.