Wie stelle ich die Nonce für Raw-Transaktionen ein?

Ein paar Fragen zu rawTransactions:

  1. Sind sie irgendwo dokumentiert?
  2. Wie genau soll ich die Nonce einer rawTransaction setzen? Wenn ich geth starte und nichts als rawTransactions übermittle, dann werden die Nonces einfach mit 1, 2, 3, ... nummeriert, richtig? Wie wäre es, wenn ich einige nicht-rohe (sendTransaction) Transaktionen von einer anderen Adresse einmische? Angenommen, ich übergebe eth_sendTransaction, eth_sendTransaction, eth_sendRawTransaction. Sollte die Nonce der ersten Rohtransaktion 1 oder 3 sein?
  3. Hat sich etwas an der Art und Weise geändert, wie rawTransaction-Nonces zwischen Develop und Master gehandhabt werden?
  4. Ändert sich die Antwort auf (2), wenn die sendTransaction(s) und die Raw-Transaktionen von unterschiedlichen Adressen stammen?

Bearbeitet (02.04.2016): Der spezifische Fehler, den ich bekomme, wenn ich versuche, Rohtransaktionen an geth zu senden: -32000: Nonce too low. (Deshalb konzentriere ich mich so auf den Nonce-Wert ...)

Hier ist ein Beispiel für die clientseitige Transaktion, bevor sie von ethereumjs-tx verpackt und verpackt wird :

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

Irgendetwas offensichtlich falsch dort ...?

Antworten (2)

  1. Eine Rohtransaktion ist der RLP-codierte Wert einer signierten Transaktion, dh alles, was im gelben Papier , Seite 4, Abschnitt 4.2, enthalten ist
  2. Nonces müssen bereits in der Rohtransaktion enthalten sein, Sie können es nicht festlegen. Geth legt es nicht fest. (Da die ebenfalls enthaltene Signatur darauf basiert).
  3. Soweit ich weiß, nicht.
Re: (2), wie geben Sie die korrekte Nonce an, die in die Rohtransaktion aufgenommen werden soll, bevor Sie sie signieren? dh wenn Sie programmgesteuert eine Transaktion im Client erstellen, muss dieses Programm den Nonce-Wert irgendwie festlegen. Mein Ansatz bestand darin, getTransactionAccount(address, "pending") zu verwenden, aber dies funktioniert nicht mehr (im Entwicklungszweig von Geth).
@tinybike - Wenn Sie Transaktionen manuell erstellen würden, würden Sie höchstwahrscheinlich getTransactionCount verwenden. Ob Sie sich für die Angabe von ausstehend entscheiden, bleibt Ihnen überlassen. Anstehend würde die Nonce auf einen Wert mehr erhöhen als den letzten Wert, der in der Liste anstehender Transaktionen gespeichert ist. Wenn Sie eine weitere Transaktion senden wollten, um eine der ausstehenden zu überschreiben (sagen wir, Sie entscheiden, dass Ihr ursprünglicher Gaspreis zu niedrig war und ihn erhöhen möchten, um ihn schneller abzubauen), dann könnten Sie einfach die Nonce dieser Transaktion erneut verwenden. Welche auch immer zuerst abgebaut wird, würde die andere ungültig machen.

Die Nonce ist immer der Transaktionszähler des Absenders. Der Empfang einer Transaktion wirkt sich nicht auf die Nonce aus. Wenn eine Transaktion verarbeitet wird, werden alle ausstehenden Transaktionen mit einer niedrigeren Nonce als der bestätigten Transaktion storniert.

Die Transaktionsanzahl und Nonce können durch web3.eth.getTransactionCount() gesetzt werden. Schwebende Transaktionen müssen berücksichtigt werden.

nonce = web3.eth.getTransactionCount() + pending transactions
Gibt es eine Möglichkeit, ausstehende Transaktionen für eine Adresse zu erhalten?
web3.eth.pendingTransactions, dies gibt die Liste der ausstehenden Transaktionen zurück.
@Timothy, können wir "earliest" als zweiten Parameter verwenden, um alle Transaktionen zu zählen, anstatt ausstehende und abgeschlossene Transaktionen separat zu berechnen?