avatar of 发明者量化-小小梦 发明者量化-小小梦
Seguir Mensajes Privados
4
Seguir
1271
Seguidores

Expansión cuantitativa de FMZ Web3: se agregó compatibilidad con Tron y se ampliaron las capacidades de transacciones en cadena

Creado el: 2025-02-28 17:20:12, Actualizado el: 2025-03-11 18:04:16
comments   0
hits   687

[TOC]

Expansión cuantitativa de FMZ Web3: se agregó compatibilidad con Tron y se ampliaron las capacidades de transacciones en cadena

Prefacio

El desarrollo de la tecnología blockchain está impulsando el comercio cuantitativo hacia la era Web3. Como herramienta comercial cuantitativa líder, la plataforma comercial cuantitativa FMZ ha estado explorando durante mucho tiempo la dirección de Web3 y proporciona funciones relacionadas con Ethereum, lo que permite a los usuarios interactuar con contratos inteligentes, administrar fondos y ejecutar estrategias comerciales automatizadas directamente en la cadena.

Hoy, la plataforma FMZ ha ampliado aún más sus capacidades comerciales Web3 y es compatible con la red Tron (TRX), lo que permite a los usuarios implementar estrategias comerciales cuantitativas en las dos principales cadenas públicas de Ethereum y Tron. Esta actualización no solo mejora la flexibilidad de las transacciones entre cadenas, sino que también brinda a los comerciantes más posibilidades para la gestión de activos en cadena.

En este artículo cubriremos en detalle:

  • Discuta la ecología de Tron, aplicaciones, desarrollo y otros contenidos técnicos en la dirección Web3 de la plataforma FMZ.
  • Practique la configuración basada en la red Tron en la plataforma FMZ.
  • Recursos y materiales utilizados en la práctica
  • Practica métodos de llamada en nodos Tron.
  • SunSwap, una práctica DeFi basada en el ecosistema Tron.

Introducción a Tron

Detalles de la introducción de TRX-TRON (citado por Feixiaohao)

TRON fue fundada por Justin Sun en septiembre de 2017 y ha logrado muchos logros destacados desde el lanzamiento de su red principal en mayo de 2018. En julio de 2018, el ecosistema TRON completó su integración con BitTorrent, pionero en la prestación de servicios descentralizados Web 3.0 con más de 100 millones de usuarios activos mensuales. En los últimos años, la red TRON ha tenido un rendimiento brillante. Los datos de TRONSCAN muestran que, a octubre de 2022, el número total de usuarios de la cadena pública TRON ha superado los 115 millones, el número de transacciones ha superado los 4 mil millones y el valor total bloqueado (TVL) ha superado los 13,2 mil millones de dólares estadounidenses. La red TRON se descentralizó por completo en diciembre de 2021 y ahora es una organización autónoma descentralizada (DAO) gobernada por la comunidad. En mayo de 2022, TRON anunció el lanzamiento de la moneda estable súper colateralizada descentralizada USDD, que está respaldada por el banco central de criptomonedas de la industria, TRON Joint Reserve, lo que marca la entrada oficial de TRON en la era de las monedas estables descentralizadas. En octubre de 2022, Dominica anunció que TRON era su infraestructura blockchain nacional oficialmente designada, lo que convierte a TRON en una gran cadena pública que ha llegado a un acuerdo de cooperación con un estado soberano para desarrollar infraestructura blockchain. TRON ha sido autorizado a emitir el token de fan de Dominica, Dominica Coin (DMC), para mejorar la visibilidad global del patrimonio natural y las atracciones turísticas de Dominica. Al mismo tiempo, a los siete tokens principales de TRON se les otorgó el estatus de moneda digital legal y de curso legal en Dominica.

  • Alto rendimiento: se logra un alto rendimiento al mejorar TPS en TRON, y su practicidad para el uso diario ha superado a Bitcoin y Ethereum.

  • Escalabilidad: gracias a una buena escalabilidad y a contratos inteligentes eficientes, las aplicaciones pueden tener más métodos de implementación en TRON, y TRON puede admitir una gran cantidad de usuarios.

  • Alta confiabilidad: TRON tiene una estructura de red más confiable, activos de usuario, valor intrínseco y un mayor grado de consenso descentralizado que brinda un mecanismo de distribución de recompensas mejorado.

