Wie man Ether nach dem Hard-Fork bedingt an ein anderes Konto sendet, um sich vor Replay-Angriffen zu schützen

Der DAO-Vertrag wurde am 17. Juni 2016 angegriffen, wobei der Angreifer Ether im Wert von etwa 50 Millionen USD abzog, indem er eine Schwachstelle bei rekursiven Aufrufen im DAO-Vertragscode nutzte.

Der Angreifer leitete die gestohlenen Ether in einige untergeordnete DAOs ab und die Robin Hood Group leitete die verbleibenden Gelder in andere untergeordnete DAOs ab.

Die Ethereum-Blockchain wurde am 20. Juli 2016 in Block Nr. 1.920.000 hart gegabelt , um die Ether aus dem DAO-Vertrag und seinen untergeordneten DAOs in einen WithdrawDAO-Vertrag zu übertragen .

Während die Mehrheit der Ethereum-Knoten-Clients die Hard-Fork-Blockchain (ETH) ausführen, führt eine Minderheit der Ethereum-Knoten-Clients die nicht-Hard-Fork-Classic-Blockchain (ETC) aus.

Ethereum-Node-Clients können so konfiguriert werden, dass sie die Hard-Fork-Blockchain oder die Non-Hard-Fork-Blockchain verwenden. Einige Knoten wurden so konfiguriert, dass sie die Transaktionen von der Hard-Fork-Blockchain zur Nicht-Hard-Fork-Blockchain und umgekehrt weiterleiten. Auf der ETH-Blockchain ausgeführte Transaktionen werden mit hoher Wahrscheinlichkeit auf der ETC-Blockchain wiedergegeben, und Transaktionen auf der ETC-Blockchain werden mit hoher Wahrscheinlichkeit auf der ETH-Blockchain wiedergegeben.

Mehrere geteilte Verträge wurden unter derselben Vertragsadresse sowohl auf den Hard-Fork- als auch auf den Nicht-Hard-Fork-Blockchains bereitgestellt.

Wie verwenden Sie diese geteilten Verträge, um Ether bedingt an andere Konten in der Hard-Fork-ETH-Kette oder der nicht-Hard-Fork-ETC-Classic-Kette zu senden?



Die DAO-Rückerstattungen

Sehe keinen Unterschied in diesen beiden Threads.
Ich bin kein Soliditätsexperte, aber wie wurde ein Attribut zu einer Methode?
@XavierCombelle: Eine öffentliche Zustandsvariable wie forkederhält eine automatisch generierte Zugriffsmethode in Solidity.
@eth Ich verstehe, das sieht aus wie ein schlechtes Soliditätsdesign, wenn es versucht, sich von Python inspirieren zu lassen: Es verstößt eklatant gegen das explizite Motto, ist besser als das implizite Motto
@XavierCombelle Ich glaube nicht, dass Solidity versucht, wie Python zu sein (das Motto wird an anderen Stellen wie msgund txVariablen verletzt). Fühlen Sie sich frei, Fragen zu stellen und willkommen auf der Website!

Antworten (2)

Update 02.06.2017

Von WARNUNG: Verwenden Sie NICHT SafeConditionalHFTransfer! Oder richtig verwenden :

Der SafeConditionalHFTransfer hat viele Ether gerettet, die nach dem DAO Hard Fork falsch auf die falsche Kette verschoben wurden. Bisher haben 20549 txns + 16022 internalTxns den SafeConditionalHFTransfer bei 0x1e143b2588705dfea63a17f2032ca123df995ce0 durchlaufen . Der Autor kontaktierte mich heute Morgen über 67.317.257581981046981598 ETH ~ USD 14.892.596,89 (@ $221,23/ETH) falsch an den Vertrag gesendet.

classicTransfer(...)Wenn Sie diesen Vertrag verwenden, müssen Sie die Funktionen oder aufrufen transfer(...), um Ihre ETH oder ETC an die vorgesehene Kette zu leiten. Wenn Sie ETH (oder ETC) DIREKT an die Vertragsadresse senden, wird Ihre ETH (oder ETC) nicht an die Zieladresse in der Zielkette umgeleitet, sondern für IMMER in diesem Vertrag gefangen.

