Sui.

Publication

Partagez vos connaissances.

HaGiang.
Jul 26, 2025
Questions et Réponses avec des Experts

Dois-je envoyer des TXS parallèles ? ,

Les gars, j'ai un récepteur Sui en langage Go, mais le TPS est faible, comment puis-je le rendre plus rapide, dois-je envoyer des TXS en parallèle ? , RequestType : « WaitForEffectScert », est très lent pour une utilisation individuelle

  • Sui
0
10
Partager
Commentaires
.

Réponses

10
0xduckmove.
Jul 27 2025, 11:29

Oui, l'envoi de transactions en parallèle peut améliorer considérablement votre débit. L'utilisation séquentielle de WaitForEffectScert pour chaque transaction vous ralentira. Regroupez plutôt vos transactions et traitez les réponses de manière asynchrone. Pensez également à utiliser WaitForLocalExecution uniquement lorsque cela est nécessaire. Optimisez en réutilisant les connexions et en ajustant les paramètres de simultanéité du SDK.

2
Meilleure réponse
Commentaires
.
Arnold.
Arnold3036
Jul 29 2025, 14:57

Oui, utilisezTxS parallèlespour augmenter le TPS. WaitForEffectsCertajoute de la latence : requêtes de commutation WaitForLocalExecutionou requêtes groupées.

// Example: Send TXs concurrently in Go  
var wg sync.WaitGroup  
for i := 0; i < 10; i++ {  
    wg.Add(1)  
    go func() {  
        defer wg.Done()  
        // Your Sui TX code here  
    }()  
}  
wg.Wait()  

Optimisations clés : 1.TX parallèles : utilisez des goroutines (évitez les limites de débit). 2.Demandes par lots : combinez les TX dans la mesure du possible. 3. WaitForLocalExecution``WaitForEffectsCertConfirmation plus rapide : préférez.

5
Commentaires
.
Paul.
Paul4340
Jul 31 2025, 12:17

Oui, si lestransactions par seconde (TPS) sont lentes et que votrerécepteur Suidans Go est en retard lors du traitement séquentiel des transactions, l'envoi detransactions parallèlespeut améliorer considérablement le débit. L'WaitForEffectsCertopération**** peut constituer un goulot d'étranglement dans l'exécution d'un seul thread, mais la parallélisation de la soumission des transactions et de l'attente des effets peut améliorer l'efficacité. Voici un aperçu de la manière de résoudre ce problème :

1.Paralléliser les soumissions de transactions

*Envoyer des transactions parallèles : au lieu d'attendre les effets de chaque transaction de manière séquentielle, vous pouvez envoyer plusieurs transactions en parallèle. Cela permet au système de traiter les transactions simultanément, améliorant ainsi le TPS.

  • Dans Go, vous pouvez utiliser desgoroutinespour envoyer des transactions en parallèle, ce qui peut vous aider à optimiser le débit. Assurez-vous que les transactions sont indépendantes les unes des autres (c'est-à-dire qu'elles ne dépendent pas des résultats les unes des autres).

Exempleutilisantgoroutinespour envoyer des transactions parallèles :

package main

import (
    "fmt"
    "sync"
)

// Simulate sending a transaction
func sendTransaction(txID int, wg *sync.WaitGroup) {
    defer wg.Done()
    // Send transaction logic here
    fmt.Printf("Transaction %d sent\n", txID)
}

func main() {
    var wg sync.WaitGroup
    txCount := 10  // Number of transactions to send

    for i := 0; i < txCount; i++ {
        wg.Add(1)
        go sendTransaction(i, &wg)  // Launch goroutine to send transaction
    }

    wg.Wait()  // Wait for all transactions to be sent
    fmt.Println("All transactions sent.")
}

###2. WaitForEffectsCertOptimiser

*Paralléliser l'attente des effets : WaitForEffectsCertpeut ralentir l'exécution séquentielle car elle attend que les effets de chaque transaction soient confirmés un par un. Pour pallier ce problème :

*Attente par lots : au lieu d'attendre les effets de chaque transaction en série, vous pouvez gérer et attendre leseffets de plusieurs transactions à la fois. Cela réduit le temps d'attente. WaitForEffectsCert*Utiliser la concurrency : implémentez un pool de travailleurs ou utilisezgoroutinespour gérer plusieurs demandes en parallèle.

WaitForEffectsCertExemplede parallélisation (pseudo-code) :

// Pseudo-code to parallelize effect wait
effectsChannel := make(chan Result, txCount)
for i := 0; i < txCount; i++ {
    go func(txID int) {
        // Wait for effect cert
        result := waitForEffectsCert(txID)
        effectsChannel <- result
    }(i)
}

// Collect results
for i := 0; i < txCount; i++ {
    result := <-effectsChannel
    fmt.Printf("Effect for Transaction %d: %v\n", result.txID, result)
}

