Skip to content

Commit

Permalink
Upgrade to v0.1.7 (0xSpaceShard#13)
Browse files Browse the repository at this point in the history
* Use cairo-lang version from pyproject.toml

* Catch deployment error

* Restore hh deploy in plugin test

* Update cairo-lang to v0.6.0

* Add sysreq and disclaimer to Readme

* Reduce startup logging

* Stop using hh config copy

* Use salt; stringify stored calldata

* Add dummy get_transaction_receipt

* Use block hash

* Improve disclaimer (hash calculation)

* Bump version to 0.1.7
  • Loading branch information
FabijanC authored Nov 19, 2021
1 parent 22afc89 commit 49905be
Show file tree
Hide file tree
Showing 13 changed files with 103 additions and 89 deletions.
4 changes: 2 additions & 2 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@ jobs:
steps:
- checkout
- run:
name: Install poetry and cairo-lang
command: pip3 install poetry cairo-lang==0.5.2
name: Install development tools
command: ./scripts/install-dev-tools.sh
- run:
name: Install dependencies
command: poetry install
Expand Down
12 changes: 11 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,11 +1,16 @@
## Introduction
A Flask wrapper of Starknet dummy network. Similar in purpose to Ganache.
A Flask wrapper of Starknet state. Similar in purpose to Ganache.

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

## Install
```text
pip install starknet-devnet
```

## Requirements
Works with Python versions <=3.9.7.

On Ubuntu/Debian, first run:
```text
sudo apt install -y libgmp3-dev
Expand All @@ -16,7 +21,12 @@ On Mac, you can use `brew`:
brew install gmp
```

## Disclaimer
- This devnet should not be used as a replacement for Alpha testnet. After testing on devnet, be sure to test on testnet!
- Hash calculation of transactions and blocks differs from the one used in Alpha testnet.

## Run
Installing the package adds the `starknet-devnet` command.
```text
usage: starknet-devnet [-h] [-v] [--host HOST] [--port PORT]
Expand Down
21 changes: 3 additions & 18 deletions poetry.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[tool.poetry]
name = "starknet_devnet"
version = "0.1.6"
version = "0.1.7"
description = "A local testnet for Starknet"
authors = ["FabijanC <[email protected]>"]
license = "ISC"
Expand All @@ -14,7 +14,7 @@ keywords = ["starknet", "cairo", "testnet", "local", "server"]
python = "^3.7"
Flask = {extras = ["async"], version = "^2.0.2"}
flask-cors = "^3.0.10"
cairo-lang = "0.5.2"
cairo-lang = "0.6.0"

[tool.poetry.dev-dependencies]

Expand Down
13 changes: 9 additions & 4 deletions scripts/get-version.sh
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,20 @@

# Extracts version from .toml

if [ -n "$1" ]; then
CONFIG_FILE="$1"
set -e

if [ -z "$1" ]; then
echo "$0 <CONFIG_ENTRY>"
exit 1
else
CONFIG_FILE=pyproject.toml
ENTRY="$1"
fi

CONFIG_FILE=pyproject.toml

if [ ! -f "$CONFIG_FILE" ]; then
echo "$0: Config file '$CONFIG_FILE' doesn't exist or not reachable"
exit 1
fi

sed -rn "s/^.*version = \"(.*)\"$/\1/p" "$CONFIG_FILE"
sed -rn "s/^$ENTRY = \"(.*)\"$/\1/p" "$CONFIG_FILE"
22 changes: 0 additions & 22 deletions scripts/hardhat.config.ts

This file was deleted.

2 changes: 1 addition & 1 deletion scripts/image_build_and_push.sh
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ function docker_tag_exists() {
}

IMAGE=shardlabs/starknet-devnet
LOCAL_VERSION=$(./scripts/get-version.sh)
LOCAL_VERSION=$(./scripts/get-version.sh version)
echo "Local version: $LOCAL_VERSION"

# Building is executed regardless of versions
Expand Down
6 changes: 6 additions & 0 deletions scripts/install-dev-tools.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
#!/bin/bash

set -e

CAIRO_LANG_VERSION=$(./scripts/get-version.sh cairo-lang)
pip3 install poetry "cairo-lang==$CAIRO_LANG_VERSION"
3 changes: 0 additions & 3 deletions scripts/setup-example.sh
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,5 @@ git clone -b devnet --single-branch [email protected]:Shard-Labs/starknet-hardhat-e
cd starknet-hardhat-example
npm ci

# describe starknetLocalhost
cp ../scripts/hardhat.config.ts hardhat.config.ts

# generate artifacts
npx hardhat starknet-compile
9 changes: 4 additions & 5 deletions scripts/test-plugin.sh
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,8 @@ sleep 1 # give the server some time to get up

cd starknet-hardhat-example
# npx hardhat starknet-compile <- Already executed in setup-example.sh
# starknetLocalhost already defined as localhost:5000
# TODO uncomment the following three lines once passing constructor arguments is enabled with the deploy task
# npx hardhat starknet-deploy \
# starknet-artifacts/contracts/contract.cairo \
# --starknet-network starknetLocalhost
# devnet already defined in config as localhost:5000
npx hardhat starknet-deploy \
starknet-artifacts/contracts/contract.cairo \
--starknet-network devnet
npx hardhat test
2 changes: 1 addition & 1 deletion starknet_devnet/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
__version__ = "0.1.6"
__version__ = "0.1.7"
51 changes: 37 additions & 14 deletions starknet_devnet/server.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
from flask import Flask, request, jsonify, abort
from flask.wrappers import Response
from flask_cors import CORS
from starkware.starknet.business_logic.internal_transaction import InternalDeploy
from starkware.starknet.services.api.gateway.transaction import Deploy, InvokeFunction, Transaction
from starkware.starknet.definitions.transaction_type import TransactionType
from starkware.starkware_utils.error_handling import StarkErrorCode, StarkException
from .util import TxStatus, parse_args
from .starknet_wrapper import Choice, StarknetWrapper
import os

app = Flask(__name__)
CORS(app)
Expand All @@ -24,29 +26,39 @@ async def add_transaction():
Endpoint for accepting DEPLOY and INVOKE_FUNCTION transactions.
"""

state = await starknet_wrapper.get_state()
raw_data = request.get_data()
transaction = Transaction.loads(raw_data)

tx_type = transaction.tx_type.name
result_dict = {}
status = TxStatus.PENDING
error_message = None

if tx_type == TransactionType.DEPLOY.name:
deploy_transaction: Deploy = transaction
deploy_transaction: InternalDeploy = InternalDeploy.from_external(transaction, state)
contract_address = hex(deploy_transaction.contract_address)
try:
await starknet_wrapper.deploy(
contract_definition=deploy_transaction.contract_definition,
contract_address_salt=deploy_transaction.contract_address_salt,
constructor_calldata=deploy_transaction.constructor_calldata
)
except StarkException as e:
error_message = e.message
status = TxStatus.REJECTED

contract_address = await starknet_wrapper.deploy(
contract_definition=deploy_transaction.contract_definition,
constructor_calldata=deploy_transaction.constructor_calldata
)
transaction_hash = starknet_wrapper.store_deploy_transaction(
contract_address=contract_address,
constructor_calldata=deploy_transaction.constructor_calldata
calldata=deploy_transaction.constructor_calldata,
salt=deploy_transaction.contract_address_salt,
status=status,
error_message=error_message
)

elif tx_type == TransactionType.INVOKE_FUNCTION.name:
transaction: InvokeFunction = transaction
contract_address = hex(transaction.contract_address)
status = TxStatus.PENDING
error_message = None
try:
result_dict = await starknet_wrapper.call_or_invoke(
Choice.INVOKE,
Expand Down Expand Up @@ -105,14 +117,14 @@ async def call_contract():

@app.route("/feeder_gateway/get_block", methods=["GET"])
def get_block():
block_id = request.args.get("blockId", type=int)
print(block_id)
block_hash = request.args.get("blockHash", type=int)
print(block_hash)
return "Not implemented", 501

@app.route("/feeder_gateway/get_code", methods=["GET"])
def get_code():
block_id = request.args.get("blockId", type=int)
print(block_id)
block_hash = request.args.get("blockHash", type=int)
print(block_hash)

contract_address = request.args.get("contractAddress", type=int)
print(contract_address)
Expand All @@ -126,8 +138,8 @@ def get_storage_at():
key = request.args.get("key")
print(key)

block_id = request.args.get("blockId", type=int)
print(block_id)
block_hash = request.args.get("blockHash", type=int)
print(block_hash)
return "Not implemented", 501

@app.route("/feeder_gateway/get_transaction_status", methods=["GET"])
Expand All @@ -150,7 +162,18 @@ def get_transaction():
ret = starknet_wrapper.get_transaction(transaction_hash)
return jsonify(ret)

@app.route("/feeder_gateway/get_transaction_receipt", methods=["GET"])
def get_transaction_receipt():
"""
Returns the transaction receipt identified by the transactionHash argument in the GET request.
"""

return "Not implemented", 501

def main():
# reduce startup logging
os.environ['WERKZEUG_RUN_MAIN'] = 'true'

args = parse_args()
app.run(**vars(args))

Expand Down
Loading

0 comments on commit 49905be

Please sign in to comment.