Kakarot is an Ethereum Virtual Machine written in Cairo. It means it can be
deployed on StarkNet, a layer 2 scaling solution for Ethereum, and run an EVM
bytecode program. Hence, Kakarot can be used to run Ethereum smart contracts on
StarkNet. Kakarot is the super sayajin zkEVM! Why? Because:
It's over 9000!!!!!
.
It is a work in progress, and it is not ready for production.
Getting started • Supported opcodes • Build • Test • Report a bug • Questions
%%{init: {'theme': 'forest', 'themeVariables': { 'darkMode': 'false'}}}%%
pie title Kakarot EMV opcodes support (142 / 142)
"Supported" : 138
"Not supported" : 0
"Partially supported" : 4
Here is the list of supported opcodes: opcodes
For the moment the list is maintained manually, but it will likely be generated automatically in the future. If you want to contribute, you can help us by adding the missing opcodes. And if you implement a new opcode, please update the list.
-
✅ 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
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
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:
To contribute, please check out the contribution guide.
# install poetry if you don't have it already
# curl -sSL https://install.python-poetry.org | python3 -
make setup
To be able to verify and compare the abi and bytecode of the test contracts, first make sure you have foundry installed:
https://book.getfoundry.sh/getting-started/installation
and then run:
make build-foundry
make build
Running the tests requires to have docker available in the machine. Check their doc for how to install it.
# 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 execute_at_adress()
kakarot is released under the MIT.
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.
Questions are welcome! If you have any questions regarding Kakarot, feel free to ask them using Newton.
- What is Kakarot, the zkEVM written in Cairo?
- Is Kakarot zkEVM a blockchain?
- When will Kakarot zkEVM launch on mainnet?
- Does Kakarot zkEVM have a token?
- Is Kakarot zkEVM a smart contract or a blockchain?
- Is Kakarot a Starkware project?
- Is Kakarot part of the Starknet ecosystem?
- Will Kakarot be an L3 on top of the Starknet validity rollup?
- Can I add Kakarot to my metamask?
- Is Kakarot equivalent to Arbitrum?
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!