Wir haben die ETH an die falsche Adresse geschickt und konnten sie zurückschicken

Ursprünglicher Autor: Anton Bukov
  • Übersetzung


Angefangen hat alles mit dem Problem, auf das wir in BitClave gestoßen sind : Während der Vorbereitung unseres ICO wurde eine gewisse Menge an ETH-Kryptowährung (Ether) an die Adresse des Smart-Vertrags gesendet, der zuvor im Ethereum - Testnetzwerk versenkt worden war . Das Geld wurde auf die gesendete Hauptnetzadresse gehört nicht zu jedem privaten Schlüssel zu einem Smart-Vertrag im Netzwerk. Zunächst schien es uns, als hätten wir einfach 2000 Dollar ausgegeben, ohne eine einzige Gelegenheit, unser Geld zurückzugeben.



Die Geschichte begann, als mein Kollege mich nach einem privaten Schlüssel an die Adresse 0x9c86825280b1d6c7dB043D4CC86E1549990149f9 fragte . Ich habe ihm einen privaten Schlüssel an die Adresse 0x231A3925A014EF0a11a0DC5c33bF7cdB3bd9919f gesendetvon dem der Smart-Vertrag an der ersten Adresse heruntergeladen wurde. Wir haben das Problem besprochen und sind zu dem Schluss gekommen, dass es keine Möglichkeit gibt, das gesendete Geld zurückzugeben.

Jeder Smart-Vertrag, der in das Ethereum-Netzwerk hochgeladen wird, hat eine eindeutige Adresse, die auf den ersten Blick zufällig aussieht. stackexchange.com/a/761/3032 . Einfach ausgedrückt ist die Download-Adresse der Hash des Absenders der Transaktion und der Nonce- Wert (gleich der Anzahl der ausgehenden Transaktionen von dieser Adresse):

deployed_address = sha3(rlp.encode([sender, nonce]))


Dies gab mir die Idee , die gleiche Handtasche (die, die ich in verwendet zu verwenden , ein Testnetz) neue smart Vertrag zum Download Basisnetz.Ich habe einen intelligenten Vertrag für ein einfaches Portemonnaie entwickelt, mit dem Sie nur den Kontostand anzeigen und das verlorene Guthaben überweisen können:

contract SimpleWallet is Ownable {
    function () public payable {
    }
    function weiBalance() public constant returns(uint256) {
        return this.balance;
    }
    function claim(address destination) public onlyOwner {
        destination.transfer(this.balance);
    }
}

Dann fand ich eine Transaktion im Testnetzwerk, mit der der ursprüngliche Vertrag heruntergeladen wurde: 0xc4c32a3d97dbd691eb3646e4c0c404e899a632010bc48d7182d75bef6803b7bc und stellte fest, dass das Nonce- Feld 13 lautete. Ich fügte dem Hauptnetzwerk einen neuen Vertrag hinzu bis nonce von 0 auf 13 wuchs. Und das wars, ich habe einen klugen Vertrag an der gewünschten Adresse geladen! Hier können wir 2 Transaktionen mit dem gleichen Nonce gleich 13 beobachten, die von 2 verschiedenen Smart-Verträgen in 2 verschiedenen Netzwerken an identischen Adressen mit einem Unterschied von 5 Tagen heruntergeladen wurden:


Nach dem Aufruf der Methode claim, einem frisch gefüllten Smart-Vertrag , sind die Gelder bei uns erfolgreich eingegangen .

Beachten Sie auch, dass der Smart-Vertrag 2 Tage nach



Eingang der Mittel im Netzwerk hochgeladen wurde: Kurz. Wir schickten das Geld an das Hauptnetz Astraleum Adresse Smart Vertrag, der in gegossen wurde ein Test Astraleum Netzwerk. Wir haben mit demselben Portemonnaie mehrmals einen völlig anderen Smart-Vertrag in das Ethereum- Hauptnetzwerk hochgeladen, bis das Transaktions- Nonce- Feld den Wert 13 erreichte, der nur zum Laden des Smart-Vertrags in den Test verwendet wurdedas Netzwerk. Dann haben wir eine spezielle Methode für einen neuen Smart-Vertrag aufgerufen, mit der wir Geld auf unser Portemonnaie abheben konnten. Es stellte sich heraus, dass wir einen intelligenten Vertrag an die Adresse hochgeladen haben, an der das Geld bereits darauf gewartet hat.

PS: Stimmen Sie für die Möglichkeit , Emoji zu Artikeln über Habr hinzuzufügen

Jetzt auch beliebt: