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.data
und 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?
msg.data
sind normalerweise ABI- codierte Informationen, die dem Vertrag die aufzurufende Funktion und Parameter angeben.
Die Verwendung von Standardwerkzeugen msg.data
wird gleich sein, wenn der Vertrag mit den gleichen Parametern aufgerufen wird. Das Hashing mit block.number
as in sha3(msg.data, block.number)
führt jedoch für jeden Block zu einem völlig anderen Ergebnis.
Hinweis: msg.data
ist formbar. Beispielsweise können zusätzliche nachgestellte Nullen angehängt werden, msg.data
ohne 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.data
als 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.data
durch einen Eigentümer nur Verwirrung für sich selbst oder andere Eigentümer zu stiften.)
msg.data
ist einfach das data
Feld 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
.
Matthias
plsnoban
msg.data
auch die Konto-Nonce enthält oder dass diese Nonce verwendet wird, um die Kennung zu erstellen? Die einzigen vom Bezeichner verwendeten Parameter scheinenmsg.data
und zu seinblock.number
.eth
msg.data
. Ich denke, @Matthieu interpretierte die Kennung als "den Transaktions-Hash" anstelle der "Operations-Hash"-Kennung der Multisig-Brieftasche.Tjaden Hess
msg.data
ohne die tatsächlichen Werte der Parameter zu ändern.Yogesh - EtherAuthority.io
eth
Tjaden Hess
eth