GithubHelp home page GithubHelp logo

nathan-sl / starknet-devnet Goto Github PK

View Code? Open in Web Editor NEW

This project forked from 0xspaceshard/starknet-devnet

0.0 0.0 0.0 796 KB

A local testnet for Starknet

Python 85.29% Shell 2.34% Dockerfile 0.40% JavaScript 0.12% Cairo 4.78% Solidity 7.07%

starknet-devnet's Introduction

Introduction

A Flask wrapper of Starknet state. Similar in purpose to Ganache.

Aims to mimic Starknet's Alpha testnet, but with simplified functionality.

Contents

Install

pip install starknet-devnet

Requirements

Works with Python versions <=3.8.9.

On Ubuntu/Debian, first run:

sudo apt install -y libgmp3-dev

On Mac, you can use brew:

brew install gmp

Disclaimer

  • Devnet should not be used as a replacement for Alpha testnet. After testing on Devnet, be sure to test on testnet!
  • Specifying a block by its hash/number is not supported. All interaction is done with the latest block.
  • Read more in interaction.

Run

Installing the package adds the starknet-devnet command.

usage: starknet-devnet [-h] [-v] [--host HOST] [--port PORT]

Run a local instance of Starknet Devnet

optional arguments:
  -h, --help            show this help message and exit
  -v, --version         Print the version
  --host HOST           Specify the address to listen at; defaults to localhost (use the address the program outputs on start)
  --port PORT, -p PORT  Specify the port to listen at; defaults to 5000
  --load-path LOAD_PATH
                        Specify the path from which the state is loaded on
                        startup
  --dump-path DUMP_PATH
                        Specify the path to dump to
  --dump-on DUMP_ON     Specify when to dump; can dump on: exit, transaction

Run with Docker

Devnet is available as a Docker container (shardlabs/starknet-devnet):

docker pull shardlabs/starknet-devnet

The server inside the container listens to the port 5000, which you need to publish to a desired <PORT> on your host machine:

docker run -p [HOST:]<PORT>:5000 shardlabs/starknet-devnet

E.g. if you want to use your host machine's 127.0.0.1:5000, you need to run:

docker run -p 127.0.0.1:5000:5000 shardlabs/starknet-devnet

You may ignore any address-related output logged on container startup (e.g. Running on all addresses or Running on http://172.17.0.2:5000). What you will use is what you specified with the -p argument.

If you don't specify the HOST part, the server will indeed be available on all of your host machine's addresses (localhost, local network IP, etc.), which may present a security issue if you don't want anyone from the local network to access your Devnet instance.

Interaction

  • Interact with Devnet as you would with the official Starknet Alpha testnet.
  • The exact underlying API is not exposed for the same reason Alpha testnet does not expose it.
  • To use Devnet with Starknet CLI, provide Devnet's URL to the --gateway_url and --feeder_gateway_url options of Starknet CLI commands.
  • The following Starknet CLI commands are supported:
    • call
    • deploy
    • estimate_fee
    • get_block
    • get_code
    • get_full_contract
    • get_state_update
    • get_storage_at
    • get_transaction
    • get_transaction_receipt
    • get_transaction_trace
    • invoke (currently will fail for max_fee > 0)
    • tx_status
  • The following Starknet CLI commands are not supported:
    • get_contract_addresses

Hardhat integration

Postman integration

Postman is a Starknet utility that allows testing L1 <> L2 interactions. To utilize this, you can use starknet-hardhat-plugin, as witnessed in this example. Or you can directly interact with the two Postman-specific endpoints:

  • Load a StarknetMockMessaging contract. The address parameter is optional; if provided, the StarknetMockMessaging contract will be fetched from that address, otherwise a new one will be deployed:

    • POST /postman/load_l1_messaging_contract
    • body: { "networkUrl": "http://localhost:5005", "address": "0x83D76591560d9CD02CE16c060c92118d19F996b3" }
    • networkUrl - the URL of the L1 network you've run locally or that already exists; possibilities include, and are not limited to:
  • Flush. This will go through the new enqueued messages sent from L1 and send them to L2. This has to be done manually for L1 -> L2, but for L2 -> L1, it is done automatically:

    • POST /postman/flush
    • body: None

This method of L1 <> L2 communication testing differs from Starknet Alpha networks. Taking the L1L2Example.sol contract in the starknet documentation:

constructor(IStarknetCore starknetCore_) public {
        starknetCore = starknetCore_;
}

The constructor takes an IStarknetCore contract as argument, however for Devnet L1 <> L2 communication testing, this will have to be replaced with the MockStarknetMessaging.sol contract:

constructor(MockStarknetMessaging mockStarknetMessaging_) public {
    starknetCore = mockStarknetMessaging_;
}

Dumping

To preserve your Devnet instance for future use, there are several options:

  • Dumping on exit (handles Ctrl+C, i.e. SIGINT, doesn't handle SIGKILL):
starknet-devnet --dump-on exit --dump-path <PATH>
  • Dumping after each transaction (done in background, doesn't block):
starknet-devnet --dump-on transaction --dump-path <PATH>
  • Dumping on request (replace <HOST>, <PORT> and <PATH> with your own):
curl -X POST http://<HOST>:<PORT>/dump -d '{ "path": <PATH> }' -H "Content-Type: application/json"

Loading

To load a preserved Devnet instance, run:

starknet-devnet --load-path <PATH>

Enabling dumping and loading with Docker

To enable dumping and loading if running Devnet in a Docker container, you must bind the container path with the path on your host machine.

This example:

  • Relies on Docker bind mount; try Docker volume instead.
  • Assumes that /actual/dumpdir exists. If unsure, use absolute paths.
  • Assumes you are listening on 127.0.0.1:5000.

If there is dump.pkl inside /actual/dumpdir, you can load it with:

docker run \
  -p 127.0.0.1:5000:5000 \
  --mount type=bind,source=/actual/dumpdir,target=/dumpdir \
  shardlabs/starknet-devnet \
  --load-path /dumpdir/dump.pkl

To dump to /actual/dumpdir/dump.pkl on Devnet shutdown, run:

docker run \
  -p 127.0.0.1:5000:5000 \
  --mount type=bind,source=/actual/dumpdir,target=/dumpdir \
  shardlabs/starknet-devnet \
  --dump-on exit --dump-path /dumpdir/dump.pkl

Block explorer

To see how to setup a local block explorer (Voyager) check here.

Lite mode

To improve Devnet performance, consider passing these CLI flags on Devnet startup:

  • --lite-mode enables all of the optimizations described below (same as using all of the following flags);
  • --lite-mode-deploy-hash disables the calculation of the transaction hash for deploy transactions. It will instead be a simple sequence of numbers;
  • --lite-mode-block-hash disables the calculation of the block hash. It will instead be a simple sequence of numbers;

Development

If you're a developer willing to contribute, be sure to have installed Poetry.

Development - Run

poetry run starknet-devnet

Development - Test

When running tests locally, do it from the project root:

poetry run pytest test/

or for a single file

poetry run pytest test/<TEST_FILE>

Development - Build

You don't need to build anything to be able to run locally, but if you need the *.whl or *.tar.gz artifacts, run

poetry build

starknet-devnet's People

Contributors

badurinantun avatar dribeiro-shardlabs avatar fabijanc avatar lucaslvy avatar solpatium avatar wraitii 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.