Was ist der Unterschied zwischen "ausstehendem" Block und txpool?

Obwohl mein Paritätsknoten (privates Netzwerk) kein Mining durchführt, scheint er sowohl einen ausstehenden Block als auch einen Txpool zu haben.

Nach dem Senden einiger Transaktionen web3.eth.getBlock("pending")gibt der Aufruf Informationen über den ausstehenden Block einschließlich der ausstehenden Transaktionen zurück:

{ author: '0x819773969b2622a0a362fd137b088f90f88bd812',
  difficulty: '131072',
  extraData: '0x506172697479',
  gasLimit: 134086668,
  gasUsed: 3264884,
  hash: '0x084fd0478d7d7cea29ecb1a3734a3810933eddf26b1f18138711c93d83066759',
  logsBloom: '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
  miner: '0x819773969b2622a0a362fd137b088f90f88bd812',
  number: 1,
  parentHash: '0xf5ef33749ed2fdfae1e6d1ce353d01d3d24cd58c37fd82f0afa78d71f206ffa0',
  receiptsRoot: '0x70e8edb579ffacaf92e02c9186fff660f9dfcf02e415d6d12f0d6523bcb67dfb',
  sealFields: [],
  sha3Uncles: '0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347',
  size: 14575,
  stateRoot: '0xfd4a9996a00551085ba9c94c362ccbd7ae082683c428afac14de04b426a0015b',
  timestamp: 1520939275,
  totalDifficulty: '132096',
  transactions:
   [ '0xa6a6eb4ba46b798ca89c58770acaa6be030c5ea96bdf1e26f5a6e692625beb99',
     '0x77d18ff8c6304ec1f4e7e28605498eb2018e2d3089dd7e59b2124077f3b7956c',
     '0xddf1cfca112e3e4c653a8a14267f569015db6a1db9f0ba2144fec8f8cfdaebcc',
     '0x7cedab2409a862b922c19c260f137e94e625a84a08d17414ebc835ecca7c19a9',
     '0x7d2bb13e6c08c99f3e8cf07fce84842a46a979e547eb009e02b2ba659bcec296',
     '0x2be0a050cf877d1feb92924d4af313155bd65146fd24cb45cf08323370484c38',
     '0x02d55f8200a2176dea514a2481a7ddfa3e1fdf9e7514008a6030e4f0dc7dfe82',
     '0x88d40a05425cd2f5f56ab84ba1aca715b99fc3234fc11b5dfe48688f5de78139',
     '0xbd6f6e70aaf16916d34b56f3a96af1b344a44fc738a1da0eb0d55c94ffafcadd',
     '0xf966a75580009d506096396676fc5ea8f8da660fc265d7b83f954a6ee46fd061',
     '0x40509d3abaabc04367de8428f14d0763b798061180b04bb5a1833746d564e377',
     '0x41b50420117a8751b8d397a1f043e3767b29928fc0ecdc0d795fd0aa821df749',
     '0x172631800f2f4125e42feceb1db45d7ef0b0d0f205d09f089b2d877d310a99d8',
     '0x20629025b98574d7eb0744b252753cff4e65ff9070bb5d03c8540108e72027c4',
     '0xf7367abaa8c356e9057d36d8ce03e437546afb271b677f6aafdccb464867a5d8',
     '0xd5e6c9c04bd5b787612d90b9668d0be804e7ddc142186885f019654063fd37f8',

Der web3.eth.getTransactionCount(<address>, "pending")Aufruf gibt eine Transaktionsanzahl von zurück:

94

Wenn Sie eine curlAnfrage stellen, um den paritätsspezifischen API-Endpunkt zu verwenden parity_nextNonce, der die Anzahl der Kontotransaktionen basierend auf dem ausstehenden Block sowie dem txpool zurückgibt, gibt er auch die gleiche Anzahl von Transaktionen zurück:

{"jsonrpc":"2.0","result":"0x5e","id":1}

Ich scheine den Unterschied zwischen dem ausstehenden Block und dem txpool nicht verstanden zu haben.

Anfangs hatte ich den Eindruck, dass im txpool alle ausstehenden Transaktionen auf einem Knoten (im Speicher) gespeichert werden und dass der ausstehende Block nur vorhanden ist, wenn ein Knoten schürft (dh der Block, für den gelöst wird), aber das ist eindeutig nicht der Fall.

Könnte jemand den Unterschied zwischen diesen beiden Konzepten im Zusammenhang mit schwebenden Transaktionen , dem Konto-Nonce und dem Senden schwebender Transaktionen erklären ?


Ähnliche Fragen wurden ohne konkrete Antworten gestellt:

getBlock('pending').transactions vs. txpool.status.pending?

eth.pendingTransactions vs. eth.getBlock('pending').transactions

Antworten (1)

Es sieht für mich so aus, als ob dies ein bisschen ein Optimierungs-/Randfall ist, der einige Verwirrung stiftet - dass der Knoten davon ausgeht, dass das Netzwerk, mit dem Sie verbunden sind, normal funktioniert, dh dass Blöcke von rationalen Akteuren abgebaut werden.

Anfangs hatte ich den Eindruck, dass im txpool alle ausstehenden Transaktionen auf einem Knoten gespeichert werden

Das ist richtig.

...dass der ausstehende Block nur vorhanden ist, wenn ein Knoten schürft (dh der Block, für den gelöst wird)

Dies ist insbesondere der Teil, in dem der Knoten meiner Meinung nach davon ausgeht, dass er Teil eines Netzwerks ist, das in Zukunft korrekt funktioniert oder funktionieren wird.


Zur Verdeutlichung können wir einige Szenarien durchspielen:

  1. Im obigen Fall: Wenn es weniger Transaktionen (TXs) gibt, als erwartet werden könnten, dass sie in einen Block passen (basierend auf dem Gaslimit), dann kann man davon ausgehen, dass jeder Knoten, der den nächsten Block abbaut, alle setzen wird die TXs aus dem Mempool in den Block (schließlich gibt es einen wirtschaftlichen Anreiz für den Miner, seinen Gewinn zu maximieren, indem er so viele TXs wie möglich einbezieht). So kann der Knoten intelligent raten, wie der nächste Block aussehen wird.
  2. In dem Fall, in dem mehr TXs im Mempool vorhanden sind, als in den Block passen würden, ist es schwieriger vorherzusagen, welche TXs in den Block aufgenommen werden (da das Neuordnen/Ändern der Liste der TXs das Mining des Blocks beeinflusst ), aber es ist wahrscheinlich davon auszugehen, dass jeder Miner darauf abzielen wird, die TXs mit den höchsten Gebühren einzubeziehen, um seinen Gewinn zu maximieren.

Könnte jemand den Unterschied zwischen diesen beiden Konzepten im Zusammenhang mit ausstehenden Transaktionen, der Konto-Nonce und der Übertragung ausstehender Transaktionen erklären?

Um diese Fragen zusammenzufassen und hoffentlich zu beantworten:

Gültige TXs (entweder auf diesem Knoten erstellt oder von einem Peer empfangen) werden dem lokalen Mempool des Knotens hinzugefügt, bis sie in einem Block enthalten sind (unabhängig davon, ob dieser Block von diesem Knoten oder einem anderen im Netzwerk abgebaut wird). An diesem Punkt werden die TX aus dem Mempool entfernt und in den Block aufgenommen.

Da wir erwarten können, dass die meisten Knoten rational sind und sich korrekt verhalten; Es ist möglich, intelligent zu raten, welche TXs (aus dem Mempool) im nächsten Block enthalten sein werden.

Wenn ein Konto TXs ausführt, erhöht sich die Nonce des Kontos, um die Bestellung von TXs für dieses Konto zu erzwingen. Selbst wenn die vergangenen TXs nicht in einen Block aufgenommen wurden, kann das Konto weiterhin gültige TXs machen, solange die Nonce erhöht wird. Sie können im Mempool erscheinen und könnten voraussichtlich im nächsten Block erscheinen - abhängig von Gasgebühren, Anzahl TXs im Mempool usw.

Neue TXs, die an einem Knoten übermittelt werden, werden an alle oder eine zufällige Teilmenge seiner Peers gesendet (je nachdem, wie der Knoten codiert ist). Der neue, ausstehende Block wird nur dann an die Peers eines Knotens gesendet, wenn er von einem Mining-Knoten abgebaut wird.

Um eine weitere Frage hinzuzufügen: Gegebenes Konto mit Nonce = 5 und Transaktion im ausstehenden Block mit Nonce = 7. Legt der Miner die Transaktion wegen der Nonce-Lücke zurück in den Txpool oder wird die Transaktion einfach abgebrochen? Kann es im Wesentlichen Transaktionen geben, die sich im Txpool, aber nicht im Pending-Block befinden, auch wenn der Pending-Block nicht voll ist?
Gute Frage, es sieht so aus, als ob der TX mit nonce = 7 ausstehend bleibt, bis die Lücke geschlossen ist: verwandte Antworten ethereum.stackexchange.com/a/2809/8469 und ethereum.stackexchange.com/a/877/8469