Статический анализ для проверки солидности интеллектуальных контрактов, основанных на https://github.com/shaunazzopardi/solity-cfg-builder и https://github.com/gordonpace/contractlarva.
Этот инструмент пытается полностью доказать свойства солидности интеллектуальных контрактов, а при частичном успехе возвращает остаточное свойство, которое еще предстоит доказано в смарт -контракте Solidity.
Мы используем представление графа управления смарт-контрактом Solidity Smart Contract в попытке доказать свойства интеллектуальных контрактов, статически, путем чрезмерного оценочного потока управляющего потока интеллектуального контракта (на основе Solidity-CFG-строителя и его переменного состояния.
Это частично основано на работе, представленной в «Спустях Prepost 2017», в серии EPCTS и доступно на ARXIV.
Каждая функция смарт-контракта представлена в виде автомата управления потоком (CFA) с переходами, помеченными тройным содержанием: (i) условием в состоянии переменной программы; (ii) утверждение, которое преобразует состояние переменной программы; и (iii) событие свойства, активированное при выполнении оператора.
Каждый такой автомат дополняется абстрактными переходами (помеченными только событием свойства), что позволяет происходить любое событие, когда в начальном, вызовом или конечном состоянии программы. Это используется в качестве основы внутрипроцедурного анализа. Каждый такой автомат переопределяет все выполнения смарт-контракта, которые вызывают соответствующую функцию. Этот автомат называется абстрактным автоматом управляющего потока (ACFA).
Простой алгоритм распространения утверждений распространяет утверждения о состоянии переменной программы (подразумеваемое условиями и утверждениями) через явные состояния CFA до тех пор, пока не будут встречаться утверждения, которые могут повлиять на утверждение. Это звук.
Свойство представлено в виде динамического автомата событий (DEA), в котором используются переходы, помеченные тройной: (i) событием; (ii) охранник в состоянии имущества переменной; и (iii) действие на состояние имущества переменной.
ACFA с переменной абстракцией состоит из DEA, создавая абстрактную контролируемую систему (AMS) с переходами, помеченными парами переходов CFA и DEA, или с одной из позиций, содержащих символ #. Когда # используется вместо перехода CFA, он сигнализирует о совпадении абстрактного перехода, в то время как, когда вместо перехода DEA он не сигнализирует об совпадении перехода DEA.
Затем AMS создается для каждой функции программы против данной DEA.
Решатель SMT, Z3, вызывается на лету во время строительства AMS, чтобы определить, возможно ли для данного перехода активируется в тот момент в реальном заезде. Учитывая переходную пару CFA-DEA, мы проверяем, что охранник DEA может удерживать истину от абстракции переменной исходного состояния, обновленного с условием и утверждением перехода CFA. В то время как данная пара CFA-#, мы проверяем, что переменная абстракция исходного состояния, обновленная с условием и утверждением перехода CFA, не является несоответствующей с отрицанием разъединения охранников DEA переходов, которые, возможно, активируются в этот момент (обратите внимание на переходы DEA, исходящие из того же состояния DEA, которые, как утверждаются, являются мутативно исключительными связями).
Каждый AMS анализируется для идентификации паров переходов CFA-DEA, извлечения переходов DEA, используемых таким образом, игнорируя совпадения переходов DEA с # Placeholder. Союз этих переходов DEA производит остаток оригинального DEA. Иногда это может быть дополнительно уменьшено за счет синтатического анализа остаточного DEA.
Более того, из AMS мы можем определить, когда охрана перехода DEA может быть удалена (т.е. изменилась на True ), то есть, когда он может использоваться в AMS, он всегда используется.
Если остаточная производительность не имеет переходов, то собственность была доказана.
Требования: Cabal v2.4.* (Например, установите полную платформу Haskell)
Компиляция: Следуйте инструкциям здесь
Для правильных результатов всегда убедитесь, что код солидности компилируется с компилятором прочности.
Для использования инструмента пройти местоположение файла Smart Contract Polidity, файла свойств DEA и предпочтительного местоположения вывода в исполняемый файл, например, выполнить:
./Main "./examples/corierservice.sol" "./examples/corierservicespec.dea" "cfa.txt" "acfa.txt" "ams.txt"
Этот проект лицензирован в соответствии с условиями лицензии Apache 2.0.