[TOC]

Le développement de la technologie blockchain propulse le trading quantitatif dans l’ère du Web3. En tant qu’outil de trading quantitatif de premier plan, la plateforme de trading quantitatif FMZ explore depuis longtemps la direction du Web3 et fournit des fonctions liées à Ethereum, permettant aux utilisateurs d’interagir avec des contrats intelligents, de gérer des fonds et d’exécuter des stratégies de trading automatisées directement sur la chaîne.
Aujourd’hui, la plateforme FMZ a encore étendu ses capacités de trading Web3 et prend en charge le réseau Tron (TRX), permettant aux utilisateurs de déployer des stratégies de trading quantitatives sur les deux principales chaînes publiques d’Ethereum et de Tron. Cette mise à niveau améliore non seulement la flexibilité des transactions inter-chaînes, mais offre également aux traders davantage de possibilités de gestion des actifs en chaîne.
Dans cet article, nous aborderons en détail :
Présentation détaillée de TRX-TRON (Citation de Feixiaohao)
TRON a été fondé par Justin Sun en septembre 2017 et a réalisé de nombreuses réalisations exceptionnelles depuis son lancement sur le réseau principal en mai 2018. En juillet 2018, l’écosystème TRON a achevé son intégration avec BitTorrent, un pionnier dans la fourniture de services Web 3.0 décentralisés avec plus de 100 millions d’utilisateurs actifs mensuels. Ces dernières années, le réseau TRON a enregistré des performances brillantes. Les données TRONSCAN montrent qu’en octobre 2022, le nombre total d’utilisateurs de la chaîne publique TRON a dépassé 115 millions, le nombre de transactions a dépassé 4 milliards et la valeur totale verrouillée (TVL) a dépassé 13,2 milliards de dollars américains. Le réseau TRON est devenu entièrement décentralisé en décembre 2021 et est désormais une organisation autonome décentralisée (DAO) gouvernée par la communauté. En mai 2022, TRON a annoncé le lancement du stablecoin décentralisé super-collatéralisé USDD, qui est soutenu par la banque centrale de crypto-monnaie du secteur, la TRON Joint Reserve, marquant l’entrée officielle de TRON dans l’ère des stablecoins décentralisés. En octobre 2022, la Dominique a annoncé que TRON était son infrastructure blockchain nationale officiellement désignée, faisant de TRON une grande chaîne publique qui a conclu un accord de coopération avec un État souverain pour développer l’infrastructure blockchain. TRON a été autorisé à émettre le jeton de fan de la Dominique, Dominica Coin (DMC), pour améliorer la visibilité mondiale du patrimoine naturel et des attractions touristiques de la Dominique. Dans le même temps, les sept principaux jetons de TRON ont obtenu le statut de monnaie numérique légale et de monnaie légale en Dominique.
Débit élevé : un débit élevé est obtenu en améliorant le TPS dans TRON, et sa praticité pour une utilisation quotidienne a dépassé Bitcoin et Ethereum.
Évolutivité : grâce à une bonne évolutivité et à des contrats intelligents efficaces, les applications peuvent avoir davantage de méthodes de déploiement dans TRON, et TRON peut prendre en charge un grand nombre d’utilisateurs.
Haute fiabilité : TRON dispose d’une structure de réseau plus fiable, d’actifs utilisateur, d’une valeur intrinsèque et d’un degré plus élevé de consensus décentralisé, ce qui apporte un mécanisme de distribution de récompenses amélioré.
grpc.trongrid.io:50051
Vous pouvez utiliser des nœuds JSON-RPC, des nœuds REST, etc. provenant d’autres fournisseurs de nœuds (vous pouvez utiliser HttpQuery pour effectuer une demande). Le seul appel à l’encapsulation de l’objet d’échange sur FMZ est la méthode grpc.
Vous devez préparer un portefeuille TRON. Vous pouvez utiliser OKX, imToken, etc., ou en générer un vous-même.
Avant que la plateforme FMZ ne prenne en charge Tron, elle avait pris l’initiative de soutenir le développement Web3 d’Ethereum. Vous pouvez consulter les articles précédents pour savoir comment vous connecter à l’échange décentralisé UniSwap. Étant donné que Tron est compatible avec Ethereum et intègre certaines fonctionnalités d’ETH et d’EOS, il présente des avantages uniques dans l’exécution de contrats intelligents et l’interaction en chaîne. La configuration des objets d’échange Tron (portefeuilles, informations sur les nœuds) sur la plate-forme FMZ est presque la même que la configuration des objets d’échange Ethereum (portefeuilles, informations sur les nœuds).
Sur la page Ajouter un Exchange :