Da die neueren Clients sowohl der ETH- als auch der ETC-Kette EIP155 Replay Protection eingebaut haben, müssen Sie diesen NICHT SafeConditionalHFTransfermehr verwenden. Stellen Sie einfach sicher, dass Sie einen aktuellen Client mit EIP155 verwenden!

Hier sind die wichtigsten Clients und die Versionen, die EIP155 implementieren:

Diese Warnung wurde auch an die Spitze der Antwort auf die Frage gestellt, wie man Ether nach dem Hard-Fork bedingt an ein anderes Konto sendet, um sich vor Replay-Angriffen zu schützen .



Update 26. November 2016 – Siehe die Antwort von @eth auf die obige Frage, da geth1.5.3 einen Replay-Angriffsschutz implementiert hat.



Zusammenfassung

  • Verwenden Sie Methode 1 unten, wenn Sie Ether über den Kontrakt gethan die Hard-Fork- ODER Non-Hard-Fork-Classic-Kette übertragen möchten .SafeConditionalHFTransfer
  • gethVerwenden Sie Methode 2 unten, wenn Sie Ether über den Vertrag auf die Hard-Fork UND die Non-Hard-Fork Classic Chain übertragen möchten ReplaySafeSplitV2.
  • Verwenden Sie Methode 3 unten, wenn Sie das Ethereum-Wallet verwenden möchten, um Ether über den Vertrag an die Hard-Fork- ODER Non-Hard-Fork-Classic-Kette zu übertragen SafeConditionalHFTransfer.
  • Verwenden Sie Methode 4 unten, wenn Sie das Ethereum-Wallet verwenden möchten, um Ether über den Vertrag an die Hard-Fork- UND Non-Hard-Fork-Classic-Kette zu übertragen ReplaySafeSplitV2. Jedes Konto kann Ihr Quellkonto sein, sodass Gelder in einer der Ketten an Ihr Konto zurückgesendet werden.
  • Die oben genannten Methoden beruhen auf einigen Ethereum-Knoten, die die Transaktionen von der Hard-Fork-Kette an die Nicht-Hard-Fork-Kette oder umgekehrt weiterleiten. Wenn Transaktionen nicht mehr an das andere Netzwerk weitergeleitet werden, wird die Transaktion nur auf der Kette ausgeführt, auf der Ihr Ethereum-Knoten überträgt.
  • WARNUNGEN
    • Überweisen Sie zunächst einen kleinen Testbetrag
    • Wenn Sie möchten, dass Ihre Transaktionen auf beiden Ketten ausgeführt werden, überweisen Sie nur Beträge, die Ihren Kontostand vor der Hard-Fork nicht überschreiten.
  • AUSGABEN

    • Wenn Sie auf einer der Chains einen Etherbetrag überweisen, der Ihren Kontostand übersteigt, wird die Transaktion auf dieser Chain abgelehnt, aber auf der anderen Chain ausgeführt. Dies führt dazu, dass Ihre Transaktion in beiden Ketten nicht synchron ist und verhindert, dass Transaktionen automatisch in beiden Ketten ausgeführt werden. Siehe Problem nach dem Abheben von Ethereum ohne Hard Fork .
    • Wenn Ihre Transaktionen nicht in beiden Ketten ausgeführt werden, ist Ihre Transaktionsnonce möglicherweise in beiden Ketten nicht synchron. Wenn Sie dennoch Transaktionen auf der OTHER-Kette ausführen möchten, müssen Sie Ihren Ethereum-Knoten-Client mit dieser OTHER-Kette synchronisieren.
  • Wenn Sie Pre-Hard-Fork-ETC an ein Exchange-ETC-Konto senden möchten

    1. Sie können dazu Ihren support-hard-forkoder den oppose-hard-forkEthereum-Node-Client verwenden.
    2. Rufen Sie auf der Börsenseite die ETC-Einzahlungsadresse ab.
    3. Verwenden Sie die classicTransferMethode in gethoder To Transfer Only On The Non-Hard-Forked Classic Chain in Ethereum Wallet .
    4. Überweisen Sie zunächst einen kleinen Testbetrag. Überprüfen Sie Ihr ETH-Konto auf einem Blockchain-Explorer (z. B. http://etherscan.io/ ) und Sie sollten feststellen, dass nur ein kleiner Betrag von Ihrem Konto für die Gaskosten des SafeConditionalHFTransferVertrags abgezogen wird, der Ihre ETH zurücksendet.
    5. Sie müssen eine kurze Weile warten, bis die ETC-Transaktion auf Ihrer Börsen-ETC-Einzahlungsadresse erscheint, da die Weiterleitung eine kurze Verzögerung zu der Transaktion hinzufügt, die auf der ETC-Kette erscheint.



Aktualisierung vom 25. August 2016

Ethereum Wallet und Mist Beta 0.8.2 haben jetzt Replay Prevention:

Replay-Prävention

Wir haben eine erweiterte Funktion hinzugefügt, um zu verhindern, dass Ihre Transaktionen auf anderen Ketten wie Ethereum Classic wiedergegeben werden. Auf diese Weise können Sie entweder verhindern, dass diese Überweisung auf Classic überhaupt stattfindet, oder diese Transaktion verwenden, um denselben Betrag an einen anderen Vertrag zu senden, z. B. ein neu erstelltes Konto oder eine Börse. Wenn Sie alle Ihre Transaktionen vollständig trennen möchten, empfehlen wir Ihnen, zwei neue Konten zu erstellen, eines für Ethereum und das andere für Classic, und dann alle Ihre Gelder darauf zu verschieben (denken Sie daran, dass Sie Ether benötigen, um Token zu verschieben). Konto hat 0 Ether auf der anderen Kette - wenn Sie dies einmal tun, wird verhindert, dass zukünftige Transaktionen wiederholt werden. Verwenden Sie dazu die Schaltfläche "Weitere Optionen" auf der Sendeseite.

Diese Funktion unterstützt auch das Aufteilen von Token, ist aber sehr experimentell und funktioniert nicht mit allen Token. Da dies alles über einen Vertrag erfolgt, müssen Sie diesem Vertrag zuerst erlauben, Token in Ihrem Namen zu verschieben, indem Sie auf „Token-Transfer genehmigen“ klicken.

Wie immer sind diese Funktionen experimentell und sollten zuerst mit kleinen Mengen getestet werden . Obwohl die meisten Transaktionen auf beiden Ketten wiedergegeben werden, können einige aus mehreren Gründen nicht ausgeführt werden. Außerdem haben einige Börsen Probleme, Ether von einer Vertragsadresse zu empfangen – wenn das Ihr Fall ist, wenden Sie sich an die Börse.

Wir haben auch den gesamten Fork-Code aus der Mist-App entfernt. Wenn Sie also Ether Classic verwenden möchten, müssen Sie entweder Classic Mist direkt aus ihrem Repository herunterladen oder Ihren eigenen Knoten als Backend für Ihre Brieftasche verwenden (beide Ethereum Wallet und Mist kann sich mit jedem Knoten verbinden), wie Sie es für ein privates Netzwerk tun würden.

Der Replay Protection Vertrag ist unter 0x1ca4a86bba124426507d1ef67ad271cc5a02820a zu finden .



Methode 1 - Nutzung gethund SafeConditionalHFTransferVertrag

Stellen Sie sicher, dass Sie die Geth-Version 1.4.10 oder höher ausführen. Und führen Sie Ihre Geth-Befehle mit der Option --support-dao-fork aus, damit Sie sich auf der Hard-Fork-Blockchain befinden. So übertragen Sie mit den Funktionen transfer(...)oder classicTransfer(...):

user@Kumquat:~$ geth console
// Allow chain to sync
var fromAccount = "{from account}";
var toAccount = "{to account}";
var amount = web3.toWei(1.123, "ether");
personal.unlockAccount(fromAccount, "{password}")

var safeConditionalHFTransferAddress = "0x1e143b2588705dfea63a17f2032ca123df995ce0";
var safeConditionalHFTransferABI = [{"constant":false,"inputs":[{"name":"to","type":"address"}],"name":"transfer","outputs":[],"type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"}],"name":"classicTransfer","outputs":[],"type":"function"},{"inputs":[],"type":"constructor"}];
var safeConditionalHFTransfer = eth.contract(safeConditionalHFTransferABI).at(safeConditionalHFTransferAddress);    

