La transacción que tiene un precio de gas bajo hace que todas las demás transacciones permanezcan en el estado pendiente

Tengo una pequeña red privada que tiene un motor de prueba de autoridad creado mediante el geth-cliqueuso Geth Version: 1.8.3-unstablede , actualmente hay tres nodos firmantes y otros dos nodos no firmantes (llamémoslos peer-Ay peer-B). peer-Ay peer-Bestán conectados a tres nodos firmantes.

Primero, envié una transacción con un valor muy bajo gasPrice, como 200, peer-Acomo se muestra a continuación.

eth.sendTransaction({from:eth.accounts[0], to:eth.accounts[1], value: web3.toWei(0,0000, "ether"), gasPrice: 200})

Más tarde, cuando envié más transacciones peer-Aincluso con mayor gasPrice, todas esas transacciones permanecerán en estado pendiente. Según tengo entendido, las transacciones enviadas funcionan como una cola FIFO y mis próximas transacciones están bloqueadas desde la primera transacción de envío con gasPricebloqueos muy bajos para otras.

Ejemplo: (Primero peer-Ay peer-Benvió un Tx con bajo gasPricey luego sus otros Tx con gasPrice alto atascados en su estado pendiente).ingrese la descripción de la imagen aquí

He solucionado esta situación limpiando my chaindataon peer-A, que también limpia todas las transacciones pendientes: rm -rf private/geth, y luego envío mis transacciones con más grande gasPrice. Supongo que esta fue una solución muy ineficiente para las redes que tienen una gran cadena.

Entonces, ¿todas las transacciones enviadas se proporcionan como cola FIFO? ¿Por qué no seleccionaron en base a cuál tiene el más alto gasPrice?

Tenga en cuenta que he intentado:

eth.resend(eth.pendingTransactions[0], web3.toWei(1000, 'gwei'))

pero ante el siguiente error:

Error: intrinsic gas too lowoError: replacement transaction underpriced error.

[P] ¿Cómo podría resolver este problema? ¿Cómo podría eliminar la transacción pendiente en el sistema que tiene un precio de gas bajo o rechazarla o actualizar su gasPricevalor y la resend()de ellos?

Problema de Github: https://github.com/ethereum/go-ethereum/issues/16284

Respuestas (2)

La respuesta de Péter Szilágyi en ( https://github.com/ethereum/go-ethereum/issues/16284 ) me ayuda a resolver el problema.

Cada cuenta y transacción en Ethereum tiene un nonce. En un momento dado, solo se puede ejecutar la transacción con el nonce correcto. Si envía una transacción con un precio de gasolina bajo, eso bloqueará todas las transacciones subsiguientes, ya que no son ejecutables, solo el siguiente nonce es ejecutable.

No necesita borrar la carpeta de datos de su cadena, las transacciones pendientes no se almacenan allí. Hay un archivo de transacciones.rlp que guarda las transacciones locales.

Estaba usando eth.resend()con dos parámetros.

=> Agregar gasLimitcomo tercer parámetro lo resolvió, ejemplo:

eth.resend(eth.pendingTransactions[0], web3.toWei(20, 'gwei'), 2000000)

=> O detenga el nodo, elimine transactions.rlpel archivo ( rm ~/examplePOA/private/geth/transactions.rlp) y reinicie.

Una solución más fácil (en comparación con restablecer la cadena) es enviar una transacción de reemplazo que

  • tiene la misma cuenta nonce (más información aquí ) que la transacción de gasolina baja pendiente
  • ofrece precio de gasolina más alto

Para obtener un algoritmo eficiente con respecto al problema más genérico de nonce singleton, consulte esta pregunta y sus respuestas.

He intentado ofrecer un precio de gasolina más alto siguiendo ( ethereum.stackexchange.com/a/18154/4575 ), pero me he enfrentado a algunos errores. @Linmao Canción
¿Algún error del registro web3 o de Geth/Parity para la transacción de reemplazo?
Estoy teniendo Error: intrinsic gas too lowo Error: replacement transaction underpriced error.@Linmao Song
¿Podría ser que el precio del gas de la transacción de reemplazo aún sea demasiado bajo? ¿Cómo se compara el precio del gas nuevo con el precio anterior, también con el precio medio del gas (p. ej., web3.eth.gasPrice)?
web3.eth.gasPrice is 18000000000, lo he intentado: eth.resend(eth.pendingTransactions[0], web3.toWei(1000, 'gwei'))pero sigue siendo el mismo error. @Linmao Canción