Haben Verträge auch eine Nonce?

Haben Verträge auch eine Nonce und wenn ja, wie wird diese berechnet? Übliche Konten haben eine Nonce, die mit jeder Transaktion erhöht wird. Verträge können jedoch keine Transaktionen durchführen, sie können nur Aufrufe tätigen, die durch Transaktionen ausgelöst werden.

Aber Verträge können immer noch andere Verträge erstellen und für den neu generierten Vertrag ist die Nonce des Absenders relevant. Es scheint also, dass Verträge auch Nonces haben. Wird diese Nonce jedes Mal erhöht, wenn sie einen anderen Vertrag kündigen, oder nur, wenn sie einen anderen Vertrag erstellen?

Antworten (2)

Ja, Verträge haben Nonces . EIP 161 ließ die Kontrakt-Nonce bei 1 beginnen , und vor EIP 161 würde die Nonce bei 0 beginnen. Eine Nonce eines Kontrakts wird nur erhöht, wenn dieser Kontrakt einen weiteren Kontrakt erstellt (@zanzus YP-Referenz). Wenn ein Vertrag eine Funktion auf einem anderen Vertrag aufruft, eine sogenannte "interne Transaktion", wird die Nonce nicht inkrementiert.

Die Nonce kann mit abgerufen werden web3.eth.getTransactionCount. Es gibt keine integrierte Methode für einen Vertrag, um auf die Nonce eines Kontos zuzugreifen, einschließlich seiner eigenen. (Ein Vertrag könnte seinen Speicher verwenden, um seine eigene Nonce zu verfolgen.)

Um es deutlich zu machen, es gibt nur 2 Arten von Konten in Ethereum und sie haben alle die gleichen 4 „physischen“ Eigenschaften: Nonce, Balance (in Wei), Hash of Storage Trie Root und Code. Der einzige "physikalische" Unterschied besteht darin, dass ein Vertrag einen Nicht-Null-Code hat.

Hinsichtlich des Verhaltens gibt es noch einige weitere Unterschiede zwischen Verträgen und gewöhnlichen Konten. Das Inkrementieren der Nonce ist ein Verhaltensunterschied; Ein weiterer wichtiger Punkt ist: Wo wird der private Schlüssel für einen Vertrag gespeichert?


Um zu verdeutlichen, dass " normale Konten eine Nonce haben, die mit jeder Transaktion erhöht wird ", wird die Nonce eines Nicht-Vertragskontos nur erhöht, wenn dieses Konto eine Transaktion auslöst (wenn es das Absenderkonto fromist). Wenn ein Konto der Empfänger ist (das toKonto), wird seine Nonce nicht erhöht.

Die Antwort auf Ihre Frage finden Sie im gelben Papier :

nonce: Ein skalarer Wert, der der Anzahl der von dieser Adresse gesendeten Transaktionen oder, im Fall von Konten mit zugehörigem Code, der Anzahl der von diesem Konto getätigten Vertragserstellungen entspricht

Denken Sie daran: In Ethereum sind Verträge Konten mit einem ihnen zugeordneten Code.