// WARNING - Run the next statement to transfer ETH on the hard-forked chain
// This will only cost some gas on the non-hard-forked ETC Classic chain
// Test with a small amount first
var transfer = safeConditionalHFTransfer.transfer(toAccount, {from: fromAccount, value: amount});
console.log(transfer);

// WARNING - Run the next statement to transfer ETC on the non-hard-forked Classic chain
// This will only cost some gas on the hard-forked ETH chain
// Test with a small amount first
var classicTransfer = safeConditionalHFTransfer.classicTransfer(toAccount, {from: fromAccount, value: amount});
console.log(classicTransfer);



Methode 2 - Nutzung gethund ReplaySafeSplitV2Vertrag

Stellen Sie sicher, dass Sie die Geth-Version 1.4.10 oder höher ausführen. Und führen Sie Ihre Geth-Befehle mit der Option --support-dao-fork aus, damit Sie sich auf der Hard-Fork-Blockchain befinden. Übertragen mit der split(...)Funktion:

user@Kumquat:~$ geth console
// Allow chain to sync
var fromAccount = "{from account}";
var toAccountFork = "{to account on forked chain}";
var toAccountNoFork = "{to account on non-forked chain}";
var amount = web3.toWei(1.123, "ether");
personal.unlockAccount(fromAccount, "{password}")

