Code-Wiederverwendbarkeit vs.

In der Bitcoin Core-Software wurde kürzlich einer der schlimmsten, konsenskritischen Fehler (CVE-2018–17144) entdeckt, der vor diesem Zeitpunkt eine nahezu makellose Historie aufwies. Jimmy Song hat eine hervorragende Aufschlüsselung dieses Fehlers geschrieben.

Die kurze Zusammenfassung des Fehlers ist, dass es 4 Fälle gibt, in denen die Bitcoin Core-Software nach doppelten Ausgaben suchen muss. Alle 4 Fälle teilten ursprünglich den gleichen Ablauf der Codeausführung. Nach einigen subtilen Iterationen des Codes über mehrere Jahre hinweg wurde einer der vier Fälle ("Single-tx-Double-spend-in-a-Block") übersprungen, wodurch ein Miner möglicherweise einige Knoten zur Annahme eines Blocks verleiten konnte Das erhöht das Bitcoin-Angebot.

Die Art dieses Fehlers erinnert mich an den ständigen Konflikt zwischen:

(a) die Notwendigkeit der Wiederverwendbarkeit und Optimierung von Code

(b) die Gefahr, auf etwas zu stürzen, was ich als zufällige Gewohnheit bezeichne: Dinge, die nicht beabsichtigt, sondern zufällig ähnlich sind

Zufällige Häufigkeiten schaffen einen fruchtbaren Boden für die Überarbeitung von Alpträumen und potenziellen Fehlern wie CVE-2018–17144.

Zufällige Gemeinheit

Einige Hintergrundinformationen, wenn Sie nicht mit Software-Engineering vertraut sind:
 
In der Software gibt es diese großartige Vision, dass Softwarekomponenten perfekt modular sind - ähnlich wie in der Physik. Es gibt einen guten Grund, warum Sie kein anderes Ladegerät oder USB-Kabel überall dabei haben müssen.

Die Wiederverwendbarkeit von Code war schon immer ein großes Anliegen. Das Schreiben von redundantem Code wird oft missbilligt. Warum die gleiche Arbeit zweimal machen, wenn Sie sie einmal machen können?

Es gibt auch eine lange Geschichte der Neuerfindung von Software, die der Wiederverwendbarkeit von Code eine noch höhere Priorität in der Prioritätenliste verleiht. Die Wiederverwendbarkeit von Code wird häufig als eine der „Best Practices“ der Branche angesehen. Ein aufstrebender Nachwuchs-Softwareentwickler ist möglicherweise der Ansicht, dass die Wiederverwendbarkeit von Code keinen Nachteil hat.

Aber es gibt eine versteckte Gefahr - und ich glaube nicht, dass dieses Zeug jemals in Schulen richtig gelehrt wird - der extremen Wiederverwendbarkeit von Code.

Extreme Wiederverwendbarkeit von Code bedeutet, dass zwei gleich aussehende Codeteile unabhängig von ihren Anwendungsfällen und ihrer ursprünglichen Absicht zu einem einzigen zusammengefasst werden.

Was oft dazu führt, dass Code ungewollt häufig vorkommt.

Es mag nicht offensichtlich sein, warum zufällige Häufigkeiten schlecht sind, aber man muss nur über einen langen Zeitraum ein ausreichend großes Softwareprojekt unterhalten, um zu verstehen, warum.

Es ist schlecht, weil sich die Produktanforderungen ändern und Software ein sich ständig weiterentwickelndes, nie ganz fertiges Produkt ist.

Dieses Problem mit sich ständig bewegenden Zielen ist einzigartig für Software. Wenn Sie ein Bauingenieur sind, wird von Ihnen nicht erwartet, dass Sie aus einem Haus ein 20-stöckiges Hochhaus oder aus einem Auto eine fliegende Untertasse machen. In der Software tun wir dies jedoch ständig.

Wenn sich Produktanforderungen und Anwendungsfälle ändern, sind die zugrunde liegenden Annahmen, für die die Software ursprünglich geschrieben wurde, möglicherweise nicht mehr anwendbar.

Das stolze Stück gemeinsamen Codes, das Sie überarbeitet haben (aber jetzt völlig vergessen haben), funktioniert also nicht mehr so, wie Sie es sich vorstellen.

Ich weiß nicht mehr, wie viele schmerzhafte Refactoring-Projekte oder böse Bugs ich gesehen habe, die eine direkte Folge vorzeitiger Optimierung oder versehentlicher Häufigkeiten sind - bis zu dem Punkt, an dem ich jetzt Dinge wie Vererbung wie eine Seuche vermeide.

Dinge, die zufällige Gemeinsamkeiten aufweisen, werden ihre Unterschiede schnell offenbaren, wenn sie sich über ihren ursprünglichen Zustand hinaus entwickeln. Jede Starrheit in der Codeüblichkeit wäre dann ein gewaltiger Fluch, den man loswerden müsste.

Je mehr Ebenen zufälliger Gemeinsamkeiten sich im Code befinden, desto mehr ist das Navigieren ein Minenfeld. CVE-2018–17144 ist ein perfektes Beispiel dafür.