Kann msg.data als Bezeichner verwendet werden?

Ich schaue mir hier die Multisig-Wallet-Implementierung an und sehe die Verwendung von sha3( msg.data, block.number) als Kennung.

Was genau befindet sich darin msg.dataund warum ist es eindeutig genug, um als Kennung verwendet zu werden? Enthält es nicht nur Informationen darüber, wie der Vertrag aufgerufen wurde? Das heißt, ist es dasselbe, wenn ich den Vertrag mit den gleichen Parametern aufrufe?

Antworten (2)

msg.datasind normalerweise ABI- codierte Informationen, die dem Vertrag die aufzurufende Funktion und Parameter angeben.

Die Verwendung von Standardwerkzeugen msg.datawird gleich sein, wenn der Vertrag mit den gleichen Parametern aufgerufen wird. Das Hashing mit block.numberas in sha3(msg.data, block.number)führt jedoch für jeden Block zu einem völlig anderen Ergebnis.

Hinweis: msg.dataist formbar. Beispielsweise können zusätzliche nachgestellte Nullen angehängt werden, msg.dataohne die Funktion zu ändern, die in einem Vertrag aufgerufen wird. Die Verwendung von Standardtools (wie web3.js) erzeugt keine zusätzlichen nachgestellten Nullen, aber Sie sollten Ihren Anwendungsfall bei der Verwendung msg.dataals Kennung prüfen, um sicherzustellen, dass die Formbarkeit kein Problem oder keine Schwachstelle verursacht.

(In dem speziellen Wallet-Fall in der Frage scheint die Formbarkeit msg.datadurch einen Eigentümer nur Verwirrung für sich selbst oder andere Eigentümer zu stiften.)

Zur Ergänzung des zweiten Teils der Frage ist msg.data für identische Aufrufe gleich, aber auch nur eine der mehreren Transaktionseigenschaften, die zum Erstellen des Hashs (Bezeichner) verwendet werden. Entscheidend ist, dass jede aufrufende Transaktion eine Konto-Nonce hat, die einzigartig und monoton erhöht ist.
@Matthieu Entschuldigung, sagen Sie, dass das msg.dataauch die Konto-Nonce enthält oder dass diese Nonce verwendet wird, um die Kennung zu erstellen? Die einzigen vom Bezeichner verwendeten Parameter scheinen msg.dataund zu sein block.number.
Das Konto nonce ist nicht Teil von msg.data. Ich denke, @Matthieu interpretierte die Kennung als "den Transaktions-Hash" anstelle der "Operations-Hash"-Kennung der Multisig-Brieftasche.
Es ist nicht unbedingt wahr, dass "msg.data gleich sein wird, wenn der Vertrag mit den gleichen Parametern aufgerufen wird". Es gibt viel Raum, um damit herumzuspielen, msg.dataohne die tatsächlichen Werte der Parameter zu ändern.
Aber wenn die zwei oder mehr Transaktionen in demselben Block enthalten sind, dann ist er gleich und nicht einzigartig.
@TjadenHess Danke, Änderungen vorgenommen. Dann habe ich Ihre Antwort bemerkt, positiv bewertet, und sie bestätigt, was ich dachte.
Ich sollte wahrscheinlich darauf hinweisen, dass die ABI-Codierung auch eine nuanciertere Manipulation ermöglicht. Beispielsweise können Sie die Reihenfolge zweier Argumente mit dynamischer Größe vertauschen oder beliebige Daten dazwischen einfügen, indem Sie mit den Zeigern spielen
Kommentare sind nicht für längere Diskussionen gedacht; diese Konversation wurde in den Chat verschoben .

msg.dataist einfach das dataFeld der Transaktion.

Aus dem Yellowpaper:

...eine Message-Call-Transaktion enthält:

data: Ein Byte-Array unbegrenzter Größe, das die Eingangsdaten des Nachrichtenaufrufs spezifiziert, formal T d .

Dieses Datenfeld kann alles enthalten, was der Absender wünscht, aber wie @eth sagte, enthält es normalerweise die Funktionssignatur (eine 4-Byte-Kennung, die Solidity mitteilt, welche Funktion aufgerufen werden soll) und Argumente. Dies ist normalerweise dasselbe, wenn die Argumente dieselben sind, aber verlassen Sie sich nicht darauf, da die Daten am Ende mit zusätzlichen Null-Bytes aufgefüllt werden können, die entfernt werden, wenn Solidity die Argumente dekodiert, aber die msg.data.