var replaySafeSplitV2Address = "0xaBbb6bEbFA05aA13e908EaA492Bd7a8343760477";
var replaySafeSplitV2ABI = [{"constant":false,"inputs":[{"name":"targetFork","type":"address"},{"name":"targetNoFork","type":"address"}],"name":"split","outputs":[{"name":"","type":"bool"}],"type":"function"}];
var replaySafeSplitV2 = eth.contract(replaySafeSplitV2ABI).at(replaySafeSplitV2Address);    

var transfer = replaySafeSplitV2.split(toAccountFork, toAccountNoFork, {from: fromAccount, value: amount});
console.log(transfer);



Methode 3 – Verwenden von Ethereum Wallet und SafeConditionalHFTransferVertrag

Beachten Sie, dass der ReplaySafeSplitV2Vertrag unten mehr Sicherheitsfunktionen enthält.

Stellen Sie sicher, dass Sie Ethereum Wallet 0.8.1 oder höher heruntergeladen haben.

Wenn Sie Ethereum Wallet 0.8.1 zum ersten Mal starten, wählen Sie „Ja“ auf die Frage „Möchten Sie die Kette aktivieren, in der mit dem Exploit verbundene Gelder in einen Vertrag zurückgeführt werden, wo sie von The DAO-Token-Inhabern abgehoben werden können?“ . Sie haben nun die Wahl getroffen, die Hard-Fork-Kette von Ethereum zu verwenden.

Wählen Sie in Ethereum Wallet die Seite CONTRACTS im oberen Menü. Klicken Sie auf VERTRAG ANSEHEN.

  • Geben Sie einen VERTRAGSNAMEN von einSafeConditionalHFTransfer
  • Geben Sie eine VERTRAGSADRESSE von ein0x1e143b2588705dfea63a17f2032ca123df995ce0
  • Geben Sie in JSON INTERFACE den folgenden Text ein[{"constant":false,"inputs":[{"name":"to","type":"address"}],"name":"transfer","outputs":[],"type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"}],"name":"classicTransfer","outputs":[],"type":"function"},{"inputs":[],"type":"constructor"}]
  • OK klicken. Ihr Uhrenvertrag sollte wie folgt aussehen:

