Der Modifikator, der verwendet wird, um zu prüfen, ob ein Vertrag eine Funktion in Solidity aufruft, verwendet den Assembler-Code extsize
. Ich frage mich, warum das gemacht wird. Die Verwendung von Assembly erscheint mir sehr "hackish" (warum hat Solidity keine "normale" Funktion, um dies zu überprüfen?). Der fragliche Code ist
modifier noContract(address _addr){
uint32 size;
assembly {
size := extcodesize(_addr)
}
require (size == 0);
_;
}
(bearbeitet von https://ethereum.stackexchange.com/a/15642/33191 )
Warum nicht msg.sender == tx.orgin
als Scheck verwenden? Gibt es hier eine Lücke?
Ist der Grund für die Verwendung extsize
, dass dies (etwas) weniger Gas verbrauchen könnte?
tx.origin
sollte in EXTREM seltenen Fällen verwendet werden. Wenn Sie überprüfen , überprüfen tx.origin
Sie, von wem der Anruf stammt. Bei unsachgemäßer Verwendung kann dies also extreme Schwachstellen öffnen oder möglicherweise die Funktionalität Ihres Vertrags beeinträchtigen.
person a -> contract-a -> contract-b
Wenn Sie es aktivieren, tx.origin
wird contract-b
es in die Adresse von aufgelöst, person a
nicht in die Adresse von contract-a
. Wenn Sie es überprüfen msg.sender
, wird es sein contract-a
.
Der Grund, warum Assembler verwendet wird, ist, wie Sie betonen, dass es derzeit keine integrierten soliden Funktionen gibt, um dies zu handhaben. Solidität ist noch eine recht junge Sprache, daher ist es nicht verwunderlich.
Es gibt nur wenige Möglichkeiten, wie dies passieren kann:
1) Spezifische Programmierfunktionen oder -logik, die den Vertrag dazu zwingen, sich selbst aufzurufen
2) Aufruf unbekannter Verträge, die die Ausführung von Fallback-Code auslösen können
Option 1 ist kein wirkliches Problem, da dies sehr einfach zu kontrollieren ist, aber Option 2 kann Sie für Hacking-Versuche auf Ihren Vertrag öffnen, da der unbekannte Vertrag, den Sie anrufen, möglicherweise eine Fallback-Funktion implementieren könnte, die Aufrufe an Ihren Vertrag auslösen würde.
Ich denke, Ihr Problem sollte besser gelöst werden, indem festgestellt wird, welche Funktionen es dem Vertrag ermöglichen, sich selbst aufzurufen, und diese Funktionen geändert werden, während alle Aufrufe unbekannter Verträge entfernt werden, die die Codeausführung auslösen könnten, für die Sie das Ergebnis nicht kennen. Sie könnten einige Assembler-Zaubereien implementieren, um dies zu verhindern, aber für mich klingt das so, als würden Sie dadurch potenziellen Schwachstellen ausgesetzt.
tx.origin
da ein Anruf niemals von einem Vertragskonto stammen kann, sondern immer von einem EOA stammen muss (zumindest vorerst bis zur Kontoentnahme). Sie sollten es niemals wirklich verwenden, tx.origin
es ist gefährlich und sollte unter extremen Umständen verwendet werden. Es hört sich so an, als ob das, wonach Sie suchen, durch Vertragsumgestaltung gelöst werden kann, anstatt zu versuchen, eine hackige Lösung zu implementieren.tx.origin
den Absender des Anrufs extcodesize
nachschlagen, während die Größe des gespeicherten Codes nachschlagen soll. Ich würde davon ausgehen, dass extcodesize mit Assemblierung wahrscheinlich etwas billiger wäre als mittx.origin
tx.origin
hat etwas böses Blut mit seiner Verwendung verbunden, da es zu einer Reihe von Schwachstellen führt, die zu hochkarätigen Hacks führen. Abgesehen davon kommt es darauf an, wie Sie implementieren tx.origin
. Viel Glück!
Lauri Peltonen
JBrouwer
Benutzer19510
JBrouwer