Coder Social home page Coder Social logo

0xcoburn / kakarot Goto Github PK

View Code? Open in Web Editor NEW

This project forked from kkrt-labs/kakarot

0.0 0.0 0.0 9.27 MB

ZK-EVM type 2.5 written in Cairo, leveraging STARK proof system.

Home Page: https://kakarot.org

License: MIT License

Shell 1.43% Python 23.89% Makefile 0.17% Dockerfile 0.17% Solidity 4.45% Cairo 69.89%

kakarot's Introduction

zkEVM written in Cairo. proof system.

GitHub Workflow Status GitHub GitHub contributors GitHub top language Telegram Contributions welcome Read FAQ GitHub Repo stars Twitter Follow

Kakarot is a zkEVM written in Cairo. It aims to allow users to leverage the scaling benefits of validity rollups while maintaining compatibility with the Ethereum ecosystem. Therefore, Kakarot can be used to run Ethereum smart contracts on Starknet.

We strongly believe the CairoVM will provide the best zero-knowledge toolbox in the coming years and that the Ethereum network effect will remain dominant in the meantime. We present to developers an abstraction layer they're familiar with: the EVM. Build and deploy as if you were working on Ethereum, be forward compatible with the future of zero-knowledge.

It is a work in progress, and it is not ready for production.

Latest presentation of Kakarot at Starkware Session TLV 2023

Getting startedSupported opcodesBuildTestReport a bugQuestions

Supported opcodes

We support 100% of EVM opcodes.

Documentation

Architecture

  • ✅ Kakarot is a smart contract, deployed on Starknet (goerli). It is written in Cairo.

  • ✅ Kakarot can: (a) execute arbitrary EVM bytecode, (b) deploy an EVM smart contract as is, (c) call a Kakarot-deployed EVM smart contract's functions (views and write methods).

  • ✅ Kakarot is an EVM bytecode interpreter.

  • ❌ Kakarot is not a blockchain.

  • ❌ Kakarot is not a compiler. Check out Warp for a Solidity -> Cairo transpiler

Main execution flow

sequenceDiagram
    title Simple bytecode execution flow example: [PUSH1 0x01 PUSH1 0x02 ADD]
    actor User
    participant Kakarot
    participant ExecutionContext
    participant EVMInstructions
    participant ArithmeticOperations
    participant PushOperations
    participant Stack
    User->>+Kakarot: execute(value, code, calldata)
    Kakarot->>+EVMInstructions: generate_instructions()
    EVMInstructions->>-Kakarot: instructions
    Kakarot->>+ExecutionContext: compute_intrinsic_gas_cost()
    ExecutionContext->>-Kakarot: ctx
    Kakarot->>Kakarot: run(instructions, ctx)
    loop opcode
        Kakarot->>+EVMInstructions: decode_and_execute(instructions, ctx)
        EVMInstructions->>EVMInstructions: retrieve the current program counter
        Note over EVMInstructions: revert if pc < 0, stop if pc > length of code
        EVMInstructions->>EVMInstructions: read opcode associated function from instruction set
        Note over PushOperations, Stack: x2 PUSH a=1, PUSH b=2
        EVMInstructions->>+PushOperations: exec_push1(ctx)
        PushOperations->>Stack: push(stack, element)
        PushOperations->>-EVMInstructions: ctx
        EVMInstructions->>+ArithmeticOperations: exec_add(ctx)
        Note over PushOperations, Stack: x2 POP a, POP b
        ArithmeticOperations->>Stack: pop(stack)
        Stack->>ArithmeticOperations: element
        ArithmeticOperations->>Stack: push(stack, result)
        ArithmeticOperations->>-EVMInstructions: ctx
        EVMInstructions->>-Kakarot: ctx
    end
    Kakarot->>-User: ctx
Loading

Execution sample

Execution of a simple EVM bytecode program on Kakarot.

The bytecode is the following:

6001600503600301610166016002026105b40460020500

Which corresponds to the following EVM program:

