6 research outputs found
Retrofitting Typestates into Rust
As software becomes more prevalent in our lives, bugs are able to cause significant disruption.
Thus, preventing them becomes a priority when trying to develop dependable
systems. While reducing their occurrence possibility to zero is infeasible, existing approaches
are able to eliminate certain subsets of bugs.
Rust is a systems programming language that addresses memory-related bugs by
design, eliminating bugs like use-after-free. To achieve this, Rust leverages the type system
along with information about object lifetimes, allowing the compiler to keep track of
objects throughout the program and checking for memory misusage. While preventing
memory-related bugs goes a long way in software security, other categories of bugs remain
in Rust. One of which would be Application Programming Interface (API) misusage,
where the developer does not respect constraints put in place by an API, thus resulting
in the program crashing.
Typestates elevate state to the type level, allowing for the enforcement of API constraints
at compile-time, relieving the developer from the burden that is keeping track
of the possible computation states at runtime, and preventing possible API misusage
during development. While Rust does not support typestates by design, the type system
is powerful enough to express and validate typestates.
I propose a new macro-based approach to deal with typestates in Rust; this approach
provides an embedded Domain-Specific Language (DSL) which allows developers to
express typestates using only existing Rust syntax. Furthermore, Rust’s macro system is
leveraged to extract a state machine out of the typestate specification and then perform
compile-time checks over the specification. Afterwards we leverage Rust’s type system to
check protocol-compliance. The DSL avoids workflow-bloat by requiring nothing but a
Rust compiler and the library itself.À medida que as nossas vidas estão cada vez mais dependentes de software, os erros do
mesmo têm o potencial de causar problemas significativos. Prevenir estes erros torna-se
uma tarefa prioritária durante o desenvolvimento de sistemas confiáveis. Erradicar erros
por completo é impossÃvel, mas é possÃvel eliminar certos conjuntos.
Rust é uma linguagem de programação de sistemas que, por desenho, endereça erros
de gestão de memória. Para o conseguir, a linguagem inclui no sistema de tipos informação
sobre o tempo de vida dos objetos, permitindo assim que o compilador conheça a
utilização dos mesmos e detecte erros de utilização de memória. Apesar da prevenção
de erros de memória ter um papel importante na segurança de software, existem ainda
outras categorias de erros em Rust, como o uso incorrecto de interfaces de programação,
em que o programador não respeita as restrições impostas pela mesma, o que resulta
numa falha do programa.
Typestates elevam o conceito de estado para o sistema de tipos, permitindo a aplicação
das restrições da interface durante a fase de compilação. Este conceito permite assim
aliviar o programador da responsabilidade que é conceptualizar e manter o estado do
programa em mente durante o desenvolvimento, prevenindo o mau uso das interfaces.
Apesar de Rust não suportar typestates de uma forma natural, o sistema de tipos permite
expressar e validar typestates.
Proponho uma nova abordagem de modo a lidar com typestates em Rust, tal abordagem
é baseada numa DSL embebida na linguagem, permitindo assim a descrição de
typestates usando apenas a sintaxe existente. A DSL vai mais além e providencia ainda
verificações estáticas sobre a especificação, tirando proveito do sistema de macros, extrai
uma máquina de estados que é depois verificada, por fim, a verificação de conformidade
é feita pelo compilador, tirando proveito do sistema de tipos. A DSL evita poluição do
ambiente trabalho, requerendo apenas um compilador de Rust e a sua própria biblioteca
Pre-deployment Analysis of Smart Contracts -- A Survey
Smart contracts are programs that execute transactions involving independent
parties and cryptocurrencies. As programs, smart contracts are susceptible to a
wide range of errors and vulnerabilities. Such vulnerabilities can result in
significant losses. Furthermore, by design, smart contract transactions are
irreversible. This creates a need for methods to ensure the correctness and
security of contracts pre-deployment. Recently there has been substantial
research into such methods. The sheer volume of this research makes
articulating state-of-the-art a substantial undertaking. To address this
challenge, we present a systematic review of the literature. A key feature of
our presentation is to factor out the relationship between vulnerabilities and
methods through properties. Specifically, we enumerate and classify smart
contract vulnerabilities and methods by the properties they address. The
methods considered include static analysis as well as dynamic analysis methods
and machine learning algorithms that analyze smart contracts before deployment.
Several patterns about the strengths of different methods emerge through this
classification process