Sui.

Beitrag

Teile dein Wissen.

HaGiang.
Jul 26, 2025
Experten Q&A

Muss ich parallele TXs senden? ,

Leute, ich habe einen Sui-Empfänger in Go-Sprache, aber TPS ist niedrig. Wie kann ich ihn schneller machen, sollte ich parallele TXs senden müssen? , requestType: „waitForEffectCert“, ist für One-by-on sehr langsam

  • Sui
0
10
Teilen
Kommentare
.

Antworten

10
0xduckmove.
Jul 27 2025, 11:29

Ja, das parallele Senden von Transaktionen kann Ihren Durchsatz erheblich verbessern. Wenn Sie WaitForEffectCert für jede Transaktion sequentiell verwenden, werden Sie langsamer. Stattdessen stapeln Sie Ihre Transaktionen und verarbeiten Sie die Antworten asynchron. Erwägen Sie auch, WaitForLocalExecution nur bei Bedarf zu verwenden. Optimieren Sie, indem Sie Verbindungen wiederverwenden und die Parallelitätseinstellungen des SDK optimieren.

2
Beste Antwort
Kommentare
.
Arnold.
Arnold3036
Jul 29 2025, 14:57

Ja, verwendeparallele TXS, um den TPS zu erhöhen. WaitForEffectsCert``WaitForLocalExecutionerhöht die Latenz — wechseln Sie zu oder stapeln Sie Anfragen.

// 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()  

Wichtige Optimierungen: 1.Parallele TXS: Verwenden Sie Goroutinen (vermeiden Sie Ratenbegrenzungen). 2.Batch-Anforderungen: Kombinieren Sie TXs, wenn möglich. 3. WaitForLocalExecution``WaitForEffectsCertSchnellere Bestätigung: Lieber.

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

Ja, wenn Sie langsameTransaktionen pro Sekunde (TPS) erleben und IhrSui-Empfängerin Go bei der sequentiellen Verarbeitung von Transaktionen hinterherhinkt, kann das Sendenparalleler Transaktionenden Durchsatz erheblich verbessern. Der WaitForEffectsCert**-Vorgang kann ein Engpass bei der Singlethread-Ausführung sein, aber die Parallelisierung der Transaktionsübermittlung und das Warten auf Auswirkungen kann die Effizienz steigern. Hier finden Sie eine Aufschlüsselung, wie Sie dieses Problem beheben können:

1.Transaktionsübermittlungen parallelisieren

*Parallele Transaktionen senden: Anstatt nacheinander auf die Auswirkungen jeder Transaktion zu warten, können Sie mehrere Transaktionen parallel senden. Dadurch kann das System Transaktionen gleichzeitig verarbeiten und TPS verbessern.

  • In Go können SieGoroutinenverwenden, um Transaktionen parallel zu senden, was zur Maximierung des Durchsatzes beitragen kann. Stellen Sie sicher, dass die Transaktionen unabhängig voneinander sind (d. h. sie hängen nicht vom Ergebnis der anderen ab).

Beispiel, bei demGoroutinenzum Senden paralleler Transaktionen verwendet werden:

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

*Parallelisieren Sie das Warten auf Effekte: Das WaitForEffectsCertkann die sequentielle Ausführung verlangsamen, da es darauf wartet, dass die Auswirkungen jeder Transaktion einzeln bestätigt werden. Um dies zu mildern:

*Batch-Warte: Anstatt nacheinander auf die Auswirkungen jeder Transaktion zu warten, können Sie dieAuswirkungen mehrerer Transaktionen gleichzeitig verwalten und darauf warten. Das reduziert die Wartezeit. WaitForEffectsCert*Parallelitätverwenden: Implementieren Sie einen Worker-Pool oder verwenden SieGoroutinen, um mehrere Anfragen parallel zu bearbeiten.

BeispielWaitForEffectsCertfür Parallelisierung (Pseudocode):

// 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. TransactionBlockNutzen Sie die API effizient

*Transaktionsblöcke: Anstatt einzelne Transaktionen zu senden, gruppieren Sie mehrere Operationen zu einemTransaktionsblock. Dies reduziert den Aufwand, jede Transaktion einzeln zu senden, und kann die Verarbeitung beschleunigen. *Massenübermittlung: Die API von Sui ermöglicht es Ihnen, mehrere Aktionen in einer Transaktion zu senden, was den Durchsatz erheblich verbessern kann. WaitForEffectsCertDie Organisation von Vorgängen in größere Transaktionen reduziert die Anzahl der erforderlichen Anrufe.

