Курсовая работа на тему: "Комплексная поддержка синтаксиса языка Vyper в IntelliJ Platform"
У нас на сайте представлено огромное количество информации, которая сможет помочь Вам в написании необходимой учебной работы.
Но если вдруг:
Вам нужна качественная учебная работа (контрольная, реферат, курсовая, дипломная, отчет по практике, перевод, эссе, РГР, ВКР, диссертация, шпоры...) с проверкой на плагиат (с высоким % оригинальности) выполненная в самые короткие сроки, с гарантией и бесплатными доработками до самой сдачи/защиты - ОБРАЩАЙТЕСЬ!
Курсовая работа на тему: "Комплексная поддержка синтаксиса языка Vyper в IntelliJ Platform"
2.2. Блокчейн-платформы . . . . . . . . . . . . . . . . . . . . . 6
2.3. Vyper . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.4. Обзор существующих решений . . . . . . . . . . . . . . . 8
3.1. IntelliJ Platform . . . . . . . . . . . . . . . . . . . . . . . . 10
3.2. Используемые технологии . . . . . . . . . . . . . . . . . . 10
3.2.1. Язык . . . . . . . . . . . . . . . . . . . . . . . . . . 10
3.2.2. Парсер-генератор . . . . . . . . . . . . . . . . . . . 11
3.3. Архитектура и элементы системы . . . . . . . . . . . . . . 12
3.3.1. Грамматика и синтаксический анализатор . . . . 12
3.3.2. Подсветка синтаксиса и ошибки . . . . . . . . . . . 13
3.3.3. Навигация . . . . . . . . . . . . . . . . . . . . . . . 14
3.3.4. Автодополнение . . . . . . . . . . . . . . . . . . . . 14
Заключение 15
Введение
Технология блокчейн (blockchain) постепенно находит применение во многих областях, особенно в сфере финансовых технологий. В об- щем случае, блокчейн — децентрализованная распределенная система для хранения и проведения транзакций в одноранговой сети. И хо- тя изначально блокчейн-платформы были нацелены исключительно на криптовалюты, многие из них теперь обладают поддержкой смарт- контрактов (smart contract). Смарт-контракты являются программи- руемыми объектами, хранящимися в блокчейне, и предоставляют набор функций для взаимодействия с ними извне. Такая поддержка позво- ляет разрабатывать произвольные приложения, часть логики которых реализуется непосредственно внутри блокчейн-платформы, что значи- тельно расширяет область применения технологии [6].
Смарт-контракты разрабатываются с использованием специальных языков программирования и в силу специфики технологии, зачастую, управляют активами пользователей. Так как это программы, то в них возможны ошибки и потенциальные уязвимости, что приводит к поте- рям и хищениям активов [9]. На возникновение таких проблем влияют разные факторы: недостатки языка, расхождения между семантикой языка и интуицией программиста, особенности блокчейна как техноло- гии, архитектура среды исполнения смарт-контрактов. В связи с этим проводится большое число исследований, результатом которых явля- ется разработка языков программирования, удовлетворяющих опреде- ленным свойствам [10].
Для успешного использования язык должен обладать определенной инфраструктурой: средой разработки, инструментами для тестирова- ния и развертывания, различнымибиблиотеками. Одним из последних разработанных языков является Vyper [8] — язык для написания смарт- контрактов для популярной блокчейн-плат-
формы Ethereum. Vyper разрабатывается с целью улучшить безопас- ность смарт-контрактов, облегчить процесс их разработки, а также упростить аудит. Учитывая то, что языкэксперементальный и нахо-
дится в ранней версии, его поддержка осуществлена в малом количе- стве редакторов и является довольно примитивной. Принимая во вни- мание интерес сообщества к Ethereum и идеи, заложенные в основу языка, ожидается, что он станет стандартом для разработки смарт- контрактов. Таким образом, актуальной становится задача поддержки Vyper в одной из популярных интегрированных сред разработки (IDE), для обеспечения его необходимой инфраструктурой для ускорения и облегчения процесса разработки смарт-контрактов.
1. Постановка задачи
Целью данной работы является реализация комплексной поддержки синтаксиса для плагина языка Vyper в IntelliJ Platform. Так как язык находится в разработке, решение должно быть легко расширяемым и изменяемым. Для достижения цели были поставлены следующие зада- чи.
1. Исследовать предметную область:
• изучить блокчейн-платформу Ethereum;
• изучить язык Vyper и сделать обзор существующих инстру- ментов для разработки.
2. Изучить IntelliJ Platform OpenAPI и множество инструментов для разработки плагина.
3. Реализовать комплексную поддержку синтаксиса в плагине:
• реализовать спецификацию грамматики языка Vyper;
• реализовать синтаксичесий анализатор;
• реализовать подсветку синтаксиса;
• реализовать навигацию по коду;
• реализовать автодополнение;
• реализовать проецирование сообщений от других модулей пла- гина в окно редактора.
2. Обзор
В этой главе рассматриваются существующие блокчейн-платформы с поддержкой смарт-контрактов и соответствующие языки программи- рования. Также приводится обоснование выбора платформы Ethereum, языка Vyper и описание их характеристик. В конце главы представлен обзор существующих решений, осуществляющих поддержку синтакси- са языка Vyper.
2.1. Смарт-контракты
Смарт-контракт — программа, хранящаяся в блокчейне и пред- назначенная для расширения возможностей транзакций в сети. Зача- стую реализуется как набор функций, каждая из которых может слу- жить точкой входа в смарт-контракт. Такие функции вызываются по- средством транзакций и могут принимать как входные параметры, так и какое-то количество токенов1, а также имеют доступ к состоянию блокчейна или смарт-контракта и могут вызывать функции в других смарт-контрактах, не создавая транзакций, т.е. атомарно.2
2.2. Блокчейн-платформы
Реализация смарт-контрактов для расширения возможностей тран- закций в сети блокчейн была предложена вместе с Ethereum [2] — плат- формой для разработки распределенных децентрализованных прило- жений, которые используют блокчейн для хранения своего состояния. Ethereum является самой крупной блокчейн-платформой на сегодняш- ний день, поддерживающей смарт-контракты [1].
Помимо Ethereum существует множество других платформ, поддер- живающих в том или ином виде смарт-контракты: Corda [5], Tezos [4], Hyperledger Fabric [3] и др.. В основном они различаются в используе-
1Определенное количество криптовалюты, представляющей активы пользователей.
2Характеристики смарт-контрактов зависят от реализации в конкретной платформе, например, некоторые платформы не имеют состояния, однако принципы для всех систем общие.
мых алгоритмах консенсуса3, предоставляемых бизнес-ориентированных механизмах и используемых языках для смарт-контрактов.4 Ethereum обладает открытым исходным кодом, постоянно развивается, хорошо документирована, имеет много инструментов и большое сообщество, по- этому в работе в качестве платформы для смарт-контрактов выбор пал именно на Ethereum.
2.3. Vyper
Платформа Ethereum имеет виртуальную машину EVM [12] для ис- полнения смарт-контрактов. Все языки, на которых ведется разработ- ка смарт-контрактов для этой платформы, компилируются в байткод EVM, и контракты хранятся в блокчейне в скомпилированном виде. EVM имеет несколько реализаций со спецификацией ее формальной семантики и большое количество статических анализаторов, которые сообщают о потенциальных уязвимостях [7].
На данный момент основным языком для написания смарт-контракт-
ов в Ethereum является Solidity. С этим языком связано большинство атак и уязвимостей в смарт-контрактах5, которые вызваны плохой чи- таемостью, неинтуитивной семантикой и нецелостностью абстракций. Также Solidity является Тьюринг-полным, что несколько ограничивает процесс статического анализа.
С целью уменьшить число возможных уязвимостей в смарт-контракт-
ах в платформе Ethereum был разработан язык Vyper [11]. Это python- подобный язык, который компилируются в байткод EVM, что позволяет переиспользовать инструменты, оперирующие напрямую с байткодом, такие как статические анализаторы или инструменты развертывания. Дизайн языка нацелен на безопасность, понятность синтаксиса и це- лостность абстракций. Также язык не поддерживает рекурсию, про-
3Алгоритмы для достижения согласованного состояния в одноранговой децентрализованной сети. 4Некоторые языки имеют специфицированную формальную семантику 5https://www.wired.com/2016/06/50-million-hack-just-showed-dao-human/
извольные циклы, перегрузку функций и наследование и является не Тьюринг-полным, что упрощает статический анализ. Язык обладает строгой статической типизацией и имеет встроеннуюпроверку на пере- полнение для некоторых типов данных.
2.4. Обзор существующих решений
Синтаксическая поддержка языка Vyper существует в нескольких редакторах и некоторые из них также осуществляют поддержку раз- личных инструментов разработки. Все известныереализации основаны на грамматике языка Python, что влияет на качество подсветки и авто- дополнения6. По этой же причине синтаксические ошибки подсвечива- ются лишь послекомпиляции.
Это обусловлено тем, что язык находится в бета-версии и даже офи- циальная реализация компилятора не имеет формально специфициро- ванной грамматики.7
синтаксиса, основанную на грамматике языка Python и регулярных вы- ражениях.
Плагины для Vim8, Emacs9, Atom10 предоставляют подсветку
Плагин для VSCode11 обеспечивает подсветку синтаксиса, имеет
предопределенные шаблоны кода, интегрированный компилятор и ста- тический анализатор. Основан на грамматике Python, поэтому ошибки в коде программы показывает лишь послекомпиляции.
Онлайн IDE Remix12 поддерживает базовую подсветку синтак-
сиса и не обеспечивает навигацию по коду. Также основан на грамма- тике языка Python, поэтому указывает на ошибки в коде лишь после компиляции и недостаточно информативно. IDE быларазработана спе- циально для языка Solidity, а так как основа у языков одна, то Remix
6Например редактор может предложить вставить метод из Python, которого естественно нет в Vyper
7https://github.com/ethereum/vyper/issues/1363 8https://github.com/jacqueswww/vim-vyper 9https://github.com/ralexstokes/vyper-mode10https://github.com/wschwab/language-vyper 11https://github.com/wschwab/language-vyper 12https://remix.ethereum.org/
предоставляет большой набор инструментов для разработки: средства тестирования, развертывания и CLI (интерфейс командной строки) для работы с сетью Ethereum.
Таким образом, существующую поддержку языка можно значитель- но улучшить, если предъявить формальную грамматику для языка, так, чтобы синтаксическая поддержка была согласована с граммати- кой, а также обеспечить интеграцию с существующими инструментами для разработки.
3. Реализация
В этой главе описываются детали реализации, архитектура и ис- пользуемые технологии.
3.1. IntelliJ Platform
3.2. Используемые технологии
3.2.1. Язык
Разработку плагина для IntelliJ Platform можно вести только на
JVM языках. Основным языком разработки был выбран Kotlin, так
В этой секции приведена мотивация выбора того или иного инстру- мента разработки.
В качестве целевой платформы, для которой реализуется плагин, была выбрана IntelliJ Platform13, так как она обладает следующими свойствами.
• является основой для целого набора IDE, что позволяет исполь- зовать плагин в любой из них;
• предоставляет не только SDK, но и широкий набор инструментов в виде плагинов, позволяющих облегчить и ускорить разработку плагина;
• имеет открытый исходный код платформы и большое количество референсных реализаций других плагинов с открытым исходным кодом;
• архитектура платформы позволяет вести параллельную разработ- ку над многими компонентами системы, отдельные компоненты регистрируются в предоставляемом xml файле;
3.2.2. Парсер-генератор
как он позволяет писать более компактный код по сравнению с Java, более безопасен, в нем больше возможности написания участков кода в функциональном стиле и более удачная организация классов по фай- лам, что позволяет сократить количество файлов в проекте. Также он хорошо интегрируется с Java и системами сборки, которые использует IntelliJ Platform.
3.3.1. Грамматика и синтаксический анализатор
Для генерации синтаксического анализатора используется парсер- генератор Grammar Kit. Для него существует поддержка в IntelliJ Platform, он позволяет вставлять в грамматику определенные пользователем функ- ции, предоставляет механизм восстановления после ошибок, синтакси- чески анализирует участки, задаваемые леворекурсивными правилами грамматики.
В результате работы синтаксического анализатора получается син- таксическое дерево, состоящее из Program Structure Interface (PSI) эле- ментов — абстракцией IntelliJ Platform для элементов языка, включая файлы, директорию и проект. Также он позволяет определить набор лексем для лексического анализатора и генерирует код для него, ис- пользуя JFlex14.
14Генератор лексических анализаторов: https://jflex.de/
3.3. Архитектура и элементы системы
Архитектура программного решения приведена на Рис. 1. Компо- нента Editor — часть системы, реализованная полностью в IntelliJ Platform и имеющая набор как определенных так и переопределяемых собы- тий, обработку которых предоставляют другие компоненты, зависящие непосредственно от нее. Компонента PsiElementsTree включает в себя синтаксический анализатор языка, а также все внутреннее представле- ние языка в виде классов, реализующих интерфейс VyperPsiElement.
Программа, написанная в редакторе в определенный момент времени, синтаксически анализируется данной компонентой каждый раз, когда файл с программой изменяется, для получения абстрактного синтакси- ческого дерева из VyperPsiElement объектов. Компонента Annotators содержит обработчики элементов VyperPsiElement для дополнитель- ного синтаксического и семантического анализа дерева для подсветки ошибок, а также обработки сообщений от интегрированных инструмен- тов. Обработчики запускаются инкрементально только на изменивших- сяэлементах дерева. ReferenceResolver обеспечивает навигацию по коду, реализуя разрешение ссылок для элементов VyperPsiElement, а компо- нента CompletionProvider определяет наборэлементов VyperPsiElement выше по дереву, которые могут быть подставлены на текущую позицию в редакторе.
В настоящее время сложилась практика использования генераторов синтаксических анализаторов для разработки синтаксических анализа- торов языков программирования, которые генерируют анализатор по входному набору правил — грамматике. Это позволяет сократить вре- мя разработки и не писать синтаксический анализатор вручную, также сгенерированные анализаторы достаточно хорошо указывают на син- таксические ошибки и легко расширяются или модифицируются, так как достаточно поправить входную грамматику.
Для реализации спецификации грамматики были использованы до- кументация языка и существующий компилятор для определения кор- ректных с его точки зрения синтаксических конструкций. Для полно- ценной поддержки важно, чтобы поток лексем программы разбирался до конца, т.е. чтобы синтаксический анализатор не застревал в какой-то момент. Для этого в Grammar Kit имеются специальные инструкции, позволяющие восстанавливаться после ошибок: синтаксический анали- затор может принять правило, даже если чего-то не хватает и, наобо- рот, может дополнительно пропустить что-то лишнее. Также для вос-
Рис. 1: Архитектура программного решения
3.3.2. Подсветка синтаксиса и ошибки
становления от ошибок были введены специальные правила с низким приоритетом, которые подходят всегда.
Стоит отметить, что язык обладает сильной контекстной зависимо- стью, например, вложенность синтаксических элементов определяется уровнем отступа, а порядок объявлений в файле строго задан. Опре- деление корректной вложенности элементов реализовано посредством функций, которые во время синтаксического анализа подсчитывают ко- личество предшествующих пробелов у лексем и кэшируют их, что поз- воляет в дальнейшем использовать информацию об отступах для сооб- щения об ошибках, а также не пересчитывать отступы каждый раз, что влияет на производительность, т.к. синтаксический анализатор часто откатывается в силу рекурсивного спуска.
3.3.3. Навигация
Подсветка синтаксиса задается на уровне лексем и заключается в разбиении их на группы и предоставлении доступа к цвету лексемы по ее типу. Процесс подсветки ошибок начинается после построения дерева, на этом этапе можно, например, проверить разрешимость ссы-
лок для тех элементов, которые могут иметь ссылки, а также на этом уровне реализована проверка правильности порядка объявлений, чтобы излишне не усложнять грамматику. Такие обработчики синтаксическо- го дерева запускаются инкрементально только на измененных элемен- тах дерева.
Элементы, на которые можно ссылаться должны обладать иденти- фикатором, т.е. это различные объявления, предопределенные функ- ции и поля. Ссылаться же может любой из следующих элементов: до- ступы к полям объекта, создание объекта структуры, вызовы функций и литералы. В зависимости от контекста, т.е. является ли, например, синтаксический элемент частью вызова функции или просто литера- лом, возвращается ссылка нужного типа. Для ссылки каждого типа определены методы в компоненте ReferenceResolver, которые обходятдерево в поиске объявлений с подходящим идентификатором и кэши- руют результат ссылки для элемента.
3.3.4. Автодополнение
Процесс автодополнения также основан на механизме ссылок. В от- вет на соответствующий запрос от пользователя IntelliJ Platform пы- тается подставить идентификатор, который впоследствии возвращает ссылку в зависимости от окружения. Метод getVariants() определяется для каждого типа ссылки и обходит синтаксическое дерево, сохраняя элементы, удовлетворяющие фильтру. В языке также присутствуют встроенные функции и поля транзакций, к которым контракт имеет доступ. Для включения их в результат поиска реализован генератор виртуальных файлов, которые содержат в себе нужные определения функций и полей. Эти файлы состоят из PSI элементов и в них также запускается поиск.
Заключение
В рамках курсовой работы были выполнены следующие задачи:
• изучена блокчейн-платформа Ethereum;
• изучен язык Vyper и существующие инструменты для разработки и поддержки языков смарт-контрактов;
• реализована комплексная поддержка синтаксиса языка Vyper для плагина в IntelliJ Platform.
Также была написана статья ”A Survey of Smart Contracts Safety and Programming Languages”, которая была принята к выступлениюна SYRCoSE 2019 с последующей публикацией.15
В данный момент проводится интеграция с остальными компонен- тами системы, в том числе проецирование сообщений компилятора, до- полнительное форматирование кода в редакторе. Стоит отметить, что имеющуюся функциональность можно значительно улучшить, покрыв больше синтаксических и семантических ошибок, расширить автодо- полнение и навигацию. Тем не менее плагин уже предоставляет хоро- шую основу и в силу использования генераторов и модульности архи- тектуры легко расширяем. Исходный код доступен на GitHub16
15http://syrcose.ispras.ru/?q=node/12 16https://github.com/NikitaMishin/vyper-plugin
Список литературы
[1] Avan-Nomayo Osato. Ethereum Surpasses Bitcoin in Number of Active Addresses. – URL: https://ethereumworldnews.com/ ethereum-surpasses-bitcoin-in-number-of-active-addresses/ (online; accessed: 2018-05-31).
[2] Buterin Vitalik. Ethereum: A next-generation smart contract and decentralized application platform. – 2014. – Accessed: 2018-12-14. URL: https://github.com/ethereum/wiki/wiki/White-Paper.
[3] Elli Androulaki Artem Barger Vita Bortnikov, other. Hyperledger Fabric: A Distributed Operating System for Permissioned Blockchains. – 2018. – Accessed:2018-12-14. URL: https:
[4] Goodman L.M. Tezos — a self-amending crypto-ledger White paper. – 2014. – Accessed:2018-12-14. URL: https://tezos.com/static/ papers/white_paper.pdf.
[5] Hearn Mike. Corda: A distributed ledger. – 2016. –
Accessed:2018-12-14. URL: https://www.corda.net/content/ corda-technical-whitepaper.pdf.
[6] Macrinici Daniel, Cartofeanu Cristian, Gao Shang. Smart contract applications within blockchain technology: A systematic mapping study // Telematics and Informatics. – 2018. – Vol. 35, no. 8. – P. 2337 – 2354.
[7] Making Smart Contracts Smarter / Loi Luu, Duc-Hiep Chu, Hrishi Olickel et al. // Proceedings of the 2016 ACM SIGSAC Conference on Computer and Communications Security.
[8] The New Viper Smart Contract Programming Language. – URL:
[9] Nicola Atzei Massimo Bartoletti Tiziana Cimoli. A survey of attacks on Ethereum smart contracts. – 2016. – Accessed: 2018-12-14. URL: https://eprint.iacr.org/2016/1007.pdf.
[10] O’Connor Russell. Simplicity: A New Language for Blockchains. – 2017. – Accessed:2018-12-14. URL: https://arxiv.org/pdf/1711. 03028.pdf.
[11] Vyper. – URL: https://github.com/ethereum/vyper.
[12] Wood Gavin. Ethereum: A secure decentralised generalised transaction ledger EIP-150 REVISION (759dccd - 2017-08-07). – 2017. – Accessed: 2018-12-14. URL: https://ethereum.github.io/ yellowpaper/paper.pdf.