Recursos y materiales utilizados en la práctica

  • Nodo grpc oficial de la red principal de TRON

grpc.trongrid.io:50051

  • Otros nodos:

Puede utilizar nodos JSON-RPC, nodos REST, etc. de otros proveedores de nodos (puede utilizar HttpQuery para solicitar). Las únicas llamadas a la encapsulación de objetos de intercambio en FMZ son los métodos grpc.

  • Monedero TRON

Debes preparar una billetera TRON. Puedes usar OKX, imToken, etc., o puedes generar una tú mismo.

  • 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 intercambio WEB3 en FMZ

Antes de que la plataforma FMZ respaldara a Tron, había tomado la iniciativa en respaldar el desarrollo de Web3 de Ethereum. Puedes revisar artículos anteriores para aprender cómo conectarte al exchange descentralizado UniSwap. Dado que Tron es compatible con Ethereum e integra algunas características de ETH y EOS, tiene ventajas únicas en la ejecución de contratos inteligentes y la interacción en cadena. Configurar objetos de intercambio de Tron (billeteras, información de nodos) en la plataforma FMZ es casi lo mismo que configurar objetos de intercambio de Ethereum (billeteras, información de nodos).

Añadir objeto de intercambio

En la página Agregar intercambio:

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

Expansión cuantitativa de FMZ Web3: se agregó compatibilidad con Tron y se ampliaron las capacidades de transacciones en cadena

Configure la billetera, seleccione TRON como ChainType y use la dirección de nodo RPC predeterminada.

Prácticas comunes de métodos de nodo JSON-RPC

Podemos utilizar las herramientas de depuración de la plataforma para realizar pruebas.

Herramientas de depuración: https://www.fmz.com/m/debug

eth_getBalance

Como sugiere su nombre, este método es exactamente el mismo que el método de Ethereum y sus funciones son exactamente las mismas. Este método se utiliza para leer el saldo de TRX en la billetera 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"}'

Los datos de saldo solicitados son un valor hexadecimal muy grande, que requiere la función de conversión que usamos en la estrategia anterior relacionada con 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)
}

Dado que la dirección de billetera copiada de la billetera Tron es una dirección codificada en base58, debe convertirse a un parámetro codificado en hexadecimal antes de poder usarse.

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
}

Después de convertir la dirección, podemos llamar a estoeth_getBalanceMétodo.

El código de prueba 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)
}

La precisión del token TRX es 6, así que complete el parámetro 6 al procesar bigNumber.

Prueba en la herramienta de depuración de la plataforma FMZ:

Expansión cuantitativa de FMZ Web3: se agregó compatibilidad con Tron y se ampliaron las capacidades de transacciones en cadena

Al comparar el saldo de TRX en la billetera consultada en tronscan, los datos son consistentes.

Expansión cuantitativa de FMZ Web3: se agregó compatibilidad con Tron y se ampliaron las capacidades de transacciones en cadena

Práctica del método de nodo gRPC

El contenido principal de la práctica en la plataforma FMZ es la llamada de método del nodo grpc. Debido al espacio limitado, aquí solo se enumeran las llamadas de método más utilizadas.

Prototipo de llamada:exchange.IO("api", "tron", "method name", ...). “nombre del método” es el nombre del método que se llamará.

GetAccount

Consultar información de la cuenta de billetera.

function main() {
    var account = exchange.IO("api", "tron", "GetAccount", "tron 钱包地址")  // tron 钱包地址 :填写实际的钱包地址。
    return account
}

Información de devolución de llamada (extracto):