4.Überwachen und passen Sie die Sui-Client-Konfiguration an

  • Wenn Sie einenSui RPC-Clientzum Senden von Transaktionen verwenden, überprüfen Sie, ob die Client-Konfiguration (z. B. Batchgröße oder Anforderungs-Timeout) für einen hohen Durchsatz optimiert ist. *Stapelgröße: Die Anpassung der Batchgrößen für die Einreichung mehrerer Transaktionen kann dazu beitragen, den Aufwand zu reduzieren. *Timeouts und Wiederholungen: Stellen Sie sicher, dass Ihr Client so eingerichtet ist, dass er Timeouts und Wiederholungen effizient verarbeitet. Netzwerkprobleme oder Serverauslastung können zu Verzögerungen führen. Die Optimierung von Timeouts und Richtlinien für Wiederholungsversuche kann daher dazu beitragen, die Reaktionszeiten zu verbessern.

5.Load Balancing und Sharding

  • Wenn Sie es mit einemhohen Transaktionsvolumenzu tun haben, ziehen SieLoad BalancingoderShardingIhrer Anfragen in Betracht. Teilen Sie Ihre Transaktionen auf mehrere Knoten oder Clients auf, um Engpässe zu vermeiden, die durch eine einzige Verbindung verursacht werden.
  • Dies kann erreicht werden, indem verschiedene Transaktionssätze auf verschiedeneSui-ValidatorenoderRPC-Endpunkteverteilt werden, wodurch eine parallele Verarbeitung über mehrere Ressourcen hinweg gewährleistet wird.

6.Transaktionsabhängigkeiten überprüfen

  • Wenn Transaktionen voneinander abhängen (z. B. wenn eine Transaktion vor einer anderen stattfinden muss), müssen Sie nacheinander auf die Auswirkungen jeder Transaktion warten. Wenn die Transaktionen jedochunabhängigsind, können Sie sie parallel senden und unabhängig voneinander auf die Auswirkungen warten.
  • Wenn möglich, strukturieren Sie die Transaktionen um, um Interdependenzen zu reduzieren und eine stärkere Parallelisierung zu ermöglichen.

7.Optimieren Sie RPC-Anfragen

Verbindungspooling: Wenn Sie mehrere RPC-Anfragen stellen, stellen Sie sicher, dass Siepersistente Verbindungenwiederverwenden, um den Aufwand zu vermeiden, für jede Anfrage neue Verbindungen herzustellen. Batchingvon Anforderungen: Wenn der Sui RPC dies unterstützt, sollten Sie erwägen,mehrere Anfragen zu einer Batchzusammenzufügen**, um den Aufwand mehrerer Round-Trip-Netzwerkanrufe zu reduzieren.

8.Berücksichtigen Sie die Leistung des Knotens

*Validator-Load: Wenn Sie Transaktionen an einen einzelnen Sui-Validator-Knoten senden, stellen Sie sicher, dass der Knotenin der Lage ist, hohe TPS zu verarbeiten. Möglicherweise müssen Sie die Infrastruktur skalieren oder Anfragen auf mehrere Validatoren verteilen, um eine bessere Leistung zu erzielen.


Zusammengefasst:

*Parallele Transaktionen: Verwenden SieGoroutinenin Go, um Transaktionen gleichzeitig zu senden und auf sie zu warten, wodurch die Latenz reduziert wird. *Batch-Transaktionen: Gruppieren Sie mehrere Aktionen zu einer Transaktion, um den Overhead zu reduzieren.

  • WaitForEffectsCertOptimieren: Behandeln Sie mehrere WaitForEffectsCertAnrufe gleichzeitig, um den Durchsatz zu verbessern. *Client-Konfiguration: Überprüfen Sie die Client-Einstellungen wie Timeout und Batchgröße, um eine optimale Leistung sicherzustellen. *Infrastrukturskalierung: Verteilen Sie die Last bei Bedarf auf mehrere Sui-Validatoren oder Knoten, um die TPS zu erhöhen.

Durch die Anwendung dieser Strategien sollten Sie in der Lage sein, den Durchsatz und die Leistung Ihres Sui-Empfängers erheblich zu verbessern, sodass er sich besser für Anwendungsfälle in Echtzeit eignet.

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

Ja,parallele Transaktionenerhöhen Ihren TPS. Das Design von Sui lebt von der parallelen Ausführung. So optimieren Sie:

###Schnelle Korrekturen: 1.TXs gleichzeitig senden— Verwenden Sie Goroutinen, um Transaktionen zu stapeln (Sui verarbeitet sie parallel). 2. WaitForEffectsCertÜberspringen— Verwenden Sie für unabhängige TXs:

  RequestType: "ImmediateReturn" // Faster, but check status later  
  1. ProgrammableTransactionBlockBatch-PTBs— Kombinieren Sie Aktionen in einer.

