Solide, aber falsche Änderung im Merkle-Baum

Aus dem Whitepaper ist der erste Schritt zur Überprüfung der Blockvalidität:

Überprüfen Sie, ob der vorherige Block, auf den der Block verweist, existiert und gültig ist.

In Bezug auf einen Merkle-Baum, der bei einer Änderung in einer der enthaltenen Noten eine Änderung nach oben propagiert:

Der Grund, warum dies funktioniert, ist, dass sich Hashes nach oben ausbreiten: Wenn ein böswilliger Benutzer versucht, eine gefälschte Transaktion in das Ende eines Merkle-Baums einzutauschen, führt diese Änderung zu einer Änderung des darüber liegenden Knotens und dann zu einer Änderung des darüber liegenden Knotens , wodurch schließlich die Wurzel des Baums und damit der Hash des Blocks geändert wird, was dazu führt, dass das Protokoll ihn als einen völlig anderen Block registriert (mit ziemlicher Sicherheit mit einem ungültigen Arbeitsnachweis).

Wäre es nicht möglich, den Merkle-Baum so zu ändern, dass sich der aktuelle Block, der verifiziert wird, nicht ändert und daher gültig ist .

Nein, denn wie Sie zitiert haben, wird sich eine kleine Änderung im Baum durch den gesamten Baum ausbreiten und dazu führen, dass er völlig anders ist. Ich fand diesen Artikel von Vitalik äußerst hilfreich zum Verständnis.

Antworten (1)

Nehmen wir als Beispiel einen sehr einfachen Merkle-Baum mit vier identischen Blättern, L.

So sieht unser Baum aus:

                  hash(A, A)
                 /          \
       A = hash(L,L)        A = hash(L,L)
         /      \             /      \
        L        L           L        L

Wenn wir nun das letzte Blatt von Lin ändern M, erhalten wir:

                  hash(A, B)
                 /          \
       A = hash(L,L)        B = hash(L,M)
         /      \             /      \
        L        L           L        M

Beachten Sie, wie sich nur eine einzige Änderung durch ihre Vorfahren ausbreitet, bis sie die Wurzel erreicht. Da die Merkle-Wurzel Teil des Block-Headers ist und durch den PoW-Algorithmus geschützt ist, ist es nicht möglich, irgendein Element (auch nicht die mittleren Knoten) in einem Merkle-Baum zu manipulieren, ohne den Block ungültig zu machen.

Es gibt also absolut keine Änderung, die an einem vorhandenen Merkle-Baum vorgenommen werden könnte, der B = A ergeben würde. Ich denke, das Wort, nach dem ich hier suche, ist so etwas wie eine Kollision für den Hash.
Sie würden eine Hash-Kollision benötigen, die derzeit für keccak256 oder sha256d nicht als praktikabel angesehen wird