Was ist die maximale Größe von Transaktionen, die Kunden wie Geth in txpool behalten können?

Was ist das Transaktionslimit, das Ethereum-Kunden im Transaktionspool behalten können?

Geth kann gemäß dieser Antwort 64 Transaktionen pro Adresse speichern, aber wie groß ist die maximale Größe der Gesamttransaktionen in txpool?

Antworten (1)

Zusammenfassung

Es ist durch den Arbeitsspeicher Ihres Computers begrenzt.

Aus meinen grundlegenden Tests in Was passiert, wenn eine Transaktions-Nonce zu hoch ist? , stürzte ich gethmit 400 x 64 Transaktionen mit einer Datennutzlast von 4.500 Bytes ab, wenn ich in 4 GB RAM lief.

Ich gehe davon aus, dass Ihre Frage lautet, wie viele Transaktionen maximal im Transaktionspool gespeichert werden können. Wenn Sie fragen, was die maximale Größe einer einzelnen Transaktion ist, lautet die Antwort: Gibt es eine Begrenzung für die Transaktionsgröße? .



Einzelheiten

Es gibt einen Pool für ausstehende Transaktionen und eine Warteschlange für Transaktionen, die noch nicht verarbeitet werden können.

Die Datenstruktur, die den Transaktionspool in Geth darstellt, ist unter go-ethereum - tx_pool.go, Zeilen 54 bis 77 zu sehen :

// TxPool contains all currently known transactions. Transactions
// enter the pool when they are received from the network or submitted
// locally. They exit the pool when they are included in the blockchain.
//
// The pool separates processable transactions (which can be applied to the
// current state) and future transactions. Transactions move between those
// two states over time as they are received and processed.
type TxPool struct {
    config       *ChainConfig
    currentState stateFn // The state function which will allow us to do some pre checks
    pendingState *state.ManagedState
    gasLimit     func() *big.Int // The current gas limit function callback
    minGasPrice  *big.Int
    eventMux     *event.TypeMux
    events       event.Subscription
    localTx      *txSet
    mu           sync.RWMutex
    pending      map[common.Hash]*types.Transaction // processable transactions
    queue        map[common.Address]map[common.Hash]*types.Transaction

    wg sync.WaitGroup // for shutdown sync

    homestead bool
}

Von stackoverflow.com - Maximum number of elements in map , die maximale Anzahl von Elementen, die in einer Go-Map-Datenstruktur gespeichert werden können, gilt 2147483647für 32-Bit-Architektur und 9223372036854775807für 64-Bit-Architektur.


Ausstehender Transaktionspool

Ausstehende Transaktionen werden in TxPool.pendingeiner map(transaction hash -> pointer to transaction). In go-ethereum - tx_pool.go gibt es keine Begrenzungsprüfung für die Anzahl der Transaktionen, wenn Transaktionen zu dieser Datenstruktur hinzugefügt werden.

Die Anzahl der Transaktionen im Pool anstehender Transaktionen wird effektiv durch den Speicher begrenzt.


Transaktionswarteschlange

Transaktionen in der Warteschlange werden in TxPool.queueeiner map(from address -> map(transaction hash -> pointer to transaction)). In go-ethereum - tx_pool.go wird geprüft, dass die Anzahl der Transaktionen von derselben FromAdresse nicht überschritten wird maxQueued = 64.

Die Anzahl der Transaktionen in der Transaktionswarteschlange wird effektiv durch den Speicher begrenzt, mit der Einschränkung, dass es nur maximal 64 Transaktionen für Transaktionen mit derselben FromAdresse geben kann.


Was ist der Unterschied zwischen einer ausstehenden Transaktion und einer Transaktion in der Warteschlange?

Ausstehende Transaktionen sind Transaktionen, die verarbeitet und in den Block aufgenommen werden können.

Transaktionen in der Warteschlange sind Transaktionen, bei denen die Transaktions-Nonce nicht der Reihe nach ist. Die Transaktions-Nonce ist eine inkrementierende Zahl für jede Transaktion mit derselben FromAdresse.

Zum Beispiel:

  • Die Transaktion vom Konto 0xaaaa...aaaamit Nonce 0 wurde in die Blockchain aufgenommen.
  • Die Transaktion vom Konto 0xaaaa...aaaamit Nonce 1 wurde in die Blockchain aufgenommen.
  • 10 Transaktionen vom Konto 0xaaaa...aaaamit den Nonces 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, die an einen Ethereum-Knoten gesendet wurden. Diese werden in die Transaktionswarteschlange gestellt, da die Transaktion vom Konto 0xaaaa...aaaamit Nonce 2 vom Ethereum-Knoten nicht gesehen wurde.
  • Sobald die Transaktion von Konto 0xaaaa...aaaamit Nonce 2 zum Transaktionspool hinzugefügt wurde, werden die 10 Transaktionen mit Nonce 3, 4, 5, 6, 7, 8, 9, 10, 11 und 12 aus der Warteschlange in den Pool für ausstehende Transaktionen verschoben und alle 11 Transaktionen sind bereit, verarbeitet und in die Blockchain eingefügt zu werden (vorausgesetzt, es gibt genug Gas).