¿Cuál es la diferencia entre el bloque "pendiente" y txpool?

Aunque mi nodo de paridad (red privada) no está minando, parece tener un bloque pendiente y un txpool.

Después de enviar algunas transacciones, la web3.eth.getBlock("pending")llamada devuelve información sobre el bloque pendiente, incluidas las transacciones pendientes:

{ 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',

La web3.eth.getTransactionCount(<address>, "pending")llamada devuelve un recuento de transacciones de:

94

Al realizar una curlsolicitud para utilizar el extremo de API específico de paridad parity_nextNonceque devuelve el recuento de transacciones de la cuenta en función del bloque pendiente y del txpool, también devuelve el mismo número de transacciones:

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

Parece que no he captado la diferencia entre el bloque pendiente y el txpool.

Inicialmente, tenía la impresión de que txpool es donde todas las transacciones pendientes se almacenan en un nodo (en la memoria) y que el bloque pendiente solo está presente cuando un nodo está minando (es decir, el bloque que se está resolviendo), pero claramente eso es no es el caso.

¿Alguien podría explicar la diferencia entre estos dos conceptos en el contexto de las transacciones pendientes , el nonce de cuenta y la transmisión de transacciones pendientes ?


Se han hecho preguntas similares sin respuestas concretas:

getBlock('pendiente').transacciones vs txpool.status.pending?

eth.pendingTransactions frente a eth.getBlock('pendiente').transacciones

Respuestas (1)

Me parece que se trata de un caso de optimización/extremo que está causando cierta confusión: que el nodo asume que la red a la que está conectado funciona normalmente, es decir, que los bloques serán extraídos por actores racionales.

Inicialmente, tenía la impresión de que txpool es donde se almacenan todas las transacciones pendientes en un nodo.

Esto es correcto.

... que el bloque pendiente solo está presente cuando un nodo está minando (es decir, el bloque que se está resolviendo)

Esta, específicamente, es la parte en la que creo que el nodo asume que es parte de una red que funciona o funcionará correctamente en el futuro.


Para ayudar a aclarar, podemos analizar algunos escenarios:

  1. En el caso anterior: donde hay menos transacciones (TX) de las que cabe esperar que quepan en un bloque (basado en el límite de gas), entonces es seguro asumir que cualquiera que sea el nodo que vaya a minar, el siguiente bloque pondrá todas las los TX del mempool al bloque (después de todo, existe un incentivo económico para que el minero maximice sus ganancias al incluir tantos TX como sea posible). Entonces, el nodo puede hacer una conjetura inteligente sobre cómo se verá el próximo bloque.
  2. En el caso de que haya más TX en el mempool de los que podrían caber en el bloque, entonces es más difícil predecir qué TX se incluirán en el bloque (ya que reordenar/modificar la lista de TX afecta la extracción del bloque). ), pero probablemente sea seguro asumir que cualquier minero intentará incluir los TX con las tarifas más altas para maximizar sus ganancias.

¿Alguien podría explicar la diferencia entre estos dos conceptos en el contexto de las transacciones pendientes, el nonce de cuenta y la transmisión de transacciones pendientes?

Para resumir y, con suerte, responder a estas preguntas:

Los TX válidos (ya sea creados en este nodo o recibidos de un par) se agregarán al mempool local del nodo hasta que se incluyan en un bloque (ya sea que ese bloque sea extraído por este nodo u otro en la red). En ese momento, los TX se eliminan del mempool y se incluyen en el bloque.

Dado que podemos esperar que la mayoría de los nodos sean racionales y se comporten correctamente; es posible adivinar inteligentemente qué TX (del mempool) se incluirán en el siguiente bloque.

A medida que una cuenta genera TX, el nonce de la cuenta aumentará para hacer cumplir el pedido de TX para esa cuenta. Incluso si los TX anteriores no se han incluido en un bloque, la cuenta puede continuar generando más TX válidos siempre que se incremente el nonce. Pueden aparecer en el mempool y se espera que aparezcan en el siguiente bloque, según las tarifas de gas, el número de TX en el mempool, etc.

Los nuevos TX que se envían en un nodo se transmitirán a todos o a un subconjunto aleatorio de sus pares (dependiendo de cómo esté codificado el nodo). El nuevo bloque pendiente solo se transmitirá a los pares de un nodo cuando sea extraído por un nodo de minería.

Para agregar otra pregunta: Cuenta dada con nonce=5 y transacción en el bloque pendiente con nonce=7. ¿El minero vuelve a colocar la transacción en el txpool debido a la brecha de nonce o simplemente se cancela la transacción? Esencialmente, ¿puede haber transacciones que estén en el txpool pero no en el bloque pendiente incluso si el bloque pendiente no está lleno?
Buena pregunta, parece que el TX con nonce = 7 permanecerá pendiente hasta que se cierre la brecha: respuestas relacionadas ethereum.stackexchange.com/a/2809/8469 y ethereum.stackexchange.com/a/877/8469