Wichtigste Vorteile:Keine Konflikte? → Frei parallelisieren (Sui behandelt Objektsperren automatisch). ✔Abhängige TXs? Gruppieren Sie sie in PTBs oder sequenzieren Sie nur kritische Schritte.

Beispiel für einen Ablauf:

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

Achten Sie auf: -Gasspitzenbei hoher Parallelität. -Ordnungsabhängigkeiten(verwenden Sie PTBs, wenn TXs Objekte gemeinsam nutzen).

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

Ja, senden Sie parallele Transaktionen, um den TPS zu erhöhen. WaitForEffectsCertist langsam, weil es nacheinander auf den Konsens wartet. Verwenden Sie die gleichzeitige Ausführung mit eindeutigen Absenderobjekten oder Zeitstempeln, um Konflikte zu vermeiden. Sui kümmert sich um die Parallelisierung — stellen Sie einfach sicher, dass unabhängige Transaktionen und die Stapelverarbeitung ordnungsgemäß ablaufen.

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

###1. Parallele TX-Verarbeitung (unerlässlich)

// 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()
}

Wichtige Einstellungen:

  • Optimale Mitarbeiter = 2 * CPU cores
  • Chargengröße = 50-100 TXs/worker

###2. Schnellerer Bestätigungsmodus Ersetze WaitForEffectsCertdurch:

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

###3. Verbindungspooling

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. Sui-spezifische Optimierungen ####Verwaltung von Gasobjekt

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

####Batch TX Building

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

###5. Leistungs-Benchmarks | Ansatz | TPS (Go) | Latenz | ----------| ---------| | ---------| | Sequentiell | 50-100 | 500ms+ | | Parallel (10 Arbeiter) | 800-1200 | 80 ms | | Stapel (50 TX/RPC) | 3000+ | 200 ms |


###Kritische Prüfungen 1.Belastung des Knoten

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

2.Fehlerbehandlung

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

Für maximale Leistung: sui.NewClient(grpcDialOpts)- Verwenden SiegRPCanstelle von JSON-RPC ()

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

Ja, wenn Sie bei der Verwendung RequestType: "WaitForEffectsCert"in Ihrem Go-basierten Sui-Empfänger einen niedrigen Durchsatz feststellen, istdas sequentielle Senden von Transaktionen Ihr Hauptengpass. Um Ihre TPS (Transaktionen pro Sekunde) deutlich zu erhöhen, müssen Sie unbedingtTransaktionen parallelsenden**, anstatt darauf zu warten, dass jede Transaktion vollständig bestätigt ist, bevor Sie die nächste senden.

Der WaitForEffectsCertModus wartet, bis die Transaktion ausgeführt und ihre Auswirkungen zertifiziert sind, bevor er zurückkehrt — das istsicher, aber langsamfür Anwendungen mit hohem Durchsatz wie Faucets, NFT-Mints oder DeFi-Bots. Wenn Sie nacheinander auf die Effekte warten, begrenzen Sie den Durchsatz auf die Round-Trip-Zeit pro Transaktion, die 1—2 Sekunden betragen kann.

So können Sie es beschleunigen:

✅ Bewährte Methoden zur Steigerung des Durchsatzs

*Transaktionen stapeln und parallelisierenmithilfe von Goroutinen.

  • Verwenden Sie die Anforderungstyp**"None“ oder „WaitForLocalExecution"**, wenn Sie eine geringe Latenz bei der Effektüberprüfung tolerieren können.
  • Beschränken Sie die Parallelität, um zu vermeiden, dass die RPC-Ratenlimits überschritten werden (z. B. 20—50 parallele TXs, je nach Knoten).
  • Bereiten Sie Transaktionen im Voraus vor, indem Sie sie verwendenTransactionBlockBuilder, signieren Sie sie und übertragen Sie sie parallel.

Beispielmuster in Go (konzeptionell) :

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

⚠️ Hinweise:

  • „waitForLocalExecution“ ist viel schneller und gibt Ihnen trotzdem die Gewissheit, dass der Knoten den TX gesehen hat.
  • Überwachen Sie den Mempool und blockieren Sie die Ausbreitung, wenn Sie einen Bot auf Produktionsebene erstellen.
  • Verwenden Sie eineHot-Wallet mit hoher Gasbilanzoder wechseln Sie mehrere Gasspeicher, um Kollisionen zu vermeiden.

