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
-
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
-
Protocolo Tron
-
SunSwap
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:
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
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.
javascript
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.
javascript
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:
javascript
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.
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.
javascript
function main() {
var account = exchange.IO("api", "tron", "GetAccount", "tron 钱包地址") // tron 钱包地址 :填写实际的钱包地址。
return account
}
Información de devolución de llamada (extracto):
json
{
"address": {},
"balance": 72767348, // 即钱包的TRX余额:72.767348
"asset_optimized": true,
"create_time": 1693463943000,
...
GetTransactionInfoByID
Consultar transferencias.
javascript
function main() {
return exchange.IO("api", "tron", "GetTransactionInfoByID", "305f0c2487095effcf9e2db61f021f976707611424cba57e1d6464736f7f49e7")
}
Datos devueltos:
json
{"id":{},"fee":1100000,"blockNumber":70192360,"blockTimeStamp":1741229766000,"contractResult":[{}],"receipt":{"net_fee":100000}}
ListNodes
Devuelve toda la información del nodo.
javascript
function main() {
return exchange.IO("api", "tron", "ListNodes")
}
TRC20GetDecimals
Consultar la información de precisión de los tokens TRC20
javascript
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.
javascript
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.
javascript
function main() {
return exchange.IO("api", "tron", "GetNowBlock")
}
Datos devueltos:
json
{
"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.
javascript
function main() {
return exchange.IO("api", "tron", "GetAccountNet", "TWTbnQuiWvEg...")
}
Datos devueltos:
json
{
"freeNetLimit": 600,
"TotalNetLimit": 43200000000,
"TotalNetWeight": 26982826755
}
CreateAccount
Crea una cuenta Tron.
javascript
function main() {
return exchange.IO("api", "tron", "CreateAccount", "TWTbnQ...", "TKCG9...")
}
Intentar crear una cuenta existente devolverá un error:
log
Futures_OP 4: Contract validate error : Account has existed
GetBlockByNum
Obtenga información del bloque en función de la altura del bloque.
javascript
function main() {
return exchange.IO("api", "tron", "GetBlockByNum", 70227286)
}
Datos devueltos:
json
{
"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
javascript
function main() {
Log("TRC20GetName:", exchange.IO("api", "tron", "TRC20GetName", "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t"))
Log("TRC20GetSymbol:", exchange.IO("api", "tron", "TRC20GetSymbol", "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t"))
}
Datos devueltos:
text
2025-03-09 11:18:43.083 信息 TRC20GetSymbol: USDT
2025-03-09 11:18:43.006 信息 TRC20GetName: Tether USD
ParseTRC20...
javascript
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.
javascript
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.
javascript
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:
json
{
"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.
javascript
function main() {
var usdtABI = exchange.IO("api", "tron", "GetContractABI", "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t")
return usdtABI
}
Datos devueltos:
json
{
"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.
javascript
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.
javascript
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 Tron
balanceOf,TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6tparaUSDTLa dirección del contrato inteligente del token.javascriptfunction 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
Otras características de exchange.IO
Plataforma FMZWeb3 tronObjeto de intercambioexchange.IOLa función implementa las siguientes funciones.
-
Transferencia TRX
javascriptfunction 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
javascriptexchange.IO("base", "rpc address") // rpc address 替换为具体的节点地址 // 或者 exchange.IO("rpc", "rpc address") -
Registrar contrato inteligente ABI
javascriptexchange.IO("abi", "contract ABI") // contract ABI 替换为具体的合约ABI内容 -
Obtener la dirección de la billetera vinculada al objeto de intercambio actual
javascriptexchange.IO("address") // 返回tron钱包地址 -
pack / encode / encodePacked
paquete / codificar: codificar/empaquetar datos, llamada de método.
javascriptfunction 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
javascriptfunction 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.
javascriptfunction 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
javascriptexchange.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.
javascriptvar 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.
javascript
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.
- 1





