Interpretador de assembly, debugger e visualizador (didático)

Olá pessoal!

Seguindo a linha dos meus projetos pra contratos inteligentes em blockchain criei um visualizador passo a passo, ou também conhecido como debugger, para assembly. Acaba sendo um projeto específico para blockchain, mas em conjunto com o compilador de C pode ajudar na explicação de como funciona um programa desde o código em alto nível até as instruções de máquina. Há vários projetos parecido para instruções i386, mas esse projeto é uma implementação para instruções desenvolvida pela ciyam para contratos inteligentes, portanto tendo bem menos instruções e sendo mais didático também.

Pra quem se interessou, pode visitar a página do projeto, carregar um programa de exemplo e avançar passo a passo verificando instruções e alterações de memória e status do programa, inclusive com a necessidade de forjar novos blocos simulando um contrato em blockchain. O projeto é feito em javascript e roda direto no navegador.

Valeu!!

5 curtidas

Atualização

Gostaria de avisar que o simulador está completo agora, com as funções especiais de transações e de hash. Dá para simular contratos inteligentes e programar simulando uma blockchain, recebendo e enviando crypto ou mensagens. Idealmente, use o SmartC para programar em C, compile para Assembly, e rode o Assembly no simulador.

Detalhes técnicos

O projeto consiste praticamente de uma máquina virtual primitiva. O contrato é o programa e a Blockchain é como se fosse o computador. Os arquivos de JS:

  • try.js: Funções de interface com o usuário
  • controller.js: Funções de controle de execução do contrato e de forja de novos blocos. Algo equivalente ao sistema operacional.
  • cpu.js: Objeto com as funções de processador e código que executam (microcode). Equivalente à lista de instruções que a arquitetura suporta.
  • api.js: Objeto com as funções de API e código que executam (microcode). Equivalente ao kernel do sistema, com funções que se comunicam com o “resto do mundo”.
  • utils.js: Objeto com funções de uso geral de tradução de código.
  • hashlib.js: Classe HashLib (minha primeira classe programada!) com código para hash MD5, RIPE-MD160 e SHA-256 de terceiros.
  • asm_highlight.js: Função que converte o texto Assembly em html.

Agora, verificando os arquivos e suas funções, vi que seria ideal mover os objetos de memória e de programa para outro arquivo. Atualmente as variáveis globais referentes ao contrato (inclusive a memória do programa) estão ainda no arquivo try.js. Valeu!!!

2 curtidas

Pro pessoal que está acompanhando:

Atualizei o projeto para typescript!

Foi meio difícil, como geralmente acontece quando a gente vai aprender algo e fazer pela primeira vez. Dá uma rigidez maior para programar mas em compensação achei meia dúzia de bugs que tinham passado despercebido. Também complica que é preciso usar módulos javascript no frontend e isso requer um servidor local. Resolvi com um pacote node.js servidor local. O código ficou extremamente mais organizado, chegando ao ponto de agora ser possível rodar vários contratos inteligentes interagindo entre eles. Não peguem meu código como exemplo, pois como primeiro projeto deve ter várias oportunidades de melhoria.

Com essa atualização considero o projeto acabado, ao menos com relação à funcionalidade. Vou usando ele para testar minhas ideias malucas e a partir de agora apenas corrigir algum bug que encontre. Embora a interface exija transações em json e mostre também a blockchain em json, o público alvo é de programadores, então vai ficar assim mesmo!

Pontos interessantes que aprendi com o projeto:

  • Simulação de programas: pilha de execução, pilha de chamada de funções, alocação de memória para um programa.
  • Simulação de CPU: como um mesmo código é usado para diferentes programas.
  • Aprendizado em typescript
  • Aprendizado em nodejs (também foi meu primeiro package.json!!)
3 curtidas