{
    "address": {},
    "balance": 72767348,   // 即钱包的TRX余额:72.767348
    "asset_optimized": true,
    "create_time": 1693463943000,
    ...

GetTransactionInfoByID

Consultar transferencias.

function main() {
    return exchange.IO("api", "tron", "GetTransactionInfoByID", "305f0c2487095effcf9e2db61f021f976707611424cba57e1d6464736f7f49e7") 
}

Datos devueltos:

{"id":{},"fee":1100000,"blockNumber":70192360,"blockTimeStamp":1741229766000,"contractResult":[{}],"receipt":{"net_fee":100000}}

ListNodes

Devuelve toda la información del nodo.

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

TRC20GetDecimals

Consultar la información de precisión de los tokens TRC20

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

TRC20ContractBalance

Consultar el saldo de un determinado token TRC20 en una determinada dirección de billetera.

function main() {
    return exchange.IO("api", "tron", "TRC20ContractBalance", "TRX 钱包地址", "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t")
}

GetNowBlock

Devuelve la información de bloque más reciente en la cadena de bloques actual.

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

Datos devueltos:

{
    "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

Consultar la información del ancho de banda de la cuenta TRON.

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

Datos devueltos:

{
    "freeNetLimit": 600,
    "TotalNetLimit": 43200000000,
    "TotalNetWeight": 26982826755
}

CreateAccount

Crea una cuenta Tron.

function main() {
    return exchange.IO("api", "tron", "CreateAccount", "TWTbnQ...", "TKCG9...")
}

Intentar crear una cuenta existente devolverá un error:

Futures_OP 4: Contract validate error : Account has existed

GetBlockByNum

Obtenga información del bloque en función de la altura del bloque.

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

Datos devueltos:

{
    "transactions": [
        {
            "transaction": {
                "raw_data": {
                    "ref_block_bytes": {},
                    "ref_block_hash": {},
                    "expiration": 1741334628000,
                    "contract": [
                    ...

TRC20GetName / TRC20GetSymbol

TRC20GetName, consulta el nombre del token TRC20 en función de la dirección del contrato. TRC20GetSymbol, consulta el símbolo del token TRC20 según la dirección del contrato

function main() {
    Log("TRC20GetName:", exchange.IO("api", "tron", "TRC20GetName", "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t"))
    Log("TRC20GetSymbol:", exchange.IO("api", "tron", "TRC20GetSymbol", "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t"))
}

Datos devueltos:

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 llamar al contrato TRC20, usamos el método balanceOf del contrato TRC20, primero lo codificamos y luego lo llamamos 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”: Dirección del contrato TRC20 USDT.
  • “TWTbnQuiWvEg…” : Parámetro, la dirección de la billetera TRX del saldo solicitado por el método balanceOf.
  • “balanceOf”: el nombre del método que debe codificarse.

Los métodos constantes no requieren difusión. El resultado de la llamada se registra en tx.constant_result.

Transfer

Construir datos trans.

function main() {
    var trans = exchange.IO("api", "tron", "Transfer", "TWTb...", "TKCG9FN...", 1000000)
    return trans
}
  • TWTb...:La dirección de la billetera TRX A.
  • TKCG9FN...:La dirección de la billetera TRX B.
  • 1000000: Transferencia 1TRX.

Datos devueltos:

{
    "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

Obtenga el ABI del contrato en función de la dirección del contrato.

function main() {
    var usdtABI = exchange.IO("api", "tron", "GetContractABI", "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t")
    return usdtABI
}

Datos devueltos:

{
    "entrys": [
        {
            "constant": true,
            "name": "name",
            "outputs": [
                {
                    "type": "string"
                }
            ],
            "type": 2,
            "stateMutability": 2
        },
        {
            "constant": true,
            "name": "deprecated",
            "outputs": [
                {
                    "type": "bool"
                }
            ],
            "type": 2,
            "stateMutability": 2
        },
        ...

Transfer

HaciaTKCG9FN1j...Transfiera 1TRX a la dirección de billetera tron.

function main() {
    var ownerAddress = exchange.IO("address")
    var ret = exchange.IO("api", "tron", "Transfer", ownerAddress, "TKCG9FN1j...", 1000000)     
    return ret
}

TriggerConstantContract

Llamar al método del 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
}

Los datos devueltos son la dirección del token token0 del grupo de negociación sunSwap.

Llamada al método del contrato inteligente

  • Consultar saldo de USDT

Llamar al método de contrato inteligente en la cadena TronbalanceOfTR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6tparaUSDTLa dirección del contrato inteligente del 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)
  }

Puedes consultar el saldo de USDT en tu billetera: 0.000019

Expansión cuantitativa de FMZ Web3: se agregó compatibilidad con Tron y se ampliaron las capacidades de transacciones en cadena

Otras características de exchange.IO

Plataforma FMZWeb3 tronObjeto de intercambioexchange.IOLa función implementa las siguientes funciones.

  • Transferencia TRX
  function main() {
      var ret = exchange.IO("api", "tron", "send", "目标TRX钱包地址", 1)  // 需要注意,参数1 表示 0.000001 TRX ,需要转换数值为链上数值。
      return ret   // 转账hash: 305f0c2487095effcf9e2db61f021f9767076114...
  }
  • Dirección del nodo de conmutación
  exchange.IO("base", "rpc address")  // rpc address 替换为具体的节点地址
  // 或者
  exchange.IO("rpc", "rpc address")
  • Registrar contrato inteligente ABI
  exchange.IO("abi", "contract ABI")  // contract ABI 替换为具体的合约ABI内容
  • Obtener la dirección de la billetera vinculada al objeto de intercambio actual
  exchange.IO("address")  // 返回tron钱包地址
  • pack / encode / encodePacked

paquete / codificar: codificar/empaquetar datos, llamada 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 y empaquetado

  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

descomprimir/decodificar: descomprimir/decodificar datos, llamada a 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)
  }
  • Actualizar/Importar clave privada
  exchange.IO("key", "xxx")  // xxx 为私钥
  • Calcular hash Prototipo de llamada:exchange.IO("hash", algo, inputFormat, outputFormat, data)

Firme con la clave privada actualmente configurada y devuelva los datos firmados.

  var signature = exchange.IO("hash", "sign", "string", "hex", "txHash")  // txHash: 具体hash值

Un primer vistazo a SunSwap

Práctica inicial en el intercambio DEX en la cadena Tron: sunSwap. Llamamos al contrato de fábrica sunSwap, solicitamos los índices de todos los pares comerciales y luego solicitamos la dirección del par comercial con í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的交易对地址
}

Debido al espacio limitado, compartiremos el contenido detallado de sunSwap con los lectores en el próximo artículo. Gracias por su apoyo.

THE END

La plataforma de comercio cuantitativo FMZ continúa innovando en la era Web3, brindando a los comerciantes cuantitativos un espacio de comercio en cadena más amplio. Al respaldar la red Tron, FMZ no solo mejora las capacidades de transacciones entre cadenas, sino que también permite a los usuarios ejecutar de manera eficiente interacciones de contratos inteligentes, administración de fondos y estrategias comerciales automatizadas en el ecosistema Tron.

En este artículo, presentamos el soporte de la plataforma FMZ para la red Tron e implementamos las llamadas al método de contrato de SunSwap DEX en la cadena Tron. Con el desarrollo de la tecnología blockchain, las posibilidades de las transacciones cuantitativas Web3 continuarán expandiéndose. FMZ continuará optimizando y mejorando sus capacidades Web3 para brindar a los comerciantes cuantitativos un entorno comercial más flexible, seguro y eficiente, ayudando a los usuarios a obtener mayores ventajas en el mercado en cadena.

Gracias por leer y gracias por su apoyo.