avatar of 发明者量化-小小梦 发明者量化-小小梦
Suivre Messages privés
4
Suivre
1271
Abonnés

Extension quantitative FMZ Web3 : prise en charge de Tron ajoutée, capacités de transaction en chaîne étendues

Créé le: 2025-02-28 17:20:12, Mis à jour le: 2025-03-11 18:04:16
comments   0
hits   687

[TOC]

Extension quantitative FMZ Web3 : prise en charge de Tron ajoutée, capacités de transaction en chaîne étendues

Préface

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 :

  • Discutez de l’écologie, des applications, du développement et d’autres contenus techniques de Tron dans la direction Web3 de la plate-forme FMZ.
  • Pratiquez la configuration basée sur le réseau Tron sur la plateforme FMZ.
  • Ressources et matériels utilisés dans la pratique
  • Entraînez-vous à appeler des méthodes sur des nœuds Tron.
  • SunSwap, une pratique DeFi basée sur l’écosystème Tron.

Présentation de Tron

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

Ressources et matériels utilisés dans la pratique

  • Nœud grpc officiel du réseau principal TRON

grpc.trongrid.io:50051

  • Autres nœuds :

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.

  • Portefeuille TRON

Vous devez préparer un portefeuille TRON. Vous pouvez utiliser OKX, imToken, etc., ou en générer un vous-même.

  • tronscan

https://tronscan.org/

  • Protocole Tron

https://github.com/tronprotocol

  • SunSwap

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

https://github.com/sunswapteam

Configurer les objets d’échange WEB3 sur FMZ

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

Ajouter un objet d’échange

Sur la page Ajouter un Exchange :

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

Extension quantitative FMZ Web3 : prise en charge de Tron ajoutée, capacités de transaction en chaîne étendues

Configurez le portefeuille, sélectionnez TRON comme ChainType et utilisez l’adresse de nœud RPC par défaut.

Pratiques courantes des méthodes de nœud JSON-RPC

Nous pouvons utiliser les outils de débogage de la plateforme pour tester.

Outils de débogage : https://www.fmz.com/m/debug

eth_getBalance

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 :

Extension quantitative FMZ Web3 : prise en charge de Tron ajoutée, capacités de transaction en chaîne étendues

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

Extension quantitative FMZ Web3 : prise en charge de Tron ajoutée, capacités de transaction en chaîne étendues

Pratique de la méthode des nœuds gRPC

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.

GetAccount

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

GetTransactionInfoByID

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

ListNodes

Renvoie toutes les informations du nœud.

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

TRC20GetDecimals

Interroger les informations de précision des jetons TRC20

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

TRC20ContractBalance

Interrogez le solde d’un certain jeton TRC20 dans une certaine adresse de portefeuille.

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

GetNowBlock

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

GetAccountNet

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
}

CreateAccount

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

GetBlockByNum

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

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

ParseTRC20…

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

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

TRC20Call

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
}
  • “TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t” : adresse du contrat TRC20 USDT.
  • “TWTbnQuiWvEg…” : Paramètre, l’adresse du portefeuille TRX du solde demandé par la méthode balanceOf.
  • “balanceOf” : Le nom de la méthode qui doit être codé.

Les méthodes constantes ne nécessitent pas de diffusion. Le résultat de l’appel est enregistré dans tx.constant_result.

Transfer

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

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

GetContractABI

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

Transfer

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
}

TriggerConstantContract

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.

Appel de méthode de contrat intelligent

  • Vérifiez le solde USDT

Appeler la méthode du contrat intelligent sur la chaîne TronbalanceOfTR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6tpourUSDTL’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

Extension quantitative FMZ Web3 : prise en charge de Tron ajoutée, capacités de transaction en chaîne étendues

Autres fonctionnalités d’exchange.IO

Plateforme FMZWeb3 tronObjet d’échangeexchange.IOLa fonction implémente les fonctions suivantes.

  • Transfert TRX
  function main() {
      var ret = exchange.IO("api", "tron", "send", "目标TRX钱包地址", 1)  // 需要注意,参数1 表示 0.000001 TRX ,需要转换数值为链上数值。
      return ret   // 转账hash: 305f0c2487095effcf9e2db61f021f9767076114...
  }
  • Adresse du nœud de commutation
  exchange.IO("base", "rpc address")  // rpc address 替换为具体的节点地址
  // 或者
  exchange.IO("rpc", "rpc address")
  • Enregistrer le contrat intelligent ABI
  exchange.IO("abi", "contract ABI")  // contract ABI 替换为具体的合约ABI内容
  • Obtenir l’adresse du portefeuille lié à l’objet d’échange actuel
  exchange.IO("address")  // 返回tron钱包地址
  • pack / encode / encodePacked

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

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)
  }
  • Mettre à jour/importer la clé privée
  exchange.IO("key", "xxx")  // xxx 为私钥
  • Calcul du hachage Appel du prototype :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值

Un premier aperçu de SunSwap

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.

THE END

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.