Ein Fehler im Solidity -Optimierer wurde über die gemeldet Foundy Program der Ethereum Foundationvon Christoph Jentzsch. Dieser Fehler ist ab 2017-05-03 mit der Veröffentlichung von Solidity 0.4.11 gepatcht.
Hintergrund
Der fragliche Fehler befasste sich mit der Optimierung des Optimierers für Konstanten im Byte -Code. Mit “Byte -Code -Konstanten” meinen wir alles, was ist DRÜCKENauf dem Stapel (nicht mit Soliditätskonstanten verwechselt). Zum Beispiel, wenn der Wert 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEHMEN Ist DRÜCKENEd, dann kann der Optimierer entweder tun Pusoder entscheide dich, dies als zu codieren als Push1 1; NICHT;.
Ein Fehler im Optimierer führte zu Optimierungen von Byte -Code -Konstanten fehl in bestimmte Fälle, indem eine Routine erzeugt wurde, die die ursprüngliche Konstante nicht ordnungsgemäß nachgebildet hat.
Das im gemeldete Fehler beschriebene Verhalten wurde in einem Vertrag gefunden, bei dem eine Methode eingestellt wurde, wenn eine andere – völlig unabhängige – Methode dem Vertrag hinzugefügt wurde. Nach der Analyse wurde festgestellt, dass eine Reihe von Bedingungen gleichzeitig vorhanden sein muss, damit der Fehler ausgelöst wird. Jede Kombination von Bedingungen, die den Fehler auslösen würden, hätte konsequent die folgenden zwei Bedingungen:
- Die Konstante muss mit beginnen mit 0xff … und enden mit einer langen Reihe von Nullen (oder umgekehrt).
- Die gleiche Konstante muss an mehreren Stellen verwendet werden, damit der Optimierer diese bestimmte Konstante optimiert. Alternativ muss es im Konstruktor verwendet werden, der eher für die Größe als für Gas optimiert.
Zusätzlich zu den beiden oben genannten Bedingungen sind weitere, kompliziertere Bedingungen erforderlich.
Analyse
Dieser Fehler ist in allen veröffentlichten Versionen von Solidität von mindestens bis zum Sommer 2015 vorhanden. Obwohl der Fehler seit 2015 vorhanden ist, erscheint es sehr schwierig, durch den „zufälligen“ Code auszulösen:
Wir führten eine statische Analyse aller auf der Blockchain bereitgestellten Vertragscode durch und fanden kein Auftreten einer solchen unglaublich erzeugten Routine. Beachten Sie, dass die Tatsache, dass wir keinen Fehler in allen Vertragscode gefunden haben, nicht das Fehlen solcher Vorkommen garantiert.
Verbesserungen
Um eine bessere Transparenz und ein höheres Bewusstsein für Fehler in der Solidität zu bieten, haben wir damit begonnen, Informationen über Soliditätsbezogene Schwachstellen als JSON-Files im Soliditätscode-Repository zu exportieren (Repository (1Anwesend2). Wir hoffen, dass Blockforscher diese Informationen zusammen mit anderen vertragsbezogenen Informationen integrieren.
Ethercan hat dies bereits implementiert, was gesehen werden kann Hier Und Hier.
In Bezug auf den Fehler selbst haben wir dem Optimierer einen Mini-EVM hinzugefügt, der die Richtigkeit jeder erzeugten Routine zur Kompilierungszeit überprüft.
Darüber hinaus hat die Arbeiten bereits mit einer voll spezifizierten und stärkeren mittleren Sprache begonnen. Zukünftige Optimierer -Routinen in dieser Sprache werden viel einfacher zu verstehen und zu prüfen und ersetzen den aktuellen Optimierer.