Configurez le portefeuille, sélectionnez TRON comme ChainType et utilisez l’adresse de nœud RPC par défaut.
Nous pouvons utiliser les outils de débogage de la plateforme pour tester.
Outils de débogage : https://www.fmz.com/m/debug
Comme son nom l’indique, cette méthode est exactement la même que la méthode d’Ethereum et ses fonctions sont exactement les mêmes. Cette méthode est utilisée pour lire le solde TRX dans le portefeuille Tron spécifié.
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"}'
Les données de solde demandées sont une valeur hexadécimale très grande, ce qui nécessite la fonction de conversion que nous avons utilisée dans la stratégie précédente liée à 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)
}
Étant donné que l’adresse du portefeuille copiée à partir du portefeuille Tron est une adresse codée en base58, elle doit être convertie en un paramètre codé en hexadécimal avant de pouvoir être utilisée.
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
}
Après avoir converti l’adresse, nous pouvons appeler cecieth_getBalanceMéthode.
Le code de test est le suivant:
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 précision du jeton TRX est de 6, remplissez donc le paramètre 6 lors du traitement de bigNumber.
Test dans l’outil de débogage de la plateforme FMZ :

En comparant le solde TRX dans le portefeuille interrogé sur tronscan, les données sont cohérentes.

Le contenu pratique principal de la plateforme FMZ est l’appel de méthode du nœud grpc. En raison de l’espace limité, seuls les appels de méthode couramment utilisés sont répertoriés ici.
Appel du prototype :exchange.IO("api", "tron", "method name", ...). « nom de la méthode » est le nom de la méthode à appeler.
Interroger les informations du compte du portefeuille.
function main() {
var account = exchange.IO("api", "tron", "GetAccount", "tron 钱包地址") // tron 钱包地址 :填写实际的钱包地址。
return account
}
Renseignements sur l’appel de retour (extrait) :
{
"address": {},
"balance": 72767348, // 即钱包的TRX余额:72.767348
"asset_optimized": true,
"create_time": 1693463943000,
...
Vérifiez les transferts.
function main() {
return exchange.IO("api", "tron", "GetTransactionInfoByID", "305f0c2487095effcf9e2db61f021f976707611424cba57e1d6464736f7f49e7")
}
Données renvoyées :
{"id":{},"fee":1100000,"blockNumber":70192360,"blockTimeStamp":1741229766000,"contractResult":[{}],"receipt":{"net_fee":100000}}
Renvoie toutes les informations du nœud.
function main() {
return exchange.IO("api", "tron", "ListNodes")
}
Interroger les informations de précision des jetons TRC20
function main() {
return exchange.IO("api", "tron", "TRC20GetDecimals", "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t") // USDT
}
Interrogez le solde d’un certain jeton TRC20 dans une certaine adresse de portefeuille.
function main() {
return exchange.IO("api", "tron", "TRC20ContractBalance", "TRX 钱包地址", "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t")
}
Renvoie les dernières informations de bloc sur la blockchain actuelle.
function main() {
return exchange.IO("api", "tron", "GetNowBlock")
}
Données renvoyées :
{
"transactions": [
{
"transaction": {
"raw_data": {
"ref_block_bytes": {},
"ref_block_hash": {},
"expiration": 1741489083000,
"contract": [
{
"type": 1,
"parameter": {
"type_url": "type.googleapis.com/protocol.TransferContract",
"value": {}
...
Interrogez les informations de bande passante du compte TRON.
function main() {
return exchange.IO("api", "tron", "GetAccountNet", "TWTbnQuiWvEg...")
}
Données renvoyées :
{
"freeNetLimit": 600,
"TotalNetLimit": 43200000000,
"TotalNetWeight": 26982826755
}
Créez un compte Tron.
function main() {
return exchange.IO("api", "tron", "CreateAccount", "TWTbnQ...", "TKCG9...")
}
La tentative de création d’un compte existant renverra une erreur :
Futures_OP 4: Contract validate error : Account has existed
Obtenez des informations sur les blocs en fonction de la hauteur des blocs.
function main() {
return exchange.IO("api", "tron", "GetBlockByNum", 70227286)
}
Données renvoyées :
{
"transactions": [
{
"transaction": {
"raw_data": {
"ref_block_bytes": {},
"ref_block_hash": {},
"expiration": 1741334628000,
"contract": [
...
TRC20GetName, interroge le nom du jeton TRC20 en fonction de l’adresse du contrat. TRC20GetSymbol, interroge le symbole du jeton TRC20 en fonction de l’adresse du contrat
function main() {
Log("TRC20GetName:", exchange.IO("api", "tron", "TRC20GetName", "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t"))
Log("TRC20GetSymbol:", exchange.IO("api", "tron", "TRC20GetSymbol", "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t"))
}
Données renvoyées :
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
}
Pour appeler le contrat TRC20, nous utilisons la méthode balanceOf du contrat TRC20, l’encodons d’abord, puis l’appelons à l’aide de 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
}
Les méthodes constantes ne nécessitent pas de diffusion. Le résultat de l’appel est enregistré dans tx.constant_result.
Construire une donnée trans.
function main() {
var trans = exchange.IO("api", "tron", "Transfer", "TWTb...", "TKCG9FN...", 1000000)
return trans
}
TWTb...: L’adresse du portefeuille TRX A.TKCG9FN...: L’adresse du portefeuille TRX B.Données renvoyées :
{
"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
}
}
Obtenez l’ABI du contrat en fonction de l’adresse du contrat.
function main() {
var usdtABI = exchange.IO("api", "tron", "GetContractABI", "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t")
return usdtABI
}
Données renvoyées :
{
"entrys": [
{
"constant": true,
"name": "name",
"outputs": [
{
"type": "string"
}
],
"type": 2,
"stateMutability": 2
},
{
"constant": true,
"name": "deprecated",
"outputs": [
{
"type": "bool"
}
],
"type": 2,
"stateMutability": 2
},
...
VersTKCG9FN1j...Transférez 1TRX vers l’adresse du portefeuille tron.
function main() {
var ownerAddress = exchange.IO("address")
var ret = exchange.IO("api", "tron", "Transfer", ownerAddress, "TKCG9FN1j...", 1000000)
return ret
}
Appelez la méthode du contrat intelligent.
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
}
Les données renvoyées sont l’adresse du jeton token0 du pool de trading sunSwap.
Appeler la méthode du contrat intelligent sur la chaîne TronbalanceOf,TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6tpourUSDTL’adresse du contrat intelligent du jeton.
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)
}
Vous pouvez vérifier le solde de l’USDT dans votre portefeuille : 0,000019

Plateforme FMZWeb3 tronObjet d’échangeexchange.IOLa fonction implémente les fonctions suivantes.
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 : Encoder/packer des données, appel de méthode.
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 : Encodé et empaqueté
function main() {
var data1 = exchange.IO("encodePacked", "address", "TWTbnQu...")
Log(data1)
// e0c12e16a9f713e5f104c...
var data2 = exchange.IO("encode", "address", "TWTbnQu...")
Log(data2)
// 000000000000000000000000 e0c12e16a9f713e5f104c...
}
décompresser / décoder : Décompresser/décoder les données, appel de méthode.
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)Signez avec la clé privée actuellement configurée et renvoyez les données signées.
var signature = exchange.IO("hash", "sign", "string", "hex", "txHash") // txHash: 具体hash值
Première pratique sur l’échange DEX sur la chaîne Tron : sunSwap. Nous appelons le contrat d’usine sunSwap, demandons les index de toutes les paires de trading, puis demandons l’adresse de la paire de trading avec l’index 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的交易对地址
}
En raison de l’espace limité, nous partagerons le contenu détaillé de sunSwap avec les lecteurs dans le prochain article. Merci pour votre soutien.
La plateforme de trading quantitatif FMZ continue d’innover à l’ère du Web3, offrant aux traders quantitatifs un espace de trading on-chain plus large. En prenant en charge le réseau Tron, FMZ améliore non seulement les capacités de transaction inter-chaînes, mais permet également aux utilisateurs d’exécuter efficacement des interactions de contrats intelligents, la gestion de fonds et des stratégies de trading automatisées dans l’écosystème Tron.
Dans cet article, nous avons présenté le support de la plateforme FMZ pour le réseau Tron et implémenté les appels de méthode de contrat de SunSwap DEX sur la chaîne Tron. Avec le développement de la technologie blockchain, les possibilités des transactions quantitatives Web3 continueront de s’étendre. FMZ continuera d’optimiser et d’améliorer ses capacités Web3 pour fournir aux traders quantitatifs un environnement de trading plus flexible, sécurisé et efficace, aidant les utilisateurs à obtenir de plus grands avantages sur le marché en chaîne.
Merci de votre lecture et merci pour votre soutien.