[TOC]

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:
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.
grpc.trongrid.io:50051
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.
Debes preparar una billetera TRON. Puedes usar OKX, imToken, etc., o puedes generar una tú mismo.
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).
En la página Agregar intercambio:

Configure la billetera, seleccione TRON como ChainType y use la dirección de nodo RPC predeterminada.
Podemos utilizar las herramientas de depuración de la plataforma para realizar pruebas.
Herramientas de depuración: https://www.fmz.com/m/debug
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:

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

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á.
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,
...
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}}
Devuelve toda la información del nodo.
function main() {
return exchange.IO("api", "tron", "ListNodes")
}
Consultar la información de precisión de los tokens TRC20
function main() {
return exchange.IO("api", "tron", "TRC20GetDecimals", "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t") // USDT
}
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")
}
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": {}
...
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
}
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
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, 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
function main() {
// 例如某个转账数据中的Data,转换为可读数值
Log("ParseTRC20NumericProperty:", exchange.IO("api", "tron", "ParseTRC20NumericProperty", "0x00000000000000000000000000000000000000000000000000000001a13b8600")) // 7000000000
// 例如某个转账数据中的Data,转换为可读字符串
Log("ParseTRC20StringProperty:", exchange.IO("api", "tron", "ParseTRC20StringProperty", "0x0000000000000000000000000000000000000000000000000000000055534454")) // USDT
}
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
}
Los métodos constantes no requieren difusión. El resultado de la llamada se registra en tx.constant_result.
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.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
}
}
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
},
...
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
}
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.
Llamar al método de contrato inteligente en la cadena TronbalanceOf,TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6tparaUSDTLa 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

Plataforma FMZWeb3 tronObjeto de intercambioexchange.IOLa función implementa las siguientes funciones.
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钱包地址
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...
}
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)
}
exchange.IO("key", "xxx") // xxx 为私钥
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值
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.
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.