Statische Analyse zur Überprüfung von Smart Contracts für Solidität, basierend auf https://github.com/shaunazzopardi/solididcfg-builder und https://github.com/gordonpace/contractlarva.
Dieses Tool versucht, Eigenschaften von Solidity Smart Contracts vollständig nachzuweisen, und gibt zu einem teilweisen Erfolg ein Resteigentum zurück, das nach wie vor nachgewiesen wird.
Wir verwenden eine Control-Flow-Diagrammdarstellung eines Smart-Vertrags für Solidität, um die Eigenschaften von Smart Contracts statisch nachzuweisen, indem wir den Kontrollfluss eines Smart-Vertrags von Solidaity (basierend auf Solidity-CFG-Builder und seinem variablen Zustand übertreffen.
Dies basiert teilweise auf Arbeiten im Proceedings of Prepost 2017 in der EPCTS -Serie und erhältlich auf Arxiv.
Jede Smart Contract-Funktion wird als Control-Flow-Automat (CFA) mit Übergängen dargestellt, die mit einem Triple enthält: (i) eine Bedingung im Programmvariablenzustand; (ii) eine Aussage, die den Programm Variabler Zustand verändert; und (iii) ein Eigentumsereignis, das nach der Ausführung der Erklärung aktiviert wird.
Jeder solcher Automaten wird durch abstrakte Übergänge (nur von einem Immobilienereignis markiert) erweitert, das es zulässt, dass ein Ereignis während eines anfänglichen, Anruf- oder Endzustands des Programms stattfindet. Dies wird als Grundlage für die intraprocedurale Analyse verwendet. Jeder solcher Automaten überprüft alle Ausführungen des intelligenten Vertrags, die die entsprechende Funktion aufrufen. Dieser Automat wird als abstrakter Steuerflusautomaton (ACFA) bezeichnet.
Ein einfacher Algorithmus zur Ausbreitung der Behauptung verbreitet Behauptungen über den Programmvariablenzustand (impliziert durch Bedingungen und Aussagen) durch die explizite Zustände eines CFA, bis Aussagen, die die Behauptung beeinflussen können, auftreten. Das ist Ton.
Eine Eigenschaft wird als dynamisches Ereignisautomaton (DEA) dargestellt, das Übergänge mit einem dreifachen: (i) Ereignis verwendet; (ii) eine Wache auf dem Grundstaat der Eigentumsvariablen; und (iii) eine Aktion auf den Grundzustand des Eigenschaftsvariablen.
Eine ACFA mit einer variablen Abstraktion besteht aus DEA, wodurch ein abstraktes überwachtes System (AMS) erzeugt wird und Übergänge markiert mit CFA- und DEA -Übergängen oder mit einer der Positionen, die das # -Symbol enthalten. Wenn # anstelle eines CFA -Übergangs verwendet wird, signalisiert es die Übereinstimmung eines abstrakten Übergangs, während anstelle eines DEA -Übergangs keine DEA -Übergangsübereinstimmung signalisiert.
Anschließend wird ein AMS für jede Funktion des Programms gegen die angegebene DEA erstellt.
Ein SMT-Löser, Z3, wird während des Aufbaus des AMS auf dem Fliege genannt, um festzustellen, ob es möglich ist, dass der gegebene Übergang zu diesem Zeitpunkt in einem realen Lauf aktiviert wird. Bei einem CFA-Dea-Übergangspaar überprüfen wir, ob der DEA-Wachmann die variable Abstraktion des Quellzustands, der mit der Bedingung und Erklärung des CFA-Übergangs aktualisiert wurde, wahr sein kann. Während wir ein CFA-#-Paar angegeben haben, überprüfen wir, dass die mit der Bedingung und Aussage des CFA-Übergangs aktualisierte variable Abstraktion des Quellzustands nicht mit der Verneinung der Disjunktion der Wachen des DEA-Übergangs nicht im Widerspruch steht (beachten Sie, dass die DEA-Übergänge, die aus demselben DEA-Staat kontaktiert werden, die sich gegenseitig ausschließen können, um Guards ausgeschlossen zu haben).
Jeder AMS wird analysiert, um CFA-DEA-Übergangspaare zu identifizieren, wodurch die auf diese Weise verwendeten DEA-Übergänge extrahiert werden und die Übergänge von DEA-Übergängen mit dem Platzhalter # ignoriert werden. Die Vereinigung dieser DEA -Übergänge erzeugt einen Rest der ursprünglichen DEA. Dies kann manchmal durch syntatische Analyse der Rest -DEA weiter reduziert werden.
Darüber hinaus können wir aus dem AMSS identifizieren, wenn die Wache eines DEA -Übergangs entfernt werden kann (dh in true geändert), dh wenn sie in den AMS verwendet werden kann, wird er immer verwendet.
Wenn der produzierte Rest keine Übergänge hat, wurde das Eigentum bewiesen.
Anforderungen: Cabal v2.4.* (Z. B. installieren Sie die vollständige Haskell -Plattform)
Zusammenstellung: Befolgen Sie hier die Anweisungen
Für korrekte Ergebnisse stellen Sie immer sicher, dass der Soliditätscode mit einem Solidity Compiler kompiliert.
Um den Tool zu verwenden, übergeben Sie den Speicherort der Smart Contract Solidity -Datei, der DEA -Eigenschaftsdatei und den bevorzugten Speicherort der Ausgabe an die ausführbare Datei, z. B. ausführende Ausführung:
./Main "./examples/courierservice.sol".
Dieses Projekt ist unter den Bestimmungen der Apache 2.0 -Lizenz lizenziert.