0x60 - PUSH1
0x60 - PUSH1
0x03 - SUB
0x60 - PUSH1
0x01 - ADD
0x61 - PUSH2
0x01 - ADD
0x60 - PUSH1
0x02 - MUL
0x61 - PUSH2
0x04 - DIV
0x60 - PUSH1
0x05 - SDIV
0x00 - STOP

Here is the execution trace of the program on Kakarot:

Tutorial

Getting started

To contribute, please check out the contribution guide.

The easiest way to get started is to use devcontainers:

  • either directly from GitHub to have an online VSCode with everything ready Codespaces
  • or from VSCode, open the project and use "Dev Containers: Rebuild container" (requires Docker on your host machine)

Otherwise, you can proceed with a regular installation on your host:

# install poetry if you don't have it already
# curl -sSL https://install.python-poetry.org | python3 -
make setup

Build

To build the Cairo files:

make build

To build the test Solidity smart contracts:

# install foundry if you don't have it already
# curl -L https://foundry.paradigm.xyz | bash
# foundryup
make build-sol

Test

# Run all tests
make test

# Run only unit tests
make test-units

# Run only integration tests
make test-integration

# Run a specific test file
pytest <PATH_TO_FILE>  # with pytest
python3 -m unittest <PATH_TO_FILE>  # with unittest

# Run a specific test mark (markers in pyproject.toml)
make run-test-mark mark=<MARK>
make run-test-mark-log mark=<MARK> # with log

Test architecture is the following:

  • tests/unit/src contains cairo tests for each cairo function in the kakarot codebase
  • tests/integration/bytecode contains python tests for kakarot execute() function with forged bytecode
  • tests/integration/solidity_contracts contains python tests for solidity contracts that are compiled, deployed on kakarot local node and interacted with kakarot eth_call() and invoke()
  • the project also contains some forge tests (e.g. PlainOpcodes.t.sol) whose purpose is to test easily the solidity functions meant to be tested with kakarot, i.e. quickly making sure that they return the expected output so that we know that we focus on kakarot testing and not .sol testing. They are not part of the CI. Simply use forge test to run them.

Deploy

The following describes how to deploy the entire Kakarot EVM on StarkNet.

It is not a description on how to deploy a contract on the official Kakarot zkEVM.

The Kakarot EVM can be deployed on StarkNet using a python script utilizing the starknet.py library.

First we need to declare some environment variables that are required for the deployment.

Start by copying the .env_example file located in the root directory (.files are usually hidden by default in most explorers. You should be able to see the file in your IDE).

Rename the copied file to .env.

The file holds the following content:

GITHUB_TOKEN=your_github_token

You will need to provide a Github access token to be able to build and deploy Kakarot.

You can learn how to create this token from here, we would suggest using a fine-grained token with only read access.

PRIVATE_KEY=your_private_key
ACCOUNT_ADDRESS=your_account_address

Now replace the placeholder values with your account and network details.

PRIVATE_KEY is the private key of the account contract that will pay for the deployment. This should be a hexadecimal number

ACCOUNT_ADDRESS is the address of the account contract that will pay for the deployment (not the public key). This should be a hexadecimal number

Here is a concrete example:

ACCOUNT_ADDRESS=0x7e00d496e324876bbc8531f2d9a82bf154d1a04a50218ee74cdd372f75a551a
PRIVATE_KEY=0xe3e70682c2094cac629f6fbed82c07cd

By default, everything will run on a local starknet-devnet (started with make run). If you want to deploy to a given target, set the STARKNET_NETWORK env variable, for example:

make deploy # localhost
STARKNET_NETWORK=testnet make deploy
STARKNET_NETWORK=testnet2 make deploy
STARKNET_NETWORK=mainnet make deploy

Deployed contract addresses will be stored in ./deployments/{networks}/deployments.json.

A step by step description of the individual components and how they are deployed/configured can be found here.

License

kakarot is released under the MIT.

Security

Kakarot follows good practices of security, but 100% security cannot be assured. Kakarot is provided "as is" without any warranty. Use at your own risk.