Geben Sie hier die Bildbeschreibung ein


Nur auf die Hard-Fork-Kette zu übertragen

Dadurch wird Ihre ETH auf das Zielkonto in der Hard-Fork-Kette übertragen und kostet Sie nur Benzin in der nicht-Hard-Fork-Classic-Kette.

Wählen Sie die Seite VERTRÄGE im oberen Menü. Klicken Sie auf SICHERE BEDINGTE HF-ÜBERTRAGUNG. Wählen Sie auf der rechten Seite unter VERTRAG SCHREIBEN die Funktion aus Transfer . Geben Sie Ihre Zieladresse auf der Hard-Fork-Kette in das Feld An - Adresse ein. Wählen Sie unter Ausführen von Ihr Konto aus. Geben Sie die Nummer der ETH unter dem Feld Send ETHER ein. Klicken Sie auf die Schaltfläche AUSFÜHREN, geben Sie Ihr Passwort ein und bestätigen Sie. Hier ist ein Bildschirmfoto:

Geben Sie hier die Bildbeschreibung ein


Nur auf die nicht hart gegabelte klassische Kette zu übertragen

Dadurch wird Ihre ETH auf das Zielkonto in der nicht-hard-fork-Classic-Kette übertragen und kostet Sie nur Benzin in der hart-fork-Kette.

Wählen Sie die Seite VERTRÄGE im oberen Menü. Klicken Sie auf SICHERE BEDINGTE HF-ÜBERTRAGUNG. Wählen Sie auf der rechten Seite unter VERTRAG SCHREIBEN die Funktion aus Classic Transfer . Geben Sie Ihre Zieladresse in der Nicht-Hard-Fork-Kette in das Feld An - Adresse ein. Wählen Sie unter Ausführen von Ihr Konto aus. Geben Sie die Nummer der ETH (ETC) unter dem Feld Send ETHER ein. Klicken Sie auf die Schaltfläche AUSFÜHREN, geben Sie Ihr Passwort ein und bestätigen Sie. Hier ist ein Bildschirmfoto:

Geben Sie hier die Bildbeschreibung ein



Methode 4 – Verwenden von Ethereum Wallet und dem ReplaySafeSplitV2Vertrag

UPDATE 22:27 Sep 4 2016 Dies ist eine neue sicherere Version, ReplaySafeSplitwie von @chevdor auf thedao.slack.com/messages/general in Safer version of the ReplaySafeSplit Smart Contract besprochen . Diese neue Version überprüft, ob die von Ihnen angegebenen Adressen nicht 0x0000...0000 sind, bevor Sie Ihre Ether an die Adressen senden. Dieser Abschnitt wurde mit den neuen Vertragsdetails aktualisiert.

Stellen Sie sicher, dass Sie Ethereum Wallet 0.8.1 oder höher heruntergeladen haben.

Wenn Sie Ethereum Wallet 0.8.1 zum ersten Mal starten, wählen Sie „Ja“ auf die Frage „Möchten Sie die Kette aktivieren, in der mit dem Exploit verbundene Gelder in einen Vertrag zurückgeführt werden, wo sie von The DAO-Token-Inhabern abgehoben werden können?“ . Sie haben nun die Wahl getroffen, die Hard-Fork-Kette von Ethereum zu verwenden.

