Beim Zusammenstellen eines einfachen Vertrages über Remix mit dem neuesten Nightly erhalte ich die folgende Warnung
"Die Verwendung von Selbstzerstörung kann aufrufende Verträge unerwartet blockieren. Seien Sie besonders vorsichtig, wenn dieser Vertrag von anderen Verträgen verwendet werden soll (z. B. Bibliotheksverträge, Interaktionen). Die Selbstzerstörung des aufgerufenen Vertrags kann Anrufer in einen funktionsunfähigen Zustand versetzen."
„Mehr“ führt hier hin , über den berüchtigten Parity-Multi-Sig-Wallet-Bug (Pmswb).
Was meine Aufmerksamkeit auf sich gezogen hat, ist die Erwähnung von Wechselwirkungen.
Kann die Interaktion mit einem selfdestructing
Vertrag (beachten Sie das fortlaufende -ing) meinen Vertrag in einen nicht funktionsfähigen Zustand versetzen? Wohlgemerkt, ich spreche hier nicht von Bibliotheken (das war das Pmswb-Szenario), aber ist die Unterscheidung zwischen der Nutzung einer Bibliothek und der Interaktion mit einem Vertrag in Ethereum sinnvoll?
Was ich im Sinn habe, ist ein Vertrag, mit dem ich eine Transaktion durchführe, die sich aus irgendeinem Grund (böswillig oder nicht) selbst zerstört und meinen Vertrag funktionsunfähig macht. Ist das ein mögliches/realistisches Szenario? Wenn ja, ist das nicht ein sehr ernstes Problem?
Diese Warnung sagt Ihnen, dass Sie vorsichtig sein sollten, wenn Sie Ihren Vertrag einsetzen, der sich selbst zerstören kann, und dass andere Verträge davon abhängen.
Wenn Sie Vertrag B haben, der eine Funktion für Vertrag A aufruft, und Vertrag A selbstzerstört ist, funktioniert Vertrag B nicht mehr.
Wenn Sie einen Vertrag mit einer Funktion haben, die sich selbst zerstört, gibt es zwei mögliche Dinge, die passieren könnten, wenn diese Funktion von einem anderen Vertrag aufgerufen wird. Angenommen, Sie haben Vertrag A wie folgt:
contract A {
address public owner = msg.sender;
function bye() public{
selfdestruct(owner);
}
}
und Vertrag B:
contract B {
uint public data = 34;
function killContractA(address _a) public {
A a = A(_a);
a.bye();
}
function killMyself(address _a) public {
_a.delegatecall(bytes4(keccak256("bye()")));
}
}
Wenn Vertrag B (der von jedem anderen bereitgestellt werden kann) killContractA() aufruft, wird dies effektiv dazu führen, dass sich Ihr Vertrag A selbst zerstört.
Wenn Vertrag B killMyself() aufruft, wird er selbst zerstört, vorausgesetzt, er verwendet den Delegataufruf.
Aus diesem Grund sollten Sie Delegatecall niemals verwenden, um auf einen Vertrag abzuzielen, von dem Sie nichts wissen.
In beiden Fällen könnten Sie dieses Verhalten verhindern, indem Sie verlangen, dass der msg.sender der Eigentümer des Vertrags in Vertrag A ist.
Andrea Alciato
pabloruiz55
Andrea Alciato
pabloruiz55
pabloruiz55