Giter Site home page Giter Site logo

cairo-vm-go's Introduction

Cairo VM in Go

โš ๏ธ This project is undergoing heavy development and is still on its early stages. There will be constant breaking changes.

This project aims to implement a Cairo Virtual Machine using Go. This is one of many other implementations that are being developed and its main goals are:

  • making the Starknet ecosystem secure by reducing the risk of a single critical vulnerability,
  • decentralizing development and maintenance of the different VMs,
  • cross-checking and validation with other implementations and
  • to foster innovation through competition.

Intro

The Cairo Virtual Machine is a crucial component of the Starknet ecosystem. It serves as the runtime environment for all smart contracts on the platform. When users write contracts in high-level Cairo, it gets compiled to Sierra, and then to CASM bytecode. The VM receives this bytecode, executes it and generates a proof of execution. This proof is then sent from a sequencer to the verifier to include the transaction in a new block.

Install

This Virtual Machine is still in development and there is no public release available yet. Currently, it is only possible to use it by building it from source by following these instructions:

  1. Clone the repo to your machine: git clone https://github.com/NethermindEth/cairo-vm-go.
  2. Install Go on your PC, instructions here.
  3. Execute on the root folder of the repo: make build.
  4. Make sure everything is running smoothly by executing: make unit.

After completing these steps, you can find the compiled VM in bin/cairo-vm.

Run The VM

To run the VM you need first to have a compiled Cairo file using the Cairo compiler at cairo-lang. Install it with the following command:

pip install cairo-lang==0.11

When the installation is completed, you can run the cairo-compile command:

cairo-compile ./integration_tests/cairo_files/factorial.cairo --proof_mode --output ./factorial_compiled.json

This will compile factorial.cairo and store the compilation result in factorial_compiled.json. The --proof_mode flag makes the compilation output contain special identifiers that allow the generation of a proof of execution from the VM later on.

Finally, let's use our VM to execute factorial_compiled.json with the next command:

./bin/cairo-vm run  --proofmode --tracefile factorial_trace --memoryfile factorial_memory factorial_compiled.json

When this command finishes, factorial.cairo has run correctly starting from the main function. The --proofmode flag indicates that a proof of execution should be generated. The location where this proof is stored is determined by both --tracefile and --memoryfile flags accordingly.

Other VM Options

To learn about all the possible options the VM can be run with, execute the run command with the --help flag:

./bin/cairo-vm run --help

Testing

We currently have defined three sets of tests:

  • unit tests where we check the correct work of each component individually.
  • integration tests where we compare that the proof of execution of our VM is the same as the proof of execution of the Python VM.
  • benchmark tests to have a baseline performance indicator.

Unit tests can be automatically run with:

make unit

Integration tests are run with:

make integration

Integration tests are run with filters in the following two methods, with the first method having higher priority.

#1) set global environment variable `INTEGRATION_TESTS_FILTERS`
export INTEGRATION_TESTS_FILTERS=fib,alloc
make integration

#2) set by editing `INTEGRATION_TESTS_FILTERS=` in the `./integration_tests/.env` file
make integration

If you want to execute all tests of the project:

make testall

To benchmark the project run:

make bench

This will run benchmarks for most of the project packages. It will create a benchmark folder and a subfolder named after the current branch git information. Inside this subfolder, each package that was benchmarked will have a cpu.out, mem.out and stdout.text. The first two files will hold profiling data regarding CPU and memory usage respectively, the last one will hold allocations/operations per second per benchmark test.

To view profiling information with a web UI, run:

go tool pprof -http=:8080 benchmarks/<subfolder>/<pkg>/cpu.out

You may also be interested in benchmarking a specific package or a specific function, you can use the PKG_NAME and TEST flags for this.

make bench PKG_NAME="hintrunner" TEST="AllocSegment"

Useful Commands

For convenience, we have created a makefile that includes the most used commands such as make build. To see all of them please run:

make help

Documentation

We are planning on writing our documentation soon detailing how we adapt the theory of a non-deterministic machine to a deterministic one. Meanwhile, the next is a list of resources we are currently using to develop the VM.

Cairo

Other

The previous list includes the most helpful documentation for the current state of the project but it does not represent all that is available. If you are interested in going beyond, there is this list made by LambdaClass which has a much broader scope.

Related Projects

Contributing

If you wish to contribute please visit our CONTRIBUTING.md for general guidelines.

cairo-vm-go's People

Contributors

alvarodb avatar cicr99 avatar danielcdz avatar edgarbarrantes avatar elijahvlasov avatar fishonamos avatar greged93 avatar guha-rahul avatar har777 avatar jbmkahdeksan avatar jimenezz22 avatar jkktom avatar jmjac avatar jorikschellekens avatar joshklop avatar kirugan avatar krafugo avatar maksymmalicki avatar mmk-1 avatar moigematino avatar omerfirmak avatar pxyxyrus avatar quasilyte avatar rodrigo-pino avatar shubham1769 avatar stdevmac avatar tadev0 avatar tomi-3-0 avatar wugalde19 avatar xiaolou86 avatar

Stargazers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.