Wählen Sie in Ethereum Wallet die Seite CONTRACTS im oberen Menü. Klicken Sie auf VERTRAG ANSEHEN.

  • Geben Sie einen VERTRAGSNAMEN von einReplaySafeSplitV2
  • Geben Sie eine VERTRAGSADRESSE von ein0x8201... (diese alte Adresse befand sich nur in der ETH-Kette. Wenn Sie diesen Vertrag verwendet haben, löschen Sie bitte Ihren Überwachungsvertrag und erstellen Sie den Überwachungsvertrag mit der neuen Adresse unten neu. )
  • Geben Sie eine VERTRAGSADRESSE von ein0xaBbb6bEbFA05aA13e908EaA492Bd7a8343760477
  • Geben Sie in JSON INTERFACE den folgenden Text ein[{"constant":false,"inputs":[{"name":"targetFork","type":"address"},{"name":"targetNoFork","type":"address"}],"name":"split","outputs":[{"name":"","type":"bool"}],"type":"function"}]
  • OK klicken. Ihr Uhrenvertrag sollte wie folgt aussehen:

Geben Sie hier die Bildbeschreibung ein


Übermitteln

Dadurch wird Ihre ETH auf zwei Konten übertragen, wobei das erste das Zielkonto in der Hard-Fork-Kette und das zweite das Zielkonto in der nicht-Hard-Fork-Classic-Kette ist.

Wählen Sie die Seite VERTRÄGE im oberen Menü. Klicken Sie auf REPLAYSAFESPLITV2. Wählen Sie auf der rechten Seite unter VERTRAG SCHREIBEN die Funktion aus Split . Geben Sie Ihre Zieladresse auf der Hard-Fork- Kette in das Feld Target Fork – Adresse ein. Geben Sie Ihre Zieladresse auf der Non-Hard-Fork Classic- Kette in das Feld Target no Fork – Adresse ein. Wählen Sie unter Ausführen von Ihr Konto aus. Geben Sie die Anzahl der Ether unter dem Feld Send ETHER ein. Klicken Sie auf die Schaltfläche AUSFÜHREN, geben Sie Ihr Passwort ein und bestätigen Sie.

Hier ist ein Bildschirmfoto:

Geben Sie hier die Bildbeschreibung ein



SafeConditionalHFTransferVertrag

Beachten Sie, dass der ReplaySafeSplitV2Vertrag unten mehr Sicherheitsfunktionen enthält.

Es folgt der Quellcode für den SafeConditionalHFTransfer-Vertrag (empfohlen bis @shoraibit26.07.2016). Dieser Kontrakt ist nicht davon abhängig, dass der WithdrawDAO-Kontrakt in der Zukunft einen Saldo von über 1.000.000 Ether hat.

contract ClassicCheck {
    function isClassic() constant returns (bool isClassic);
}

contract SafeConditionalHFTransfer {        
    bool classic;

    function SafeConditionalHFTransfer() {
        classic = ClassicCheck(0x882fb4240f9a11e197923d0507de9a983ed69239).isClassic();
    }

    function classicTransfer(address to) {
        if (!classic) 
            msg.sender.send(msg.value);
        else
            to.send(msg.value);
    }

    function transfer(address to) {
        if (classic)
            msg.sender.send(msg.value);
        else
            to.send(msg.value);
    }            
}

Dieser Vertrag ist abhängig vom ClassicCheck Vertrag :

contract ClassicCheck {   
    bool public classic;

    function ClassicCheck() {
        if (address(0xbf4ed7b27f1d666546e30d74d50d173d20bca754).balance > 1000000 ether)
            classic = false;
        else
            classic = true;
    }   

    function isClassic() constant returns (bool isClassic) {
        return classic;
    }
}

Als der SafeConditionalHFTransferVertrag bereitgestellt wurde, wurde der ClassicCheckVertrag verwendet, um zu bestimmen, ob der Code in der Hard-Fork- oder Nicht-Hard-Fork-Kette bereitgestellt wurde. Und diese Überprüfung wurde durchgeführt, als das WithdrawDAO einen Saldo von über 1.000.000 hatte. SafeConditionalHFTransfer sollte immer funktionieren, da es nicht mehr den Saldo des WithdrawDAO-Guthabens überprüfen muss.



ReplaySafeSplitV2Vertrag

