¿Cómo configuro el nonce para transacciones sin procesar?

Algunas preguntas sobre rawTransactions:

  1. ¿Están documentados en algún lugar?
  2. ¿Cómo debo establecer exactamente el nonce de una transacción sin procesar? Si empiezo con geth y no le envío nada más que transacciones sin procesar, entonces los nonces simplemente se numeran 1, 2, 3, ..., ¿correcto? ¿Qué tal si mezclo algunas transacciones no sin procesar (sendTransaction), desde una dirección diferente? Por ejemplo, supongamos que envío eth_sendTransaction, eth_sendTransaction, eth_sendRawTransaction. ¿Debería el nonce de la primera transacción sin procesar ser 1 o 3?
  3. ¿Ha cambiado algo en la forma en que se manejan los nonces rawTransaction, entre el desarrollo y el maestro?
  4. ¿Cambia la respuesta a (2) si las transacciones de envío y las transacciones sin procesar provienen de direcciones diferentes?

Editado (4/2/2016): el error específico que recibo cuando intento enviar transacciones sin procesar a geth: -32000: Nonce too low. (Es por eso que estoy tan concentrado en el valor nonce...)

Aquí hay un ejemplo de la transacción del lado del cliente, antes de ser empaquetada y empaquetada por ethereumjs-tx :

{
  "to": "0x895d32f2db7d01ebb50053f9e48aacf26584fe40",
  "from": "0x6bcf3d525c425965a40fb77b1fe6461eeced67d7",
  "gasLimit": "0x2fd618",
  "nonce": 1,
  "value": "0x0",
  "data": "0x5f92896e00000000000000000000000000000000000000000000000000000000000f69b5",
  "gasPrice": "0x4a817c800"
}

¿Obviamente algo anda mal ahí...?

Respuestas (2)

  1. Una transacción sin procesar es el valor codificado en RLP de una transacción firmada, es decir, todo lo incluido según se define en la página 4 del documento amarillo , sección 4.2.
  2. Los nonces ya deben estar incluidos en la transacción sin procesar, no puede configurarlo. Geth no lo establece. (Ya que la firma que también se incluye está basada en ella).
  3. No tan lejos como sé.
Re: (2), ¿cómo especifica el nonce correcto para incluir en la transacción sin procesar, antes de firmarla? es decir, si está construyendo mediante programación una transacción en el cliente, entonces ese programa debe establecer el valor de nonce de alguna manera. Mi enfoque ha sido usar getTransactionAccount(dirección, "pendiente") pero esto ya no funciona (en la rama de desarrollo de geth).
@tinybike: si estuviera construyendo transacciones manualmente, lo más probable es que use getTransactionCount. Si decide especificar pendiente depende de usted. Pendiente incrementaría el nonce a un valor más que el último valor almacenado en la lista de transacciones pendientes. Si desea enviar otra transacción para sobrescribir una de las pendientes (por ejemplo, decide que el precio original de la gasolina era demasiado bajo y desea aumentarlo para extraerlo más rápido), entonces podría usar el nonce de esa transacción nuevamente. Cualquiera que se extraiga primero invalidaría al otro.

El nonce es siempre el recuento de transacciones del remitente. Recibir una transacción no afecta el nonce. Cuando se procesa una transacción, se cancelan todas las transacciones pendientes con un nonce inferior a la transacción confirmada.

El recuento de transacciones y el nonce se pueden configurar mediante web3.eth.getTransactionCount(). Se deben tener en cuenta las transacciones pendientes.

nonce = web3.eth.getTransactionCount() + pending transactions
¿Hay alguna forma de obtener transacciones pendientes para una dirección?
web3.eth.pendingTransactions, esto devolverá la lista de transacciones pendientes.
@Timothy, ¿podemos usar 'primero' como segundo parámetro para contar todas las transacciones en lugar de calcular las transacciones pendientes y las realizadas por separado?