Lesen Sie mehr über die Optionen zur Transaktionsausführung: https://docs.sui.io/build/transaction-types

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

Ja, das parallele Senden von Transaktionen kann Ihren Durchsatz erheblich verbessern. Wenn Sie WaitForEffectCert für jede Transaktion sequentiell verwenden, werden Sie langsamer. Stattdessen stapeln Sie Ihre Transaktionen und verarbeiten Sie die Antworten asynchron. Erwägen Sie auch, WaitForLocalExecution nur bei Bedarf zu verwenden. Optimieren Sie, indem Sie Verbindungen wiederverwenden und die Parallelitätseinstellungen des SDK optimieren.

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

Wenn Sie bei Ihrem GO-basierten Sui-Transaktionsabsender einen niedrigen TPS haben, ist der Engpass wahrscheinlich darauf zurückzuführen, dass Transaktionen sequentiell mit requestType: „waitForEffectCert“ gesendet werden. Dieser Anforderungstyp wartet auf den vollständigen Abschluss, bevor er fortfährt. Er ist nicht für den Durchsatz optimiert, wenn eine Anfrage nach der anderen ausgeführt wird. Um die Leistung zu verbessern, sollten Sie das parallele oder stapelweise Senden von Transaktionen implementieren.

Durch die Parallelisierung können mehrere Transaktionen gleichzeitig ausgeführt werden, wodurch die Fähigkeit von Sui, Transaktionen gleichzeitig zu verarbeiten, effektiv genutzt wird, insbesondere wenn die Transaktionen getrennte Objekte berühren. Sie sollten einen Worker-Pool oder Goroutinen implementieren, um Transaktionen gleichzeitig einzureichen. Stellen Sie sicher, dass Sie Nonce (Sequenznummern) oder Objektreferenzen ordnungsgemäß verwalten, damit es nicht zu Konflikten bei der Eigentümerschaft von Objekten kommt.

Vermeiden Sie beim Senden paralleler Transaktionen überlappende Eingabeobjekte, es sei denn, die Vertragslogik erlaubt gemeinsamen Zugriff (z. B. mit &mut-Referenzen). Seien Sie sich des Potenzials von Objektkonflikten bewusst und stellen Sie sicher, dass Ihr Code Wiederholungen und vorübergehende Fehler ordnungsgemäß verarbeitet. Sie können die Optimierung weiter optimieren, indem Sie den Grad der Parallelität anpassen. Beginnen Sie klein (z. B. 10 Goroutinen) und skalieren Sie auf der Grundlage der Ergebnisse.

Sie könnten auch die Verwendung von waitForLocalExecution anstelle von waitForEffectScert in Betracht ziehen, wenn Sie eine etwas schnellere Bestätigung wünschen, aber nicht endgültige Ergebnisse tolerieren können. Bei vertraulichen Statusaktualisierungen oder benutzerorientierten Salden ist WaitForEffectScert jedoch sicherer. Sie können Transaktionen auch vorab signieren und sie in Bursts senden, um die Latenz zwischen den einzelnen Anfragen zu minimieren.

Stellen Sie sicher, dass Ihr Sui-Knoten oder RPC-Endpunkt ein hohes Anforderungsvolumen verarbeiten kann. Erwägen Sie die Verwendung eines RPC-Anbieters mit Lastenausgleich oder hoher Leistung. Erstellen Sie ein Profil für Ihren Go-Client, um festzustellen, ob der HTTP- oder Serialisierungs-Overhead zur Latenz beiträgt. Verwenden Sie asynchrone HTTP-Clients wie FastHTTP oder persistente gRPC-Verbindungen, sofern im SDK verfügbar.

Protokollieren und analysieren Sie abschließend fehlgeschlagene Transaktionen, um Engpässe oder Konfliktmuster zu erkennen. Mit der richtigen Parallelität und gut verteilten Eingabeobjekten sollten Sie in der Lage sein, Ihr TPS deutlich zu verbessern.

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

Wenn Sie bei Ihrem GO-basierten Sui-Transaktionsabsender einen niedrigen TPS haben, ist der Engpass wahrscheinlich darauf zurückzuführen, dass Transaktionen sequentiell mit requestType: „waitForEffectCert“ gesendet werden. Dieser Anforderungstyp wartet auf den vollständigen Abschluss, bevor er fortfährt. Er ist nicht für den Durchsatz optimiert, wenn eine Anfrage nach der anderen ausgeführt wird. Um die Leistung zu verbessern, sollten Sie das parallele oder stapelweise Senden von Transaktionen implementieren.

1
Kommentare
.

Weißt du die Antwort?

Bitte melde dich an und teile sie.