UPDATE 22:27 Sep 4 2016 Dies ist eine neue sicherere Version, ReplaySafeSplitwie von @chevdor auf thedao.slack.com/messages/general in Safer version of the ReplaySafeSplit Smart Contract besprochen . Diese neue Version überprüft, ob die von Ihnen angegebenen Adressen nicht vorhanden sind, 0x0000...0000bevor Sie Ihre Ether an die Adressen senden.

Es folgt der Quellcode für den ReplaySafeSplitV2-Vertrag :

contract RequiringFunds {
   modifier NeedEth () {
       if (msg.value <= 0 ) throw;
       _
   }
}

contract AmIOnTheFork {
   function forked() constant returns(bool);
}

contract ReplaySafeSplit is RequiringFunds {
   // address private constant oracleAddress = 0x8128B12cABc6043d94BD3C4d9B9455077Eb18807;    // testnet
   address private constant oracleAddress = 0x2bd2326c993dfaef84f696526064ff22eba5b362;   // mainnet

   // Fork oracle to use
   AmIOnTheFork amIOnTheFork = AmIOnTheFork(oracleAddress);

   // Splits the funds into 2 addresses
   function split(address targetFork, address targetNoFork) NeedEth returns(bool) {
       // The 2 checks are to ensure that users provide BOTH addresses
       // and prevent funds to be sent to 0x0 on one fork or the other.
       if (targetFork == 0) throw;
       if (targetNoFork == 0) throw;

       if (amIOnTheFork.forked()                   // if we are on the fork
           && targetFork.send(msg.value)) {        // send the ETH to the targetFork address
           return true;
       } else if (!amIOnTheFork.forked()           // if we are NOT on the fork
           && targetNoFork.send(msg.value)) {      // send the ETH to the targetNoFork address
           return true;
       }

       throw;                                      // don't accept value transfer, otherwise it would be trapped.
   }

   // Reject value transfers.
   function() {
       throw;
   }
}

Es folgt der VM-Code aus der nicht-hard-forked Classic-Blockchain, der mit dem verifizierten VM-Code + Quellcode auf der hard-fork-Kette übereinstimmt.

user@PussyWillow:~$ geth -exec 'eth.getCode("0xaBbb6bEbFA05aA13e908EaA492Bd7a8343760477")' attach
"0x6060604052361561001f5760e060020a60003504630f2c93298114610028575b6100005b610002565b6100406004356024356000348190116100e157610002565b60408051918252519081900360200190f35b80547f16c72721000000000000000000000000000000000000000000000000000000006060908152600160a060020a0391909116906316c727219060649060209060048187876161da5a03f11561000257505060405151905080156100d25750604051600160a060020a038416908290349082818181858883f193505050505b1561010f575060015b92915050565b82600160a060020a0316600014156100f857610002565b81600160a060020a03166000141561005257610002565b600060009054906101000a9004600160a060020a0316600160a060020a03166316c727216040518160e060020a0281526004018090506020604051808303816000876161da5a03f11561000257505060405151159050801561018c5750604051600160a060020a038316908290349082818181858883f193505050505b15610023575060016100db56"

Dieser Vertrag hängt vom AmIOnTheFork-Vertrag ab :