3.Utilisez l'TransactionBlockAPI efficacement

*Blocs de transactions : au lieu d'envoyer des transactions individuelles, regroupez plusieurs opérations dans unbloc de transaction. Cela réduit les frais liés à l'envoi individuel de chaque transaction et peut accélérer le traitement. *Soumission groupée : l'API de Sui vous permet d'envoyer plusieurs actions en une seule transaction, ce qui peut améliorer considérablement le débit. L'organisation des opérations en transactions plus importantes réduit le nombre d'WaitForEffectsCertappels requis.

##4.Surveiller et ajuster la configuration du client su

  • Si vous utilisez unclient Sui RPCpour envoyer des transactions, vérifiez si la configuration du client (telle que la taille des lots ou le délai d'expiration des demandes) est optimisée pour un débit élevé. *Taille du lot : L'ajustement de la taille des lots pour la soumission de plusieurs transactions peut contribuer à réduire les frais généraux. *Délais et récupérations : Assurez-vous que votre client est configuré pour gérer efficacement les délais d'attente et les nouvelles tentatives. Les problèmes de réseau ou la charge du serveur peuvent entraîner des retards. L'optimisation des délais d'attente et des politiques relatives aux nouvelles tentatives peut donc contribuer à améliorer les temps de réponse.

##5.Équilibrage de charge et partage

  • Si vous avez affaire à unvolume élevé de transactions, pensez àéquilibrer la chargeou àpartagervos demandes. Répartissez vos transactions sur plusieurs nœuds ou clients pour éviter les blocages causés par une seule connexion.
  • Cela peut être fait en distribuant différents ensembles de transactions à différentsvalidateurs Suioupoints de terminaison RPC, garantissant un traitement parallèle sur plusieurs ressources.

##6.Examiner les dépendances des transactions

  • Si les transactions dépendent les unes des autres (par exemple, si une transaction doit avoir lieu avant une autre), vous devrez attendre les effets de chaque transaction de manière séquentielle. Cependant, si les transactions sontindépendantes, vous pouvez les envoyer en parallèle et attendre les effets indépendamment.
  • Si possible, restructurez les transactions afin de réduire les interdépendances, en permettant une plus grande parallélisation.

##7.Optimiser les demandes RPC

*Regroupement de connexions : si vous effectuez plusieurs requêtes RPC, assurez-vous de réutiliser lesconnexions persistantespour éviter les frais liés à l'établissement de nouvelles connexions pour chaque demande. *Traitement par lots de requêtes : si le Sui RPC le prend en charge, envisagez deregrouper plusieurs demandes en une seulepour réduire les frais liés à plusieurs appels réseau aller-retour.

##8.Tenez compte des performances des nodes

*Charge du validateur : si vous envoyez des transactions à un seul nœud de validation Sui, assurez-vous que le nœud estcapable de gérer un TPSélevé. Vous devrez peut-être faire évoluer l'infrastructure ou répartir les demandes entre plusieurs validateurs pour améliorer les performances.


En résumé :

*Transactions parallèles : utilisez lesgoroutinesdans Go pour envoyer et attendre des transactions simultanément, réduisant ainsi la latence. *Transactions par lots : regroupez plusieurs actions en une seule transaction pour réduire les frais généraux. *Optimiser WaitForEffectsCert : gérez plusieurs WaitForEffectsCertappels simultanément pour améliorer le débit. *Configuration du client : vérifiez les paramètres du client tels que le délai d'expiration et la taille des lots pour garantir des performances optimales. *Mise à l'échelle de l'infrastructure : si nécessaire, répartissez la charge sur plusieurs validateurs Sui ou nœuds pour augmenter le TPS.

En appliquant ces stratégies, vous devriez être en mesure d'améliorer de manière significative le débit et les performances de votre récepteur Sui, le rendant ainsi plus adapté aux cas d'utilisation en temps réel.

5
Commentaires
.
Evgeniy CRYPTOCOIN.
Jul 30 2025, 08:52

Oui, lestransactions parallèlesaugmenteront votre TPS. Le design de Sui repose sur une exécution parallèle. Voici comment optimiser :

###Corrections rapides : 1.Envoyer des SMS simultanément— Utilisez des goroutines pour regrouper les transactions (Sui les traite en parallèle). 2.Ignorer WaitForEffectsCert— Pour les TX non dépendants, utilisez :

  RequestType: "ImmediateReturn" // Faster, but check status later  
  1. ProgrammableTransactionBlockPTBs par lots — Combinez des actions en une seule.

Principaux gains :Pas de conflits ? → Parallélisez librement (Sui gère automatiquement le verrouillage des objets). ✔Textes dépendants ? Regroupez en PTB ou ne séquencez que les étapes critiques.

Exemple de flux :

// Launch 100 TXs concurrently  
for i := 0; i < 100; i++ {  
    go submitTx(txData[i])  
}  

Surveillez : -Pics de gazen cas de forte simultanéité. -Dépendances d'ordonnance(utilisez les PTB si les TX partagent des objets).

4
Commentaires
.
Alya.
Alya-14
Jul 31 2025, 14:34

Oui, envoyez des transactions parallèles pour augmenter le TPS. WaitForEffectsCertest lent car il attend un consensus un par un. Utilisez l'exécution simultanée avec des objets d'expéditeur ou des horodatages uniques pour éviter les conflits. Sui gère la parallélisation : il suffit de garantir des transactions indépendantes et de regrouper correctement.

4
Commentaires
.
Bekky.
Bekky1762
Jul 30 2025, 13:37

###1. Traitement TX parallèle (essentiel)

// Worker pool pattern
func processInParallel(txChan <-chan *Transaction, workers int) {
    var wg sync.WaitGroup
    wg.Add(workers)

    for i := 0; i < workers; i++ {
        go func() {
            defer wg.Done()
            for tx := range txChan {
                submitTx(tx) // Your TX submission logic
            }
        }()
    }
    wg.Wait()
}

Paramètres clés :

  • Travailleurs optimaux = 2 * CPU cores
  • Taille du lot = 50-100 TXs/worker

###2. Mode de confirmation plus rapide Remplacer WaitForEffectsCertpar :

requestType := "WaitForLocalExecution"  // 3-5x faster
// OR for max speed (risky):
requestType := "ImmediateReturn" // + async status checks

###3. Regroupement de connexions

import "github.com/valyala/fasthttp"

client := &fasthttp.Client{
    MaxConnsPerHost:     1000,  // Default is 512
    ReadTimeout:         10 * time.Second,
    WriteTimeout:        10 * time.Second,
    MaxIdleConnDuration: 30 * time.Second,
}

###4. Optimisations spécifiques à Sui ####Gestion des objets gazeus

// Pre-load 1000 gas objects
gasObjects := make(chan string, 1000)
go func() {
    for i := 0; i < 1000; i++ {
        obj := getNewGasObject() // Your implementation
        gasObjects <- obj
    }
}()

####Bâtiment TX

txBatch := make([]*Transaction, 0, 50)
for i := 0; i < 50; i++ {
    txBatch = append(txBatch, buildTx())
}
submitParallel(txBatch) // Implement batch RPC

###5. Critères de performance | Approche | TPS (Go) | Latence | | -------------------| ---------| | Séquentiel | 50-100 | 500 ms+ | | Parallèle (10 travailleurs) | 800-1200 | 80 ms | | Lot (50 TX/RPC) | Plus de 3 000 | 200 ms |


###Contrôles critiques 1.Charge du noeud

  watch -n 1 'curl -s http://localhost:9000/metrics | grep "rpc_queue"'

2.Gestion des erreurs

  if errors.Is(err, sui.ErrTxQueueFull) {
      time.Sleep(100 * time.Millisecond)
      retry(tx)
  }

Pour des performances maximales : sui.NewClient(grpcDialOpts)- UtilisezgRPCau lieu de JSON-RPC ()

  • Activez lacompression :
 dialOpts := []grpc.DialOption{
     grpc.WithDefaultCallOptions(grpc.UseCompressor("gzip")),
 }
3
Commentaires
.
shamueely.
Jul 26 2025, 17:53

Oui, si vous constatez un faible débit lors de l'utilisation de RequestType: "WaitForEffectsCert"votre récepteur Sui basé sur Go, alorsl'envoi séquentiel de transactions est votre principal goulot d'étranglement. Pour augmenter significativement votre TPS (transactions par seconde), vous devez absolumentenvoyer des transactions en parallèleplutôt que d'attendre que chacune soit pleinement confirmée avant d'envoyer la suivante.

Le WaitForEffectsCertmode attend que la transaction soit exécutée et que ses effets soient certifiés avant de revenir. C'estsûr mais lentementpour les applications à haut débit telles que les robinets, les NFT mints ou les robots DeFi. Lorsque vous attendez les effets un par un, vous limitez le débit au temps aller-retour par transaction, qui peut être de 1 à 2 secondes.

Voici comment vous pouvez l'accélérer :

✅ Meilleures pratiques pour augmenter le débit

*Battez et parallélisez les transactionsà l'aide de Goroutines.

  • Utilisez le type de requête**"Aucune » ou « WaitForLocalExecution"**si vous pouvez tolérer une latence mineure lors de la vérification des effets.
  • Limitez la simultanéité pour éviter d'atteindre les limites de débit RPC (par exemple, 20 à 50 TX parallèles selon le nœud).
  • Préparez les transactions à l'avance en les utilisantTransactionBlockBuilder, signez-les et envoyez-les en parallèle.

Exemple de modèle en Go (conceptuel) :

for i := 0; i < txCount; i++ {
    go func(i int) {
        tx := BuildTx(i) // your custom tx builder
        resp, err := suiClient.ExecuteTransaction(tx, "WaitForLocalExecution")
        if err != nil {
            log.Println("TX error:", err)
        } else {
            log.Println("TX confirmed:", resp.Digest)
        }
    }(i)
}

⚠️ Remarques :

  • « WaitForLocalExecution » est beaucoup plus rapide et vous donne tout de même l'assurance que le nœud a vu le TX.
  • Surveillez le mempool et bloquez la propagation si vous créez un bot en production.
  • Utilisez unportefeuille chaud avec un bilan d'essence élevé, ou faites tourner plusieurs payeurs d'essence pour réduire les collisions.

En savoir plus sur les options d'exécution des transactions : https://docs.sui.io/build/transaction-types

2
Commentaires
.
290697tz.
Jul 27 2025, 06:48

Oui, l'envoi de transactions en parallèle peut améliorer considérablement votre débit. L'utilisation séquentielle de WaitForEffectScert pour chaque transaction vous ralentira. Regroupez plutôt vos transactions et traitez les réponses de manière asynchrone. Pensez également à utiliser WaitForLocalExecution uniquement lorsque cela est nécessaire. Optimisez en réutilisant les connexions et en ajustant les paramètres de simultanéité du SDK.

2
Commentaires
.
SuiLover.
Jul 27 2025, 07:08

Si le TPS de votre expéditeur de transactions Sui basé à Go est faible, le goulot d'étranglement est probablement dû à l'envoi séquentiel des transactions avec RequestType : « WaitForEffectScert ». Ce type de demande attend d'être complètement finalisé avant de poursuivre, ce qui n'est pas optimisé pour le débit lorsqu'il est effectué une par une. Pour améliorer les performances, vous devez implémenter l'envoi de transactions en parallèle ou par lots.

La parallélisation permet à plusieurs transactions d'être en cours en même temps, en utilisant efficacement la capacité de Sui à traiter les transactions simultanément, en particulier lorsque les transactions concernent des objets disjoints. Vous devez implémenter un pool de travailleurs ou des goroutines pour soumettre des transactions simultanément. Assurez-vous de gérer correctement les nonce (numéros de séquence) ou les références aux objets afin de ne pas provoquer de conflits dans la propriété des objets.

Lorsque vous envoyez des transactions parallèles, évitez de superposer les objets d'entrée à moins que la logique du contrat n'autorise un accès partagé (par exemple, avec des références &mut). Soyez conscient du risque de conflit d'objets et assurez-vous que votre code gère correctement les nouvelles tentatives et les erreurs transitoires. Vous pouvez optimiser davantage en ajustant le niveau de simultanéité, en commençant petit (par exemple, 10 goroutines) et en augmentant en fonction des résultats.

Vous pouvez également envisager d'utiliser WaitForLocalExecution au lieu de WaitForEffectScert si vous souhaitez une confirmation légèrement plus rapide mais pouvez tolérer des résultats non finaux. Cependant, pour les mises à jour d'état sensibles ou les soldes destinés aux utilisateurs, WaitForEffectScert est plus sûr. Vous pouvez également pré-signer les transactions et les envoyer par rafales afin de minimiser la latence entre chaque demande.

Assurez-vous que votre nœud Sui ou votre point de terminaison RPC peut gérer un volume de demandes élevé. Pensez à utiliser un fournisseur RPC à charge équilibrée ou à hautes performances. Profilez votre client Go pour voir si la surcharge HTTP ou de sérialisation contribue à la latence. Utilisez des clients HTTP asynchrones tels que fasthttp ou des connexions gRPC persistantes, s'ils sont disponibles dans le SDK.

Enfin, enregistrez et analysez les transactions ayant échoué afin de détecter les goulots d'étranglement ou les modèles de contentieux. Avec un parallélisme approprié et des objets d'entrée bien répartis, vous devriez être en mesure d'améliorer considérablement votre TPS.

1
Commentaires
.
lucid-obsidian.
Aug 11 2025, 06:57

Si le TPS de votre expéditeur de transactions Sui basé à Go est faible, le goulot d'étranglement est probablement dû à l'envoi séquentiel des transactions avec RequestType : « WaitForEffectScert ». Ce type de demande attend d'être complètement finalisé avant de poursuivre, ce qui n'est pas optimisé pour le débit lorsqu'il est effectué une par une. Pour améliorer les performances, vous devez implémenter l'envoi de transactions en parallèle ou par lots.

1
Commentaires
.

Connaissez-vous la réponse ?

Veuillez vous connecter et la partager.