Wenn beide im Hauptteil einer Solidity-Funktion verwendet werden, die den Status eines Vertrags ändern kann (Schreibaufruf), was ist der Hauptunterschied und / oder Vorteil der Verwendung einer Funktion gegenüber der anderen? Zum Beispiel:
function setOwner() {
owner = msg.sender;
}
vs.
function setOwner() {
owner = tx.origin;
}
Was ist der Unterschied?
Mit msg.sender
dem Eigentümer kann ein Vertrag geschlossen werden.
Mit tx.origin
dem Eigentümer kann niemals ein Vertrag zustande kommen.
In einer einfachen Anrufkette A->B->C->D wird innerhalb von D msg.sender
C und tx.origin
A sein.
msg.sender
wegen der gebotenen Flexibilität bevorzugt. Darüber hinaus empfiehlt Vitalik für Serenity, auch wenn es eine Weile her ist, Folgendes zu vermeiden tx.origin
: Wie mache ich mein DAPP „Serenity-Proof“?
Überlegen Sie sorgfältig, ob Sie wirklich jemals verwenden müssen tx.origin
. Denken Sie daran, dass Sie möglicherweise nicht der einzige Nutzer Ihres Vertrags sind. Andere Personen möchten möglicherweise Ihren Vertrag verwenden und über einen von ihnen geschriebenen Vertrag damit interagieren.
Wenn der Ursprung in D wirklich erwünscht ist, dann könnte jede der Funktionen in den Verträgen B, C, D einen zusätzlichen Parameter annehmen, um den Ursprung weiterzugeben: A würde seine Adresse ( this
) an B weitergeben, B würde den Wert an C weitergeben, und C würde es an D weitergeben.
BEARBEITEN: Um den Kommentar von @WBT unten hervorzuheben, muss ein Vertrag, der einen übergebenen Wert für den Ursprung verwendet, sehr vorsichtig sein, wie er den Ursprung verwendet: Jeder kann einen Wert übergeben, der nicht der wahre Ursprung ist.
msg.sender
gibt den direkten Absender der Nachricht an, also zum Beispiel einen Vertrag, der sie weitergegeben hat.
tx.origin
gibt die Herkunft der Transaktionen an, also die Benutzeradresse, von der sie ursprünglich gesendet wurden. In der Praxis wird dies immer ein Benutzer sein, daher gilt die Antwort von eth.
Paul S
eth
Kurz
eth
WBT