contract AmIOnTheFork {
    bool public forked = false;
    address constant darkDAO = 0x304a554a310c7e546dfe434669c62820b7d83490;
    // Check the fork condition during creation of the contract.
    // This function should be called between block 1920000 and 1921200.
    // Approximately between 2016-07-20 12:00:00 UTC and 2016-07-20 17:00:00 UTC.
    // After that the status will be locked in.
    function update() {
        if (block.number >= 1920000 && block.number <= 1921200) {
            forked = darkDAO.balance < 3600000 ether;
        }
    }
    function() {
        throw;
    }
}
Ich konnte ein zweites Windows-Konto erstellen und meine Kettendaten in einen anderen Ordner kopieren. Dann startete geth und zeigte auf den Classic-Ordner mit dem Flag --datadir sowie dem Flag --oppose-dao-fork. Ein Windows-Benutzerkonto befindet sich also auf Classic und das andere auf Main net. Ich konnte den obigen HFConditionalTransfer-Vertrag verwenden, um Ether (anfangs mit nur 1 begonnen) an ein neues Konto in der Classic-Kette zu senden. Ich habe das zunächst bei gastracker.io und etherscan.io überprüft, während ich darauf gewartet habe, dass meine Classic-Kette vollständig synchronisiert ist. Ich habe dann ETC auf Poloniex eingezahlt. So weit, ist es gut.
Ich habe es mit --oppose-dao-forkIt works!
Haben Sie versucht, über live.ether.camp nachzuverfolgen? Oder wenn Sie damit zufrieden sind, könnten Sie Ihren TX-Hash posten?
Mein Fehler, es sieht so aus, als hätte Etherscan den internen TX nicht erkannt, und ich habe nicht lange genug gewartet, bis der Kontostand aktualisiert wurde. Alles gut. Es klappt.
Könnte nicht jemand einen Vertrag auf 0xb671c3883307cf05bb3dff77a9754e87b4347195 auf dem Ethereum Classic-Fork erstellen und irgendwie 10 Millionen usw. zusammenlegen, damit die Prüfung erfolgreich ist und der Replay-Angriff wieder aktiviert wird?
@Fernando Ja, deshalb ist es ratsam, Ihren Ether auf beiden Ketten an unterschiedliche Adressen zu verschieben. Mit dieser Methode können Sie Replay-Angriffe für die nächsten Tage oder Wochen verhindern, damit Sie dies ohne Probleme tun können ... aber entsorgen Sie auf jeden Fall Ihre Pre-Hardfork-Adressen, wenn Sie Wert darauf legen, dass Replay-Angriffe möglich sind, wenn die DAO-Refund-Adresse unter a geht Millionen auf der Hauptkette.
In Ihrem Code für Methode 1 var classicTransfer = hfConditionalTransferist fehlerhaft, da er immer noch verwendet hfConditionalTransferund nicht die sichere Version.
Danke @ThomasKahle. Ich habe den Code jetzt aktualisiert. Könntest du das bitte überprüfen/testen?
Als ich den Vertrag getestet habe, hat es funktioniert (Senden usw. an Poloniex, jeweils 1, nur um zweimal zu testen), als ich den Gesamtbetrag ausprobiert habe und er nicht in Gastracker angezeigt wird. Da es nicht passiert ist, bekomme ich Bestätigungen in Mist.
Können Sie für Methode 3 bitte erklären, wie ReplaySafeSplitauf zwei Blockchains reagiert wird? Ich verstehe das Teil nicht. Ich hatte erwartet, dass Sie etwas zweimal ausführen müssten, jeweils einmal von einer Brieftasche, die auf eine der beiden Blockchains zeigt.
@mowliv, Transaktionen aus dem HF-Netzwerk werden derzeit auf das Nicht-HF-Netzwerk weitergeleitet und umgekehrt. Ich habe die Antwort oben aktualisiert.

Wenn Sie einen neuen Client wie Geth 1.5.3 verwenden, implementiert dieser EIP 155 Simple Replay Attack Protection , sodass Ihre ETH-Transaktionen vor einem Replay-Angriff auf ETC geschützt sein sollten.

Mit Geth 1.5.3 (oder höher) sollten Sie ein weiteres Konto erstellen und Ihre gesamte ETH an die neue Adresse verschieben. Vergessen Sie nicht, dieses neue Konto zu sichern (und löschen Sie nicht das alte Konto, da es Ihren ETC enthält).


Zusätzlicher Schritt für die Zwischenzeit, da Geth 1.5.3 sehr neu ist: Verschieben Sie nach dem oben Gesagten alle ETC in der ETC-Kette an eine andere Adresse. Dadurch wird sichergestellt, dass Sie tatsächlich vor Replay-Angriffen geschützt sind.