For more information and to report security issues, please refer to our security documentation.

Callgraphs

The callgraph artifacts contains all the contract's call graph. Those are generated using thoth and can provide some more insight on the inside of this zkEVM. The legend can be found here. You can use this tool to visualize the .gv files online.

Questions / FAQ

Questions are welcome! If you have any questions regarding Kakarot, feel free to ask them using Newton.

FAQ

Contributing

First off, thanks for taking the time to contribute! Contributions are what make the open-source community such an amazing place to learn, inspire, and create. Any contributions you make will benefit everybody else and are greatly appreciated.

Please read our contribution guidelines, and thank you for being involved!

Contributors

Abdel @ StarkWare
Abdel @ StarkWare

💻 ⚠️ 📖 🚇 📆 🧑‍🏫
Lucas
Lucas

💻 ⚠️ 📖 🧑‍🏫
Mentor Reka
Mentor Reka

💻 ⚠️ 📖 🚇
danilowhk
danilowhk

💻 ⚠️
Lenny
Lenny

💻 ⚠️
Florian Bellotti
Florian Bellotti

💻 ⚠️
Henri
Henri

💻 ⚠️
FreshPizza
FreshPizza

💻 ⚠️
Clément Walter
Clément Walter

📖 ⚠️ 💻
Rich Warner
Rich Warner

💻 ⚠️
pscott
pscott

💻 ⚠️
Elias Tazartes
Elias Tazartes

💻 ⚠️
Riad-Quadratic
Riad-Quadratic

💻 ⚠️
Tyler Smith
Tyler Smith

⚠️
Shahar Papini
Shahar Papini

🧑‍🏫 💻 ⚠️
Riad | Quadratic
Riad | Quadratic

💻
thomas-quadratic
thomas-quadratic

💻
Pedro Bergamini
Pedro Bergamini

💻
ptisserand
ptisserand

💻
TurcFort07
TurcFort07

💻
Mnemba Chambuya
Mnemba Chambuya

💻
Matthieu Auger
Matthieu Auger

🧑‍🏫 ⚠️ 💻
ftupas
ftupas

💻
johann bestowrous
johann bestowrous

💻
Seshanth.S
Seshanth.S

💻
Flydexo
Flydexo

💻 ⚠️ 📖
Petar Calic
Petar Calic

💻 ⚠️
gaetbout
gaetbout

🚇
greged93
greged93

💻 ⚠️
Francisco Strambini
Francisco Strambini

💻 ⚠️
sparqet
sparqet

💻 ⚠️
omahs
omahs

📖
ArnaudBD
ArnaudBD

📖
Dragan Pilipovic
Dragan Pilipovic

💻 ⚠️
Harsh Bajpai
Harsh Bajpai

💻 ⚠️ 📖
Alex
Alex

📖
Antoine
Antoine

💻
Bal7hazar @ Carbonable
Bal7hazar @ Carbonable

📖
Daniel Bejarano
Daniel Bejarano

⚠️
JuMi231
JuMi231

📖
Juan Rigada
Juan Rigada

💻
Mete Karasakal
Mete Karasakal

📖
Ng Wei Han
Ng Wei Han

💻
etash
etash

💻
kasteph
kasteph

📖
Lakhdar Slaim
Lakhdar Slaim

💻
mmsc2
mmsc2

💻
sarantapodarousa
sarantapodarousa

💻

kakarot's People

Contributors

abdelstark avatar clementwalter avatar lucaslvy avatar jobez avatar eikix avatar 0xmentornotapseudo avatar danilowhk avatar matthieuauger avatar totalpizza avatar ftupas avatar greged93 avatar zarboq avatar 0xlny avatar pedrobergamini avatar florian-bellotti avatar ptisserand avatar dragan2234 avatar l-henri avatar spapinistarkware avatar pscott avatar gaetbout avatar seshanths avatar flydexo avatar franfiuba avatar richwarner avatar petarcalic99 avatar bajpai244 avatar thomas-quadratic avatar sarantapodarousa avatar omahs 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.