From 9736ef9afed3bd7237a46a942dbeb4f904ae46b1 Mon Sep 17 00:00:00 2001 From: Lior Goldberg Date: Sat, 6 May 2023 16:04:18 +0300 Subject: [PATCH] Cairo v0.11.1a0 (pre). --- BUILD | 20 + CMakeLists.txt | 22 - Dockerfile | 25 +- README.md | 2 +- WORKSPACE | 89 ++ bazel_utils/BUILD | 37 + bazel_utils/gen_python_exe.py | 42 +- bazel_utils/get_from_cairo_lang.bzl | 2 + bazel_utils/python.bzl | 133 +++ bazel_utils/python/BUILD | 41 + bazel_utils/python/defs.bzl | 117 +++ bazel_utils/solidity.bzl | 123 +++ build.sh | 16 - load_cairo_lang.bzl | 2 + ...ists.txt => pypy3.9_archive_build_file.bzl | 0 scripts/BUILD | 6 + scripts/requirements-deps.json | 46 +- scripts/requirements.txt | 18 +- src/CMakeLists.txt | 3 - src/cmake_utils/CMakeLists.txt | 1 - src/cmake_utils/CMakeLists_common.txt | 15 - src/cmake_utils/cmake_rules.cmake | 9 - src/cmake_utils/copy_rules.cmake | 51 -- src/cmake_utils/exe_rules.cmake | 18 - src/cmake_utils/pip_rules.cmake | 138 --- src/cmake_utils/python_rules.cmake | 332 ------- src/cmake_utils/solidity_rules.cmake | 60 -- src/services/CMakeLists.txt | 2 - src/services/everest/CMakeLists.txt | 3 - src/services/everest/api/CMakeLists.txt | 2 - src/services/everest/api/feeder_gateway/BUILD | 36 + .../everest/api/feeder_gateway/CMakeLists.txt | 27 - src/services/everest/api/gateway/BUILD | 52 ++ .../everest/api/gateway/CMakeLists.txt | 42 - src/services/everest/business_logic/BUILD | 58 ++ .../everest/business_logic/CMakeLists.txt | 48 - src/services/everest/definitions/BUILD | 32 + .../everest/definitions/CMakeLists.txt | 26 - src/services/external_api/BUILD | 43 + src/services/external_api/CMakeLists.txt | 29 - src/services/external_api/vars.bzl | 2 + src/starkware/CMakeLists.txt | 8 - src/starkware/cairo/BUILD | 1 + src/starkware/cairo/CMakeLists.txt | 7 - src/starkware/cairo/bootloaders/BUILD | 69 ++ .../cairo/bootloaders/CMakeLists.txt | 57 -- .../cairo/bootloaders/bootloader/BUILD | 42 + .../bootloaders/bootloader/CMakeLists.txt | 2 - .../bootloaders/program_hash_test_utils.cmake | 9 - .../cairo/bootloaders/simple_bootloader/BUILD | 37 + .../simple_bootloader/CMakeLists.txt | 2 - src/starkware/cairo/builtin_selection/BUILD | 47 + .../cairo/builtin_selection/CMakeLists.txt | 30 - src/starkware/cairo/cairo_verifier/BUILD | 60 ++ .../cairo/cairo_verifier/CMakeLists.txt | 21 - .../cairo_verifier_layout_program.bzl | 36 + .../cairo_verifier/cairo_verifier_layouts.bzl | 3 + .../cairo_verifier/layouts/all_cairo/BUILD | 21 + .../layouts/all_cairo/CMakeLists.txt | 25 - .../layouts/all_cairo/program_hash_test.py | 16 +- src/starkware/cairo/common/BUILD | 140 +++ src/starkware/cairo/common/CMakeLists.txt | 119 --- .../cairo/common/builtin_keccak/BUILD | 3 + .../cairo/common/builtin_keccak/keccak.cairo | 61 +- .../cairo/common/builtin_poseidon/BUILD | 3 + .../cairo/common/cairo_blake2s/BUILD | 25 + .../cairo/common/cairo_blake2s/CMakeLists.txt | 16 - src/starkware/cairo/common/cairo_keccak/BUILD | 7 + src/starkware/cairo/common/cairo_secp/BUILD | 6 + src/starkware/cairo/common/cairo_sha256/BUILD | 3 + src/starkware/cairo/common/keccak_utils/BUILD | 6 + src/starkware/cairo/lang/BUILD | 90 ++ src/starkware/cairo/lang/CMakeLists.txt | 8 - src/starkware/cairo/lang/VERSION | 2 +- src/starkware/cairo/lang/builtins/BUILD | 51 ++ .../cairo/lang/builtins/CMakeLists.txt | 47 - .../cairo/lang/builtins/bitwise/BUILD | 6 + src/starkware/cairo/lang/builtins/ec/BUILD | 22 + .../cairo/lang/builtins/ec/CMakeLists.txt | 15 - src/starkware/cairo/lang/builtins/hash/BUILD | 6 + .../cairo/lang/builtins/keccak/BUILD | 6 + .../cairo/lang/builtins/poseidon/BUILD | 6 + .../cairo/lang/builtins/range_check/BUILD | 20 + .../lang/builtins/range_check/CMakeLists.txt | 13 - .../cairo/lang/builtins/signature/BUILD | 21 + .../lang/builtins/signature/CMakeLists.txt | 14 - .../cairo/lang/cairo_cmake_rules.cmake | 134 --- src/starkware/cairo/lang/cairo_rules.bzl | 74 ++ src/starkware/cairo/lang/compiler/BUILD | 189 ++++ .../cairo/lang/compiler/CMakeLists.txt | 176 ---- src/starkware/cairo/lang/compiler/ast/BUILD | 18 + .../cairo/lang/compiler/ast/CMakeLists.txt | 14 - src/starkware/cairo/lang/compiler/lib/BUILD | 3 + .../cairo/lang/compiler/preprocessor/BUILD | 28 + .../lang/compiler/preprocessor/CMakeLists.txt | 26 - .../compiler/preprocessor/bool_expr/BUILD | 22 + .../preprocessor/bool_expr/CMakeLists.txt | 13 - .../preprocessor/preprocessor_test.py | 10 + .../lang/compiler/substitute_identifiers.py | 16 +- src/starkware/cairo/lang/compiler/vars.bzl | 1 + .../cairo/lang/create_cairo_lang_zip.py | 48 + .../cairo/lang/ide/vscode-cairo/package.json | 2 +- src/starkware/cairo/lang/lang.cmake | 71 -- src/starkware/cairo/lang/migrators/BUILD | 37 + .../cairo/lang/migrators/CMakeLists.txt | 35 - src/starkware/cairo/lang/scripts/BUILD | 25 + .../cairo/lang/scripts/CMakeLists.txt | 19 - .../cairo/lang/scripts/cairo-compile | 4 +- src/starkware/cairo/lang/scripts/cairo-format | 4 +- .../cairo/lang/scripts/cairo-hash-program | 4 +- .../cairo/lang/scripts/cairo-migrate | 4 +- .../lang/scripts/cairo-reconstruct-traceback | 4 +- src/starkware/cairo/lang/scripts/cairo-run | 4 +- src/starkware/cairo/lang/scripts/cairo-sharp | 4 +- src/starkware/cairo/lang/tracer/BUILD | 39 + .../cairo/lang/tracer/CMakeLists.txt | 33 - .../cairo/lang/tracer/third_party/BUILD | 3 + src/starkware/cairo/lang/vm/BUILD | 156 ++++ src/starkware/cairo/lang/vm/CMakeLists.txt | 137 --- .../cairo/lang/vm/virtual_machine_base.py | 4 +- src/starkware/cairo/sharp/BUILD | 71 ++ src/starkware/cairo/sharp/CMakeLists.txt | 58 -- .../cairo/stark_verifier/CMakeLists.txt | 2 - src/starkware/cairo/stark_verifier/air/BUILD | 64 ++ .../cairo/stark_verifier/air/CMakeLists.txt | 52 -- .../cairo/stark_verifier/air/layouts/BUILD | 12 + .../stark_verifier/air/layouts/CMakeLists.txt | 23 - .../air/layouts/all_cairo/BUILD | 3 + .../stark_verifier/air/layouts/dex/BUILD | 3 + .../air/layouts/layouts_gen.bzl | 23 + .../air/layouts/recursive/BUILD | 3 + .../stark_verifier/air/layouts/small/BUILD | 3 + .../stark_verifier/air/layouts/starknet/BUILD | 3 + .../air/layouts/starknet_with_keccak/BUILD | 3 + src/starkware/cairo/stark_verifier/core/BUILD | 65 ++ .../cairo/stark_verifier/core/CMakeLists.txt | 52 -- .../cairo/stark_verifier/core/fri/BUILD | 44 + .../stark_verifier/core/fri/CMakeLists.txt | 30 - src/starkware/cairo/vars.bzl | 6 + src/starkware/crypto/BUILD | 24 + src/starkware/crypto/CMakeLists.txt | 17 - src/starkware/crypto/signature/BUILD | 6 + src/starkware/eth/BUILD | 27 + src/starkware/eth/CMakeLists.txt | 21 - src/starkware/eth/web3_wrapper.py | 45 +- src/starkware/python/BUILD | 87 ++ src/starkware/python/CMakeLists.txt | 1 - src/starkware/python/CMakeLists_common.txt | 68 -- src/starkware/python/json_rpc/BUILD | 25 + src/starkware/python/json_rpc/CMakeLists.txt | 16 - src/starkware/python/utils.py | 1 + src/starkware/python/utils_test.py | 16 +- src/starkware/solidity/BUILD | 11 + src/starkware/solidity/CMakeLists.txt | 5 - src/starkware/solidity/components/BUILD | 30 + .../solidity/components/CMakeLists.txt | 24 - src/starkware/solidity/interfaces/BUILD | 40 + .../solidity/interfaces/CMakeLists.txt | 28 - src/starkware/solidity/libraries/BUILD | 19 + .../solidity/libraries/CMakeLists.txt | 11 - src/starkware/solidity/utils.cmake | 5 - src/starkware/starknet/BUILD | 1 + src/starkware/starknet/CMakeLists.txt | 17 - .../starknet/builtins/CMakeLists.txt | 1 - .../starknet/builtins/segment_arena/BUILD | 47 + .../builtins/segment_arena/CMakeLists.txt | 27 - .../segment_arena/segment_arena.cairo | 8 +- src/starkware/starknet/business_logic/BUILD | 27 + .../starknet/business_logic/CMakeLists.txt | 28 - .../starknet/business_logic/execution/BUILD | 92 ++ .../business_logic/execution/CMakeLists.txt | 81 -- .../execution/execute_entry_point.py | 167 ++-- .../business_logic/execution/objects.py | 8 +- .../execution/os_resources.json | 5 + .../business_logic/execution/os_usage.py | 12 +- .../starknet/business_logic/fact_state/BUILD | 69 ++ .../business_logic/fact_state/CMakeLists.txt | 62 -- .../fact_state/patricia_state.py | 6 +- .../business_logic/fact_state/state.py | 6 +- .../starknet/business_logic/state/BUILD | 25 + .../business_logic/state/CMakeLists.txt | 20 - .../starknet/business_logic/state/state.py | 72 +- .../business_logic/state/state_api.py | 4 +- .../business_logic/state/state_api_objects.py | 2 +- .../business_logic/state/test_utils.py | 48 + .../starknet/business_logic/transaction/BUILD | 87 ++ .../business_logic/transaction/CMakeLists.txt | 81 -- .../starknet/business_logic/utils.py | 21 +- src/starkware/starknet/cli/BUILD | 84 ++ src/starkware/starknet/cli/CMakeLists.txt | 83 -- src/starkware/starknet/cli/starknet_cli.py | 2 +- src/starkware/starknet/common/BUILD | 53 ++ src/starkware/starknet/common/CMakeLists.txt | 38 - .../starknet/common/new_syscalls.cairo | 13 + src/starkware/starknet/compiler/BUILD | 76 ++ .../starknet/compiler/CMakeLists.txt | 67 -- .../starknet/compiler/compiler.cmake | 18 - .../compiler/starknet_cmake_rules.cmake | 12 - src/starkware/starknet/compiler/v1/BUILD | 21 + ...0.0 => BUILD.cairo-compiler-archive-1.0.0} | 2 +- .../starknet/compiler/v1/CMakeLists.txt | 111 --- src/starkware/starknet/compiler/v1/compile.py | 2 +- .../compiler/v1/testnet2_libfuncs.json | 18 +- .../compiler/v1/testnet_libfuncs.json | 28 +- src/starkware/starknet/core/CMakeLists.txt | 2 - src/starkware/starknet/core/os/BUILD | 194 +++++ src/starkware/starknet/core/os/CMakeLists.txt | 70 -- .../starknet/core/os/block_hash/BUILD | 20 + .../core/os/block_hash/CMakeLists.txt | 17 - .../starknet/core/os/constants.cairo | 4 + .../starknet/core/os/contract_address/BUILD | 42 + .../core/os/contract_address/CMakeLists.txt | 36 - .../starknet/core/os/contract_class/BUILD | 53 ++ .../core/os/contract_class/CMakeLists.txt | 29 - .../os/contract_class/compiled_class_hash.py | 9 +- .../core/os/deprecated_syscall_handler.py | 771 +++++++++++++++++ .../starknet/core/os/execution/BUILD | 9 + .../core/os/execution/execute_syscalls.cairo | 2 +- .../starknet/core/os/os_config/BUILD | 66 ++ .../starknet/core/os/os_config/CMakeLists.txt | 59 -- src/starkware/starknet/core/os/os_input.py | 8 +- src/starkware/starknet/core/os/os_utils.py | 6 +- src/starkware/starknet/core/os/output.cairo | 2 + .../starknet/core/os/program_hash.json | 2 +- .../starknet/core/os/syscall_handler.py | 817 ++---------------- .../starknet/core/os/transaction_hash/BUILD | 44 + .../core/os/transaction_hash/CMakeLists.txt | 38 - .../starknet/core/test_contract/BUILD | 43 + .../core/test_contract/CMakeLists.txt | 28 - src/starkware/starknet/definitions/BUILD | 56 ++ .../starknet/definitions/CMakeLists.txt | 46 - .../starknet/definitions/constants.py | 15 +- .../starknet/definitions/error_codes.py | 3 + src/starkware/starknet/definitions/fields.py | 52 +- .../starknet/definitions/general_config.py | 15 - .../starknet/definitions/general_config.yml | 7 +- src/starkware/starknet/public/BUILD | 32 + src/starkware/starknet/public/CMakeLists.txt | 28 - src/starkware/starknet/scripts/BUILD | 15 + src/starkware/starknet/scripts/CMakeLists.txt | 12 - src/starkware/starknet/scripts/starknet | 7 +- .../starknet/scripts/starknet-class-hash | 4 +- .../scripts/starknet-compile-deprecated | 4 +- src/starkware/starknet/security/BUILD | 67 ++ .../starknet/security/CMakeLists.txt | 64 -- .../starknet/security/whitelists/BUILD | 3 + .../security/whitelists/cairo_secp.json | 7 + .../starknet/services/CMakeLists.txt | 2 - src/starkware/starknet/services/api/BUILD | 18 + .../starknet/services/api/CMakeLists.txt | 19 - .../services/api/contract_class/BUILD | 36 + .../api/contract_class/CMakeLists.txt | 31 - .../contracts/test_contract_cairo1.cairo | 171 ---- .../services/api/feeder_gateway/BUILD | 66 ++ .../api/feeder_gateway/CMakeLists.txt | 59 -- .../api/feeder_gateway/response_objects.py | 26 +- .../starknet/services/api/gateway/BUILD | 50 ++ .../services/api/gateway/CMakeLists.txt | 43 - .../services/api/gateway/transaction.py | 4 +- .../starknet/services/api/messages.py | 4 +- src/starkware/starknet/services/utils/BUILD | 22 + .../starknet/services/utils/CMakeLists.txt | 19 - src/starkware/starknet/solidity/BUILD | 57 ++ .../starknet/solidity/CMakeLists.txt | 27 - src/starkware/starknet/solidity/Output.sol | 5 +- src/starkware/starknet/solidity/Starknet.sol | 31 +- .../starknet/solidity/StarknetState.sol | 4 + .../starknet/solidity/solidity.cmake | 19 - src/starkware/starknet/starknet_rules.bzl | 122 +++ src/starkware/starknet/starknet_rules_v0.bzl | 14 + src/starkware/starknet/storage/BUILD | 19 + src/starkware/starknet/storage/CMakeLists.txt | 16 - src/starkware/starknet/testing/BUILD | 128 +++ src/starkware/starknet/testing/CMakeLists.txt | 111 --- src/starkware/starknet/testing/contract.py | 15 +- .../starknet/testing/contract_test.py | 20 +- .../starknet/testing/contract_utils.py | 21 +- src/starkware/starknet/testing/postman.py | 4 +- .../starknet/testing/postman_test.py | 3 +- src/starkware/starknet/testing/starknet.py | 185 ++-- .../starknet/testing/starknet_test.py | 75 +- src/starkware/starknet/testing/state.py | 102 ++- .../starknet/testing/test_cairo1.cairo | 25 + src/starkware/starknet/testing/test_utils.py | 19 +- .../starknet/third_party/CMakeLists.txt | 1 - .../starknet/third_party/open_zeppelin/BUILD | 30 + .../third_party/open_zeppelin/CMakeLists.txt | 19 - .../third_party/open_zeppelin/utils/BUILD | 10 + src/starkware/starknet/utils/BUILD | 12 + src/starkware/starknet/utils/CMakeLists.txt | 9 - src/starkware/starknet/wallets/BUILD | 40 + src/starkware/starknet/wallets/CMakeLists.txt | 36 - src/starkware/starkware_utils/BUILD | 162 ++++ src/starkware/starkware_utils/CMakeLists.txt | 49 -- .../starkware_utils/CMakeLists_common.txt | 102 --- .../starkware_utils/commitment_tree/BUILD | 3 + .../commitment_tree/CMakeLists.txt | 1 - .../commitment_tree/merkle_tree/BUILD | 8 + .../commitment_tree/patricia_tree/BUILD | 34 + .../patricia_tree/CMakeLists.txt | 23 - .../starkware_utils/field_validators.py | 8 +- src/starkware/starkware_utils/time/BUILD | 11 + .../starkware_utils/time/CMakeLists.txt | 16 - src/starkware/starkware_utils/vars.bzl | 6 + src/starkware/storage/BUILD | 120 +++ src/starkware/storage/CMakeLists.txt | 1 - src/starkware/storage/storage.cmake | 45 - src/starkware/storage/storage_base.cmake | 70 -- src/third_party/pip/BUILD | 19 + vars.bzl | 1 + 310 files changed, 6757 insertions(+), 5518 deletions(-) create mode 100644 BUILD delete mode 100644 CMakeLists.txt create mode 100644 WORKSPACE create mode 100644 bazel_utils/BUILD create mode 100644 bazel_utils/get_from_cairo_lang.bzl create mode 100644 bazel_utils/python.bzl create mode 100644 bazel_utils/python/BUILD create mode 100644 bazel_utils/python/defs.bzl create mode 100644 bazel_utils/solidity.bzl delete mode 100755 build.sh create mode 100644 load_cairo_lang.bzl rename src/starkware/starknet/core/os/execution/CMakeLists.txt => pypy3.9_archive_build_file.bzl (100%) create mode 100644 scripts/BUILD delete mode 100644 src/CMakeLists.txt delete mode 100644 src/cmake_utils/CMakeLists.txt delete mode 100644 src/cmake_utils/CMakeLists_common.txt delete mode 100644 src/cmake_utils/cmake_rules.cmake delete mode 100644 src/cmake_utils/copy_rules.cmake delete mode 100644 src/cmake_utils/exe_rules.cmake delete mode 100644 src/cmake_utils/pip_rules.cmake delete mode 100644 src/cmake_utils/python_rules.cmake delete mode 100644 src/cmake_utils/solidity_rules.cmake delete mode 100644 src/services/CMakeLists.txt delete mode 100644 src/services/everest/CMakeLists.txt delete mode 100644 src/services/everest/api/CMakeLists.txt create mode 100644 src/services/everest/api/feeder_gateway/BUILD delete mode 100644 src/services/everest/api/feeder_gateway/CMakeLists.txt create mode 100644 src/services/everest/api/gateway/BUILD delete mode 100644 src/services/everest/api/gateway/CMakeLists.txt create mode 100644 src/services/everest/business_logic/BUILD delete mode 100644 src/services/everest/business_logic/CMakeLists.txt create mode 100644 src/services/everest/definitions/BUILD delete mode 100644 src/services/everest/definitions/CMakeLists.txt create mode 100644 src/services/external_api/BUILD delete mode 100644 src/services/external_api/CMakeLists.txt create mode 100644 src/services/external_api/vars.bzl delete mode 100644 src/starkware/CMakeLists.txt create mode 100644 src/starkware/cairo/BUILD delete mode 100644 src/starkware/cairo/CMakeLists.txt create mode 100644 src/starkware/cairo/bootloaders/BUILD delete mode 100644 src/starkware/cairo/bootloaders/CMakeLists.txt create mode 100644 src/starkware/cairo/bootloaders/bootloader/BUILD delete mode 100644 src/starkware/cairo/bootloaders/bootloader/CMakeLists.txt delete mode 100644 src/starkware/cairo/bootloaders/program_hash_test_utils.cmake create mode 100644 src/starkware/cairo/bootloaders/simple_bootloader/BUILD delete mode 100644 src/starkware/cairo/bootloaders/simple_bootloader/CMakeLists.txt create mode 100644 src/starkware/cairo/builtin_selection/BUILD delete mode 100644 src/starkware/cairo/builtin_selection/CMakeLists.txt create mode 100644 src/starkware/cairo/cairo_verifier/BUILD delete mode 100644 src/starkware/cairo/cairo_verifier/CMakeLists.txt create mode 100644 src/starkware/cairo/cairo_verifier/cairo_verifier_layout_program.bzl create mode 100644 src/starkware/cairo/cairo_verifier/cairo_verifier_layouts.bzl create mode 100644 src/starkware/cairo/cairo_verifier/layouts/all_cairo/BUILD delete mode 100644 src/starkware/cairo/cairo_verifier/layouts/all_cairo/CMakeLists.txt create mode 100644 src/starkware/cairo/common/BUILD delete mode 100644 src/starkware/cairo/common/CMakeLists.txt create mode 100644 src/starkware/cairo/common/builtin_keccak/BUILD create mode 100644 src/starkware/cairo/common/builtin_poseidon/BUILD create mode 100644 src/starkware/cairo/common/cairo_blake2s/BUILD delete mode 100644 src/starkware/cairo/common/cairo_blake2s/CMakeLists.txt create mode 100644 src/starkware/cairo/common/cairo_keccak/BUILD create mode 100644 src/starkware/cairo/common/cairo_secp/BUILD create mode 100644 src/starkware/cairo/common/cairo_sha256/BUILD create mode 100644 src/starkware/cairo/common/keccak_utils/BUILD create mode 100644 src/starkware/cairo/lang/BUILD delete mode 100644 src/starkware/cairo/lang/CMakeLists.txt create mode 100644 src/starkware/cairo/lang/builtins/BUILD delete mode 100644 src/starkware/cairo/lang/builtins/CMakeLists.txt create mode 100644 src/starkware/cairo/lang/builtins/bitwise/BUILD create mode 100644 src/starkware/cairo/lang/builtins/ec/BUILD delete mode 100644 src/starkware/cairo/lang/builtins/ec/CMakeLists.txt create mode 100644 src/starkware/cairo/lang/builtins/hash/BUILD create mode 100644 src/starkware/cairo/lang/builtins/keccak/BUILD create mode 100644 src/starkware/cairo/lang/builtins/poseidon/BUILD create mode 100644 src/starkware/cairo/lang/builtins/range_check/BUILD delete mode 100644 src/starkware/cairo/lang/builtins/range_check/CMakeLists.txt create mode 100644 src/starkware/cairo/lang/builtins/signature/BUILD delete mode 100644 src/starkware/cairo/lang/builtins/signature/CMakeLists.txt delete mode 100644 src/starkware/cairo/lang/cairo_cmake_rules.cmake create mode 100644 src/starkware/cairo/lang/cairo_rules.bzl create mode 100644 src/starkware/cairo/lang/compiler/BUILD delete mode 100644 src/starkware/cairo/lang/compiler/CMakeLists.txt create mode 100644 src/starkware/cairo/lang/compiler/ast/BUILD delete mode 100644 src/starkware/cairo/lang/compiler/ast/CMakeLists.txt create mode 100644 src/starkware/cairo/lang/compiler/lib/BUILD create mode 100644 src/starkware/cairo/lang/compiler/preprocessor/BUILD delete mode 100644 src/starkware/cairo/lang/compiler/preprocessor/CMakeLists.txt create mode 100644 src/starkware/cairo/lang/compiler/preprocessor/bool_expr/BUILD delete mode 100644 src/starkware/cairo/lang/compiler/preprocessor/bool_expr/CMakeLists.txt create mode 100644 src/starkware/cairo/lang/compiler/vars.bzl create mode 100644 src/starkware/cairo/lang/create_cairo_lang_zip.py delete mode 100644 src/starkware/cairo/lang/lang.cmake create mode 100644 src/starkware/cairo/lang/migrators/BUILD delete mode 100644 src/starkware/cairo/lang/migrators/CMakeLists.txt create mode 100644 src/starkware/cairo/lang/scripts/BUILD delete mode 100644 src/starkware/cairo/lang/scripts/CMakeLists.txt create mode 100644 src/starkware/cairo/lang/tracer/BUILD delete mode 100644 src/starkware/cairo/lang/tracer/CMakeLists.txt create mode 100644 src/starkware/cairo/lang/tracer/third_party/BUILD create mode 100644 src/starkware/cairo/lang/vm/BUILD delete mode 100644 src/starkware/cairo/lang/vm/CMakeLists.txt create mode 100644 src/starkware/cairo/sharp/BUILD delete mode 100644 src/starkware/cairo/sharp/CMakeLists.txt delete mode 100644 src/starkware/cairo/stark_verifier/CMakeLists.txt create mode 100644 src/starkware/cairo/stark_verifier/air/BUILD delete mode 100644 src/starkware/cairo/stark_verifier/air/CMakeLists.txt create mode 100644 src/starkware/cairo/stark_verifier/air/layouts/BUILD delete mode 100644 src/starkware/cairo/stark_verifier/air/layouts/CMakeLists.txt create mode 100644 src/starkware/cairo/stark_verifier/air/layouts/all_cairo/BUILD create mode 100644 src/starkware/cairo/stark_verifier/air/layouts/dex/BUILD create mode 100644 src/starkware/cairo/stark_verifier/air/layouts/layouts_gen.bzl create mode 100644 src/starkware/cairo/stark_verifier/air/layouts/recursive/BUILD create mode 100644 src/starkware/cairo/stark_verifier/air/layouts/small/BUILD create mode 100644 src/starkware/cairo/stark_verifier/air/layouts/starknet/BUILD create mode 100644 src/starkware/cairo/stark_verifier/air/layouts/starknet_with_keccak/BUILD create mode 100644 src/starkware/cairo/stark_verifier/core/BUILD delete mode 100644 src/starkware/cairo/stark_verifier/core/CMakeLists.txt create mode 100644 src/starkware/cairo/stark_verifier/core/fri/BUILD delete mode 100644 src/starkware/cairo/stark_verifier/core/fri/CMakeLists.txt create mode 100644 src/starkware/cairo/vars.bzl create mode 100644 src/starkware/crypto/BUILD delete mode 100644 src/starkware/crypto/CMakeLists.txt create mode 100644 src/starkware/crypto/signature/BUILD create mode 100644 src/starkware/eth/BUILD delete mode 100644 src/starkware/eth/CMakeLists.txt create mode 100644 src/starkware/python/BUILD delete mode 100644 src/starkware/python/CMakeLists.txt delete mode 100644 src/starkware/python/CMakeLists_common.txt create mode 100644 src/starkware/python/json_rpc/BUILD delete mode 100644 src/starkware/python/json_rpc/CMakeLists.txt create mode 100644 src/starkware/solidity/BUILD delete mode 100644 src/starkware/solidity/CMakeLists.txt create mode 100644 src/starkware/solidity/components/BUILD delete mode 100644 src/starkware/solidity/components/CMakeLists.txt create mode 100644 src/starkware/solidity/interfaces/BUILD delete mode 100644 src/starkware/solidity/interfaces/CMakeLists.txt create mode 100644 src/starkware/solidity/libraries/BUILD delete mode 100644 src/starkware/solidity/libraries/CMakeLists.txt delete mode 100644 src/starkware/solidity/utils.cmake create mode 100644 src/starkware/starknet/BUILD delete mode 100644 src/starkware/starknet/CMakeLists.txt delete mode 100644 src/starkware/starknet/builtins/CMakeLists.txt create mode 100644 src/starkware/starknet/builtins/segment_arena/BUILD delete mode 100644 src/starkware/starknet/builtins/segment_arena/CMakeLists.txt create mode 100644 src/starkware/starknet/business_logic/BUILD delete mode 100644 src/starkware/starknet/business_logic/CMakeLists.txt create mode 100644 src/starkware/starknet/business_logic/execution/BUILD delete mode 100644 src/starkware/starknet/business_logic/execution/CMakeLists.txt create mode 100644 src/starkware/starknet/business_logic/fact_state/BUILD delete mode 100644 src/starkware/starknet/business_logic/fact_state/CMakeLists.txt create mode 100644 src/starkware/starknet/business_logic/state/BUILD delete mode 100644 src/starkware/starknet/business_logic/state/CMakeLists.txt create mode 100644 src/starkware/starknet/business_logic/state/test_utils.py create mode 100644 src/starkware/starknet/business_logic/transaction/BUILD delete mode 100644 src/starkware/starknet/business_logic/transaction/CMakeLists.txt create mode 100644 src/starkware/starknet/cli/BUILD delete mode 100644 src/starkware/starknet/cli/CMakeLists.txt create mode 100644 src/starkware/starknet/common/BUILD delete mode 100644 src/starkware/starknet/common/CMakeLists.txt create mode 100644 src/starkware/starknet/compiler/BUILD delete mode 100644 src/starkware/starknet/compiler/CMakeLists.txt delete mode 100644 src/starkware/starknet/compiler/compiler.cmake delete mode 100644 src/starkware/starknet/compiler/starknet_cmake_rules.cmake create mode 100644 src/starkware/starknet/compiler/v1/BUILD rename src/starkware/starknet/compiler/v1/{BUILD.cairo-lang-1.0.0 => BUILD.cairo-compiler-archive-1.0.0} (76%) delete mode 100644 src/starkware/starknet/compiler/v1/CMakeLists.txt delete mode 100644 src/starkware/starknet/core/CMakeLists.txt create mode 100644 src/starkware/starknet/core/os/BUILD delete mode 100644 src/starkware/starknet/core/os/CMakeLists.txt create mode 100644 src/starkware/starknet/core/os/block_hash/BUILD delete mode 100644 src/starkware/starknet/core/os/block_hash/CMakeLists.txt create mode 100644 src/starkware/starknet/core/os/contract_address/BUILD delete mode 100644 src/starkware/starknet/core/os/contract_address/CMakeLists.txt create mode 100644 src/starkware/starknet/core/os/contract_class/BUILD delete mode 100644 src/starkware/starknet/core/os/contract_class/CMakeLists.txt create mode 100644 src/starkware/starknet/core/os/deprecated_syscall_handler.py create mode 100644 src/starkware/starknet/core/os/execution/BUILD create mode 100644 src/starkware/starknet/core/os/os_config/BUILD delete mode 100644 src/starkware/starknet/core/os/os_config/CMakeLists.txt create mode 100644 src/starkware/starknet/core/os/transaction_hash/BUILD delete mode 100644 src/starkware/starknet/core/os/transaction_hash/CMakeLists.txt create mode 100644 src/starkware/starknet/core/test_contract/BUILD delete mode 100644 src/starkware/starknet/core/test_contract/CMakeLists.txt create mode 100644 src/starkware/starknet/definitions/BUILD delete mode 100644 src/starkware/starknet/definitions/CMakeLists.txt create mode 100644 src/starkware/starknet/public/BUILD delete mode 100644 src/starkware/starknet/public/CMakeLists.txt create mode 100644 src/starkware/starknet/scripts/BUILD delete mode 100644 src/starkware/starknet/scripts/CMakeLists.txt mode change 100644 => 100755 src/starkware/starknet/scripts/starknet-class-hash create mode 100644 src/starkware/starknet/security/BUILD delete mode 100644 src/starkware/starknet/security/CMakeLists.txt create mode 100644 src/starkware/starknet/security/whitelists/BUILD delete mode 100644 src/starkware/starknet/services/CMakeLists.txt create mode 100644 src/starkware/starknet/services/api/BUILD delete mode 100644 src/starkware/starknet/services/api/CMakeLists.txt create mode 100644 src/starkware/starknet/services/api/contract_class/BUILD delete mode 100644 src/starkware/starknet/services/api/contract_class/CMakeLists.txt delete mode 100644 src/starkware/starknet/services/api/contract_class/contracts/test_contract_cairo1.cairo create mode 100644 src/starkware/starknet/services/api/feeder_gateway/BUILD delete mode 100644 src/starkware/starknet/services/api/feeder_gateway/CMakeLists.txt create mode 100644 src/starkware/starknet/services/api/gateway/BUILD delete mode 100644 src/starkware/starknet/services/api/gateway/CMakeLists.txt create mode 100644 src/starkware/starknet/services/utils/BUILD delete mode 100644 src/starkware/starknet/services/utils/CMakeLists.txt create mode 100644 src/starkware/starknet/solidity/BUILD delete mode 100644 src/starkware/starknet/solidity/CMakeLists.txt delete mode 100644 src/starkware/starknet/solidity/solidity.cmake create mode 100644 src/starkware/starknet/starknet_rules.bzl create mode 100644 src/starkware/starknet/starknet_rules_v0.bzl create mode 100644 src/starkware/starknet/storage/BUILD delete mode 100644 src/starkware/starknet/storage/CMakeLists.txt create mode 100644 src/starkware/starknet/testing/BUILD delete mode 100644 src/starkware/starknet/testing/CMakeLists.txt create mode 100644 src/starkware/starknet/testing/test_cairo1.cairo delete mode 100644 src/starkware/starknet/third_party/CMakeLists.txt create mode 100644 src/starkware/starknet/third_party/open_zeppelin/BUILD delete mode 100644 src/starkware/starknet/third_party/open_zeppelin/CMakeLists.txt create mode 100644 src/starkware/starknet/third_party/open_zeppelin/utils/BUILD create mode 100644 src/starkware/starknet/utils/BUILD delete mode 100644 src/starkware/starknet/utils/CMakeLists.txt create mode 100644 src/starkware/starknet/wallets/BUILD delete mode 100644 src/starkware/starknet/wallets/CMakeLists.txt create mode 100644 src/starkware/starkware_utils/BUILD delete mode 100644 src/starkware/starkware_utils/CMakeLists.txt delete mode 100644 src/starkware/starkware_utils/CMakeLists_common.txt create mode 100644 src/starkware/starkware_utils/commitment_tree/BUILD delete mode 100644 src/starkware/starkware_utils/commitment_tree/CMakeLists.txt create mode 100644 src/starkware/starkware_utils/commitment_tree/merkle_tree/BUILD create mode 100644 src/starkware/starkware_utils/commitment_tree/patricia_tree/BUILD delete mode 100644 src/starkware/starkware_utils/commitment_tree/patricia_tree/CMakeLists.txt create mode 100644 src/starkware/starkware_utils/time/BUILD delete mode 100644 src/starkware/starkware_utils/time/CMakeLists.txt create mode 100644 src/starkware/starkware_utils/vars.bzl create mode 100644 src/starkware/storage/BUILD delete mode 100644 src/starkware/storage/CMakeLists.txt delete mode 100644 src/starkware/storage/storage.cmake delete mode 100644 src/starkware/storage/storage_base.cmake create mode 100644 src/third_party/pip/BUILD create mode 100644 vars.bzl diff --git a/BUILD b/BUILD new file mode 100644 index 00000000..cb66a1ed --- /dev/null +++ b/BUILD @@ -0,0 +1,20 @@ +load("vars.bzl", "ADDITIONAL_IMPORTS") + +exports_files([ + ".clang-format", + "package.json", + "yarn_ganache.lock", +] + glob(["*.py"])) + +# The 'starkware' library adds 'src' to PYTHONPATH. +# The library on its own does not add any dependencies. +# This library is needed to allow us to use "import starkware.foo" instead of +# "import src.starkware.foo". +py_library( + name = "starkware", + srcs = [], + imports = [ + "src", + ] + ADDITIONAL_IMPORTS, + visibility = ["//visibility:public"], +) diff --git a/CMakeLists.txt b/CMakeLists.txt deleted file mode 100644 index 42f8f54d..00000000 --- a/CMakeLists.txt +++ /dev/null @@ -1,22 +0,0 @@ -cmake_minimum_required (VERSION 3.22) - -set (PYTHON_COMMAND python3.9) - -project(CairoLang VERSION 0.1.0) -include(CTest) - -enable_testing() - -if (NOT DEFINED CMAKE_BUILD_TYPE) - set(CMAKE_BUILD_TYPE Debug) -endif() - -# Python library macro. -find_program(PYTHON "python3") - -include("src/cmake_utils/cmake_rules.cmake") -include("src/cmake_utils/solidity_rules.cmake") -include("src/starkware/cairo/lang/cairo_cmake_rules.cmake") -include("src/starkware/starknet/compiler/starknet_cmake_rules.cmake") - -add_subdirectory(src) diff --git a/Dockerfile b/Dockerfile index da2ae455..5e817ba2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,9 +1,9 @@ FROM ciimage/python:3.9 -RUN apt update -RUN apt install -y make libgmp3-dev g++ python3-pip python3.9-dev python3.9-venv npm -# Installing cmake via apt doesn't bring the most up-to-date version. -RUN pip install cmake==3.22 +COPY ./docker_common_deps.sh /app/ +WORKDIR /app/ +RUN ./docker_common_deps.sh +RUN apt-get install -y git libgmp3-dev python3-pip python3.9-venv python3.9-dev npm # Install solc and ganache RUN curl https://binaries.soliditylang.org/linux-amd64/solc-linux-amd64-v0.6.12+commit.27d51765 -o /usr/local/bin/solc-0.6.12 @@ -11,19 +11,16 @@ RUN echo 'f6cb519b01dabc61cab4c184a3db11aa591d18151e362fcae850e42cffdfb09a /usr/ RUN chmod +x /usr/local/bin/solc-0.6.12 RUN npm install -g --unsafe-perm ganache@7.4.3 -COPY . /app/ - -# Build. -WORKDIR /app/ -RUN ./build.sh +COPY . /app -WORKDIR /app/build/Release -RUN make all -j8 +# Build the cairo-lang package. +RUN bazel build //src/starkware/cairo/lang:create_cairo_lang_package_zip +RUN build/bazelbin/src/starkware/cairo/lang/create_cairo_lang_package_zip -# Run tests. -RUN ctest -V -j8 +# Build and test all the targets. +RUN bazel build //... +RUN bazel test //... -WORKDIR /app/ RUN src/starkware/cairo/lang/package_test/run_test.sh # Build the Visual Studio Code extension. diff --git a/README.md b/README.md index c4edfbc4..b3530ef4 100644 --- a/README.md +++ b/README.md @@ -54,7 +54,7 @@ Once the docker image is built, you can fetch the python package zip file using: ```bash > container_id=$(docker create cairo) -> docker cp ${container_id}:/app/cairo-lang-0.11.0.2.zip . +> docker cp ${container_id}:/app/cairo-lang-0.11.1.zip . > docker rm -v ${container_id} ``` diff --git a/WORKSPACE b/WORKSPACE new file mode 100644 index 00000000..c9e3940c --- /dev/null +++ b/WORKSPACE @@ -0,0 +1,89 @@ +load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive", "http_file") +load("//bazel_utils:get_from_cairo_lang.bzl", "get_from_cairo_lang") + +http_archive( + name = "build_bazel_rules_nodejs", + sha256 = "f10a3a12894fc3c9bf578ee5a5691769f6805c4be84359681a785a0c12e8d2b6", + urls = [ + "https://github.com/bazelbuild/rules_nodejs/releases/download/5.5.3/rules_nodejs-5.5.3.tar.gz", + ], +) + +load("@build_bazel_rules_nodejs//:repositories.bzl", "build_bazel_rules_nodejs_dependencies") + +build_bazel_rules_nodejs_dependencies() + +load("@build_bazel_rules_nodejs//:index.bzl", "yarn_install") + +yarn_install( + name = "npm_ganache", + package_json = "//:package.json", + yarn_lock = "//:yarn_ganache.lock", +) + +http_file( + name = "solc-0.6.12", + downloaded_file_path = "solc-0.6.12", + executable = True, + sha256 = "f6cb519b01dabc61cab4c184a3db11aa591d18151e362fcae850e42cffdfb09a", + urls = [ + "https://binaries.soliditylang.org/linux-amd64/solc-linux-amd64-v0.6.12+commit.27d51765", + "https://starkware-third-party.s3.us-east-2.amazonaws.com/ethereum/solc-0.6.12", + ], +) + +http_archive( + name = "rules_python", + sha256 = "a3a6e99f497be089f81ec082882e40246bfd435f52f4e82f37e89449b04573f6", + strip_prefix = "rules_python-0.10.2", + url = "https://github.com/bazelbuild/rules_python/archive/refs/tags/0.10.2.tar.gz", +) + +http_archive( + name = "cairo-compiler-archive-1.0.0", + build_file = get_from_cairo_lang("//src/starkware/starknet/compiler/v1:BUILD.cairo-compiler-archive-1.0.0"), + strip_prefix = "cairo", + url = "https://github.com/starkware-libs/cairo/releases/download/v1.0.0-rc0/release-x86_64-unknown-linux-musl.tar.gz", +) + +http_archive( + name = "pypy3.9", + build_file = "//:pypy3.9_archive_build_file.bzl", + sha256 = "46818cb3d74b96b34787548343d266e2562b531ddbaf330383ba930ff1930ed5", + strip_prefix = "pypy3.9-v7.3.9-linux64", + url = "https://downloads.python.org/pypy/pypy3.9-v7.3.9-linux64.tar.bz2", +) + +register_toolchains("//bazel_utils/python:py_stub_toolchain") + +load("@rules_python//python:repositories.bzl", "python_register_toolchains") + +python_register_toolchains( + name = "python3", + python_version = "3.9", + register_toolchains = False, +) + +# Install python pip packages in a lazy way. +load("@python3//:defs.bzl", "interpreter") +load("@rules_python//python:pip.bzl", "pip_parse") + +pip_parse( + name = "cpython_reqs", + python_interpreter_target = interpreter, + requirements_lock = "//scripts:requirements.txt", +) + +load("@cpython_reqs//:requirements.bzl", "install_deps") + +install_deps() + +pip_parse( + name = "pypy_reqs", + python_interpreter_target = "@pypy3.9//:bin/pypy3", + requirements_lock = "//scripts:pypy-requirements.txt", +) + +load("@pypy_reqs//:requirements.bzl", pypy_install_deps = "install_deps") + +pypy_install_deps() diff --git a/bazel_utils/BUILD b/bazel_utils/BUILD new file mode 100644 index 00000000..61ff2e99 --- /dev/null +++ b/bazel_utils/BUILD @@ -0,0 +1,37 @@ +load("//bazel_utils:python.bzl", "py_exe") + +package(default_visibility = ["//visibility:public"]) + +exports_files(["pytest_wrapper.py"]) + +py_binary( + name = "gen_python_exe", + srcs = ["gen_python_exe.py"], + main = "gen_python_exe.py", +) + +py_binary( + name = "solc_wrapper", + srcs = ["solc_wrapper.py"], +) + +sh_binary( + name = "solc-0.6.12", + srcs = ["@solc-0.6.12//file"], +) + +py_library( + name = "default_extract_artifacts_lib", + srcs = [ + "__init__.py", + "extract_artifacts.py", + ], + visibility = ["//visibility:public"], + deps = [], +) + +py_exe( + name = "default_extract_artifacts_exe", + module = "bazel_utils.extract_artifacts", + deps = ["default_extract_artifacts_lib"], +) diff --git a/bazel_utils/gen_python_exe.py b/bazel_utils/gen_python_exe.py index 6bd1250a..b645ba4c 100755 --- a/bazel_utils/gen_python_exe.py +++ b/bazel_utils/gen_python_exe.py @@ -12,10 +12,24 @@ def main(): parser = ArgumentParser(description="Generates an executable file for py_exe().") parser.add_argument("--name", help="The name of the target", required=True) parser.add_argument("--module", help="The name of the module to run", required=True) + parser.add_argument( + "--py_binary_path", + help="Path where the py_binary is defined by Bazel. For rlocation", + required=True, + ) + parser.add_argument( + "--output_py", help="Path for the output of the python module", required=True + ) + parser.add_argument( + "--output_sh", + help="Path for the output of the shell binary that wraps the py_binary", + required=True, + ) args = parser.parse_args() - print( - f"""\ + with open(args.output_py, "w") as f: + f.write( + f"""\ import os import subprocess import sys @@ -26,7 +40,29 @@ def main(): proc = subprocess.run(cmd) sys.exit(proc.returncode) """ - ) + ) + + with open(args.output_sh, "w") as f: + f.write( + f"""\ +#!/bin/bash + +# --- begin runfiles.bash initialization v2 --- +# Copy-pasted from the Bazel Bash runfiles library v2. +set -uo pipefail; f=bazel_tools/tools/bash/runfiles/runfiles.bash +source "${{RUNFILES_DIR:-/dev/null}}/$f" 2>/dev/null || \ + source "$(grep -sm1 "^$f " "${{RUNFILES_MANIFEST_FILE:-/dev/null}}" | cut -f2- -d' ')" \ + 2>/dev/null || \ + source "$0.runfiles/$f" 2>/dev/null || \ + source "$(grep -sm1 "^$f " "$0.runfiles_manifest" | cut -f2- -d' ')" 2>/dev/null || \ + source "$(grep -sm1 "^$f " "$0.exe.runfiles_manifest" | cut -f2- -d' ')" 2>/dev/null || \ + {{ echo>&2 "ERROR: cannot find $f"; exit 1; }}; f=; set -e +# --- end runfiles.bash initialization v2 --- + +unset PYTHONPATH +exec $(rlocation {args.py_binary_path}) "$@" +""" + ) if __name__ == "__main__": diff --git a/bazel_utils/get_from_cairo_lang.bzl b/bazel_utils/get_from_cairo_lang.bzl new file mode 100644 index 00000000..8aa7a09a --- /dev/null +++ b/bazel_utils/get_from_cairo_lang.bzl @@ -0,0 +1,2 @@ +def get_from_cairo_lang(label): + return label diff --git a/bazel_utils/python.bzl b/bazel_utils/python.bzl new file mode 100644 index 00000000..89d078ef --- /dev/null +++ b/bazel_utils/python.bzl @@ -0,0 +1,133 @@ +"""Python related macros and rules.""" + +load( + "//bazel_utils/python:defs.bzl", + "cpython_binary", + "cpython_test", + "pypy_binary", + "pypy_test", + "requirement", +) + +IPYTHON_EXE_SUFFIX = "_ipython" + +def pytest_test( + name, + srcs, + deps = [], + args = [], + data = [], + code_coverage = True, + is_pypy = False, + legacy_create_init = False, + **kwargs): + """ + Calls pytest. + """ + + if "timeout" not in kwargs: + kwargs["timeout"] = "eternal" + + (pypy_test if is_pypy else cpython_test)( + name = name, + srcs = [ + "//bazel_utils:pytest_wrapper.py", + ] + srcs, + main = "//bazel_utils:pytest_wrapper.py", + # Args passed to the tests using parser.addoption() need to be sent after the tested + # files so pytest recognizes them. + args = ["$(location :%s)" % x for x in srcs] + ["--color=yes"] + args, + python_version = "PY3", + srcs_version = "PY3", + deps = deps + [requirement("pytest"), "//:starkware"], + data = data, + legacy_create_init = legacy_create_init, + **kwargs + ) + +def _py_wrappers_impl(ctx): + ctx.actions.run( + outputs = [ctx.outputs.py_wrapper, ctx.outputs.sh_wrapper], + executable = ctx.executable._gen_python_exe, + arguments = [ + "--py_binary_path", + "%s/%s/%s" % ( + ctx.label.workspace_name or ctx.workspace_name, + ctx.label.package, + ctx.attr.py_binary_name, + ), + "--output_py", + ctx.outputs.py_wrapper.path, + "--output_sh", + ctx.outputs.sh_wrapper.path, + "--name", + ctx.attr.py_exe_name, + "--module", + ctx.attr.module, + ], + ) + +_py_wrappers = rule( + implementation = _py_wrappers_impl, + attrs = { + "py_wrapper": attr.output(), + "sh_wrapper": attr.output(), + "py_binary_name": attr.string(), + "_gen_python_exe": attr.label( + cfg = "exec", + default = "//bazel_utils:gen_python_exe", + executable = True, + ), + "py_exe_name": attr.string(), + "module": attr.string(), + }, +) + +def py_exe( + name, + module, + deps = [], + additional_srcs = [], + args = [], + data = [], + env = {}, + is_pypy = False, + legacy_create_init = False, + **kwargs): + py_exe_module = name + "_exe.py" + sh_file = name + "_exe.sh" + py_binary_name = name + "_py_binary" + + _py_wrappers( + name = name + "_wrappers", + py_exe_name = name, + module = module, + py_binary_name = py_binary_name, + py_wrapper = py_exe_module, + sh_wrapper = sh_file, + ) + + (pypy_binary if is_pypy else cpython_binary)( + name = py_binary_name, + srcs = [ + py_exe_module, + ] + additional_srcs, + main = py_exe_module, + python_version = "PY3", + srcs_version = "PY3", + deps = deps + ["//:starkware"], + data = data, + legacy_create_init = legacy_create_init, + **kwargs + ) + + native.sh_binary( + name = name, + srcs = [sh_file], + data = [ + py_binary_name, + "@bazel_tools//tools/bash/runfiles", + ], + args = args, + env = env, + ) diff --git a/bazel_utils/python/BUILD b/bazel_utils/python/BUILD new file mode 100644 index 00000000..a5d3f4d2 --- /dev/null +++ b/bazel_utils/python/BUILD @@ -0,0 +1,41 @@ +load("@rules_python//python:defs.bzl", "py_runtime", "py_runtime_pair") +load(":defs.bzl", "python_version_info") + +python_version_info( + name = "python_version", + build_setting_default = "", + visibility = ["//visibility:public"], +) + +config_setting( + name = "pypy", + flag_values = {":python_version": "pypy"}, +) + +config_setting( + name = "cpython", + flag_values = {":python_version": "cpython"}, +) + +py_runtime( + name = "python_stub_runtime", + files = [ + "@bazel_tools//tools/bash/runfiles", + "@python3//:files", + ], + interpreter = "//bazel_utils/python:stub.sh", + python_version = "PY3", + visibility = ["//visibility:public"], +) + +py_runtime_pair( + name = "py_stub_runtime_pair", + py2_runtime = None, + py3_runtime = ":python_stub_runtime", +) + +toolchain( + name = "py_stub_toolchain", + toolchain = ":py_stub_runtime_pair", + toolchain_type = "@bazel_tools//tools/python:toolchain_type", +) diff --git a/bazel_utils/python/defs.bzl b/bazel_utils/python/defs.bzl new file mode 100644 index 00000000..a71c384c --- /dev/null +++ b/bazel_utils/python/defs.bzl @@ -0,0 +1,117 @@ +load("@rules_python//python:defs.bzl", "py_binary", "py_library", "py_test") + +_PythonVersionInfo = provider(fields = ["interpreter"]) + +def _python_version_info_impl(ctx): + return [_PythonVersionInfo(interpreter = ctx.build_setting_value)] + +python_version_info = rule( + implementation = _python_version_info_impl, + build_setting = config.string(flag = True), +) + +def _set_python_version_impl(settings, attr): + return {"//bazel_utils/python:python_version": attr.python_version} + +_set_python_version = transition( + implementation = _set_python_version_impl, + inputs = [], + outputs = ["//bazel_utils/python:python_version"], +) + +def _python_version_deps_impl(ctx): + library = ctx.attr.library[0] + return [ + DefaultInfo( + files = library[DefaultInfo].files, + runfiles = library[DefaultInfo].default_runfiles, + ), + library[PyInfo], + library[OutputGroupInfo], + ] + +_python_version_deps = rule( + implementation = _python_version_deps_impl, + attrs = { + "python_version": attr.string(), + "library": attr.label(cfg = _set_python_version, providers = [PyInfo]), + "_allowlist_function_transition": attr.label( + default = "@bazel_tools//tools/allowlists/function_transition_allowlist", + ), + }, +) + +def unify_requirements(repo_to_requirements): + requirements = depset( + transitive = [ + depset([req[len("@" + repo + "_"):-len("//:pkg")] for req in requirements]) + for repo, requirements in repo_to_requirements.items() + ], + ) + return requirements.to_list() + +def requirement(name): + return "//src/third_party/pip:" + name + +def _pypy_rule(py_rule, name, main = None, srcs = [], data = [], deps = [], **kwargs): + py_library( + name = "_" + name + "_deps", + data = data, + deps = deps, + ) + _python_version_deps( + name = "_pypy_" + name, + python_version = "pypy", + library = ":_" + name + "_deps", + ) + new_main = name + "_uses_pypy_.py" + + # Copying the main file to another path might cause bugs in executables that rely on the path + # of the main file and are located in a different directory from where they are defined. + # This will never happen for rules defined by py_exe and pytest_test. + native.genrule( + name = "generate_" + new_main, + outs = [new_main], + srcs = [main or (name + ".py")], + cmd = "cp $(SRCS) $(OUTS)", + ) + py_rule( + name = name, + main = new_main, + data = [ + "@pypy3.9//:files", + "@pypy3.9//:python3", + ], + srcs = srcs + [new_main], + deps = [":_pypy_" + name], + **kwargs + ) + +def _cpython_rule(py_rule, name, data = [], deps = [], **kwargs): + py_library( + name = "_" + name + "_deps", + data = data, + deps = deps, + ) + _python_version_deps( + name = "_cpython_" + name, + python_version = "cpython", + library = ":_" + name + "_deps", + ) + py_rule( + name = name, + deps = [":_cpython_" + name], + **kwargs + ) + +def pypy_binary(name, **kwargs): + _pypy_rule(py_binary, name = name, **kwargs) + +def pypy_test(name, **kwargs): + _pypy_rule(py_test, name = name, **kwargs) + +def cpython_binary(name, **kwargs): + _cpython_rule(py_binary, name = name, **kwargs) + +def cpython_test(name, **kwargs): + _cpython_rule(py_test, name = name, **kwargs) diff --git a/bazel_utils/solidity.bzl b/bazel_utils/solidity.bzl new file mode 100644 index 00000000..b4f2f71f --- /dev/null +++ b/bazel_utils/solidity.bzl @@ -0,0 +1,123 @@ +SolidityInfo = provider(fields = ["transitive_sources"]) + +def get_transitive_solidity_srcs(srcs, deps): + """ + Returns the Solidity source files for a target and its transitive dependencies. + """ + return depset(srcs, transitive = [dep[SolidityInfo].transitive_sources for dep in deps]) + +# Rule for a library of Solidity files (similar to py_library). + +def _solidity_library_impl(ctx): + trans_srcs = get_transitive_solidity_srcs(srcs = ctx.files.srcs, deps = ctx.attr.deps) + return [ + SolidityInfo(transitive_sources = trans_srcs), + ] + +sol_library = rule( + implementation = _solidity_library_impl, + attrs = { + "srcs": attr.label_list(allow_files = [".sol"]), + "deps": attr.label_list(providers = [SolidityInfo]), + }, +) + +def _sol_contract_impl(ctx): + """ + Compiles a Solidity contract. + """ + trans_srcs = get_transitive_solidity_srcs(srcs = [], deps = ctx.attr.deps) + srcs_list = trans_srcs.to_list() + + combined_json = ctx.actions.declare_file("_%s/combined.json" % ctx.attr.name) + + if ctx.executable.solc_exe.basename == "solc-0.6.12": + ctx.actions.run( + executable = ctx.executable._solc_wrapper, + arguments = [ + "--solc", + ctx.executable.solc_exe.path, + "--optimize_runs", + str(ctx.attr.optimize_runs), + "--base_path", + ctx.attr.include_path, + "--output", + combined_json.dirname, + "--srcs", + ] + [f.path for f in srcs_list], + inputs = srcs_list + ctx.files.solc_exe, + outputs = [combined_json], + ) + else: # solc-0.8.16 + ctx.actions.run( + executable = ctx.executable.solc_exe, + arguments = [ + "--optimize", + "--optimize-runs", + str(ctx.attr.optimize_runs), + "--combined-json", + "abi,bin", + "--base-path", + ".", + "--include-path", + ctx.attr.include_path, + "-o", + combined_json.dirname, + ] + [f.path for f in srcs_list], + inputs = srcs_list, + outputs = [combined_json], + ) + + if ctx.label.workspace_root == "": + current_dir = "/".join([combined_json.root.path, ctx.label.package]) + else: + current_dir = ( + "/".join([combined_json.root.path, ctx.label.workspace_root, ctx.label.package]) + ) + outputs = [ctx.actions.declare_file(f) for f in ctx.attr.contracts] + ctx.actions.run( + executable = ctx.executable.extract_artifacts_exe, + arguments = [ + "--input_json", + combined_json.path, + "--artifacts_dir", + current_dir, + "--source_dir", + ctx.label.package, + "--contracts", + ] + ctx.attr.contracts, + inputs = [combined_json], + outputs = outputs, + ) + return [DefaultInfo(files = depset(outputs), runfiles = ctx.runfiles(files = outputs))] + +sol_contract = rule( + implementation = _sol_contract_impl, + attrs = { + "deps": attr.label_list(), + "contracts": attr.string_list(mandatory = True, allow_empty = False), + "optimize_runs": attr.int(default = 200), + "include_path": attr.string(default = "src"), + "solc_exe": attr.label( + default = Label("//bazel_utils:solc-0.6.12"), + allow_files = True, + executable = True, + # See https://bazel.build/rules/rules#configurations. + cfg = "exec", + ), + "_solc_wrapper": attr.label( + default = Label("//bazel_utils:solc_wrapper"), + allow_files = True, + executable = True, + # See https://bazel.build/rules/rules#configurations. + cfg = "exec", + ), + "extract_artifacts_exe": attr.label( + default = Label("//bazel_utils:default_extract_artifacts_exe"), + allow_files = True, + executable = True, + # See https://bazel.build/rules/rules#configurations. + cfg = "exec", + ), + }, +) diff --git a/build.sh b/build.sh deleted file mode 100755 index b278d7e6..00000000 --- a/build.sh +++ /dev/null @@ -1,16 +0,0 @@ -set -e - -mkdir -p build/Release -( - cd build/Release - cmake ../.. -DCMAKE_BUILD_TYPE=Release - make -j8 cairo_lang_package_venv -) - -VENV_SITE_DIR=build/Release/src/starkware/cairo/lang/cairo_lang_package_venv-site -cp src/starkware/cairo/lang/setup.py ${VENV_SITE_DIR} -cp src/starkware/cairo/lang/MANIFEST.in ${VENV_SITE_DIR} -cp scripts/requirements-gen.txt ${VENV_SITE_DIR}/requirements.txt -cp README.md ${VENV_SITE_DIR} -( cd ${VENV_SITE_DIR}; python3.9 setup.py sdist --format=zip ) -cp ${VENV_SITE_DIR}/dist/cairo-lang-$(cat src/starkware/cairo/lang/VERSION).zip . diff --git a/load_cairo_lang.bzl b/load_cairo_lang.bzl new file mode 100644 index 00000000..285bf877 --- /dev/null +++ b/load_cairo_lang.bzl @@ -0,0 +1,2 @@ +def load_cairo_lang(): + pass diff --git a/src/starkware/starknet/core/os/execution/CMakeLists.txt b/pypy3.9_archive_build_file.bzl similarity index 100% rename from src/starkware/starknet/core/os/execution/CMakeLists.txt rename to pypy3.9_archive_build_file.bzl diff --git a/scripts/BUILD b/scripts/BUILD new file mode 100644 index 00000000..92be7e59 --- /dev/null +++ b/scripts/BUILD @@ -0,0 +1,6 @@ +package(default_visibility = ["//visibility:public"]) + +exports_files([ + "pypy-requirements.txt", + "requirements.txt", +]) diff --git a/scripts/requirements-deps.json b/scripts/requirements-deps.json index 1eb49ea2..a83cf294 100644 --- a/scripts/requirements-deps.json +++ b/scripts/requirements-deps.json @@ -22,7 +22,7 @@ "required_version": ">=4.0.0a3,<5.0" }, { - "installed_version": "22.2.0", + "installed_version": "23.1.0", "key": "attrs", "package_name": "attrs", "required_version": ">=17.3.0" @@ -84,7 +84,7 @@ { "dependencies": [], "package": { - "installed_version": "22.2.0", + "installed_version": "23.1.0", "key": "attrs", "package_name": "attrs" } @@ -372,7 +372,7 @@ { "dependencies": [], "package": { - "installed_version": "2.3.6", + "installed_version": "2.3.7", "key": "frozendict", "package_name": "frozendict" } @@ -412,7 +412,7 @@ { "dependencies": [ { - "installed_version": "22.2.0", + "installed_version": "23.1.0", "key": "attrs", "package_name": "attrs", "required_version": ">=17.4.0" @@ -449,7 +449,7 @@ { "dependencies": [ { - "installed_version": "23.0", + "installed_version": "23.1", "key": "packaging", "package_name": "packaging", "required_version": ">=17.0" @@ -553,7 +553,7 @@ { "dependencies": [], "package": { - "installed_version": "23.0", + "installed_version": "23.1", "key": "packaging", "package_name": "packaging" } @@ -608,7 +608,7 @@ { "dependencies": [], "package": { - "installed_version": "4.22.1", + "installed_version": "4.22.3", "key": "protobuf", "package_name": "protobuf" } @@ -631,12 +631,6 @@ }, { "dependencies": [ - { - "installed_version": "22.2.0", - "key": "attrs", - "package_name": "attrs", - "required_version": ">=19.2.0" - }, { "installed_version": "1.1.1", "key": "exceptiongroup", @@ -650,7 +644,7 @@ "required_version": null }, { - "installed_version": "23.0", + "installed_version": "23.1", "key": "packaging", "package_name": "packaging", "required_version": null @@ -669,7 +663,7 @@ } ], "package": { - "installed_version": "7.2.2", + "installed_version": "7.3.1", "key": "pytest", "package_name": "pytest" } @@ -677,7 +671,7 @@ { "dependencies": [ { - "installed_version": "7.2.2", + "installed_version": "7.3.1", "key": "pytest", "package_name": "pytest", "required_version": ">=7.0.0" @@ -748,7 +742,7 @@ { "dependencies": [], "package": { - "installed_version": "67.4.0", + "installed_version": "67.6.1", "key": "setuptools", "package_name": "setuptools" } @@ -849,7 +843,7 @@ "installed_version": "4.0.0", "key": "eth-abi", "package_name": "eth-abi", - "required_version": ">=4.0.0-b.2" + "required_version": ">=4.0.0" }, { "installed_version": "0.8.0", @@ -894,13 +888,7 @@ "required_version": ">=1.1.6" }, { - "installed_version": "0.9.0", - "key": "parsimonious", - "package_name": "parsimonious", - "required_version": "==0.9.0" - }, - { - "installed_version": "4.22.1", + "installed_version": "4.22.3", "key": "protobuf", "package_name": "protobuf", "required_version": ">=4.21.6" @@ -912,14 +900,14 @@ "required_version": ">=2.16.0" }, { - "installed_version": "10.4", + "installed_version": "11.0.2", "key": "websockets", "package_name": "websockets", "required_version": ">=10.0.0" } ], "package": { - "installed_version": "6.0.0", + "installed_version": "6.2.0", "key": "web3", "package_name": "web3" } @@ -927,7 +915,7 @@ { "dependencies": [], "package": { - "installed_version": "10.4", + "installed_version": "11.0.2", "key": "websockets", "package_name": "websockets" } @@ -935,7 +923,7 @@ { "dependencies": [], "package": { - "installed_version": "0.38.4", + "installed_version": "0.40.0", "key": "wheel", "package_name": "wheel" } diff --git a/scripts/requirements.txt b/scripts/requirements.txt index 70614ad8..0ff33cdc 100644 --- a/scripts/requirements.txt +++ b/scripts/requirements.txt @@ -1,7 +1,7 @@ aiohttp==3.8.4 aiosignal==1.3.1 async-timeout==4.0.2 -attrs==22.2.0 +attrs==23.1.0 bitarray==2.7.3 cachetools==5.3.0 certifi==2022.12.7 @@ -18,7 +18,7 @@ eth-typing==3.3.0 eth-utils==2.1.0 exceptiongroup==1.1.1 fastecdsa==2.3.0 -frozendict==2.3.6 +frozendict==2.3.7 frozenlist==1.3.3 hexbytes==0.3.0 idna==3.4 @@ -34,22 +34,22 @@ mpmath==1.3.0 multidict==6.0.4 mypy-extensions==1.0.0 numpy==1.24.2 -packaging==23.0 +packaging==23.1 parsimonious==0.9.0 pip==23.0.1 pipdeptree==2.7.0 pluggy==1.0.0 prometheus-client==0.16.0 -protobuf==4.22.1 +protobuf==4.22.3 pycryptodome==3.17 pyrsistent==0.19.3 -pytest==7.2.2 +pytest==7.3.1 pytest-asyncio==0.21.0 PyYAML==6.0 regex==2023.3.23 requests==2.28.2 rlp==3.0.0 -setuptools==67.4.0 +setuptools==67.6.1 six==1.16.0 sympy==1.11.1 tomli==2.0.1 @@ -58,7 +58,7 @@ typeguard==2.13.3 typing-inspect==0.8.0 typing_extensions==4.5.0 urllib3==1.26.15 -web3==6.0.0 -websockets==10.4 -wheel==0.38.4 +web3==6.2.0 +websockets==11.0.2 +wheel==0.40.0 yarl==1.8.2 diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt deleted file mode 100644 index 1e62a38a..00000000 --- a/src/CMakeLists.txt +++ /dev/null @@ -1,3 +0,0 @@ -add_subdirectory(cmake_utils) -add_subdirectory(services) -add_subdirectory(starkware) diff --git a/src/cmake_utils/CMakeLists.txt b/src/cmake_utils/CMakeLists.txt deleted file mode 100644 index 56dd8405..00000000 --- a/src/cmake_utils/CMakeLists.txt +++ /dev/null @@ -1 +0,0 @@ -include(CMakeLists_common.txt) diff --git a/src/cmake_utils/CMakeLists_common.txt b/src/cmake_utils/CMakeLists_common.txt deleted file mode 100644 index 76a9c43b..00000000 --- a/src/cmake_utils/CMakeLists_common.txt +++ /dev/null @@ -1,15 +0,0 @@ -python_lib(gen_solidity_lib - FILES - gen_solidity_env.py -) - -python_venv(gen_solidity_venv - PYTHON ${PYTHON_COMMAND} - LIBS - gen_solidity_lib -) - -python_exe(gen_solidity_exe - VENV gen_solidity_venv - MODULE gen_solidity_env -) diff --git a/src/cmake_utils/cmake_rules.cmake b/src/cmake_utils/cmake_rules.cmake deleted file mode 100644 index 58119834..00000000 --- a/src/cmake_utils/cmake_rules.cmake +++ /dev/null @@ -1,9 +0,0 @@ -include("${CMAKE_SOURCE_DIR}/src/cmake_utils/exe_rules.cmake") -include("${CMAKE_SOURCE_DIR}/src/cmake_utils/copy_rules.cmake") -include("${CMAKE_SOURCE_DIR}/src/cmake_utils/python_rules.cmake") -include("${CMAKE_SOURCE_DIR}/src/cmake_utils/pip_rules.cmake") -include("${CMAKE_SOURCE_DIR}/src/cmake_utils/solidity_rules.cmake") -python_get_pip_deps(main_reqs - python3.9:${CMAKE_SOURCE_DIR}/scripts/requirements-deps.json - ${ADDITIONAL_PIP_DEPS} -) diff --git a/src/cmake_utils/copy_rules.cmake b/src/cmake_utils/copy_rules.cmake deleted file mode 100644 index fb8abc70..00000000 --- a/src/cmake_utils/copy_rules.cmake +++ /dev/null @@ -1,51 +0,0 @@ -# Creates a target to copy files relative to SOURCE, into directory DEST, while preserving -# relative directory structure. -function(copy_files TARGET_NAME SOURCE DEST) - set(STAMP_FILE ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME}.stamp) - - set(OUTPUT_FILES) - foreach(FILENAME ${ARGN}) - add_custom_command( - OUTPUT ${DEST}/${FILENAME} - COMMAND ${CMAKE_COMMAND} -E copy ${SOURCE}/${FILENAME} ${DEST}/${FILENAME} - DEPENDS ${SOURCE}/${FILENAME} - COMMENT "Copying file ${FILENAME}" - ) - set(OUTPUT_FILES ${OUTPUT_FILES} ${DEST}/${FILENAME}) - endforeach(FILENAME) - - add_custom_command( - OUTPUT ${STAMP_FILE} - COMMAND ${CMAKE_COMMAND} -E touch ${STAMP_FILE} - DEPENDS ${OUTPUT_FILES} - ) - - add_custom_target(${TARGET_NAME} ALL - DEPENDS ${STAMP_FILE} - ) - set_target_properties( - ${TARGET_NAME} PROPERTIES - STAMP_FILE ${STAMP_FILE} - ) -endfunction(copy_files) - -macro(copy_files_target TARGET_NAME) - set(OUTPUT_FILES) - foreach(FILENAME ${ARGN}) - add_custom_command( - OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${FILENAME} - COMMAND ${CMAKE_COMMAND} -E copy - ${CMAKE_CURRENT_SOURCE_DIR}/${FILENAME} - ${CMAKE_CURRENT_BINARY_DIR}/${FILENAME} - DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${FILENAME} - COMMENT "Copying file ${FILENAME}" - ) - set(OUTPUT_FILES ${OUTPUT_FILES} ${CMAKE_CURRENT_BINARY_DIR}/${FILENAME}) - endforeach(FILENAME) - - add_custom_target(${TARGET_NAME} - ALL - DEPENDS ${OUTPUT_FILES} - ) - # Add to project virtual environment. -endmacro(copy_files_target) diff --git a/src/cmake_utils/exe_rules.cmake b/src/cmake_utils/exe_rules.cmake deleted file mode 100644 index a93d08f1..00000000 --- a/src/cmake_utils/exe_rules.cmake +++ /dev/null @@ -1,18 +0,0 @@ -include_guard(GLOBAL) - -# These rules automatically collect all executables added in cmake to a list of executables. -# By hooking the existing add_exectuable() rule, users do not have to do anything to get their -# executable listed. -# Utils to collect all executable paths by target name. -set(EXECUTABLES_FILENAME ${CMAKE_BINARY_DIR}/executables.txt) -file(WRITE ${EXECUTABLES_FILENAME}) -function(add_to_executables_list TARGET) - file(APPEND ${EXECUTABLES_FILENAME} "${TARGET} ${CMAKE_CURRENT_BINARY_DIR}\n") -endfunction(add_to_executables_list) - -# Hook add_executable, to make a list of executables by target. -function(add_executable TARGET) - # Call the original function - _add_executable(${TARGET} ${ARGN}) - add_to_executables_list(${TARGET}) -endfunction(add_executable TARGET) diff --git a/src/cmake_utils/pip_rules.cmake b/src/cmake_utils/pip_rules.cmake deleted file mode 100644 index ef999186..00000000 --- a/src/cmake_utils/pip_rules.cmake +++ /dev/null @@ -1,138 +0,0 @@ -# Note: STAMP_FILE is a dummy output file for a target that holds all of the reqeuired file level -# dependencies of the target. If you have a custom command that needs a dependency target to run -# before, it should depend on the target and the stamp file. - -# Create a target for a python library from a pip requirement REQ. -# REQ is a pip requirement line. For example, abcd==1.2.3, or requests>2.1 . -function(python_pip TARGET) - # Parse arguments. - set(options) - set(oneValueArgs) - set(multiValueArgs VERSIONS LIBS) - cmake_parse_arguments(ARGS "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) - - # Create a list of all dependencies regardless of python's version. - set(UNITED_LIBS ${ARGS_LIBS}) - if("${UNITED_LIBS}" MATCHES ":") - execute_process( - COMMAND ${UNITE_LIBS_EXECUTABLE} ${UNITED_LIBS} - OUTPUT_VARIABLE UNITED_LIBS - ) - endif() - separate_arguments(UNITED_LIBS) - - set(ALL_STAMPS) - set(ALL_LIB_DIRS) - foreach(VERSION ${ARGS_VERSIONS}) - separate_arguments(VERSION) - list(GET VERSION 0 INTERPRETER) - list(GET VERSION 1 REQ) - - set(LIB_DIR ${CMAKE_BINARY_DIR}/python_pip/${INTERPRETER}/${TARGET}) - set(DOWNLOAD_DIR ${CMAKE_BINARY_DIR}/python_pip_downloads/${INTERPRETER}/${TARGET}) - # Adding REQ here makes sure a different version will rebuild target. - # The filename will have '==' in it. - set(STAMP_FILE ${CMAKE_BINARY_DIR}/python_pip/${TARGET}_${INTERPRETER}_${REQ}.stamp) - - # Creating library directory. - if (${REQ} MATCHES "\\+local$") - string(REPLACE "==" "-" PACKAGE_NAME ${REQ}) - set(ZIP_FILE "${PROJECT_SOURCE_DIR}/${PACKAGE_NAME}.zip") - add_custom_command( - OUTPUT ${STAMP_FILE} - COMMENT "Building ${REQ} from a local copy." - COMMAND rm -rf ${LIB_DIR}/* - COMMAND unzip ${ZIP_FILE} -d ${LIB_DIR} > /dev/null - COMMAND mv ${LIB_DIR}/${PACKAGE_NAME}/* ${LIB_DIR}/ - COMMAND rm -rf ${LIB_DIR}/${PACKAGE_NAME}/ - COMMAND ${CMAKE_COMMAND} -E touch ${STAMP_FILE} - DEPENDS ${ZIP_FILE} - ) - else() - add_custom_command( - OUTPUT ${STAMP_FILE} - # Download or build wheel. - COMMENT "Building wheel ${REQ} for ${INTERPRETER}" - COMMAND ${CMAKE_COMMAND} -E make_directory ${LIB_DIR} - COMMAND ${CMAKE_COMMAND} -E make_directory ${DOWNLOAD_DIR} - # Extract wheel. - COMMAND - ${INTERPRETER} -m pip wheel - --retries 10 - --disable-pip-version-check - --no-deps - -w ${DOWNLOAD_DIR}/ - ${REQ} - ${PIP_INSTALL_ARGS_${INTERPRETER}} - || exit 1 # Failure to fetch package should abort the build. - COMMAND cd ${LIB_DIR} && ${CMAKE_COMMAND} -E tar xzf ${DOWNLOAD_DIR}/*.whl - # Some wheels may put their files at /{name}-{version}.data/(pure|plat)lib/, instead of - # under the root directory. See https://www.python.org/dev/peps/pep-0427/#id24. - # Copy the files from there. Suppress errors, which happen most of the times when this - # subdirectory does not exist. - COMMAND cp -r ${LIB_DIR}/*.data/*lib/* ${LIB_DIR}/ > /dev/null 2>&1 || true - # Cleanup download. - COMMAND ${CMAKE_COMMAND} -E remove_directory ${DOWNLOAD_DIR} - # Timestamp. - COMMAND ${CMAKE_COMMAND} -E touch ${STAMP_FILE} - ) - endif() - - list(APPEND ALL_STAMPS ${STAMP_FILE}) - list(APPEND ALL_LIB_DIRS "${INTERPRETER}:${LIB_DIR}") - endforeach() - - # Info target. - set(DEP_INFO) - foreach(DEP_LIB ${UNITED_LIBS}) - get_lib_info_file(DEP_INFO_FILE ${DEP_LIB}) - set(DEP_INFO ${DEP_INFO} ${DEP_INFO_FILE}) - endforeach() - - get_lib_info_file(INFO_FILE ${TARGET}) - add_custom_command( - OUTPUT ${INFO_FILE} - COMMAND ${GEN_PY_LIB_EXECUTABLE} - --name ${TARGET} - --lib_dir ${ALL_LIB_DIRS} - --import_paths ${ALL_LIB_DIRS} - --lib_deps ${ARGS_LIBS} - --output ${INFO_FILE} - --py_exe_deps - DEPENDS ${GEN_PY_LIB_EXECUTABLE} ${DEP_INFO} ${UNITED_LIBS} ${ALL_STAMPS} - ) - - add_custom_target(${TARGET} ALL - DEPENDS ${INFO_FILE} - ) -endfunction() - - -# Creates all pip library targets from a given pipdeptree json file. -# TARGET is a name to represent this dependency tree. -# DEPS_FILE is a json file created by pipdeptree (or lock_reqs.py). -set(PIP_GEN_EXECUTABLE ${CMAKE_CURRENT_LIST_DIR}/gen_pip_cmake.py) -function(python_get_pip_deps TARGET) - set(CMAKE_FILE "${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_generated_rules.cmake") - - # Create a list of all dependency files. - set(UNITED_DEP_FILES ${ARGN}) - if("${UNITED_DEP_FILES}" MATCHES ":") - execute_process( - COMMAND ${UNITE_LIBS_EXECUTABLE} ${UNITED_DEP_FILES} - OUTPUT_VARIABLE UNITED_DEP_FILES - ) - endif() - separate_arguments(UNITED_DEP_FILES) - - # Add as a reconfigure dependency, so that CMake will reconfigure on change. - set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${UNITED_DEP_FILES}) - - # Generate cmake file on configure. - execute_process( - COMMAND ${PIP_GEN_EXECUTABLE} - --interpreter_deps ${ARGN} - --output ${CMAKE_FILE} - ) - include(${CMAKE_FILE}) -endfunction() diff --git a/src/cmake_utils/python_rules.cmake b/src/cmake_utils/python_rules.cmake deleted file mode 100644 index 4602f7a3..00000000 --- a/src/cmake_utils/python_rules.cmake +++ /dev/null @@ -1,332 +0,0 @@ -# CACHE INTERNAL makes the variables definitions available in every scope. -set(GEN_PY_LIB_EXECUTABLE ${CMAKE_CURRENT_LIST_DIR}/gen_py_lib.py CACHE INTERNAL "") -set(GEN_VENV_EXECUTABLE ${CMAKE_CURRENT_LIST_DIR}/gen_venv.py CACHE INTERNAL "") -set(GEN_PYTHON_EXE_EXECUTABLE ${CMAKE_CURRENT_LIST_DIR}/gen_python_exe.py CACHE INTERNAL "") -set(UNITE_LIBS_EXECUTABLE ${CMAKE_CURRENT_LIST_DIR}/unite_lib.py CACHE INTERNAL "") - -set(PY_LIB_INFO_GLOBAL_DIR ${CMAKE_BINARY_DIR}/python_libs CACHE INTERNAL "") -function(get_lib_info_file OUTPUT_VARIABLE LIB) - set(${OUTPUT_VARIABLE} ${PY_LIB_INFO_GLOBAL_DIR}/${LIB}.info PARENT_SCOPE) -endfunction() - -add_custom_target(all_python_libs_dryrun) - -# Creates a python library target. -# Caller should make this target depend on artifact targets (using add_dependencies()) -# to force correct build order. -# -# Example usage: -# python_lib(starkware_crypto_lib -# FILES -# starkware/__init__.py -# ... -# LIBS -# starkware_storage_lib -# pip_sympy -# ) -# For a test library: -# python_lib(starkware_crypto_test_lib -# FILES -# starkware/crypto/my_test.py -# ... -# LIBS -# pip_new_dependency_for_test_lib -# ) -function(python_lib LIB) - # Parse arguments. - set(options) - set(oneValueArgs PREFIX) - set(multiValueArgs FILES ARTIFACTS LIBS PY_EXE_DEPENDENCIES) - cmake_parse_arguments(ARGS "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) - - set(LIB_DIR_ROOT ${CMAKE_CURRENT_BINARY_DIR}/${LIB}) - - if(ARGS_PREFIX) - set(LIB_DIR ${LIB_DIR_ROOT}/${ARGS_PREFIX}) - set(ARGS_PREFIX "${ARGS_PREFIX}/") - else() - set(LIB_DIR ${LIB_DIR_ROOT}) - endif() - - set(LIB_FILES) - foreach(FILE ${ARGS_FILES}) - list(APPEND LIB_FILES "${ARGS_PREFIX}${FILE}") - endforeach() - - set(ALL_FILE_DEPS) - - # Copy files. - copy_files(${LIB}_copy_files ${CMAKE_CURRENT_SOURCE_DIR} ${LIB_DIR} ${ARGS_FILES}) - get_target_property(COPY_STAMP ${LIB}_copy_files STAMP_FILE) - list(APPEND ALL_FILE_DEPS ${COPY_STAMP}) - - # Copy artifacts. - foreach(ARTIFACT ${ARGS_ARTIFACTS}) - separate_arguments(ARTIFACT) - list(GET ARTIFACT 0 ARTIFACT_SRC) - list(GET ARTIFACT 1 ARTIFACT_DEST) - - add_custom_command( - OUTPUT ${LIB_DIR}/${ARTIFACT_DEST} - COMMAND ${CMAKE_COMMAND} -E copy - ${ARTIFACT_SRC} ${LIB_DIR}/${ARTIFACT_DEST} - DEPENDS ${ARTIFACT_SRC} - COMMENT "Copying artifact ${ARTIFACT_SRC} to ${LIB_DIR}/${ARTIFACT_DEST}" - ) - list(APPEND ALL_FILE_DEPS ${LIB_DIR}/${ARTIFACT_DEST}) - list(APPEND LIB_FILES ${ARGS_PREFIX}${ARTIFACT_DEST}) - endforeach() - - # Create a list of all dependencies regardless of python's version. - set(UNITED_LIBS ${ARGS_LIBS}) - if("${UNITED_LIBS}" MATCHES ":") - execute_process( - COMMAND ${UNITE_LIBS_EXECUTABLE} ${UNITED_LIBS} - OUTPUT_VARIABLE UNITED_LIBS - ) - endif() - separate_arguments(UNITED_LIBS) - - # Info target. - set(DEP_INFO) - foreach(DEP_LIB ${UNITED_LIBS} ${ARGS_PY_EXE_DEPENDENCIES}) - get_lib_info_file(DEP_INFO_FILE ${DEP_LIB}) - LIST(APPEND DEP_INFO ${DEP_INFO_FILE}) - endforeach() - - get_lib_info_file(INFO_FILE ${LIB}) - file(RELATIVE_PATH CMAKE_DIR ${CMAKE_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}) - set(GEN_PY_LIB_COMMAND - ${GEN_PY_LIB_EXECUTABLE} - --name ${LIB} - --lib_dir ${LIB_DIR_ROOT} - --files ${LIB_FILES} - --lib_deps ${ARGS_LIBS} - --py_exe_deps ${ARGS_PY_EXE_DEPENDENCIES} - --cmake_dir ${CMAKE_DIR} - --prefix ${ARGS_PREFIX} - ) - add_custom_command( - OUTPUT ${INFO_FILE} - COMMAND ${GEN_PY_LIB_COMMAND} --output ${INFO_FILE} - DEPENDS ${GEN_PY_LIB_EXECUTABLE} ${DEP_INFO} ${UNITED_LIBS} - ${ARGS_PY_EXE_DEPENDENCIES} ${ALL_FILE_DEPS} ${LIB}_copy_files - ) - add_custom_target(${LIB} ALL DEPENDS ${INFO_FILE}) - add_custom_command( - OUTPUT ${INFO_FILE}.dryrun - COMMAND ${GEN_PY_LIB_COMMAND} --output ${INFO_FILE}.dryrun - DEPENDS ${GEN_PY_LIB_EXECUTABLE} - ) - add_custom_target(${LIB}_dryrun DEPENDS ${INFO_FILE}.dryrun) - add_dependencies(all_python_libs_dryrun ${LIB}_dryrun) -endfunction() - -# Creates a virtual environment target. -# Usage: python_venv(venv_name PYTHON ${PYTHON_COMMAND} LIBS lib0 lib1 ...) -# Target properties: -# VENV_PYTHON: Full path to the vritual environment python executable. -# STAMP_FILE: when this file is generated, the virtual environment is ready to use. -function(python_venv VENV_NAME) - # Parse arguments. - set(options) - set(oneValueArgs PYTHON) - set(multiValueArgs LIBS) - cmake_parse_arguments(ARGS "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) - - # A directory with symlinks to files of other libraries. - # This will be appended to .pth file. - set(SITE_DIR ${CMAKE_CURRENT_BINARY_DIR}/${VENV_NAME}-site) - set(VENV_DIR ${CMAKE_CURRENT_BINARY_DIR}/${VENV_NAME}) - get_lib_info_file(VENV_INFO_FILE ${VENV_NAME}) - - set(DEP_INFO) - foreach(DEP_LIB ${ARGS_LIBS}) - get_lib_info_file(DEP_INFO_FILE ${DEP_LIB}) - list(APPEND DEP_INFO ${DEP_INFO_FILE}) - endforeach() - - add_custom_command( - OUTPUT ${VENV_INFO_FILE} - COMMAND ${GEN_VENV_EXECUTABLE} - --name ${VENV_NAME} - --libs ${ARGS_LIBS} - --python ${ARGS_PYTHON} - --site_dir ${SITE_DIR} - --venv_dir ${VENV_DIR} - --info_dir ${PY_LIB_INFO_GLOBAL_DIR} - DEPENDS ${GEN_VENV_EXECUTABLE} ${DEP_INFO} ${ARGS_LIBS} - ) - - # Create target. - add_custom_target(${VENV_NAME} ALL - DEPENDS ${VENV_INFO_FILE} - ) - - # Target properties. - set_target_properties(${VENV_NAME} PROPERTIES - VENV_PYTHON ${VENV_DIR}/bin/python - STAMP_FILE ${VENV_INFO_FILE} - ) -endfunction() - -# Creates a python executable target, based on a specific python module, which runs inside a -# given python virtual environment. -# Example usage: -# python_exe(hello_world -# VENV hello_world_venv -# MODULE hello_world -# ARGS -a -# ) -function(python_exe EXE_NAME) - # Parse arguments. - set(options) - set(oneValueArgs VENV MODULE ARGS WORKING_DIR ENVIRONMENT_VARS) - set(multiValueArgs) - cmake_parse_arguments(ARGS "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) - - get_lib_info_file(VENV_INFO_FILE ${ARGS_VENV}) - get_lib_info_file(INFO_FILE ${EXE_NAME}) - add_to_executables_list(${EXE_NAME}) - - # Create a runner script. - set(EXECUTABLE_PATH ${CMAKE_CURRENT_BINARY_DIR}/${EXE_NAME}) - - # This command generates both INFO_FILE and EXE_NAME. - # However, we cannot list EXE_NAME as an output, since it clashes with the custom target below. - add_custom_command( - OUTPUT ${INFO_FILE} - COMMAND ${GEN_PYTHON_EXE_EXECUTABLE} - --name ${EXE_NAME} - --exe_path ${EXECUTABLE_PATH} - --venv ${ARGS_VENV} - --module ${ARGS_MODULE} - "--args=${ARGS_ARGS}" - --info_dir ${PY_LIB_INFO_GLOBAL_DIR} - --cmake_binary_dir ${CMAKE_BINARY_DIR} - "--working_dir=${ARGS_WORKING_DIR}" - "--environment_variables=${ARGS_ENVIRONMENT_VARS}" - DEPENDS ${GEN_PYTHON_EXE_EXECUTABLE} ${ARGS_VENV} ${VENV_INFO_FILE} - ) - - # Create target. - add_custom_target(${EXE_NAME} ALL - DEPENDS ${ARGS_VENV} ${INFO_FILE} - ) -endfunction() - -function(python_test TEST_NAME) - # Parse arguments. - set(options NO_CODE_COVERAGE) - set(oneValueArgs VENV TESTED_MODULES TEST_ARGS ENVIRONMENT_VARS) - set(multiValueArgs) - cmake_parse_arguments(ARGS "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) - - # If code coverage is enabled, and the target is run as part of the nightly run, need to add - # command line options + an environment variable. - set(COVERAGE_ARGS "") - if(NOT ARGS_NO_CODE_COVERAGE AND ("$ENV{NIGHTLY_TEST}" EQUAL "1")) - # Set COVERAGE_DEBUG environment variable for debugging coverage-related failures, as suggested - # here: https://github.com/pytest-dev/pytest-cov/issues/237. - set(ENV{COVERAGE_DEBUG} "process,config") - set(COVERAGE_ARGS "--cov-report html:{VENV_SITE_DIR}/coverage_py_html \ - --cov {VENV_SITE_DIR}/${ARGS_TESTED_MODULES}" - ) - string(REPLACE "/" "." COVERAGE_FILE_SUFFIX "${ARGS_TESTED_MODULES}") - string(APPEND ARGS_ENVIRONMENT_VARS " COVERAGE_FILE=.coverage.${COVERAGE_FILE_SUFFIX}") - endif() - - python_exe(${TEST_NAME} - VENV ${ARGS_VENV} - MODULE pytest - ARGS "${COVERAGE_ARGS} {VENV_SITE_DIR}/${ARGS_TESTED_MODULES} ${ARGS_TEST_ARGS}" - WORKING_DIR ${CMAKE_BINARY_DIR} - ENVIRONMENT_VARS ${ARGS_ENVIRONMENT_VARS} - ) - - add_test( - NAME ${TEST_NAME} - COMMAND ${CMAKE_CURRENT_BINARY_DIR}/${TEST_NAME} - ) -endfunction() - -function(full_python_test TEST_NAME) - # Parse arguments. - set(options NO_CODE_COVERAGE) - set(oneValueArgs TESTED_MODULES TEST_ARGS PYTHON ENVIRONMENT_VARS) - set(multiValueArgs LIBS ARTIFACTS PY_EXE_DEPENDENCIES) - cmake_parse_arguments(ARGS "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) - - # If code coverage is suppressed, the option needs to be passed to the python_exe macro. - # Otherwise, need to add the pytest-cov dependency. - set(CODE_COVERAGE_SUPPRESSION_FLAG) - if(ARGS_NO_CODE_COVERAGE OR NOT ("$ENV{NIGHTLY_TEST}" EQUAL "1")) - set(CODE_COVERAGE_SUPPRESSION_FLAG NO_CODE_COVERAGE) - else() - list(APPEND ARGS_LIBS "pip_pytest_cov") - endif() - - # Use a 3rd-party Python debugger (instead of `pdb`). - # - # Usage: Override both args below before CMake imports this file. - # The contents of the variables should be as follows: - # - # PYTHON_DEBUGGER_LIB: the name of the python_lib for the debugger package. - # format: "pip_" # For more on this format, see the definition - # of `python_lib` above. - # PYTHON_BREAKPOINT_HANDLER: the cmd that triggers the debugger - # (will be run when `breakpoint()` is called). - # format: "PYTHONBREAKPOINT=" - # - # Example (for the package `ipdb`): - # - # PYTHON_DEBUGGER_LIB="pip_ipdb" - # PYTHON_BREAKPOINT_HANDLER="PYTHONBREAKPOINT=ipdb.set_trace" - list(APPEND ARGS_LIBS ${PYTHON_DEBUGGER_LIB}) - list(APPEND ARGS_ENVIRONMENT_VARS ${PYTHON_BREAKPOINT_HANDLER}) - - python_lib(${TEST_NAME}_lib - ${ARGS_UNPARSED_ARGUMENTS} - LIBS ${ARGS_LIBS} - ARTIFACTS ${ARGS_ARTIFACTS} - PY_EXE_DEPENDENCIES ${ARGS_PY_EXE_DEPENDENCIES} - ) - python_venv(${TEST_NAME}_venv - PYTHON ${ARGS_PYTHON} - LIBS ${TEST_NAME}_lib - ) - python_test(${TEST_NAME} - VENV ${TEST_NAME}_venv - TESTED_MODULES ${ARGS_TESTED_MODULES} - TEST_ARGS ${ARGS_TEST_ARGS} - ENVIRONMENT_VARS ${ARGS_ENVIRONMENT_VARS} - ${CODE_COVERAGE_SUPPRESSION_FLAG} - ) -endfunction() - -function(starknet_contract_v1 NAME) - # Parse arguments. - set(options) - set(oneValueArgs MAIN COMPILED_SIERRA_NAME COMPILED_CASM_NAME) - set(multiValueArgs) - cmake_parse_arguments(ARGS "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) - - add_custom_command( - OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${ARGS_COMPILED_SIERRA_NAME} - COMMAND - ${CMAKE_BINARY_DIR}/src/starkware/starknet/compiler/v1/cairo/bin/starknet-compile - ${CMAKE_CURRENT_SOURCE_DIR}/${ARGS_MAIN} - ${CMAKE_CURRENT_BINARY_DIR}/${ARGS_COMPILED_SIERRA_NAME} - DEPENDS get_cairo_compiler ${CMAKE_CURRENT_SOURCE_DIR}/${ARGS_MAIN} - ) - add_custom_command( - OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${ARGS_COMPILED_CASM_NAME} - COMMAND - ${CMAKE_BINARY_DIR}/src/starkware/starknet/compiler/v1/cairo/bin/starknet-sierra-compile - --add-pythonic-hints - ${CMAKE_CURRENT_BINARY_DIR}/${ARGS_COMPILED_SIERRA_NAME} - ${CMAKE_CURRENT_BINARY_DIR}/${ARGS_COMPILED_CASM_NAME} - DEPENDS get_cairo_compiler ${CMAKE_CURRENT_BINARY_DIR}/${ARGS_COMPILED_SIERRA_NAME} - ) -add_custom_target(${NAME} ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${ARGS_COMPILED_SIERRA_NAME} ${CMAKE_CURRENT_BINARY_DIR}/${ARGS_COMPILED_CASM_NAME}) -endfunction() diff --git a/src/cmake_utils/solidity_rules.cmake b/src/cmake_utils/solidity_rules.cmake deleted file mode 100644 index 33f2c9da..00000000 --- a/src/cmake_utils/solidity_rules.cmake +++ /dev/null @@ -1,60 +0,0 @@ -set(GEN_SOLIDITY_ENV_EXE ${CMAKE_BINARY_DIR}/src/cmake_utils/gen_solidity_exe CACHE INTERNAL "") -set(DEFAULT_SOLC "solc-0.6.12") -set(DEFAULT_RUNS "200") - -# Creates a solidity environment target. -# Usage: solidity_env(venv_name LIBS lib0 lib1 ...) -function(solidity_env ENV_NAME) - # Parse arguments. - set(options) - set(oneValueArgs SOLC_BIN OPTIMIZE_RUNS) - set(multiValueArgs CONTRACTS LIBS) - cmake_parse_arguments(ARGS "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) - if (NOT ARGS_SOLC_BIN) - set(ARGS_SOLC_BIN ${DEFAULT_SOLC}) - endif() - if (NOT ARGS_OPTIMIZE_RUNS) - set(ARGS_OPTIMIZE_RUNS ${DEFAULT_RUNS}) - endif() - - # A directory with symlinks to files of other libraries. - set(ENV_DIR ${CMAKE_CURRENT_BINARY_DIR}/${ENV_NAME}) - get_lib_info_file(ENV_INFO_FILE ${ENV_NAME}) - - set(DEP_INFO) - foreach(DEP_LIB ${ARGS_LIBS}) - get_lib_info_file(DEP_INFO_FILE ${DEP_LIB}) - set(DEP_INFO ${DEP_INFO} ${DEP_INFO_FILE}) - endforeach() - - add_custom_command( - OUTPUT ${ENV_INFO_FILE} - COMMAND ${GEN_SOLIDITY_ENV_EXE} - --name ${ENV_NAME} - --solc_bin ${ARGS_SOLC_BIN} - --optimize_runs ${ARGS_OPTIMIZE_RUNS} - --libs ${ARGS_LIBS} - --env_dir ${ENV_DIR} - --info_dir ${PY_LIB_INFO_GLOBAL_DIR} - DEPENDS gen_solidity_exe ${GEN_SOLIDITY_ENV_EXE} ${DEP_INFO} ${ARGS_LIBS} - ) - - # Add contract file targets. - foreach(CONTRACT ${ARGS_CONTRACTS}) - set(OUTPUT_FILENAME ${CMAKE_CURRENT_BINARY_DIR}/${CONTRACT}.json) - add_custom_command( - OUTPUT ${OUTPUT_FILENAME} - COMMAND ${CMAKE_COMMAND} -E copy - ${ENV_DIR}/artifacts/${CONTRACT}.json - ${OUTPUT_FILENAME} - DEPENDS ${ENV_INFO_FILE} - COMMENT "Copying contract ${CONTRACT}" - ) - set(OUTPUT_FILES ${OUTPUT_FILES} ${OUTPUT_FILENAME}) - endforeach(CONTRACT) - - # Create target. - add_custom_target(${ENV_NAME} ALL - DEPENDS ${ENV_INFO_FILE} ${OUTPUT_FILES} - ) -endfunction() diff --git a/src/services/CMakeLists.txt b/src/services/CMakeLists.txt deleted file mode 100644 index 46d7aaf5..00000000 --- a/src/services/CMakeLists.txt +++ /dev/null @@ -1,2 +0,0 @@ -add_subdirectory(external_api) -add_subdirectory(everest) diff --git a/src/services/everest/CMakeLists.txt b/src/services/everest/CMakeLists.txt deleted file mode 100644 index 0105d622..00000000 --- a/src/services/everest/CMakeLists.txt +++ /dev/null @@ -1,3 +0,0 @@ -add_subdirectory(api) -add_subdirectory(business_logic) -add_subdirectory(definitions) diff --git a/src/services/everest/api/CMakeLists.txt b/src/services/everest/api/CMakeLists.txt deleted file mode 100644 index 2222a2a6..00000000 --- a/src/services/everest/api/CMakeLists.txt +++ /dev/null @@ -1,2 +0,0 @@ -add_subdirectory(feeder_gateway) -add_subdirectory(gateway) diff --git a/src/services/everest/api/feeder_gateway/BUILD b/src/services/everest/api/feeder_gateway/BUILD new file mode 100644 index 00000000..632b307e --- /dev/null +++ b/src/services/everest/api/feeder_gateway/BUILD @@ -0,0 +1,36 @@ +load("//bazel_utils/python:defs.bzl", "requirement") + +package(default_visibility = ["//visibility:public"]) + +py_library( + name = "everest_feeder_gateway_client_lib", + srcs = [ + "feeder_gateway_client.py", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/services/external_api:services_external_api_lib", + ], +) + +py_library( + name = "everest_external_api_feeder_gateway_lib", + srcs = [ + "docs.py", + ], + visibility = ["//visibility:public"], + deps = [ + ], +) + +py_library( + name = "everest_feeder_gateway_response_objects_lib", + srcs = [ + "response_objects.py", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/starkware/starkware_utils:starkware_dataclasses_field_utils_lib", + requirement("marshmallow"), + ], +) diff --git a/src/services/everest/api/feeder_gateway/CMakeLists.txt b/src/services/everest/api/feeder_gateway/CMakeLists.txt deleted file mode 100644 index 7843bbe8..00000000 --- a/src/services/everest/api/feeder_gateway/CMakeLists.txt +++ /dev/null @@ -1,27 +0,0 @@ -python_lib(everest_feeder_gateway_client_lib - PREFIX services/everest/api/feeder_gateway - - FILES - feeder_gateway_client.py - - LIBS - services_external_api_lib -) - -python_lib(everest_external_api_feeder_gateway_lib - PREFIX services/everest/api/feeder_gateway - - FILES - docs.py -) - -python_lib(everest_feeder_gateway_response_objects_lib - PREFIX services/everest/api/feeder_gateway - - FILES - response_objects.py - - LIBS - starkware_dataclasses_field_utils_lib - pip_marshmallow -) diff --git a/src/services/everest/api/gateway/BUILD b/src/services/everest/api/gateway/BUILD new file mode 100644 index 00000000..c7da7c32 --- /dev/null +++ b/src/services/everest/api/gateway/BUILD @@ -0,0 +1,52 @@ +load("//bazel_utils/python:defs.bzl", "requirement") + +package(default_visibility = ["//visibility:public"]) + +py_library( + name = "everest_transaction_type_lib", + srcs = [ + "transaction_type.py", + ], + visibility = ["//visibility:public"], + deps = [ + ], +) + +py_library( + name = "everest_transaction_lib", + srcs = [ + "transaction.py", + ], + visibility = ["//visibility:public"], + deps = [ + "everest_transaction_type_lib", + "//src/starkware/starkware_utils:starkware_dataclasses_field_utils_lib", + requirement("marshmallow_enum"), + requirement("marshmallow_oneofschema"), + ], +) + +py_library( + name = "everest_config_request_lib", + srcs = [ + "set_config_request.py", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/starkware/starkware_utils:starkware_dataclasses_field_utils_lib", + "//src/starkware/starkware_utils:starkware_dataclasses_utils_lib", + "//src/starkware/starkware_utils:starkware_error_handling_lib", + ], +) + +py_library( + name = "everest_gateway_client_lib", + srcs = [ + "gateway_client.py", + ], + visibility = ["//visibility:public"], + deps = [ + "everest_transaction_lib", + "//src/services/external_api:services_external_api_lib", + ], +) diff --git a/src/services/everest/api/gateway/CMakeLists.txt b/src/services/everest/api/gateway/CMakeLists.txt deleted file mode 100644 index 26dac211..00000000 --- a/src/services/everest/api/gateway/CMakeLists.txt +++ /dev/null @@ -1,42 +0,0 @@ -python_lib(everest_transaction_type_lib - PREFIX services/everest/api/gateway - - FILES - transaction_type.py -) - -python_lib(everest_transaction_lib - PREFIX services/everest/api/gateway - - FILES - transaction.py - - LIBS - everest_transaction_type_lib - starkware_dataclasses_field_utils_lib - pip_marshmallow_enum - pip_marshmallow_oneofschema -) - -python_lib(everest_config_request_lib - PREFIX services/everest/api/gateway - - FILES - set_config_request.py - - LIBS - starkware_dataclasses_field_utils_lib - starkware_dataclasses_utils_lib - starkware_error_handling_lib -) - -python_lib(everest_gateway_client_lib - PREFIX services/everest/api/gateway - - FILES - gateway_client.py - - LIBS - everest_transaction_lib - services_external_api_lib -) diff --git a/src/services/everest/business_logic/BUILD b/src/services/everest/business_logic/BUILD new file mode 100644 index 00000000..80c4466f --- /dev/null +++ b/src/services/everest/business_logic/BUILD @@ -0,0 +1,58 @@ +load("//bazel_utils/python:defs.bzl", "requirement") + +package(default_visibility = ["//visibility:public"]) + +py_library( + name = "everest_business_logic_state_api_lib", + srcs = [ + "state_api.py", + ], + visibility = ["//visibility:public"], + deps = [ + ], +) + +py_library( + name = "everest_business_logic_lib", + srcs = [ + "state.py", + ], + visibility = ["//visibility:public"], + deps = [ + "everest_business_logic_state_api_lib", + "//src/starkware/python:starkware_python_utils_lib", + "//src/starkware/starkware_utils:starkware_config_utils_lib", + "//src/starkware/starkware_utils:starkware_dataclasses_field_utils_lib", + "//src/starkware/starkware_utils:starkware_utils_lib", + "//src/starkware/storage:starkware_storage_lib", + ], +) + +py_library( + name = "everest_internal_transaction_lib", + srcs = [ + "internal_transaction.py", + ], + visibility = ["//visibility:public"], + deps = [ + "everest_business_logic_lib", + "everest_business_logic_state_api_lib", + "everest_transaction_execution_objects_lib", + "//src/services/everest/api/gateway:everest_transaction_lib", + "//src/starkware/starkware_utils:starkware_config_utils_lib", + "//src/starkware/starkware_utils:starkware_one_of_schema_utils_lib", + ], +) + +py_library( + name = "everest_transaction_execution_objects_lib", + srcs = [ + "transaction_execution_objects.py", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/starkware/starkware_utils:starkware_dataclasses_field_utils_lib", + requirement("marshmallow"), + requirement("marshmallow_dataclass"), + ], +) diff --git a/src/services/everest/business_logic/CMakeLists.txt b/src/services/everest/business_logic/CMakeLists.txt deleted file mode 100644 index f0ee659d..00000000 --- a/src/services/everest/business_logic/CMakeLists.txt +++ /dev/null @@ -1,48 +0,0 @@ -python_lib(everest_business_logic_state_api_lib - PREFIX services/everest/business_logic - - FILES - state_api.py -) - -python_lib(everest_business_logic_lib - PREFIX services/everest/business_logic - - FILES - state.py - - LIBS - everest_business_logic_state_api_lib - starkware_config_utils_lib - starkware_dataclasses_field_utils_lib - starkware_python_utils_lib - starkware_storage_lib - starkware_utils_lib -) - -python_lib(everest_internal_transaction_lib - PREFIX services/everest/business_logic - - FILES - internal_transaction.py - - LIBS - everest_business_logic_lib - everest_business_logic_state_api_lib - everest_transaction_execution_objects_lib - everest_transaction_lib - starkware_config_utils_lib - starkware_one_of_schema_utils_lib -) - -python_lib(everest_transaction_execution_objects_lib - PREFIX services/everest/business_logic - - FILES - transaction_execution_objects.py - - LIBS - starkware_dataclasses_field_utils_lib - pip_marshmallow - pip_marshmallow_dataclass -) diff --git a/src/services/everest/definitions/BUILD b/src/services/everest/definitions/BUILD new file mode 100644 index 00000000..68aa7d2a --- /dev/null +++ b/src/services/everest/definitions/BUILD @@ -0,0 +1,32 @@ +load("//bazel_utils/python:defs.bzl", "requirement") + +package(default_visibility = ["//visibility:public"]) + +py_library( + name = "everest_definitions_lib", + srcs = [ + "constants.py", + "fields.py", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/starkware/crypto:starkware_crypto_lib", + "//src/starkware/eth:web3_wrapper_lib", + "//src/starkware/starkware_utils:starkware_dataclasses_field_utils_lib", + "//src/starkware/starkware_utils:starkware_error_handling_lib", + requirement("marshmallow"), + requirement("web3"), + ], +) + +py_library( + name = "everest_general_config_lib", + srcs = [ + "general_config.py", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/starkware/starkware_utils:starkware_config_utils_lib", + requirement("marshmallow_dataclass"), + ], +) diff --git a/src/services/everest/definitions/CMakeLists.txt b/src/services/everest/definitions/CMakeLists.txt deleted file mode 100644 index 5ba27e81..00000000 --- a/src/services/everest/definitions/CMakeLists.txt +++ /dev/null @@ -1,26 +0,0 @@ -python_lib(everest_definitions_lib - PREFIX services/everest/definitions - - FILES - constants.py - fields.py - - LIBS - starkware_crypto_lib - starkware_dataclasses_field_utils_lib - starkware_error_handling_lib - pip_marshmallow - pip_web3 - web3_wrapper_lib -) - -python_lib(everest_general_config_lib - PREFIX services/everest/definitions - - FILES - general_config.py - - LIBS - starkware_config_utils_lib - pip_marshmallow_dataclass -) diff --git a/src/services/external_api/BUILD b/src/services/external_api/BUILD new file mode 100644 index 00000000..b1356f9b --- /dev/null +++ b/src/services/external_api/BUILD @@ -0,0 +1,43 @@ +load("//bazel_utils/python:defs.bzl", "requirement") +load( + "//src/services/external_api:vars.bzl", + "SERVICES_EXTERNAL_API_LIB_ADDITIONAL_FILES", + "SERVICES_EXTERNAL_API_LIB_ADDITIONAL_LIBS", +) + +package(default_visibility = ["//visibility:public"]) + +py_library( + name = "services_external_api_utils_lib", + srcs = [ + "utils.py", + ], + visibility = ["//visibility:public"], + deps = [ + ], +) + +py_library( + name = "services_external_api_lib", + srcs = [ + "client.py", + "has_uri_prefix.py", + ] + SERVICES_EXTERNAL_API_LIB_ADDITIONAL_FILES, + visibility = ["//visibility:public"], + deps = [ + "services_external_api_utils_lib", + "//src/starkware/starkware_utils:starkware_dataclasses_field_utils_lib", + "//src/starkware/python:starkware_python_utils_lib", + requirement("aiohttp"), + ] + SERVICES_EXTERNAL_API_LIB_ADDITIONAL_LIBS, +) + +py_library( + name = "services_eth_gas_constants_lib", + srcs = [ + "eth_gas_constants.py", + ], + visibility = ["//visibility:public"], + deps = [ + ], +) diff --git a/src/services/external_api/CMakeLists.txt b/src/services/external_api/CMakeLists.txt deleted file mode 100644 index def57705..00000000 --- a/src/services/external_api/CMakeLists.txt +++ /dev/null @@ -1,29 +0,0 @@ -python_lib(services_external_api_utils_lib - PREFIX services/external_api - - FILES - utils.py -) - -python_lib(services_external_api_lib - PREFIX services/external_api - - FILES - client.py - has_uri_prefix.py - ${SERVICES_EXTERNAL_API_LIB_ADDITIONAL_FILES} - - LIBS - services_external_api_utils_lib - starkware_dataclasses_field_utils_lib - starkware_python_utils_lib - pip_aiohttp - ${SERVICES_EXTERNAL_API_LIB_ADDITIONAL_LIBS} -) - -python_lib(services_eth_gas_constants_lib - PREFIX services/external_api - - FILES - eth_gas_constants.py -) diff --git a/src/services/external_api/vars.bzl b/src/services/external_api/vars.bzl new file mode 100644 index 00000000..4ab9d102 --- /dev/null +++ b/src/services/external_api/vars.bzl @@ -0,0 +1,2 @@ +SERVICES_EXTERNAL_API_LIB_ADDITIONAL_FILES = [] +SERVICES_EXTERNAL_API_LIB_ADDITIONAL_LIBS = [] diff --git a/src/starkware/CMakeLists.txt b/src/starkware/CMakeLists.txt deleted file mode 100644 index a3109df9..00000000 --- a/src/starkware/CMakeLists.txt +++ /dev/null @@ -1,8 +0,0 @@ -add_subdirectory(cairo) -add_subdirectory(crypto) -add_subdirectory(eth) -add_subdirectory(python) -add_subdirectory(solidity) -add_subdirectory(starknet) -add_subdirectory(starkware_utils) -add_subdirectory(storage) diff --git a/src/starkware/cairo/BUILD b/src/starkware/cairo/BUILD new file mode 100644 index 00000000..a28d906e --- /dev/null +++ b/src/starkware/cairo/BUILD @@ -0,0 +1 @@ +exports_files([".isort.cfg"]) diff --git a/src/starkware/cairo/CMakeLists.txt b/src/starkware/cairo/CMakeLists.txt deleted file mode 100644 index c8bd2374..00000000 --- a/src/starkware/cairo/CMakeLists.txt +++ /dev/null @@ -1,7 +0,0 @@ -add_subdirectory(bootloaders) -add_subdirectory(builtin_selection) -add_subdirectory(cairo_verifier) -add_subdirectory(common) -add_subdirectory(lang) -add_subdirectory(sharp) -add_subdirectory(stark_verifier) diff --git a/src/starkware/cairo/bootloaders/BUILD b/src/starkware/cairo/bootloaders/BUILD new file mode 100644 index 00000000..a7ddb0cd --- /dev/null +++ b/src/starkware/cairo/bootloaders/BUILD @@ -0,0 +1,69 @@ +load("//bazel_utils:get_from_cairo_lang.bzl", "get_from_cairo_lang") +load("//bazel_utils/python:defs.bzl", "requirement") +load("//bazel_utils:python.bzl", "py_exe") + +py_library( + name = "program_hash_test_utils_lib", + srcs = [ + "program_hash_test_utils.py", + ], + visibility = ["//visibility:public"], + deps = [ + get_from_cairo_lang("//src/starkware/cairo/bootloaders:cairo_hash_program_lib"), + ], +) + +package(default_visibility = ["//visibility:public"]) + +py_library( + name = "cairo_hash_program_lib", + srcs = [ + "hash_program.py", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/starkware/cairo/common:cairo_common_lib", + "//src/starkware/cairo/lang:cairo_version_lib", + "//src/starkware/cairo/lang/compiler:cairo_compile_lib", + "//src/starkware/cairo/lang/vm:cairo_vm_crypto_lib", + "//src/starkware/python:starkware_python_utils_lib", + ], +) + +py_exe( + name = "cairo_hash_program_exe", + module = "starkware.cairo.bootloaders.hash_program", + deps = [ + "cairo_hash_program_lib", + ], +) + +py_library( + name = "cairo_bootloader_fact_topology_lib", + srcs = [ + "fact_topology.py", + ], + visibility = ["//visibility:public"], + deps = [ + requirement("marshmallow"), + requirement("marshmallow_dataclass"), + ], +) + +py_library( + name = "cairo_bootloader_generate_fact_lib", + srcs = [ + "compute_fact.py", + "generate_fact.py", + ], + visibility = ["//visibility:public"], + deps = [ + "cairo_bootloader_fact_topology_lib", + "cairo_hash_program_lib", + "//src/starkware/cairo/lang/vm:cairo_relocatable_lib", + "//src/starkware/cairo/lang/vm:cairo_vm_lib", + "//src/starkware/python:starkware_python_utils_lib", + requirement("eth_hash"), + requirement("pycryptodome"), + ], +) diff --git a/src/starkware/cairo/bootloaders/CMakeLists.txt b/src/starkware/cairo/bootloaders/CMakeLists.txt deleted file mode 100644 index 19424f34..00000000 --- a/src/starkware/cairo/bootloaders/CMakeLists.txt +++ /dev/null @@ -1,57 +0,0 @@ -set(PROGRAM_HASH_TEST_UTILS_LIB_ADDITIONAL_LIBS cairo_hash_program_lib) - -add_subdirectory(bootloader) -add_subdirectory(simple_bootloader) - -include(program_hash_test_utils.cmake) - -python_lib(cairo_hash_program_lib - PREFIX starkware/cairo/bootloaders - - FILES - hash_program.py - - LIBS - cairo_common_lib - cairo_compile_lib - cairo_version_lib - cairo_vm_crypto_lib - starkware_python_utils_lib -) - -python_venv(cairo_hash_program_venv - PYTHON ${PYTHON_COMMAND} - LIBS - cairo_hash_program_lib -) - -python_exe(cairo_hash_program_exe - VENV cairo_hash_program_venv - MODULE starkware.cairo.bootloaders.hash_program -) - -python_lib(cairo_bootloader_fact_topology_lib - PREFIX starkware/cairo/bootloaders - FILES - fact_topology.py - - LIBS - pip_marshmallow - pip_marshmallow_dataclass -) - -python_lib(cairo_bootloader_generate_fact_lib - PREFIX starkware/cairo/bootloaders - FILES - compute_fact.py - generate_fact.py - - LIBS - cairo_bootloader_fact_topology_lib - cairo_hash_program_lib - cairo_relocatable_lib - cairo_vm_lib - starkware_python_utils_lib - pip_eth_hash - pip_pycryptodome -) diff --git a/src/starkware/cairo/bootloaders/bootloader/BUILD b/src/starkware/cairo/bootloaders/bootloader/BUILD new file mode 100644 index 00000000..0fce223b --- /dev/null +++ b/src/starkware/cairo/bootloaders/bootloader/BUILD @@ -0,0 +1,42 @@ +load("//src/starkware/cairo/lang:cairo_rules.bzl", "cairo_binary", "cairo_library") + +cairo_library( + name = "bootloader_lib", + srcs = [ + "bootloader.cairo", + "//src/starkware/cairo/bootloaders/simple_bootloader:execute_task.cairo", + "//src/starkware/cairo/bootloaders/simple_bootloader:run_simple_bootloader.cairo", + "//src/starkware/cairo/builtin_selection:inner_select_builtins.cairo", + "//src/starkware/cairo/builtin_selection:select_input_builtins.cairo", + "//src/starkware/cairo/builtin_selection:validate_builtins.cairo", + "//src/starkware/cairo/cairo_verifier:objects.cairo", + "//src/starkware/cairo/common:bool.cairo", + "//src/starkware/cairo/common:cairo_builtins.cairo", + "//src/starkware/cairo/common:ec_point.cairo", + "//src/starkware/cairo/common:find_element.cairo", + "//src/starkware/cairo/common:hash.cairo", + "//src/starkware/cairo/common:hash_chain.cairo", + "//src/starkware/cairo/common:hash_state.cairo", + "//src/starkware/cairo/common:keccak_state.cairo", + "//src/starkware/cairo/common:math.cairo", + "//src/starkware/cairo/common:memcpy.cairo", + "//src/starkware/cairo/common:poseidon_state.cairo", + "//src/starkware/cairo/common:registers.cairo", + "//src/starkware/cairo/lang/compiler/lib:registers.cairo", + ], +) + +cairo_binary( + name = "bootloader_program", + cairoopts = [ + "--debug_info_with_source", + "--proof_mode", + ], + compiled_program_name = "bootloader_compiled.json", + main = "bootloader.cairo", + deps = [":bootloader_lib"], +) + +package(default_visibility = ["//visibility:public"]) + +exports_files(["bootloader_config_hash.json"]) diff --git a/src/starkware/cairo/bootloaders/bootloader/CMakeLists.txt b/src/starkware/cairo/bootloaders/bootloader/CMakeLists.txt deleted file mode 100644 index a3a650c8..00000000 --- a/src/starkware/cairo/bootloaders/bootloader/CMakeLists.txt +++ /dev/null @@ -1,2 +0,0 @@ -cairo_compile(bootloader_program - bootloader_compiled.json bootloader.cairo "--debug_info_with_source --proof_mode") diff --git a/src/starkware/cairo/bootloaders/program_hash_test_utils.cmake b/src/starkware/cairo/bootloaders/program_hash_test_utils.cmake deleted file mode 100644 index 1293006c..00000000 --- a/src/starkware/cairo/bootloaders/program_hash_test_utils.cmake +++ /dev/null @@ -1,9 +0,0 @@ -python_lib(program_hash_test_utils_lib - PREFIX starkware/cairo/bootloaders - - FILES - program_hash_test_utils.py - - LIBS - ${PROGRAM_HASH_TEST_UTILS_LIB_ADDITIONAL_LIBS} -) diff --git a/src/starkware/cairo/bootloaders/simple_bootloader/BUILD b/src/starkware/cairo/bootloaders/simple_bootloader/BUILD new file mode 100644 index 00000000..7dc92c13 --- /dev/null +++ b/src/starkware/cairo/bootloaders/simple_bootloader/BUILD @@ -0,0 +1,37 @@ +load("//src/starkware/cairo/lang:cairo_rules.bzl", "cairo_binary", "cairo_library") + +cairo_library( + name = "simple_bootloader_lib", + srcs = [ + "execute_task.cairo", + "run_simple_bootloader.cairo", + "simple_bootloader.cairo", + "//src/starkware/cairo/builtin_selection:inner_select_builtins.cairo", + "//src/starkware/cairo/builtin_selection:select_input_builtins.cairo", + "//src/starkware/cairo/builtin_selection:validate_builtins.cairo", + "//src/starkware/cairo/common:cairo_builtins.cairo", + "//src/starkware/cairo/common:ec_point.cairo", + "//src/starkware/cairo/common:hash_chain.cairo", + "//src/starkware/cairo/common:keccak_state.cairo", + "//src/starkware/cairo/common:poseidon_state.cairo", + "//src/starkware/cairo/common:registers.cairo", + ], +) + +cairo_binary( + name = "simple_bootloader_program", + cairoopts = [ + "--debug_info_with_source", + "--proof_mode", + ], + compiled_program_name = "simple_bootloader_compiled.json", + main = "simple_bootloader.cairo", + deps = [":simple_bootloader_lib"], +) + +package(default_visibility = ["//visibility:public"]) + +exports_files([ + "execute_task.cairo", + "run_simple_bootloader.cairo", +]) diff --git a/src/starkware/cairo/bootloaders/simple_bootloader/CMakeLists.txt b/src/starkware/cairo/bootloaders/simple_bootloader/CMakeLists.txt deleted file mode 100644 index 3557d452..00000000 --- a/src/starkware/cairo/bootloaders/simple_bootloader/CMakeLists.txt +++ /dev/null @@ -1,2 +0,0 @@ -cairo_compile(simple_bootloader_program - simple_bootloader_compiled.json simple_bootloader.cairo "--debug_info_with_source --proof_mode") diff --git a/src/starkware/cairo/builtin_selection/BUILD b/src/starkware/cairo/builtin_selection/BUILD new file mode 100644 index 00000000..0573227e --- /dev/null +++ b/src/starkware/cairo/builtin_selection/BUILD @@ -0,0 +1,47 @@ +load("//src/starkware/cairo/lang:cairo_rules.bzl", "cairo_library") +load("//bazel_utils:python.bzl", "pytest_test") + +cairo_library( + name = "cairo_builtin_selection_cairo_lib", + srcs = [ + "inner_select_builtins.cairo", + "select_builtins.cairo", + "select_input_builtins.cairo", + "validate_builtins.cairo", + ], +) + +py_library( + name = "cairo_builtin_selection_lib", + data = [ + ":cairo_builtin_selection_cairo_lib", + ], + visibility = ["//visibility:public"], +) + +package(default_visibility = ["//visibility:public"]) + +exports_files([ + "inner_select_builtins.cairo", + "select_input_builtins.cairo", + "validate_builtins.cairo", +]) + +pytest_test( + name = "cairo_builtin_selection_test", + srcs = [ + "select_input_builtins_test.py", + "validate_builtins_test.py", + ], + visibility = ["//visibility:public"], + deps = [ + "cairo_builtin_selection_lib", + "//src/starkware/cairo/common:cairo_common_lib", + "//src/starkware/cairo/common:cairo_function_runner_lib", + "//src/starkware/cairo/lang/compiler:cairo_compile_lib", + "//src/starkware/cairo/lang/vm:cairo_vm_lib", + "//src/starkware/crypto:starkware_crypto_lib", + "//src/starkware/python:starkware_python_test_utils_lib", + "//src/starkware/python:starkware_python_utils_lib", + ], +) diff --git a/src/starkware/cairo/builtin_selection/CMakeLists.txt b/src/starkware/cairo/builtin_selection/CMakeLists.txt deleted file mode 100644 index dacdbb0d..00000000 --- a/src/starkware/cairo/builtin_selection/CMakeLists.txt +++ /dev/null @@ -1,30 +0,0 @@ -python_lib(cairo_builtin_selection_lib - PREFIX starkware/cairo/builtin_selection - - FILES - inner_select_builtins.cairo - select_builtins.cairo - select_input_builtins.cairo - validate_builtins.cairo -) - -full_python_test(cairo_builtin_selection_test - PREFIX starkware/cairo/builtin_selection - PYTHON ${PYTHON_COMMAND} - TESTED_MODULES starkware/cairo/builtin_selection - - FILES - select_input_builtins_test.py - validate_builtins_test.py - - LIBS - cairo_builtin_selection_lib - cairo_function_runner_lib - cairo_common_lib - cairo_compile_lib - cairo_vm_lib - starkware_crypto_lib - starkware_python_test_utils_lib - starkware_python_utils_lib - pip_pytest -) diff --git a/src/starkware/cairo/cairo_verifier/BUILD b/src/starkware/cairo/cairo_verifier/BUILD new file mode 100644 index 00000000..009075aa --- /dev/null +++ b/src/starkware/cairo/cairo_verifier/BUILD @@ -0,0 +1,60 @@ +load("//src/starkware/cairo/lang:cairo_rules.bzl", "cairo_library") +load( + "//src/starkware/cairo/cairo_verifier:cairo_verifier_layout_program.bzl", + "cairo_verifier_program", +) +load("cairo_verifier_layouts.bzl", "CAIRO_LAYOUTS") + +cairo_library( + name = "cairo_verifier_lib", + srcs = [ + "objects.cairo", + "//src/starkware/cairo/lang/compiler/lib:registers.cairo", + "//src/starkware/cairo/stark_verifier/core:air_interface.cairo", + "//src/starkware/cairo/stark_verifier/core:channel.cairo", + "//src/starkware/cairo/stark_verifier/core:config.cairo", + "//src/starkware/cairo/stark_verifier/core:domains.cairo", + "//src/starkware/cairo/stark_verifier/core:proof_of_work.cairo", + "//src/starkware/cairo/stark_verifier/core:queries.cairo", + "//src/starkware/cairo/stark_verifier/core:stark.cairo", + "//src/starkware/cairo/stark_verifier/core:table_commitment.cairo", + "//src/starkware/cairo/stark_verifier/core:utils.cairo", + "//src/starkware/cairo/stark_verifier/core:vector_commitment.cairo", + "//src/starkware/cairo/stark_verifier/core/fri:config.cairo", + "//src/starkware/cairo/stark_verifier/core/fri:fri.cairo", + "//src/starkware/cairo/stark_verifier/core/fri:fri_formula.cairo", + "//src/starkware/cairo/stark_verifier/core/fri:fri_layer.cairo", + ], + deps = ["//src/starkware/cairo/common:cairo_common_cairo_lib"], +) + +cairo_library( + name = "cairo_verifier_program_lib", + srcs = [ + "//src/starkware/cairo/stark_verifier/air:config.cairo", + "//src/starkware/cairo/stark_verifier/air:diluted.cairo", + "//src/starkware/cairo/stark_verifier/air:layout.cairo", + "//src/starkware/cairo/stark_verifier/air:oods.cairo", + "//src/starkware/cairo/stark_verifier/air:public_input.cairo", + "//src/starkware/cairo/stark_verifier/air:public_memory.cairo", + "//src/starkware/cairo/stark_verifier/air:traces.cairo", + ], + deps = [":cairo_verifier_lib"], +) + +CAIRO_VERIFIER_LAYOUT_PROGRAM_OUTPUTS = [ + cairo_verifier_program(layout_name = layout_name) + for layout_name in CAIRO_LAYOUTS +] + +CAIRO_VERIFIER_PROGRAM_ARTIFACTS_ALL_LAYOUTS = [ + output.compiled_program_name + for output in CAIRO_VERIFIER_LAYOUT_PROGRAM_OUTPUTS +] + +package(default_visibility = ["//visibility:public"]) + +exports_files([ + "example_proof.json", + "objects.cairo", +]) diff --git a/src/starkware/cairo/cairo_verifier/CMakeLists.txt b/src/starkware/cairo/cairo_verifier/CMakeLists.txt deleted file mode 100644 index 8e375b4b..00000000 --- a/src/starkware/cairo/cairo_verifier/CMakeLists.txt +++ /dev/null @@ -1,21 +0,0 @@ -set(PROGRAM_ARTIFACTS) -add_custom_target(cairo_verifier_program_all_layouts) - -function(cairo_verifier_layout LAYOUT_NAME) - cairo_compile(cairo_verifier_program_${LAYOUT_NAME} - cairo_verifier_compiled_${LAYOUT_NAME}.json - layouts/${LAYOUT_NAME}/cairo_verifier.cairo - "--no_debug_info --proof_mode" - ) - set( - PROGRAM_ARTIFACTS - ${PROGRAM_ARTIFACTS} - "${CMAKE_CURRENT_BINARY_DIR}/cairo_verifier_compiled_${LAYOUT_NAME}.json cairo_verifier_compiled_${LAYOUT_NAME}.json" - PARENT_SCOPE - ) - add_dependencies(cairo_verifier_program_all_layouts cairo_verifier_program_${LAYOUT_NAME}) -endfunction() - -cairo_verifier_layout(all_cairo) - -add_subdirectory(layouts/all_cairo) diff --git a/src/starkware/cairo/cairo_verifier/cairo_verifier_layout_program.bzl b/src/starkware/cairo/cairo_verifier/cairo_verifier_layout_program.bzl new file mode 100644 index 00000000..277748a8 --- /dev/null +++ b/src/starkware/cairo/cairo_verifier/cairo_verifier_layout_program.bzl @@ -0,0 +1,36 @@ +load("//src/starkware/cairo/lang:cairo_rules.bzl", "cairo_binary") + +def cairo_verifier_program(layout_name): + """ + Generates a Cairo verifier program with the given layout. + Returns the program name and the compiled program name. + """ + + program_name = "cairo_verifier_program_%s" % layout_name + compiled_program_name = "cairo_verifier_compiled_%s.json" % layout_name + main_cairo_file = ( + "//src/starkware/cairo/cairo_verifier/layouts/%s:cairo_verifier.cairo" % layout_name + ) + + cairo_binary( + name = program_name, + srcs = [ + main_cairo_file, + "//src/starkware/cairo/stark_verifier/air/layouts/%s:autogenerated.cairo" % layout_name, + "//src/starkware/cairo/stark_verifier/air/layouts/%s:composition.cairo" % layout_name, + "//src/starkware/cairo/stark_verifier/air/layouts/%s:global_values.cairo" % layout_name, + "//src/starkware/cairo/stark_verifier/air/layouts/%s:periodic_columns.cairo" % layout_name, + "//src/starkware/cairo/stark_verifier/air/layouts/%s:public_verify.cairo" % layout_name, + "//src/starkware/cairo/stark_verifier/air/layouts/%s:verify.cairo" % layout_name, + ], + cairoopts = [ + "--no_debug_info", + "--proof_mode", + ], + compiled_program_name = compiled_program_name, + main = main_cairo_file, + deps = [":cairo_verifier_program_lib"], + tags = ["external_cairo", "external_cairo-docs"], + ) + + return struct(program_name = program_name, compiled_program_name = compiled_program_name) diff --git a/src/starkware/cairo/cairo_verifier/cairo_verifier_layouts.bzl b/src/starkware/cairo/cairo_verifier/cairo_verifier_layouts.bzl new file mode 100644 index 00000000..ebfa554e --- /dev/null +++ b/src/starkware/cairo/cairo_verifier/cairo_verifier_layouts.bzl @@ -0,0 +1,3 @@ +CAIRO_LAYOUTS = [ + "all_cairo", +] diff --git a/src/starkware/cairo/cairo_verifier/layouts/all_cairo/BUILD b/src/starkware/cairo/cairo_verifier/layouts/all_cairo/BUILD new file mode 100644 index 00000000..c44e0275 --- /dev/null +++ b/src/starkware/cairo/cairo_verifier/layouts/all_cairo/BUILD @@ -0,0 +1,21 @@ +load("//bazel_utils:python.bzl", "pytest_test") + +package(default_visibility = ["//visibility:public"]) + +exports_files(["cairo_verifier.cairo"]) + +pytest_test( + name = "cairo_verifier_program_hash_all_cairo_test", + srcs = [ + "program_hash_test.py", + ], + data = [ + "program_hash.json", + "//src/starkware/cairo/cairo_verifier:cairo_verifier_compiled_all_cairo.json", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/starkware/cairo/bootloaders:cairo_hash_program_lib", + "//src/starkware/cairo/bootloaders:program_hash_test_utils_lib", + ], +) diff --git a/src/starkware/cairo/cairo_verifier/layouts/all_cairo/CMakeLists.txt b/src/starkware/cairo/cairo_verifier/layouts/all_cairo/CMakeLists.txt deleted file mode 100644 index 95f535c6..00000000 --- a/src/starkware/cairo/cairo_verifier/layouts/all_cairo/CMakeLists.txt +++ /dev/null @@ -1,25 +0,0 @@ -full_python_test(cairo_verifier_program_hash_all_cairo_test - PREFIX starkware/cairo/cairo_verifier/layouts/all_cairo - PYTHON ${PYTHON_COMMAND} - TESTED_MODULES starkware/cairo/cairo_verifier/layouts/all_cairo - - FILES - program_hash.json - program_hash_test.py - - LIBS - cairo_hash_program_lib - program_hash_test_utils_lib - pip_pytest - - ARTIFACTS - "${CMAKE_BINARY_DIR}/src/starkware/cairo/cairo_verifier/cairo_verifier_compiled_all_cairo.json cairo_verifier_compiled_all_cairo.json" -) - -add_dependencies(cairo_verifier_program_hash_all_cairo_test_lib cairo_verifier_program_all_cairo) - -python_exe(generate_cairo_verifier_program_hash_all_cairo - VENV cairo_verifier_program_hash_all_cairo_test_venv - MODULE starkware.cairo.cairo_verifier.layouts.all_cairo.program_hash_test - ARGS "--fix" -) diff --git a/src/starkware/cairo/cairo_verifier/layouts/all_cairo/program_hash_test.py b/src/starkware/cairo/cairo_verifier/layouts/all_cairo/program_hash_test.py index 0fdfe384..bf48b0f0 100644 --- a/src/starkware/cairo/cairo_verifier/layouts/all_cairo/program_hash_test.py +++ b/src/starkware/cairo/cairo_verifier/layouts/all_cairo/program_hash_test.py @@ -1,13 +1,19 @@ -import os - from starkware.cairo.bootloaders.program_hash_test_utils import ( program_hash_test_main, run_generate_hash_test, ) +from starkware.python.utils import get_build_dir_path, get_source_dir_path + +PROGRAM_PATH = get_build_dir_path( + "src/starkware/cairo/cairo_verifier/cairo_verifier_compiled_all_cairo.json" +) +HASH_PATH = get_source_dir_path( + rel_path="src/starkware/cairo/cairo_verifier/layouts/all_cairo/program_hash.json", + default_value=get_build_dir_path( + "src/starkware/cairo/cairo_verifier/layouts/all_cairo/program_hash.json" + ), +) -CURRENT_DIR_PATH = os.path.dirname(__file__) -PROGRAM_PATH = os.path.join(CURRENT_DIR_PATH, "cairo_verifier_compiled_all_cairo.json") -HASH_PATH = os.path.join(CURRENT_DIR_PATH, "program_hash.json") COMMAND = "generate_cairo_verifier_program_hash_all_cairo" diff --git a/src/starkware/cairo/common/BUILD b/src/starkware/cairo/common/BUILD new file mode 100644 index 00000000..4e990d62 --- /dev/null +++ b/src/starkware/cairo/common/BUILD @@ -0,0 +1,140 @@ +load("//src/starkware/cairo:vars.bzl", "CAIRO_COMMON_LIB_ADDITIONAL_FILES", "CAIRO_COMMON_LIB_ADDITIONAL_LIBS") +load("//src/starkware/cairo/lang:cairo_rules.bzl", "cairo_library") + +cairo_library( + name = "cairo_common_cairo_lib", + srcs = [ + "alloc.cairo", + "bitwise.cairo", + "bool.cairo", + "cairo_builtins.cairo", + "default_dict.cairo", + "dict.cairo", + "dict_access.cairo", + "ec.cairo", + "ec_point.cairo", + "find_element.cairo", + "hash.cairo", + "hash_chain.cairo", + "hash_state.cairo", + "hash_state_poseidon.cairo", + "invoke.cairo", + "keccak.cairo", + "keccak_state.cairo", + "math.cairo", + "math_cmp.cairo", + "memcpy.cairo", + "memset.cairo", + "merkle_multi_update.cairo", + "merkle_update.cairo", + "patricia_with_sponge.cairo", + "patricia.cairo", + "patricia_with_poseidon.cairo", + "patricia_utils.cairo", + "poseidon_state.cairo", + "pow.cairo", + "registers.cairo", + "segments.cairo", + "serialize.cairo", + "set.cairo", + "signature.cairo", + "small_merkle_tree.cairo", + "sponge_as_hash.cairo", + "squash_dict.cairo", + "uint256.cairo", + "usort.cairo", + "//src/starkware/cairo/common/builtin_keccak:keccak.cairo", + "//src/starkware/cairo/common/builtin_poseidon:poseidon.cairo", + "//src/starkware/cairo/common/cairo_blake2s:blake2s.cairo", + "//src/starkware/cairo/common/cairo_blake2s:packed_blake2s.cairo", + "//src/starkware/cairo/common/cairo_keccak:keccak.cairo", + "//src/starkware/cairo/common/cairo_keccak:packed_keccak.cairo", + "//src/starkware/cairo/common/cairo_secp:bigint.cairo", + "//src/starkware/cairo/common/cairo_secp:constants.cairo", + "//src/starkware/cairo/common/cairo_secp:ec.cairo", + "//src/starkware/cairo/common/cairo_secp:field.cairo", + "//src/starkware/cairo/common/cairo_secp:signature.cairo", + "//src/starkware/cairo/common/keccak_utils:keccak_utils.cairo", + ] + CAIRO_COMMON_LIB_ADDITIONAL_FILES, +) + +py_library( + name = "poseidon_utils_lib", + srcs = [ + "poseidon_hash.py", + "poseidon_utils.py", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/starkware/cairo/lang:cairo_constants_lib", + "//src/starkware/python:starkware_python_utils_lib", + ], +) + +py_library( + name = "cairo_common_lib", + srcs = [ + "dict.py", + "hash_chain.py", + "hash_state.py", + "math_utils.py", + "patricia_utils.py", + "small_merkle_tree.py", + "structs.py", + "//src/starkware/cairo/common/cairo_blake2s:blake2s_utils.py", + "//src/starkware/cairo/common/cairo_keccak:keccak_utils.py", + "//src/starkware/cairo/common/cairo_secp:secp256r1_utils.py", + "//src/starkware/cairo/common/cairo_secp:secp_utils.py", + "//src/starkware/cairo/common/cairo_sha256:sha256_utils.py", + "//src/starkware/cairo/common/keccak_utils:keccak_utils.py", + ], + data = [ + ":cairo_common_cairo_lib", + ], + visibility = ["//visibility:public"], + deps = [ + "poseidon_utils_lib", + "//src/starkware/cairo/lang/vm:cairo_vm_crypto_lib", + "//src/starkware/cairo/lang:cairo_constants_lib", + "//src/starkware/python:starkware_python_utils_lib", + "//src/starkware/python:starkware_merkle_tree_lib", + ] + CAIRO_COMMON_LIB_ADDITIONAL_LIBS, +) + +package(default_visibility = ["//visibility:public"]) + +exports_files(glob([ + "*.cairo", + "*.py", +])) + +py_library( + name = "cairo_common_validate_utils_lib", + srcs = [ + "validate_utils.py", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/starkware/cairo/lang/builtins:cairo_run_builtins_lib", + "//src/starkware/cairo/lang/vm:cairo_run_lib", + "//src/starkware/cairo/lang/vm:cairo_vm_lib", + "//src/starkware/python:starkware_python_utils_lib", + ], +) + +py_library( + name = "cairo_function_runner_lib", + srcs = [ + "cairo_function_runner.py", + ], + visibility = ["//visibility:public"], + deps = [ + "cairo_common_lib", + "//src/starkware/cairo/lang/builtins:cairo_run_builtins_lib", + "//src/starkware/cairo/lang/compiler:cairo_compile_lib", + "//src/starkware/cairo/lang/tracer:cairo_tracer_lib", + "//src/starkware/cairo/lang/vm:cairo_run_lib", + "//src/starkware/cairo/lang/vm:cairo_vm_crypto_lib", + "//src/starkware/cairo/lang/vm:cairo_vm_lib", + ], +) diff --git a/src/starkware/cairo/common/CMakeLists.txt b/src/starkware/cairo/common/CMakeLists.txt deleted file mode 100644 index 8c96c0e8..00000000 --- a/src/starkware/cairo/common/CMakeLists.txt +++ /dev/null @@ -1,119 +0,0 @@ -add_subdirectory(cairo_blake2s) - -python_lib(cairo_common_lib - PREFIX starkware/cairo/common - FILES - alloc.cairo - bitwise.cairo - bool.cairo - builtin_keccak/keccak.cairo - builtin_poseidon/poseidon.cairo - cairo_blake2s/blake2s.cairo - cairo_blake2s/blake2s_utils.py - cairo_blake2s/packed_blake2s.cairo - cairo_builtins.cairo - cairo_keccak/keccak.cairo - cairo_keccak/keccak_utils.py - cairo_keccak/packed_keccak.cairo - cairo_secp/bigint.cairo - cairo_secp/constants.cairo - cairo_secp/ec.cairo - cairo_secp/field.cairo - cairo_secp/secp256r1_utils.py - cairo_secp/secp_utils.py - cairo_secp/signature.cairo - cairo_sha256/sha256_utils.py - default_dict.cairo - dict_access.cairo - dict.cairo - dict.py - ec.cairo - ec_point.cairo - find_element.cairo - hash_chain.cairo - hash_chain.py - hash_state.cairo - hash_state_poseidon.cairo - hash_state.py - hash.cairo - invoke.cairo - keccak.cairo - keccak_state.cairo - keccak_utils/keccak_utils.py - keccak_utils/keccak_utils.cairo - math_cmp.cairo - math_utils.py - math.cairo - memcpy.cairo - memset.cairo - merkle_multi_update.cairo - merkle_update.cairo - patricia_utils.py - patricia_with_sponge.cairo - patricia_with_poseidon.cairo - patricia_utils.cairo - patricia.cairo - poseidon_state.cairo - pow.cairo - registers.cairo - segments.cairo - serialize.cairo - set.cairo - signature.cairo - small_merkle_tree.cairo - small_merkle_tree.py - sponge_as_hash.cairo - squash_dict.cairo - structs.py - uint256.cairo - usort.cairo - ${CAIRO_COMMON_LIB_ADDITIONAL_FILES} - - LIBS - cairo_constants_lib - cairo_vm_crypto_lib - poseidon_utils_lib - starkware_python_utils_lib - starkware_merkle_tree_lib - ${CAIRO_COMMON_LIB_ADDITIONAL_LIBS} -) - -python_lib(cairo_common_validate_utils_lib - PREFIX starkware/cairo/common - FILES - validate_utils.py - - LIBS - cairo_run_builtins_lib - cairo_run_lib - cairo_vm_lib - starkware_python_utils_lib -) - -python_lib(cairo_function_runner_lib - PREFIX starkware/cairo/common - - FILES - cairo_function_runner.py - - LIBS - cairo_common_lib - cairo_compile_lib - cairo_run_builtins_lib - cairo_run_lib - cairo_tracer_lib - cairo_vm_crypto_lib - cairo_vm_lib -) - -python_lib(poseidon_utils_lib - PREFIX starkware/cairo/common - - FILES - poseidon_hash.py - poseidon_utils.py - - LIBS - cairo_constants_lib - starkware_python_utils_lib -) diff --git a/src/starkware/cairo/common/builtin_keccak/BUILD b/src/starkware/cairo/common/builtin_keccak/BUILD new file mode 100644 index 00000000..f879fce4 --- /dev/null +++ b/src/starkware/cairo/common/builtin_keccak/BUILD @@ -0,0 +1,3 @@ +package(default_visibility = ["//visibility:public"]) + +exports_files(["keccak.cairo"]) diff --git a/src/starkware/cairo/common/builtin_keccak/keccak.cairo b/src/starkware/cairo/common/builtin_keccak/keccak.cairo index 473e364e..6a96d195 100644 --- a/src/starkware/cairo/common/builtin_keccak/keccak.cairo +++ b/src/starkware/cairo/common/builtin_keccak/keccak.cairo @@ -81,19 +81,11 @@ func keccak_felts_bigend{range_check_ptr, bitwise_ptr: BitwiseBuiltin*, keccak_p return keccak_bigend(inputs=inputs_start, n_bytes=n_elements * 32); } -// Computes the keccak of 'input'. -// To use this function, split the input into words of 64 bits (little endian). -// For example, to compute keccak('Hello world!'), use: -// inputs = [8031924123371070792, 560229490] -// where: -// 8031924123371070792 == int.from_bytes(b'Hello wo', 'little') -// 560229490 == int.from_bytes(b'rld!', 'little') -// -// Returns the hash as a Uint256. -func keccak{range_check_ptr, bitwise_ptr: BitwiseBuiltin*, keccak_ptr: KeccakBuiltin*}( - inputs: felt*, n_bytes: felt +// Converts a final state of the Keccak builtin to the hash output as `Uint256`. +@known_ap_change +func _keccak_output_to_uint256{range_check_ptr, bitwise_ptr: BitwiseBuiltin*}( + output: KeccakBuiltinState* ) -> (res: Uint256) { - let (output) = keccak_final_state(inputs=inputs, n_bytes=n_bytes); tempvar output0 = output.s0; tempvar output1 = output.s1; @@ -124,6 +116,24 @@ func keccak{range_check_ptr, bitwise_ptr: BitwiseBuiltin*, keccak_ptr: KeccakBui return (res=Uint256(low=output0_low, high=res_high)); } +// Computes the keccak of 'input'. +// To use this function, split the input into words of 64 bits (little endian). +// For example, to compute keccak('Hello world!'), use: +// inputs = [8031924123371070792, 560229490] +// where: +// 8031924123371070792 == int.from_bytes(b'Hello wo', 'little') +// 560229490 == int.from_bytes(b'rld!', 'little') +// +// Returns the hash as a Uint256. +func keccak{range_check_ptr, bitwise_ptr: BitwiseBuiltin*, keccak_ptr: KeccakBuiltin*}( + inputs: felt*, n_bytes: felt +) -> (res: Uint256) { + let (output) = keccak_final_state(inputs=inputs, n_bytes=n_bytes); + + let res = _keccak_output_to_uint256(output); + return res; +} + // Same as keccak, but outputs the hash in big endian representation. // Note that the input is still treated as little endian. func keccak_bigend{range_check_ptr, bitwise_ptr: BitwiseBuiltin*, keccak_ptr: KeccakBuiltin*}( @@ -362,3 +372,30 @@ func _keccak{range_check_ptr, bitwise_ptr: BitwiseBuiltin*, keccak_ptr: KeccakBu let keccak_ptr = keccak_ptr + KeccakBuiltin.SIZE; return (output=state); } + +// Same as keccak but assumes that the input was already padded to 1088-bit blocks. +// Namely, the size of the `inputs` should be `n_blocks * KECCAK_FULL_RATE_IN_WORDS`. +func keccak_padded_input{range_check_ptr, bitwise_ptr: BitwiseBuiltin*, keccak_ptr: KeccakBuiltin*}( + inputs: felt*, n_blocks: felt +) -> (res: Uint256) { + tempvar state = new KeccakBuiltinState(s0=0, s1=0, s2=0, s3=0, s4=0, s5=0, s6=0, s7=0); + let output = _keccak_padded_input(inputs, n_blocks, state); + let res = _keccak_output_to_uint256(output); + return res; +} + +func _keccak_padded_input{ + range_check_ptr, bitwise_ptr: BitwiseBuiltin*, keccak_ptr: KeccakBuiltin* +}(inputs: felt*, n_blocks: felt, state: KeccakBuiltinState*) -> KeccakBuiltinState* { + if (n_blocks == 0) { + return state; + } + + _prepare_full_block(inputs=inputs, state=state); + let state = &(keccak_ptr.output); + let keccak_ptr = keccak_ptr + KeccakBuiltin.SIZE; + + return _keccak_padded_input( + inputs=&inputs[KECCAK_FULL_RATE_IN_WORDS], n_blocks=n_blocks - 1, state=state + ); +} diff --git a/src/starkware/cairo/common/builtin_poseidon/BUILD b/src/starkware/cairo/common/builtin_poseidon/BUILD new file mode 100644 index 00000000..2c9e2d24 --- /dev/null +++ b/src/starkware/cairo/common/builtin_poseidon/BUILD @@ -0,0 +1,3 @@ +package(default_visibility = ["//visibility:public"]) + +exports_files(["poseidon.cairo"]) diff --git a/src/starkware/cairo/common/cairo_blake2s/BUILD b/src/starkware/cairo/common/cairo_blake2s/BUILD new file mode 100644 index 00000000..f64196ac --- /dev/null +++ b/src/starkware/cairo/common/cairo_blake2s/BUILD @@ -0,0 +1,25 @@ +load("//bazel_utils/python:defs.bzl", "requirement") +load("//bazel_utils:python.bzl", "pytest_test") + +pytest_test( + name = "cairo_blake2s_test", + srcs = [ + "blake2s_test.py", + ], + data = [ + "blake2s_test.cairo", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/starkware/cairo/common:cairo_common_lib", + "//src/starkware/cairo/common:cairo_function_runner_lib", + "//src/starkware/cairo/lang:cairo_constants_lib", + requirement("pytest_asyncio"), + ], +) + +exports_files([ + "blake2s.cairo", + "blake2s_utils.py", + "packed_blake2s.cairo", +]) diff --git a/src/starkware/cairo/common/cairo_blake2s/CMakeLists.txt b/src/starkware/cairo/common/cairo_blake2s/CMakeLists.txt deleted file mode 100644 index e2a2a159..00000000 --- a/src/starkware/cairo/common/cairo_blake2s/CMakeLists.txt +++ /dev/null @@ -1,16 +0,0 @@ -full_python_test(cairo_blake2s_test - PREFIX starkware/cairo/common/cairo_blake2s - PYTHON ${PYTHON_COMMAND} - TESTED_MODULES starkware/cairo/common - - FILES - blake2s_test.cairo - blake2s_test.py - - LIBS - cairo_common_lib - cairo_constants_lib - cairo_function_runner_lib - pip_pytest - pip_pytest_asyncio -) diff --git a/src/starkware/cairo/common/cairo_keccak/BUILD b/src/starkware/cairo/common/cairo_keccak/BUILD new file mode 100644 index 00000000..53205263 --- /dev/null +++ b/src/starkware/cairo/common/cairo_keccak/BUILD @@ -0,0 +1,7 @@ +package(default_visibility = ["//visibility:public"]) + +exports_files([ + "keccak.cairo", + "keccak_utils.py", + "packed_keccak.cairo", +]) diff --git a/src/starkware/cairo/common/cairo_secp/BUILD b/src/starkware/cairo/common/cairo_secp/BUILD new file mode 100644 index 00000000..93e06769 --- /dev/null +++ b/src/starkware/cairo/common/cairo_secp/BUILD @@ -0,0 +1,6 @@ +package(default_visibility = ["//visibility:public"]) + +exports_files(glob([ + "*.cairo", + "*.py", +])) diff --git a/src/starkware/cairo/common/cairo_sha256/BUILD b/src/starkware/cairo/common/cairo_sha256/BUILD new file mode 100644 index 00000000..3c3658c5 --- /dev/null +++ b/src/starkware/cairo/common/cairo_sha256/BUILD @@ -0,0 +1,3 @@ +package(default_visibility = ["//visibility:public"]) + +exports_files(["sha256_utils.py"]) diff --git a/src/starkware/cairo/common/keccak_utils/BUILD b/src/starkware/cairo/common/keccak_utils/BUILD new file mode 100644 index 00000000..669d381f --- /dev/null +++ b/src/starkware/cairo/common/keccak_utils/BUILD @@ -0,0 +1,6 @@ +package(default_visibility = ["//visibility:public"]) + +exports_files([ + "keccak_utils.cairo", + "keccak_utils.py", +]) diff --git a/src/starkware/cairo/lang/BUILD b/src/starkware/cairo/lang/BUILD new file mode 100644 index 00000000..b03d0ee1 --- /dev/null +++ b/src/starkware/cairo/lang/BUILD @@ -0,0 +1,90 @@ +load("//src/starkware/cairo:vars.bzl", "CAIRO_INSTANCES_LIB_ADDITIONAL_FILES") +load("//bazel_utils:python.bzl", "py_exe") + +# Python library with all the dependencies that should be part of the cairo-lang package. +py_library( + name = "cairo_lang_package_lib", + srcs = [ + "create_cairo_lang_zip.py", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/starkware/cairo/bootloaders:cairo_bootloader_generate_fact_lib", + "//src/starkware/cairo/bootloaders:cairo_hash_program_lib", + "//src/starkware/cairo/bootloaders:program_hash_test_utils_lib", + "//src/starkware/cairo/common:cairo_common_lib", + "//src/starkware/cairo/lang/compiler:cairo_compile_lib", + "//src/starkware/cairo/lang/compiler:cairo_compile_test_utils_lib", + "//src/starkware/cairo/lang/scripts:cairo_script_lib", + "//src/starkware/cairo/lang/vm:cairo_run_lib", + "//src/starkware/cairo/sharp:sharp_client_config_lib", + "//src/starkware/cairo/sharp:sharp_client_lib", + "//src/starkware/eth:starkware_eth_test_utils_lib", + "//src/starkware/starknet/business_logic/fact_state:starknet_business_logic_fact_state_lib", + "//src/starkware/starknet/business_logic/state:starknet_business_logic_state_lib", + "//src/starkware/starknet/core/os/block_hash:starknet_block_hash_lib", + "//src/starkware/starknet/core/test_contract:starknet_test_external_contract_test_utils_lib", + "//src/starkware/starknet/scripts:starknet_script_lib", + "//src/starkware/starknet/services/utils:starknet_sequencer_api_utils_lib", + "//src/starkware/starknet/testing:starknet_testing_lib", + ], +) + +# src/starkware/cairo/lang/setup.py is run inside the runfiles directory of this target +# to create the cairo-lang package zip. +py_exe( + name = "create_cairo_lang_package_zip", + module = "starkware.cairo.lang.create_cairo_lang_zip", + deps = [ + "cairo_lang_package_lib", + "//src/starkware/python:starkware_python_utils_lib", + ], +) + +package(default_visibility = ["//visibility:public"]) + +exports_files(["cairo_constants.py"]) + +py_library( + name = "cairo_version_lib", + srcs = [ + "version.py", + ], + data = [ + "VERSION", + ], + visibility = ["//visibility:public"], + deps = [ + ], +) + +py_library( + name = "cairo_instances_lib", + srcs = [ + "instances.py", + ] + CAIRO_INSTANCES_LIB_ADDITIONAL_FILES, + visibility = ["//visibility:public"], + deps = [ + "//src/starkware/cairo/lang/builtins:cairo_run_builtins_lib", + ], +) + +py_library( + name = "cairo_constants_lib", + srcs = [ + "cairo_constants.py", + ], + visibility = ["//visibility:public"], + deps = [ + ], +) + +py_library( + name = "dynamic_layout_params_lib", + srcs = [ + "dynamic_layout_params.py", + ], + visibility = ["//visibility:public"], + deps = [ + ], +) diff --git a/src/starkware/cairo/lang/CMakeLists.txt b/src/starkware/cairo/lang/CMakeLists.txt deleted file mode 100644 index fa88e88d..00000000 --- a/src/starkware/cairo/lang/CMakeLists.txt +++ /dev/null @@ -1,8 +0,0 @@ -add_subdirectory(builtins) -add_subdirectory(compiler) -add_subdirectory(migrators) -add_subdirectory(scripts) -add_subdirectory(tracer) -add_subdirectory(vm) - -include(lang.cmake) diff --git a/src/starkware/cairo/lang/VERSION b/src/starkware/cairo/lang/VERSION index 8f07b868..fd61b759 100644 --- a/src/starkware/cairo/lang/VERSION +++ b/src/starkware/cairo/lang/VERSION @@ -1 +1 @@ -0.11.0.2 +0.11.1a0 diff --git a/src/starkware/cairo/lang/builtins/BUILD b/src/starkware/cairo/lang/builtins/BUILD new file mode 100644 index 00000000..1653b3ff --- /dev/null +++ b/src/starkware/cairo/lang/builtins/BUILD @@ -0,0 +1,51 @@ +package(default_visibility = ["//visibility:public"]) + +py_library( + name = "cairo_run_builtins_lib", + srcs = [ + "//src/starkware/cairo/lang/builtins/bitwise:bitwise_builtin_runner.py", + "//src/starkware/cairo/lang/builtins/bitwise:instance_def.py", + "//src/starkware/cairo/lang/builtins/ec:ec_op_builtin_runner.py", + "//src/starkware/cairo/lang/builtins/ec:instance_def.py", + "//src/starkware/cairo/lang/builtins/hash:hash_builtin_runner.py", + "//src/starkware/cairo/lang/builtins/hash:instance_def.py", + "//src/starkware/cairo/lang/builtins/keccak:instance_def.py", + "//src/starkware/cairo/lang/builtins/keccak:keccak_builtin_runner.py", + "//src/starkware/cairo/lang/builtins/poseidon:instance_def.py", + "//src/starkware/cairo/lang/builtins/poseidon:poseidon_builtin_runner.py", + "//src/starkware/cairo/lang/builtins/range_check:instance_def.py", + "//src/starkware/cairo/lang/builtins/range_check:range_check_builtin_runner.py", + "//src/starkware/cairo/lang/builtins/signature:instance_def.py", + "//src/starkware/cairo/lang/builtins/signature:signature_builtin_runner.py", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/starkware/cairo/common:cairo_common_lib", + "//src/starkware/cairo/lang/vm:cairo_relocatable_lib", + "//src/starkware/cairo/lang/vm:cairo_vm_crypto_lib", + "//src/starkware/cairo/lang/vm:cairo_vm_lib", + "//src/starkware/python:starkware_python_utils_lib", + ], +) + +py_library( + name = "cairo_all_builtins_lib", + srcs = [ + "all_builtins.py", + ], + visibility = ["//visibility:public"], + deps = [ + ], +) + +py_library( + name = "cairo_run_builtins_test_utils_lib", + srcs = [ + "builtin_runner_test_utils.py", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/starkware/cairo/lang/compiler:cairo_compile_lib", + "//src/starkware/cairo/lang/vm:cairo_run_lib", + ], +) diff --git a/src/starkware/cairo/lang/builtins/CMakeLists.txt b/src/starkware/cairo/lang/builtins/CMakeLists.txt deleted file mode 100644 index 02af1702..00000000 --- a/src/starkware/cairo/lang/builtins/CMakeLists.txt +++ /dev/null @@ -1,47 +0,0 @@ -add_subdirectory(ec) -add_subdirectory(range_check) -add_subdirectory(signature) - -python_lib(cairo_run_builtins_lib - PREFIX starkware/cairo/lang/builtins - - FILES - bitwise/bitwise_builtin_runner.py - bitwise/instance_def.py - ec/ec_op_builtin_runner.py - ec/instance_def.py - hash/hash_builtin_runner.py - hash/instance_def.py - keccak/keccak_builtin_runner.py - keccak/instance_def.py - poseidon/instance_def.py - poseidon/poseidon_builtin_runner.py - range_check/instance_def.py - range_check/range_check_builtin_runner.py - signature/instance_def.py - signature/signature_builtin_runner.py - - LIBS - cairo_common_lib - cairo_relocatable_lib - cairo_vm_crypto_lib - cairo_vm_lib - starkware_python_utils_lib -) - -python_lib(cairo_all_builtins_lib - PREFIX starkware/cairo/lang/builtins - - FILES - all_builtins.py -) - -python_lib(cairo_run_builtins_test_utils_lib - PREFIX starkware/cairo/lang/builtins - FILES - builtin_runner_test_utils.py - - LIBS - cairo_compile_lib - cairo_run_lib -) diff --git a/src/starkware/cairo/lang/builtins/bitwise/BUILD b/src/starkware/cairo/lang/builtins/bitwise/BUILD new file mode 100644 index 00000000..8292f6a0 --- /dev/null +++ b/src/starkware/cairo/lang/builtins/bitwise/BUILD @@ -0,0 +1,6 @@ +package(default_visibility = ["//visibility:public"]) + +exports_files([ + "bitwise_builtin_runner.py", + "instance_def.py", +]) diff --git a/src/starkware/cairo/lang/builtins/ec/BUILD b/src/starkware/cairo/lang/builtins/ec/BUILD new file mode 100644 index 00000000..66dca74f --- /dev/null +++ b/src/starkware/cairo/lang/builtins/ec/BUILD @@ -0,0 +1,22 @@ +load("//bazel_utils:python.bzl", "pytest_test") + +package(default_visibility = ["//visibility:public"]) + +exports_files([ + "ec_op_builtin_runner.py", + "instance_def.py", +]) + +pytest_test( + name = "cairo_run_builtins_ec_op_test", + srcs = [ + "ec_op_builtin_runner_test.py", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/starkware/cairo/lang/builtins:cairo_run_builtins_test_utils_lib", + "//src/starkware/cairo/lang/vm:cairo_vm_lib", + "//src/starkware/crypto:starkware_crypto_lib", + "//src/starkware/python:starkware_python_utils_lib", + ], +) diff --git a/src/starkware/cairo/lang/builtins/ec/CMakeLists.txt b/src/starkware/cairo/lang/builtins/ec/CMakeLists.txt deleted file mode 100644 index 2d990c23..00000000 --- a/src/starkware/cairo/lang/builtins/ec/CMakeLists.txt +++ /dev/null @@ -1,15 +0,0 @@ -full_python_test(cairo_run_builtins_ec_op_test - PREFIX starkware/cairo/lang/builtins/ec - PYTHON ${PYTHON_COMMAND} - TESTED_MODULES starkware/cairo/lang/builtins/ec - - FILES - ec_op_builtin_runner_test.py - - LIBS - cairo_run_builtins_test_utils_lib - cairo_vm_lib - starkware_crypto_lib - starkware_python_utils_lib - pip_pytest -) diff --git a/src/starkware/cairo/lang/builtins/hash/BUILD b/src/starkware/cairo/lang/builtins/hash/BUILD new file mode 100644 index 00000000..8486cb5f --- /dev/null +++ b/src/starkware/cairo/lang/builtins/hash/BUILD @@ -0,0 +1,6 @@ +package(default_visibility = ["//visibility:public"]) + +exports_files([ + "hash_builtin_runner.py", + "instance_def.py", +]) diff --git a/src/starkware/cairo/lang/builtins/keccak/BUILD b/src/starkware/cairo/lang/builtins/keccak/BUILD new file mode 100644 index 00000000..93dc1311 --- /dev/null +++ b/src/starkware/cairo/lang/builtins/keccak/BUILD @@ -0,0 +1,6 @@ +package(default_visibility = ["//visibility:public"]) + +exports_files([ + "instance_def.py", + "keccak_builtin_runner.py", +]) diff --git a/src/starkware/cairo/lang/builtins/poseidon/BUILD b/src/starkware/cairo/lang/builtins/poseidon/BUILD new file mode 100644 index 00000000..316f5d72 --- /dev/null +++ b/src/starkware/cairo/lang/builtins/poseidon/BUILD @@ -0,0 +1,6 @@ +package(default_visibility = ["//visibility:public"]) + +exports_files([ + "instance_def.py", + "poseidon_builtin_runner.py", +]) diff --git a/src/starkware/cairo/lang/builtins/range_check/BUILD b/src/starkware/cairo/lang/builtins/range_check/BUILD new file mode 100644 index 00000000..2ba9c013 --- /dev/null +++ b/src/starkware/cairo/lang/builtins/range_check/BUILD @@ -0,0 +1,20 @@ +load("//bazel_utils:python.bzl", "pytest_test") + +package(default_visibility = ["//visibility:public"]) + +exports_files([ + "instance_def.py", + "range_check_builtin_runner.py", +]) + +pytest_test( + name = "cairo_run_builtins_range_check_test", + srcs = [ + "range_check_builtin_runner_test.py", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/starkware/cairo/lang/builtins:cairo_run_builtins_test_utils_lib", + "//src/starkware/cairo/lang/vm:cairo_vm_lib", + ], +) diff --git a/src/starkware/cairo/lang/builtins/range_check/CMakeLists.txt b/src/starkware/cairo/lang/builtins/range_check/CMakeLists.txt deleted file mode 100644 index e70d104b..00000000 --- a/src/starkware/cairo/lang/builtins/range_check/CMakeLists.txt +++ /dev/null @@ -1,13 +0,0 @@ -full_python_test(cairo_run_builtins_range_check_test - PREFIX starkware/cairo/lang/builtins/range_check - PYTHON ${PYTHON_COMMAND} - TESTED_MODULES starkware/cairo/lang/builtins/range_check - - FILES - range_check_builtin_runner_test.py - - LIBS - cairo_run_builtins_test_utils_lib - cairo_vm_lib - pip_pytest -) diff --git a/src/starkware/cairo/lang/builtins/signature/BUILD b/src/starkware/cairo/lang/builtins/signature/BUILD new file mode 100644 index 00000000..aba204f6 --- /dev/null +++ b/src/starkware/cairo/lang/builtins/signature/BUILD @@ -0,0 +1,21 @@ +load("//bazel_utils:python.bzl", "pytest_test") + +package(default_visibility = ["//visibility:public"]) + +exports_files([ + "instance_def.py", + "signature_builtin_runner.py", +]) + +pytest_test( + name = "cairo_run_builtins_signature_test", + srcs = [ + "signature_builtin_runner_test.py", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/starkware/cairo/lang/builtins:cairo_run_builtins_test_utils_lib", + "//src/starkware/cairo/lang/vm:cairo_vm_lib", + "//src/starkware/python:starkware_python_test_utils_lib", + ], +) diff --git a/src/starkware/cairo/lang/builtins/signature/CMakeLists.txt b/src/starkware/cairo/lang/builtins/signature/CMakeLists.txt deleted file mode 100644 index e3b02e92..00000000 --- a/src/starkware/cairo/lang/builtins/signature/CMakeLists.txt +++ /dev/null @@ -1,14 +0,0 @@ -full_python_test(cairo_run_builtins_signature_test - PREFIX starkware/cairo/lang/builtins/signature - PYTHON ${PYTHON_COMMAND} - TESTED_MODULES starkware/cairo/lang/builtins/signature - - FILES - signature_builtin_runner_test.py - - LIBS - cairo_run_builtins_test_utils_lib - cairo_vm_lib - starkware_python_test_utils_lib - pip_pytest -) diff --git a/src/starkware/cairo/lang/cairo_cmake_rules.cmake b/src/starkware/cairo/lang/cairo_cmake_rules.cmake deleted file mode 100644 index 7ac1a295..00000000 --- a/src/starkware/cairo/lang/cairo_cmake_rules.cmake +++ /dev/null @@ -1,134 +0,0 @@ -# Generic logic for compiling Cairo or StarkNet contracts. -# See cairo_compile for usage example. -function(cairo_compile_base TARGET_NAME COMPILER_EXE COMPILED_PROGRAM_NAME SOURCE_FILE - COMPILE_FLAGS) - # Choose a file name for the Cairo dependencies of the compiled file. - set(COMPILE_DEPENDENCY_FILE - "${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME}_compile_dependencies.cmake") - # If this is the first build, create an empty dependency file (this file will be overriden when - # cairo-compile is executed with the actual dependencies, using the --cairo_dependencies flag). - if(NOT EXISTS ${COMPILE_DEPENDENCY_FILE}) - file(WRITE ${COMPILE_DEPENDENCY_FILE} "") - endif() - # The following include() will populate the DEPENDENCIES variable with the Cairo files. - include(${COMPILE_DEPENDENCY_FILE}) - - get_filename_component(COMPILER_EXE_TARGET ${COMPILER_EXE} NAME) - separate_arguments(COMPILE_FLAGS) - add_custom_command( - OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${COMPILED_PROGRAM_NAME}" - COMMAND ${COMPILER_EXE} - "${CMAKE_CURRENT_SOURCE_DIR}/${SOURCE_FILE}" - "--output=${CMAKE_CURRENT_BINARY_DIR}/${COMPILED_PROGRAM_NAME}" - "--prime=3618502788666131213697322783095070105623107215331596699973092056135872020481" - "--cairo_path=${CMAKE_SOURCE_DIR}/src" - "--cairo_dependencies=${COMPILE_DEPENDENCY_FILE}" - ${COMPILE_FLAGS} - DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/${SOURCE_FILE}" - ${COMPILE_DEPENDENCY_FILE} ${DEPENDENCIES} ${COMPILER_EXE_TARGET} ${COMPILER_EXE} - COMMENT "Compiling ${CMAKE_CURRENT_SOURCE_DIR}/${SOURCE_FILE}" - ) - - add_custom_target(${TARGET_NAME} - ALL - DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/${COMPILED_PROGRAM_NAME}" - ) -endfunction() - -# Compiles a Cairo program. -# Usage example: -# cairo_compile(mytarget main_compiled.json main.cairo "--debug_info_with_source") -function(cairo_compile TARGET_NAME COMPILED_PROGRAM_NAME SOURCE_FILE COMPILE_FLAGS) - cairo_compile_base( - ${TARGET_NAME} - "${CMAKE_BINARY_DIR}/src/starkware/cairo/lang/compiler/cairo_compile_exe" - "${COMPILED_PROGRAM_NAME}" - "${SOURCE_FILE}" - "${COMPILE_FLAGS}" - ) -endfunction() - - -# Compiles and runs a Cairo file. -# ARTIFACTS is a ';'-separated list that may contain the following artifacts: -# * trace -# * public_input -function(cairo_compile_run TARGET_NAME FILENAME STEPS ARTIFACTS COMPILE_FLAGS RUN_FLAGS) - get_lib_info_file(STAMP_FILE cairo_lang_venv) - - set(ARTIFACT_LIST ${ARTIFACTS}) - - # Choose a file name for the python dependencies of cairo-run. - set(RUN_DEPENDENCY_FILE "${CMAKE_CURRENT_BINARY_DIR}/${FILENAME}_run_dependencies.cmake") - # If this is the first build, create an empty dependency file (this file will be overriden when - # cairo-run is executed with the actual dependencies, using the --python_dependencies flag). - if(NOT EXISTS ${RUN_DEPENDENCY_FILE}) - file(WRITE ${RUN_DEPENDENCY_FILE} "") - endif() - # The following include() will populate the DEPENDENCIES variable with the python modules used - # by cairo-compile and cairo-run. - include(${RUN_DEPENDENCY_FILE}) - - if ("trace" IN_LIST ARTIFACT_LIST) - set(MEMORY_FILE "${CMAKE_CURRENT_BINARY_DIR}/${FILENAME}_memory.bin") - set(TRACE_FILE "${CMAKE_CURRENT_BINARY_DIR}/${FILENAME}_trace.bin") - set(TRACE_HEADER "${TRACE_FILE}.h") - set(MEMORY_HEADER "${MEMORY_FILE}.h") - set(GENERATE_TRACE "--trace_file=${TRACE_FILE}") - set(GENERATE_MEMORY "--memory_file=${MEMORY_FILE}") - endif() - if ("public_input" IN_LIST ARTIFACT_LIST) - set(PUBLIC_INPUT_FILE "${CMAKE_CURRENT_BINARY_DIR}/${FILENAME}_public_input.json") - set(PUBLIC_INPUT_HEADER "${PUBLIC_INPUT_FILE}.h") - set(GENERATE_PUBLIC_INPUT "--air_public_input=${PUBLIC_INPUT_FILE}") - endif() - - cairo_compile( - "${TARGET_NAME}_compile" - "${TARGET_NAME}_compiled.json" - "${FILENAME}.cairo" - "${COMPILE_FLAGS}") - - separate_arguments(RUN_FLAGS) - - add_custom_command( - OUTPUT "${MEMORY_FILE}" "${TRACE_FILE}" "${PUBLIC_INPUT_FILE}" - COMMAND "${CMAKE_BINARY_DIR}/src/starkware/cairo/lang/cairo_lang_venv/bin/python" - "-m" "starkware.cairo.lang.vm.cairo_run" - "--program=${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME}_compiled.json" - "--steps=${STEPS}" - "--python_dependencies=${RUN_DEPENDENCY_FILE}" - "--proof_mode" - ${RUN_FLAGS} - "${GENERATE_MEMORY}" - "${GENERATE_TRACE}" - "${GENERATE_PUBLIC_INPUT}" - DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/${FILENAME}.cairo" - "${TARGET_NAME}_compiled.json" - ${RUN_DEPENDENCY_FILE} ${DEPENDENCIES} cairo_lang_venv ${VENV_STAMP} - COMMENT "Executing ${CMAKE_CURRENT_SOURCE_DIR}/${FILENAME}.cairo" - ) - if ("trace" IN_LIST ARTIFACT_LIST) - generate_cpp_resource( - ${TRACE_FILE} - ${TRACE_HEADER} - ${FILENAME}_trace - ) - generate_cpp_resource( - ${MEMORY_FILE} - ${MEMORY_HEADER} - ${FILENAME}_memory - ) - endif() - if ("public_input" IN_LIST ARTIFACT_LIST) - generate_cpp_resource( - ${PUBLIC_INPUT_FILE} - ${PUBLIC_INPUT_HEADER} - ${FILENAME}_public_input - ) - endif() - - add_custom_target(${TARGET_NAME} - DEPENDS "${TRACE_HEADER}" "${MEMORY_HEADER}" "${PUBLIC_INPUT_HEADER}" - ) -endfunction(cairo_compile_run) diff --git a/src/starkware/cairo/lang/cairo_rules.bzl b/src/starkware/cairo/lang/cairo_rules.bzl new file mode 100644 index 00000000..ce06d18e --- /dev/null +++ b/src/starkware/cairo/lang/cairo_rules.bzl @@ -0,0 +1,74 @@ +CairoInfo = provider(fields = ["transitive_sources"]) + +def get_transitive_cairo_srcs(srcs, deps): + """ + Returns the Cairo source files for a target and its transitive dependencies. + """ + return depset(srcs, transitive = [dep[CairoInfo].transitive_sources for dep in deps]) + +# Rule for a library of Cairo files (similar to py_library). + +def _cairo_library_impl(ctx): + trans_srcs = get_transitive_cairo_srcs(srcs = ctx.files.srcs, deps = ctx.attr.deps) + return [ + CairoInfo(transitive_sources = trans_srcs), + DefaultInfo(runfiles = ctx.runfiles(transitive_files = trans_srcs)), + ] + +cairo_library = rule( + implementation = _cairo_library_impl, + attrs = { + "srcs": attr.label_list(allow_files = [".cairo"]), + "deps": attr.label_list(providers = [CairoInfo]), + }, +) + +def _cairo_binary_impl(ctx): + cairo_compile_exe = ctx.executable.cairo_compile_exe + trans_srcs = get_transitive_cairo_srcs(srcs = ctx.files.srcs, deps = ctx.attr.deps) + srcs_list = trans_srcs.to_list() + + out = ctx.outputs.compiled_program_name + outs = [out] + + additional_args = [] + if ctx.outputs.abi != None: + abi_out = ctx.outputs.abi + outs.append(abi_out) + additional_args += ["--abi", abi_out.path] + + ctx.actions.run( + executable = cairo_compile_exe, + arguments = [ + ctx.file.main.path, + "--output", + out.path, + "--cairo_path", + "src:external/cairo-lang/src", + ] + additional_args + ctx.attr.cairoopts, + inputs = srcs_list + [cairo_compile_exe], + outputs = outs, + progress_message = "Compiling %s..." % ctx.file.main.path, + ) + return [DefaultInfo(files = depset(outs))] + +# Rule for compiling a Cairo program (similar to py_binary). + +cairo_binary = rule( + implementation = _cairo_binary_impl, + attrs = { + "srcs": attr.label_list(allow_files = True), + "deps": attr.label_list(), + "cairo_compile_exe": attr.label( + default = Label("//src/starkware/cairo/lang/compiler:cairo_compile_exe"), + allow_files = True, + executable = True, + # See https://bazel.build/rules/rules#configurations. + cfg = "exec", + ), + "cairoopts": attr.string_list(), + "compiled_program_name": attr.output(mandatory = True), + "main": attr.label(allow_single_file = True, mandatory = True), + "abi": attr.output(), + }, +) diff --git a/src/starkware/cairo/lang/compiler/BUILD b/src/starkware/cairo/lang/compiler/BUILD new file mode 100644 index 00000000..40efd5d6 --- /dev/null +++ b/src/starkware/cairo/lang/compiler/BUILD @@ -0,0 +1,189 @@ +load("//src/starkware/cairo/lang/compiler:vars.bzl", "IS_COMPILER_PYPY") +load("//bazel_utils/python:defs.bzl", "requirement") +load("//bazel_utils:python.bzl", "py_exe", "pytest_test") +load("//src/starkware/cairo:vars.bzl", "CAIRO_LANG_VENV_ADDITIONAL_LIBS") + +py_exe( + name = "cairo_compile_exe", + is_pypy = IS_COMPILER_PYPY, + module = "starkware.cairo.lang.compiler.cairo_compile", + deps = [ + "//src/starkware/cairo/bootloaders:cairo_bootloader_generate_fact_lib", + "//src/starkware/cairo/common:cairo_common_lib", + "cairo_compile_lib", + "//src/starkware/cairo/bootloaders:cairo_hash_program_lib", + "//src/starkware/cairo/lang/vm:cairo_run_lib", + "//src/starkware/cairo/lang/scripts:cairo_script_lib", + ] + CAIRO_LANG_VENV_ADDITIONAL_LIBS, +) + +package(default_visibility = ["//visibility:public"]) + +py_library( + name = "cairo_compile_lib", + srcs = [ + "__init__.py", + "assembler.py", + "cairo_compile.py", + "cairo_format.py", + "const_expr_checker.py", + "constants.py", + "debug_info.py", + "encode.py", + "error_handling.py", + "expression_evaluator.py", + "expression_simplifier.py", + "expression_transformer.py", + "fields.py", + "filter_unused_identifiers.py", + "identifier_definition.py", + "identifier_manager.py", + "identifier_manager_field.py", + "identifier_utils.py", + "import_loader.py", + "injector.py", + "instruction.py", + "instruction_builder.py", + "location_utils.py", + "module_reader.py", + "offset_reference.py", + "parser.py", + "parser_transformer.py", + "program.py", + "proxy_identifier_manager.py", + "references.py", + "resolve_search_result.py", + "scoped_name.py", + "substitute_identifiers.py", + "type_casts.py", + "type_system.py", + "type_system_visitor.py", + "type_utils.py", + "unique_name_provider.py", + "//src/starkware/cairo/lang/compiler/ast:__init__.py", + "//src/starkware/cairo/lang/compiler/ast:aliased_identifier.py", + "//src/starkware/cairo/lang/compiler/ast:arguments.py", + "//src/starkware/cairo/lang/compiler/ast:bool_expr.py", + "//src/starkware/cairo/lang/compiler/ast:cairo_types.py", + "//src/starkware/cairo/lang/compiler/ast:code_elements.py", + "//src/starkware/cairo/lang/compiler/ast:expr.py", + "//src/starkware/cairo/lang/compiler/ast:expr_func_call.py", + "//src/starkware/cairo/lang/compiler/ast:formatting_utils.py", + "//src/starkware/cairo/lang/compiler/ast:instructions.py", + "//src/starkware/cairo/lang/compiler/ast:module.py", + "//src/starkware/cairo/lang/compiler/ast:node.py", + "//src/starkware/cairo/lang/compiler/ast:notes.py", + "//src/starkware/cairo/lang/compiler/ast:parentheses_expr_wrapper.py", + "//src/starkware/cairo/lang/compiler/ast:particle.py", + "//src/starkware/cairo/lang/compiler/ast:rvalue.py", + "//src/starkware/cairo/lang/compiler/ast:types.py", + "//src/starkware/cairo/lang/compiler/ast:visitor.py", + "//src/starkware/cairo/lang/compiler/preprocessor:__init__.py", + "//src/starkware/cairo/lang/compiler/preprocessor:auxiliary_info_collector.py", + "//src/starkware/cairo/lang/compiler/preprocessor:compound_expressions.py", + "//src/starkware/cairo/lang/compiler/preprocessor:default_pass_manager.py", + "//src/starkware/cairo/lang/compiler/preprocessor:dependency_graph.py", + "//src/starkware/cairo/lang/compiler/preprocessor:directives.py", + "//src/starkware/cairo/lang/compiler/preprocessor:flow.py", + "//src/starkware/cairo/lang/compiler/preprocessor:identifier_aware_visitor.py", + "//src/starkware/cairo/lang/compiler/preprocessor:identifier_collector.py", + "//src/starkware/cairo/lang/compiler/preprocessor:if_labels.py", + "//src/starkware/cairo/lang/compiler/preprocessor:local_variables.py", + "//src/starkware/cairo/lang/compiler/preprocessor:memento.py", + "//src/starkware/cairo/lang/compiler/preprocessor:pass_manager.py", + "//src/starkware/cairo/lang/compiler/preprocessor:preprocess_codes.py", + "//src/starkware/cairo/lang/compiler/preprocessor:preprocessor.py", + "//src/starkware/cairo/lang/compiler/preprocessor:preprocessor_error.py", + "//src/starkware/cairo/lang/compiler/preprocessor:preprocessor_utils.py", + "//src/starkware/cairo/lang/compiler/preprocessor:reg_tracking.py", + "//src/starkware/cairo/lang/compiler/preprocessor:struct_collector.py", + "//src/starkware/cairo/lang/compiler/preprocessor/bool_expr:__init__.py", + "//src/starkware/cairo/lang/compiler/preprocessor/bool_expr:errors.py", + "//src/starkware/cairo/lang/compiler/preprocessor/bool_expr:lowering.py", + "//src/starkware/cairo/lang/compiler/preprocessor/bool_expr:lowering_test_utils.py", + ], + data = [ + "cairo.ebnf", + "//src/starkware/cairo/lang/compiler/lib:registers.cairo", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/starkware/cairo/lang:cairo_constants_lib", + "//src/starkware/cairo/lang:cairo_version_lib", + "//src/starkware/python:starkware_expression_string_lib", + "//src/starkware/python:starkware_python_utils_lib", + "//src/starkware/starkware_utils:starkware_dataclasses_utils_lib", + requirement("marshmallow_dataclass"), + requirement("marshmallow_enum"), + requirement("marshmallow_oneofschema"), + requirement("marshmallow"), + requirement("lark"), + ], +) + +py_exe( + name = "cairo_format", + module = "starkware.cairo.lang.compiler.cairo_format", + deps = [ + "cairo_compile_lib", + ], +) + +py_library( + name = "cairo_compile_test_utils_lib", + srcs = [ + "test_utils.py", + "//src/starkware/cairo/lang/compiler/ast:ast_objects_test_utils.py", + "//src/starkware/cairo/lang/compiler/preprocessor:preprocessor_test_utils.py", + ], + visibility = ["//visibility:public"], + deps = [ + "cairo_compile_lib", + "//src/starkware/python:starkware_python_utils_lib", + ], +) + +pytest_test( + name = "cairo_compile_test", + srcs = [ + "assembler_test.py", + "ast_objects_test.py", + "cairo_compile_test.py", + "conftest.py", + "debug_info_test.py", + "encode_test.py", + "error_handling_test.py", + "expression_evaluator_test.py", + "expression_simplifier_test.py", + "filter_unused_identifiers_test.py", + "identifier_definition_test.py", + "identifier_manager_field_test.py", + "identifier_manager_test.py", + "identifier_utils_test.py", + "import_loader_test.py", + "injector_test.py", + "instruction_builder_test.py", + "instruction_test.py", + "module_reader_test.py", + "offset_reference_test.py", + "parser_errors_test.py", + "parser_test.py", + "parser_test_utils.py", + "proxy_identifier_manager_test.py", + "references_test.py", + "resolve_search_result_test.py", + "scoped_name_test.py", + "type_casts_test.py", + "type_system_visitor_test.py", + "type_utils_test.py", + "unique_name_provider_test.py", + ], + visibility = ["//visibility:public"], + deps = [ + "cairo_compile_lib", + "cairo_compile_test_utils_lib", + "//src/starkware/cairo/lang/vm:cairo_vm_test_utils_lib", + "//src/starkware/python:starkware_python_test_utils_lib", + "//src/starkware/python:starkware_python_utils_lib", + ], +) diff --git a/src/starkware/cairo/lang/compiler/CMakeLists.txt b/src/starkware/cairo/lang/compiler/CMakeLists.txt deleted file mode 100644 index 51d53ae8..00000000 --- a/src/starkware/cairo/lang/compiler/CMakeLists.txt +++ /dev/null @@ -1,176 +0,0 @@ -add_subdirectory(ast) -add_subdirectory(preprocessor) - -python_lib(cairo_compile_lib - PREFIX starkware/cairo/lang/compiler - FILES - __init__.py - assembler.py - ast/__init__.py - ast/aliased_identifier.py - ast/arguments.py - ast/bool_expr.py - ast/cairo_types.py - ast/code_elements.py - ast/expr.py - ast/expr_func_call.py - ast/formatting_utils.py - ast/instructions.py - ast/module.py - ast/node.py - ast/notes.py - ast/parentheses_expr_wrapper.py - ast/particle.py - ast/rvalue.py - ast/types.py - ast/visitor.py - cairo_compile.py - cairo_format.py - cairo.ebnf - constants.py - const_expr_checker.py - debug_info.py - encode.py - error_handling.py - expression_evaluator.py - expression_simplifier.py - expression_transformer.py - fields.py - filter_unused_identifiers.py - identifier_definition.py - identifier_manager.py - identifier_manager_field.py - identifier_utils.py - import_loader.py - injector.py - instruction_builder.py - instruction.py - lib/registers.cairo - location_utils.py - module_reader.py - offset_reference.py - parser_transformer.py - parser.py - preprocessor/__init__.py - preprocessor/auxiliary_info_collector.py - preprocessor/bool_expr/__init__.py - preprocessor/bool_expr/errors.py - preprocessor/bool_expr/lowering.py - preprocessor/bool_expr/lowering_test_utils.py - preprocessor/compound_expressions.py - preprocessor/default_pass_manager.py - preprocessor/dependency_graph.py - preprocessor/directives.py - preprocessor/flow.py - preprocessor/identifier_aware_visitor.py - preprocessor/identifier_collector.py - preprocessor/if_labels.py - preprocessor/local_variables.py - preprocessor/memento.py - preprocessor/pass_manager.py - preprocessor/preprocess_codes.py - preprocessor/preprocessor_error.py - preprocessor/preprocessor_utils.py - preprocessor/preprocessor.py - preprocessor/reg_tracking.py - preprocessor/struct_collector.py - program.py - proxy_identifier_manager.py - references.py - resolve_search_result.py - scoped_name.py - substitute_identifiers.py - type_casts.py - type_system_visitor.py - type_system.py - type_utils.py - unique_name_provider.py - - LIBS - cairo_constants_lib - cairo_version_lib - starkware_dataclasses_utils_lib - starkware_expression_string_lib - starkware_python_utils_lib - pip_marshmallow_dataclass - pip_marshmallow_enum - pip_marshmallow_oneofschema - pip_marshmallow - pip_lark -) - -python_exe(cairo_compile_exe - VENV cairo_lang_venv - MODULE starkware.cairo.lang.compiler.cairo_compile -) - -python_venv(cairo_format_venv - PYTHON ${PYTHON_COMMAND} - LIBS - cairo_compile_lib -) - -python_exe(cairo_format - VENV cairo_format_venv - MODULE starkware.cairo.lang.compiler.cairo_format -) - -python_lib(cairo_compile_test_utils_lib - PREFIX starkware/cairo/lang/compiler - FILES - ast/ast_objects_test_utils.py - preprocessor/preprocessor_test_utils.py - test_utils.py - - LIBS - cairo_compile_lib - starkware_python_utils_lib - pip_pytest -) - -full_python_test(cairo_compile_test - PREFIX starkware/cairo/lang/compiler - PYTHON ${PYTHON_COMMAND} - TESTED_MODULES starkware/cairo/lang/compiler - - FILES - assembler_test.py - ast_objects_test.py - cairo_compile_test.py - conftest.py - debug_info_test.py - encode_test.py - error_handling_test.py - expression_evaluator_test.py - expression_simplifier_test.py - filter_unused_identifiers_test.py - identifier_definition_test.py - identifier_manager_field_test.py - identifier_manager_test.py - identifier_utils_test.py - import_loader_test.py - injector_test.py - instruction_builder_test.py - instruction_test.py - module_reader_test.py - offset_reference_test.py - parser_errors_test.py - parser_test_utils.py - parser_test.py - proxy_identifier_manager_test.py - references_test.py - resolve_search_result_test.py - scoped_name_test.py - type_casts_test.py - type_system_visitor_test.py - type_utils_test.py - unique_name_provider_test.py - - LIBS - cairo_compile_lib - cairo_compile_test_utils_lib - cairo_vm_test_utils_lib - starkware_python_test_utils_lib - starkware_python_utils_lib - pip_pytest -) diff --git a/src/starkware/cairo/lang/compiler/ast/BUILD b/src/starkware/cairo/lang/compiler/ast/BUILD new file mode 100644 index 00000000..41e630ed --- /dev/null +++ b/src/starkware/cairo/lang/compiler/ast/BUILD @@ -0,0 +1,18 @@ +load("//bazel_utils:python.bzl", "pytest_test") + +package(default_visibility = ["//visibility:public"]) + +exports_files(glob(["*.py"])) + +pytest_test( + name = "cairo_compile_formatting_test", + srcs = [ + "parentheses_expr_wrapper_test.py", + "particle_test.py", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/starkware/cairo/lang/compiler:cairo_compile_lib", + "//src/starkware/cairo/lang/compiler:cairo_compile_test_utils_lib", + ], +) diff --git a/src/starkware/cairo/lang/compiler/ast/CMakeLists.txt b/src/starkware/cairo/lang/compiler/ast/CMakeLists.txt deleted file mode 100644 index 6f9bbfeb..00000000 --- a/src/starkware/cairo/lang/compiler/ast/CMakeLists.txt +++ /dev/null @@ -1,14 +0,0 @@ -full_python_test(cairo_compile_formatting_test - PREFIX starkware/cairo/lang/compiler/ast - PYTHON ${PYTHON_COMMAND} - TESTED_MODULES starkware/cairo/lang/compiler/ast - - FILES - parentheses_expr_wrapper_test.py - particle_test.py - - LIBS - cairo_compile_lib - cairo_compile_test_utils_lib - pip_pytest -) diff --git a/src/starkware/cairo/lang/compiler/lib/BUILD b/src/starkware/cairo/lang/compiler/lib/BUILD new file mode 100644 index 00000000..db320d03 --- /dev/null +++ b/src/starkware/cairo/lang/compiler/lib/BUILD @@ -0,0 +1,3 @@ +package(default_visibility = ["//visibility:public"]) + +exports_files(["registers.cairo"]) diff --git a/src/starkware/cairo/lang/compiler/preprocessor/BUILD b/src/starkware/cairo/lang/compiler/preprocessor/BUILD new file mode 100644 index 00000000..87a5dbc9 --- /dev/null +++ b/src/starkware/cairo/lang/compiler/preprocessor/BUILD @@ -0,0 +1,28 @@ +load("//bazel_utils:python.bzl", "pytest_test") + +package(default_visibility = ["//visibility:public"]) + +exports_files(glob(["*.py"])) + +pytest_test( + name = "cairo_compile_preprocessor_test", + srcs = [ + "compound_expressions_test.py", + "conftest.py", + "dependency_graph_test.py", + "flow_test.py", + "identifier_aware_visitor_test.py", + "identifier_collector_test.py", + "if_labels_test.py", + "local_variables_test.py", + "memento_test.py", + "preprocessor_test.py", + "reg_tracking_test.py", + "struct_collector_test.py", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/starkware/cairo/lang/compiler:cairo_compile_lib", + "//src/starkware/cairo/lang/compiler:cairo_compile_test_utils_lib", + ], +) diff --git a/src/starkware/cairo/lang/compiler/preprocessor/CMakeLists.txt b/src/starkware/cairo/lang/compiler/preprocessor/CMakeLists.txt deleted file mode 100644 index cca6166a..00000000 --- a/src/starkware/cairo/lang/compiler/preprocessor/CMakeLists.txt +++ /dev/null @@ -1,26 +0,0 @@ -add_subdirectory(bool_expr) - -full_python_test(cairo_compile_preprocessor_test - PREFIX starkware/cairo/lang/compiler/preprocessor - PYTHON ${PYTHON_COMMAND} - TESTED_MODULES starkware/cairo/lang/compiler/preprocessor - - FILES - compound_expressions_test.py - conftest.py - dependency_graph_test.py - flow_test.py - identifier_aware_visitor_test.py - identifier_collector_test.py - if_labels_test.py - local_variables_test.py - memento_test.py - preprocessor_test.py - reg_tracking_test.py - struct_collector_test.py - - LIBS - cairo_compile_lib - cairo_compile_test_utils_lib - pip_pytest -) diff --git a/src/starkware/cairo/lang/compiler/preprocessor/bool_expr/BUILD b/src/starkware/cairo/lang/compiler/preprocessor/bool_expr/BUILD new file mode 100644 index 00000000..811773e8 --- /dev/null +++ b/src/starkware/cairo/lang/compiler/preprocessor/bool_expr/BUILD @@ -0,0 +1,22 @@ +load("//bazel_utils:python.bzl", "pytest_test") + +package(default_visibility = ["//visibility:public"]) + +exports_files([ + "__init__.py", + "errors.py", + "lowering.py", + "lowering_test_utils.py", +]) + +pytest_test( + name = "cairo_compile_preprocessor_bool_expr_test", + srcs = [ + "lowering_test.py", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/starkware/cairo/lang/compiler:cairo_compile_lib", + "//src/starkware/cairo/lang/compiler:cairo_compile_test_utils_lib", + ], +) diff --git a/src/starkware/cairo/lang/compiler/preprocessor/bool_expr/CMakeLists.txt b/src/starkware/cairo/lang/compiler/preprocessor/bool_expr/CMakeLists.txt deleted file mode 100644 index 1141a2e9..00000000 --- a/src/starkware/cairo/lang/compiler/preprocessor/bool_expr/CMakeLists.txt +++ /dev/null @@ -1,13 +0,0 @@ -full_python_test(cairo_compile_preprocessor_bool_expr_test - PREFIX starkware/cairo/lang/compiler/preprocessor/bool_expr - PYTHON ${PYTHON_COMMAND} - TESTED_MODULES starkware/cairo/lang/compiler/preprocessor/bool_expr - - FILES - lowering_test.py - - LIBS - cairo_compile_lib - - cairo_compile_test_utils_lib -) diff --git a/src/starkware/cairo/lang/compiler/preprocessor/preprocessor_test.py b/src/starkware/cairo/lang/compiler/preprocessor/preprocessor_test.py index 1aa0e148..798cd240 100644 --- a/src/starkware/cairo/lang/compiler/preprocessor/preprocessor_test.py +++ b/src/starkware/cairo/lang/compiler/preprocessor/preprocessor_test.py @@ -96,6 +96,16 @@ def test_scope_const(): ) +def test_pow_with_const_exponent(): + code = """ +const A = 5; +const B = 2 ** A; +[ap] = B; +""" + program = preprocess_str(code=code, prime=PRIME) + assert program.format() == "[ap] = 32;\n" + + def test_pow_failure(): verify_exception( """\ diff --git a/src/starkware/cairo/lang/compiler/substitute_identifiers.py b/src/starkware/cairo/lang/compiler/substitute_identifiers.py index 322e67d5..5601d10b 100644 --- a/src/starkware/cairo/lang/compiler/substitute_identifiers.py +++ b/src/starkware/cairo/lang/compiler/substitute_identifiers.py @@ -58,12 +58,20 @@ def visit_ExprCast(self, expr: ExprCast): ) def visit_ExprPow(self, expr: ExprPow): - # Same as super().visit_ExprPow, except that we don't visit expr.b. - # The reason is that the exponent shouldn't be taken modulo PRIME, so we don't allow - # using identifiers in the exponent. + # Same as super().visit_ExprPow, except that we visit expr.b only if it is an + # identifier that is resolved to a const. + # The reason for the limitation is that expressions in Cairo are simplified modulo PRIME + # but the exponent shouldn't be taken modulo PRIME. + fixed_b = expr.b + if isinstance(expr.b, ExprIdentifier): + # If expr.b is an Identifier try to substitute it only it it is a const. + res = self.visit(expr.b) + if isinstance(res, ExprConst): + fixed_b = res + return ExprPow( a=self.visit(expr.a), - b=expr.b, + b=fixed_b, notes=expr.notes, location=self.location_modifier(expr.location), ) diff --git a/src/starkware/cairo/lang/compiler/vars.bzl b/src/starkware/cairo/lang/compiler/vars.bzl new file mode 100644 index 00000000..3dc3ec5a --- /dev/null +++ b/src/starkware/cairo/lang/compiler/vars.bzl @@ -0,0 +1 @@ +IS_COMPILER_PYPY = False diff --git a/src/starkware/cairo/lang/create_cairo_lang_zip.py b/src/starkware/cairo/lang/create_cairo_lang_zip.py new file mode 100644 index 00000000..3ec5087e --- /dev/null +++ b/src/starkware/cairo/lang/create_cairo_lang_zip.py @@ -0,0 +1,48 @@ +""" +This script is run by the target create_cairo_lang_package_zip to create the cairo-lang package +zip file. +""" + +import os +import shutil +import subprocess +import sys + +from starkware.python.utils import get_build_dir_path + +INIT_FILE_CONTENT = "__path__ = __import__('pkgutil').extend_path(__path__, __name__)\n" + + +def add_init_files(path: str): + """ + Adds __init__.py files (with INIT_FILE_CONTENT) to every directory which does not have an init + file and contains a ".py" file or a sub directory. + """ + + for path, directories, files in os.walk(path): + if "__init__.py" in files: + continue + + if len(directories) > 0 or any(file_name.endswith(".py") for file_name in files): + with open(os.path.join(path, "__init__.py"), "w") as init_file: + init_file.write(INIT_FILE_CONTENT) + + +if __name__ == "__main__": + dst_dir = get_build_dir_path("src") + + # Add init files. + add_init_files(os.path.join(dst_dir, "starkware")) + add_init_files(os.path.join(dst_dir, "services")) + + shutil.copy("src/starkware/cairo/lang/setup.py", dst_dir) + shutil.copy("src/starkware/cairo/lang/MANIFEST.in", dst_dir) + shutil.copy("scripts/requirements-gen.txt", os.path.join(dst_dir, "requirements.txt")) + shutil.copy("README.md", dst_dir) + + # Run setup.py. + subprocess.check_call([sys.executable, "setup.py", "sdist", "--format=zip"], cwd=dst_dir) + + with open("src/starkware/cairo/lang/VERSION", "r") as f: + version = f.read().strip("\n") + shutil.copy(f"{dst_dir}/dist/cairo-lang-{version}.zip", ".") diff --git a/src/starkware/cairo/lang/ide/vscode-cairo/package.json b/src/starkware/cairo/lang/ide/vscode-cairo/package.json index 77cf415e..8bdda557 100644 --- a/src/starkware/cairo/lang/ide/vscode-cairo/package.json +++ b/src/starkware/cairo/lang/ide/vscode-cairo/package.json @@ -2,7 +2,7 @@ "name": "cairo", "displayName": "Cairo", "description": "Support Cairo syntax", - "version": "0.11.0", + "version": "0.11.1", "engines": { "vscode": "^1.30.0" }, diff --git a/src/starkware/cairo/lang/lang.cmake b/src/starkware/cairo/lang/lang.cmake deleted file mode 100644 index 90164379..00000000 --- a/src/starkware/cairo/lang/lang.cmake +++ /dev/null @@ -1,71 +0,0 @@ -python_lib(cairo_version_lib - PREFIX starkware/cairo/lang - - FILES - VERSION - version.py -) - -if (NOT DEFINED CAIRO_PYTHON_INTERPRETER) - set(CAIRO_PYTHON_INTERPRETER python3.9) -endif() - -python_venv(cairo_lang_venv - PYTHON ${CAIRO_PYTHON_INTERPRETER} - LIBS - cairo_bootloader_generate_fact_lib - cairo_common_lib - cairo_compile_lib - cairo_hash_program_lib - cairo_run_lib - cairo_script_lib - ${CAIRO_LANG_VENV_ADDITIONAL_LIBS} -) - -python_venv(cairo_lang_package_venv - PYTHON ${PYTHON_COMMAND} - LIBS - cairo_bootloader_generate_fact_lib - cairo_common_lib - cairo_compile_lib - cairo_compile_test_utils_lib - cairo_hash_program_lib - cairo_run_lib - cairo_script_lib - program_hash_test_utils_lib - sharp_client_config_lib - sharp_client_lib - starknet_block_hash_lib - starknet_business_logic_fact_state_lib - starknet_business_logic_state_lib - starknet_script_lib - starknet_sequencer_api_utils_lib - starknet_test_external_contract_test_utils_lib - starknet_testing_lib - starkware_eth_test_utils_lib -) - -python_lib(cairo_instances_lib - PREFIX starkware/cairo/lang - - FILES - instances.py - ${CAIRO_INSTANCES_LIB_ADDITIONAL_FILES} - - LIBS - cairo_run_builtins_lib -) - -python_lib(cairo_constants_lib - PREFIX starkware/cairo/lang - - FILES - cairo_constants.py -) - -python_lib(dynamic_layout_params_lib - PREFIX starkware/cairo/lang - - FILES - dynamic_layout_params.py -) diff --git a/src/starkware/cairo/lang/migrators/BUILD b/src/starkware/cairo/lang/migrators/BUILD new file mode 100644 index 00000000..732b785e --- /dev/null +++ b/src/starkware/cairo/lang/migrators/BUILD @@ -0,0 +1,37 @@ +load("//bazel_utils:python.bzl", "py_exe", "pytest_test") + +package(default_visibility = ["//visibility:public"]) + +py_library( + name = "cairo_migrator_lib", + srcs = [ + "migrator.py", + ], + data = [ + "migrator_grammar.ebnf", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/starkware/cairo/lang/compiler:cairo_compile_lib", + ], +) + +pytest_test( + name = "cairo_migrator_test", + srcs = [ + "migrator_test.py", + ], + visibility = ["//visibility:public"], + deps = [ + "cairo_migrator_lib", + "//src/starkware/cairo/lang/compiler:cairo_compile_lib", + ], +) + +py_exe( + name = "cairo_migrator", + module = "starkware.cairo.lang.migrators.migrator", + deps = [ + "cairo_migrator_lib", + ], +) diff --git a/src/starkware/cairo/lang/migrators/CMakeLists.txt b/src/starkware/cairo/lang/migrators/CMakeLists.txt deleted file mode 100644 index 8f1b7c60..00000000 --- a/src/starkware/cairo/lang/migrators/CMakeLists.txt +++ /dev/null @@ -1,35 +0,0 @@ -python_lib(cairo_migrator_lib - PREFIX starkware/cairo/lang/migrators - - FILES - migrator_grammar.ebnf - migrator.py - - LIBS - cairo_compile_lib -) - -full_python_test(cairo_migrator_test - PREFIX starkware/cairo/lang/migrators - PYTHON ${PYTHON_COMMAND} - TESTED_MODULES starkware/cairo/lang/migrators - - FILES - migrator_test.py - - LIBS - cairo_migrator_lib - cairo_compile_lib - pip_pytest -) - -python_venv(cairo_migrator_venv - PYTHON ${PYTHON_COMMAND} - LIBS - cairo_migrator_lib -) - -python_exe(cairo_migrator - VENV cairo_migrator_venv - MODULE starkware.cairo.lang.migrators.migrator -) diff --git a/src/starkware/cairo/lang/scripts/BUILD b/src/starkware/cairo/lang/scripts/BUILD new file mode 100644 index 00000000..be406f4e --- /dev/null +++ b/src/starkware/cairo/lang/scripts/BUILD @@ -0,0 +1,25 @@ +package(default_visibility = ["//visibility:public"]) + +py_library( + name = "cairo_script_lib", + srcs = [ + ], + data = [ + "cairo-compile", + "cairo-format", + "cairo-hash-program", + "cairo-migrate", + "cairo-reconstruct-traceback", + "cairo-run", + "cairo-sharp", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/starkware/cairo/bootloaders:cairo_hash_program_lib", + "//src/starkware/cairo/lang/compiler:cairo_compile_lib", + "//src/starkware/cairo/lang/migrators:cairo_migrator_lib", + "//src/starkware/cairo/lang/vm:cairo_run_lib", + "//src/starkware/cairo/lang/vm:cairo_vm_utils_lib", + "//src/starkware/cairo/sharp:sharp_client_lib", + ], +) diff --git a/src/starkware/cairo/lang/scripts/CMakeLists.txt b/src/starkware/cairo/lang/scripts/CMakeLists.txt deleted file mode 100644 index dfe529e0..00000000 --- a/src/starkware/cairo/lang/scripts/CMakeLists.txt +++ /dev/null @@ -1,19 +0,0 @@ -python_lib(cairo_script_lib - PREFIX starkware/cairo/lang/scripts - FILES - cairo-compile - cairo-format - cairo-hash-program - cairo-migrate - cairo-reconstruct-traceback - cairo-run - cairo-sharp - - LIBS - cairo_compile_lib - cairo_hash_program_lib - cairo_migrator_lib - cairo_run_lib - cairo_vm_utils_lib - sharp_client_lib -) diff --git a/src/starkware/cairo/lang/scripts/cairo-compile b/src/starkware/cairo/lang/scripts/cairo-compile index a89d73d9..423d2bee 100755 --- a/src/starkware/cairo/lang/scripts/cairo-compile +++ b/src/starkware/cairo/lang/scripts/cairo-compile @@ -3,8 +3,8 @@ import os import sys -sys.path.insert(0, os.path.join(os.path.dirname(__file__), '../../../..')) +sys.path.insert(0, os.path.join(os.path.dirname(__file__), "../../../..")) from starkware.cairo.lang.compiler.cairo_compile import main # noqa -if __name__ == '__main__': +if __name__ == "__main__": sys.exit(main()) diff --git a/src/starkware/cairo/lang/scripts/cairo-format b/src/starkware/cairo/lang/scripts/cairo-format index 27616baf..0e5749f7 100755 --- a/src/starkware/cairo/lang/scripts/cairo-format +++ b/src/starkware/cairo/lang/scripts/cairo-format @@ -3,8 +3,8 @@ import os import sys -sys.path.insert(0, os.path.join(os.path.dirname(__file__), '../../../..')) +sys.path.insert(0, os.path.join(os.path.dirname(__file__), "../../../..")) from starkware.cairo.lang.compiler.cairo_format import main # noqa -if __name__ == '__main__': +if __name__ == "__main__": sys.exit(main()) diff --git a/src/starkware/cairo/lang/scripts/cairo-hash-program b/src/starkware/cairo/lang/scripts/cairo-hash-program index 167d8f8c..4a90a218 100755 --- a/src/starkware/cairo/lang/scripts/cairo-hash-program +++ b/src/starkware/cairo/lang/scripts/cairo-hash-program @@ -3,8 +3,8 @@ import os import sys -sys.path.insert(0, os.path.join(os.path.dirname(__file__), '../../../..')) +sys.path.insert(0, os.path.join(os.path.dirname(__file__), "../../../..")) from starkware.cairo.bootloaders.hash_program import main # noqa -if __name__ == '__main__': +if __name__ == "__main__": sys.exit(main()) diff --git a/src/starkware/cairo/lang/scripts/cairo-migrate b/src/starkware/cairo/lang/scripts/cairo-migrate index d1490c55..1dca6e62 100755 --- a/src/starkware/cairo/lang/scripts/cairo-migrate +++ b/src/starkware/cairo/lang/scripts/cairo-migrate @@ -3,8 +3,8 @@ import os import sys -sys.path.insert(0, os.path.join(os.path.dirname(__file__), '../../../..')) +sys.path.insert(0, os.path.join(os.path.dirname(__file__), "../../../..")) from starkware.cairo.lang.migrators.migrator import main # noqa -if __name__ == '__main__': +if __name__ == "__main__": sys.exit(main()) diff --git a/src/starkware/cairo/lang/scripts/cairo-reconstruct-traceback b/src/starkware/cairo/lang/scripts/cairo-reconstruct-traceback index 21b72b67..9138b3d8 100755 --- a/src/starkware/cairo/lang/scripts/cairo-reconstruct-traceback +++ b/src/starkware/cairo/lang/scripts/cairo-reconstruct-traceback @@ -3,8 +3,8 @@ import os import sys -sys.path.insert(0, os.path.join(os.path.dirname(__file__), '../../../..')) +sys.path.insert(0, os.path.join(os.path.dirname(__file__), "../../../..")) from starkware.cairo.lang.vm.reconstruct_traceback import main # noqa -if __name__ == '__main__': +if __name__ == "__main__": sys.exit(main()) diff --git a/src/starkware/cairo/lang/scripts/cairo-run b/src/starkware/cairo/lang/scripts/cairo-run index 5fa5f3e9..970fb016 100755 --- a/src/starkware/cairo/lang/scripts/cairo-run +++ b/src/starkware/cairo/lang/scripts/cairo-run @@ -3,8 +3,8 @@ import os import sys -sys.path.insert(0, os.path.join(os.path.dirname(__file__), '../../../..')) +sys.path.insert(0, os.path.join(os.path.dirname(__file__), "../../../..")) from starkware.cairo.lang.vm.cairo_run import main # noqa -if __name__ == '__main__': +if __name__ == "__main__": sys.exit(main()) diff --git a/src/starkware/cairo/lang/scripts/cairo-sharp b/src/starkware/cairo/lang/scripts/cairo-sharp index 45e45b9b..0abd620a 100755 --- a/src/starkware/cairo/lang/scripts/cairo-sharp +++ b/src/starkware/cairo/lang/scripts/cairo-sharp @@ -3,8 +3,8 @@ import os import sys -sys.path.insert(0, os.path.join(os.path.dirname(__file__), '../../../..')) +sys.path.insert(0, os.path.join(os.path.dirname(__file__), "../../../..")) from starkware.cairo.sharp.sharp_client import main # noqa -if __name__ == '__main__': +if __name__ == "__main__": sys.exit(main()) diff --git a/src/starkware/cairo/lang/tracer/BUILD b/src/starkware/cairo/lang/tracer/BUILD new file mode 100644 index 00000000..8ae85994 --- /dev/null +++ b/src/starkware/cairo/lang/tracer/BUILD @@ -0,0 +1,39 @@ +load("//bazel_utils/python:defs.bzl", "requirement") +load("//bazel_utils:python.bzl", "pytest_test") + +package(default_visibility = ["//visibility:public"]) + +py_library( + name = "cairo_tracer_lib", + srcs = [ + "profile.py", + "profiler.py", + "tracer.py", + "tracer_data.py", + "//src/starkware/cairo/lang/tracer/third_party:profile_pb2.py", + ], + data = [ + "favicon.png", + "index.html", + "tracer.css", + "tracer.js", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/starkware/cairo/lang/compiler:cairo_compile_lib", + "//src/starkware/cairo/lang/vm:cairo_vm_lib", + requirement("protobuf"), + ], +) + +pytest_test( + name = "cairo_tracer_test", + srcs = [ + "tracer_data_test.py", + ], + visibility = ["//visibility:public"], + deps = [ + "cairo_tracer_lib", + "//src/starkware/cairo/lang/vm:cairo_run_lib", + ], +) diff --git a/src/starkware/cairo/lang/tracer/CMakeLists.txt b/src/starkware/cairo/lang/tracer/CMakeLists.txt deleted file mode 100644 index 80c46a2c..00000000 --- a/src/starkware/cairo/lang/tracer/CMakeLists.txt +++ /dev/null @@ -1,33 +0,0 @@ -python_lib(cairo_tracer_lib - PREFIX starkware/cairo/lang/tracer - - FILES - favicon.png - index.html - profile.py - profiler.py - third_party/profile_pb2.py - tracer_data.py - tracer.css - tracer.js - tracer.py - - LIBS - cairo_compile_lib - cairo_vm_lib - pip_protobuf -) - -full_python_test(cairo_tracer_test - PREFIX starkware/cairo/lang/tracer - PYTHON ${PYTHON_COMMAND} - TESTED_MODULES starkware/cairo/lang/tracer - - FILES - tracer_data_test.py - - LIBS - cairo_run_lib - cairo_tracer_lib - pip_pytest -) diff --git a/src/starkware/cairo/lang/tracer/third_party/BUILD b/src/starkware/cairo/lang/tracer/third_party/BUILD new file mode 100644 index 00000000..9e76ad3e --- /dev/null +++ b/src/starkware/cairo/lang/tracer/third_party/BUILD @@ -0,0 +1,3 @@ +package(default_visibility = ["//visibility:public"]) + +exports_files(["profile_pb2.py"]) diff --git a/src/starkware/cairo/lang/vm/BUILD b/src/starkware/cairo/lang/vm/BUILD new file mode 100644 index 00000000..faa57def --- /dev/null +++ b/src/starkware/cairo/lang/vm/BUILD @@ -0,0 +1,156 @@ +load("//bazel_utils/python:defs.bzl", "requirement") +load("//bazel_utils:python.bzl", "py_exe", "pytest_test") +load("//src/starkware/cairo:vars.bzl", "CAIRO_LANG_VENV_ADDITIONAL_LIBS", "CAIRO_VM_CRYPTO_ADDITIONAL_LIBS") + +package(default_visibility = ["//visibility:public"]) + +py_library( + name = "cairo_relocatable_lib", + srcs = [ + "relocatable.py", + "relocatable_fields.py", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/starkware/python:starkware_python_utils_lib", + requirement("marshmallow"), + ], +) + +py_library( + name = "cairo_vm_crypto_lib", + srcs = [ + "crypto.py", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/starkware/cairo/common:poseidon_utils_lib", + "//src/starkware/crypto:starkware_crypto_lib", + ] + CAIRO_VM_CRYPTO_ADDITIONAL_LIBS, +) + +py_library( + name = "cairo_vm_lib", + srcs = [ + "air_public_input.py", + "builtin_runner.py", + "cairo_pie.py", + "memory_dict.py", + "memory_dict_backend.py", + "memory_segments.py", + "output_builtin_runner.py", + "security.py", + "trace_entry.py", + "utils.py", + "validated_memory_dict.py", + "virtual_machine_base.py", + "vm.py", + "vm_consts.py", + "vm_core.py", + "vm_exceptions.py", + ], + visibility = ["//visibility:public"], + deps = [ + "cairo_relocatable_lib", + "cairo_vm_crypto_lib", + "//src/starkware/cairo/lang:dynamic_layout_params_lib", + "//src/starkware/cairo/lang/builtins:cairo_all_builtins_lib", + "//src/starkware/cairo/lang/compiler:cairo_compile_lib", + "//src/starkware/python:starkware_python_utils_lib", + "//src/starkware/starknet/security:starknet_security_lib", + ], +) + +py_library( + name = "cairo_run_lib", + srcs = [ + "cairo_run.py", + "cairo_runner.py", + ], + visibility = ["//visibility:public"], + deps = [ + "cairo_vm_lib", + "//src/starkware/cairo/lang:cairo_instances_lib", + "//src/starkware/cairo/lang:cairo_version_lib", + "//src/starkware/cairo/lang:dynamic_layout_params_lib", + "//src/starkware/cairo/lang/builtins:cairo_run_builtins_lib", + "//src/starkware/cairo/lang/compiler:cairo_compile_lib", + "//src/starkware/cairo/lang/tracer:cairo_tracer_lib", + "//src/starkware/python:starkware_python_utils_lib", + "//src/starkware/starkware_utils:starkware_utils_lib", + ], +) + +py_library( + name = "cairo_vm_utils_lib", + srcs = [ + "reconstruct_traceback.py", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/starkware/cairo/lang:cairo_version_lib", + "//src/starkware/cairo/lang/compiler:cairo_compile_lib", + ], +) + +py_exe( + name = "cairo_run_exe", + module = "starkware.cairo.lang.vm.cairo_run", + deps = [ + "//src/starkware/cairo/bootloaders:cairo_bootloader_generate_fact_lib", + "//src/starkware/cairo/common:cairo_common_lib", + "//src/starkware/cairo/lang/compiler:cairo_compile_lib", + "//src/starkware/cairo/bootloaders:cairo_hash_program_lib", + "cairo_run_lib", + "//src/starkware/cairo/lang/scripts:cairo_script_lib", + ] + CAIRO_LANG_VENV_ADDITIONAL_LIBS, +) + +py_library( + name = "cairo_vm_test_utils_lib", + srcs = [ + "test_utils.py", + ], + visibility = ["//visibility:public"], + deps = [ + "cairo_run_lib", + "cairo_vm_lib", + "//src/starkware/cairo/lang/compiler:cairo_compile_lib", + ], +) + +pytest_test( + name = "cairo_vm_test", + srcs = [ + "cairo_pie_test.py", + "cairo_runner_test.py", + "memory_dict_test.py", + "memory_segments_test.py", + "output_builtin_runner_test.py", + "reconstruct_traceback_test.py", + "relocatable_fields_test.py", + "relocatable_test.py", + "security_test.py", + "trace_entry_test.py", + "validated_memory_dict_test.py", + "vm_consts_test.py", + "vm_test.py", + ], + data = [ + "test.cairo", + ], + visibility = ["//visibility:public"], + deps = [ + "cairo_run_lib", + "cairo_vm_lib", + "cairo_vm_test_utils_lib", + "cairo_vm_utils_lib", + "//src/starkware/cairo/common:cairo_common_lib", + "//src/starkware/cairo/lang:cairo_constants_lib", + "//src/starkware/cairo/lang/compiler:cairo_compile_lib", + "//src/starkware/python:starkware_python_test_utils_lib", + "//src/starkware/python:starkware_python_utils_lib", + "//src/starkware/starkware_utils:starkware_dataclasses_field_utils_lib", + requirement("marshmallow_dataclass"), + ], +) diff --git a/src/starkware/cairo/lang/vm/CMakeLists.txt b/src/starkware/cairo/lang/vm/CMakeLists.txt deleted file mode 100644 index 41a8fc0c..00000000 --- a/src/starkware/cairo/lang/vm/CMakeLists.txt +++ /dev/null @@ -1,137 +0,0 @@ -python_lib(cairo_relocatable_lib - PREFIX starkware/cairo/lang/vm - - FILES - relocatable.py - relocatable_fields.py - - LIBS - starkware_python_utils_lib - pip_marshmallow -) - -python_lib(cairo_vm_crypto_lib - PREFIX starkware/cairo/lang/vm - - FILES - crypto.py - - LIBS - poseidon_utils_lib - starkware_crypto_lib - ${CAIRO_VM_CRYPTO_ADDITIONAL_LIBS} -) - -python_lib(cairo_vm_lib - PREFIX starkware/cairo/lang/vm - - FILES - air_public_input.py - builtin_runner.py - cairo_pie.py - memory_dict.py - memory_dict_backend.py - memory_segments.py - output_builtin_runner.py - security.py - trace_entry.py - utils.py - validated_memory_dict.py - virtual_machine_base.py - vm.py - vm_consts.py - vm_core.py - vm_exceptions.py - - LIBS - cairo_all_builtins_lib - cairo_compile_lib - cairo_relocatable_lib - cairo_vm_crypto_lib - dynamic_layout_params_lib - starknet_security_lib - starkware_python_utils_lib -) - -python_lib(cairo_run_lib - PREFIX starkware/cairo/lang/vm - - FILES - cairo_run.py - cairo_runner.py - - LIBS - cairo_compile_lib - cairo_instances_lib - cairo_run_builtins_lib - cairo_tracer_lib - cairo_version_lib - cairo_vm_lib - dynamic_layout_params_lib - starkware_utils_lib - starkware_python_utils_lib -) - -python_lib(cairo_vm_utils_lib - PREFIX starkware/cairo/lang/vm - - FILES - reconstruct_traceback.py - - LIBS - cairo_compile_lib - cairo_version_lib -) - -python_exe(cairo_run_exe - VENV cairo_lang_venv - MODULE starkware.cairo.lang.vm.cairo_run -) - -python_lib(cairo_vm_test_utils_lib - PREFIX starkware/cairo/lang/vm - - FILES - test_utils.py - - LIBS - cairo_compile_lib - cairo_run_lib - cairo_vm_lib -) - -full_python_test(cairo_vm_test - PREFIX starkware/cairo/lang/vm - PYTHON ${PYTHON_COMMAND} - TESTED_MODULES starkware/cairo/lang/vm - - FILES - cairo_pie_test.py - cairo_runner_test.py - memory_dict_test.py - memory_segments_test.py - output_builtin_runner_test.py - reconstruct_traceback_test.py - relocatable_fields_test.py - relocatable_test.py - security_test.py - test.cairo - trace_entry_test.py - validated_memory_dict_test.py - vm_consts_test.py - vm_test.py - - LIBS - cairo_common_lib - cairo_compile_lib - cairo_constants_lib - cairo_run_lib - cairo_vm_lib - cairo_vm_test_utils_lib - cairo_vm_utils_lib - starkware_dataclasses_field_utils_lib - starkware_python_utils_lib - starkware_python_test_utils_lib - pip_marshmallow_dataclass - pip_pytest -) diff --git a/src/starkware/cairo/lang/vm/virtual_machine_base.py b/src/starkware/cairo/lang/vm/virtual_machine_base.py index 53fc0ec5..387b1ee0 100644 --- a/src/starkware/cairo/lang/vm/virtual_machine_base.py +++ b/src/starkware/cairo/lang/vm/virtual_machine_base.py @@ -204,6 +204,8 @@ def validate_existing_memory(self): self.validated_memory.validate_existing_memory() def load_hints(self, program: Program, program_base: MaybeRelocatable): + # Avoid using 'self' in the lambda function (to avoid cyclic pointers). + prime = self.prime for pc, hints in program.hints.items(): compiled_hints = [] for hint_index, hint in enumerate(hints): @@ -221,7 +223,7 @@ def load_hints(self, program: Program, program_base: MaybeRelocatable): context=VmConstsContext( identifiers=program.identifiers, evaluator=ExpressionEvaluator( - self.prime, ap, fp, memory, program.identifiers + prime, ap, fp, memory, program.identifiers ).eval, reference_manager=program.reference_manager, flow_tracking_data=hint.flow_tracking_data, diff --git a/src/starkware/cairo/sharp/BUILD b/src/starkware/cairo/sharp/BUILD new file mode 100644 index 00000000..1fed2f62 --- /dev/null +++ b/src/starkware/cairo/sharp/BUILD @@ -0,0 +1,71 @@ +load("//bazel_utils:python.bzl", "pytest_test") +load("//bazel_utils/python:defs.bzl", "requirement") + +pytest_test( + name = "sharp_client_lib_test", + srcs = [ + "client_lib_test.py", + "sharp_client_test.py", + ], + data = [ + "//src/starkware/cairo/lang/compiler:cairo_compile_exe", + "//src/starkware/cairo/lang/vm:cairo_run_exe", + ], + visibility = ["//visibility:public"], + deps = [ + "sharp_client_lib", + ], +) + +package(default_visibility = ["//visibility:public"]) + +py_library( + name = "fact_checker_lib", + srcs = [ + "fact_checker.py", + ], + visibility = ["//visibility:public"], + deps = [ + requirement("web3"), + ], +) + +pytest_test( + name = "fact_checker_test", + srcs = [ + "fact_checker_test.py", + ], + visibility = ["//visibility:public"], + deps = [ + "fact_checker_lib", + ], +) + +py_library( + name = "sharp_client_lib", + srcs = [ + "client_lib.py", + "sharp_client.py", + ], + visibility = ["//visibility:public"], + deps = [ + "fact_checker_lib", + "//src/starkware/cairo/bootloaders:cairo_bootloader_generate_fact_lib", + "//src/starkware/cairo/bootloaders:cairo_hash_program_lib", + "//src/starkware/cairo/lang/vm:cairo_vm_crypto_lib", + "//src/starkware/cairo/lang/vm:cairo_vm_lib", + requirement("urllib3"), + ], +) + +py_library( + name = "sharp_client_config_lib", + srcs = [ + ], + data = [ + "config.json", + ], + visibility = ["//visibility:public"], + deps = [ + ], +) diff --git a/src/starkware/cairo/sharp/CMakeLists.txt b/src/starkware/cairo/sharp/CMakeLists.txt deleted file mode 100644 index 23b48348..00000000 --- a/src/starkware/cairo/sharp/CMakeLists.txt +++ /dev/null @@ -1,58 +0,0 @@ -python_lib(fact_checker_lib - PREFIX starkware/cairo/sharp - - FILES - fact_checker.py - - LIBS - pip_web3 -) - -full_python_test(fact_checker_test - PREFIX starkware/cairo/sharp - PYTHON ${PYTHON_COMMAND} - - FILES - fact_checker_test.py - - LIBS - fact_checker_lib - pip_pytest -) - -python_lib(sharp_client_lib - PREFIX starkware/cairo/sharp - - FILES - client_lib.py - sharp_client.py - - LIBS - cairo_bootloader_generate_fact_lib - cairo_hash_program_lib - cairo_vm_crypto_lib - cairo_vm_lib - fact_checker_lib - pip_urllib3 -) - -full_python_test(sharp_client_lib_test - PREFIX starkware/cairo/sharp - PYTHON ${PYTHON_COMMAND} - - FILES - client_lib_test.py - sharp_client_test.py - - LIBS - cairo_script_lib - sharp_client_lib - pip_pytest -) - -python_lib(sharp_client_config_lib - PREFIX starkware/cairo/sharp - - FILES - config.json -) diff --git a/src/starkware/cairo/stark_verifier/CMakeLists.txt b/src/starkware/cairo/stark_verifier/CMakeLists.txt deleted file mode 100644 index d433795a..00000000 --- a/src/starkware/cairo/stark_verifier/CMakeLists.txt +++ /dev/null @@ -1,2 +0,0 @@ -add_subdirectory(air) -add_subdirectory(core) diff --git a/src/starkware/cairo/stark_verifier/air/BUILD b/src/starkware/cairo/stark_verifier/air/BUILD new file mode 100644 index 00000000..c33877b1 --- /dev/null +++ b/src/starkware/cairo/stark_verifier/air/BUILD @@ -0,0 +1,64 @@ +load("//bazel_utils/python:defs.bzl", "requirement") +load("//bazel_utils:python.bzl", "pytest_test") + +py_library( + name = "starkware_cairo_stark_verifier_air_test_base_lib", + srcs = [ + "stark_test_utils.py", + ], + data = [ + "example_proof.json", + ], + visibility = ["//visibility:public"], + deps = [ + "starkware_cairo_stark_verifier_air_lib", + "//src/starkware/cairo/common:cairo_common_lib", + "//src/starkware/cairo/common:cairo_common_validate_utils_lib", + "//src/starkware/cairo/common:cairo_function_runner_lib", + "//src/starkware/cairo/lang/compiler:cairo_compile_lib", + "//src/starkware/cairo/stark_verifier/air/layouts:starkware_cairo_stark_verifier_air_starknet_with_keccak_lib", + "//src/starkware/cairo/stark_verifier/core:starkware_cairo_stark_verifier_core_stark_lib", + "//src/starkware/python:starkware_python_utils_lib", + requirement("eth_hash"), + ], +) + +package(default_visibility = ["//visibility:public"]) + +exports_files(glob([ + "*.cairo", + "*.json", +])) + +py_library( + name = "starkware_cairo_stark_verifier_air_lib", + srcs = [ + "parser.py", + "utils.py", + ], + data = [ + "config.cairo", + "diluted.cairo", + "layout.cairo", + "oods.cairo", + "params.cairo", + "public_input.cairo", + "public_memory.cairo", + "traces.cairo", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/starkware/cairo/stark_verifier/core:starkware_cairo_stark_verifier_core_stark_lib", + ], +) + +pytest_test( + name = "starkware_cairo_stark_verifier_air_test", + srcs = [ + "stark_test.py", + ], + visibility = ["//visibility:public"], + deps = [ + "starkware_cairo_stark_verifier_air_test_base_lib", + ], +) diff --git a/src/starkware/cairo/stark_verifier/air/CMakeLists.txt b/src/starkware/cairo/stark_verifier/air/CMakeLists.txt deleted file mode 100644 index 52a9d496..00000000 --- a/src/starkware/cairo/stark_verifier/air/CMakeLists.txt +++ /dev/null @@ -1,52 +0,0 @@ -add_subdirectory(layouts) - -python_lib(starkware_cairo_stark_verifier_air_lib - PREFIX starkware/cairo/stark_verifier/air - - FILES - config.cairo - diluted.cairo - layout.cairo - oods.cairo - params.cairo - parser.py - public_input.cairo - public_memory.cairo - traces.cairo - utils.py - - LIBS - starkware_cairo_stark_verifier_core_stark_lib -) - -python_lib(starkware_cairo_stark_verifier_air_test_base_lib - PREFIX starkware/cairo/stark_verifier/air - - FILES - example_proof.json - stark_test_utils.py - - LIBS - cairo_common_lib - cairo_common_validate_utils_lib - cairo_compile_lib - cairo_function_runner_lib - starkware_cairo_stark_verifier_air_starknet_with_keccak_lib - starkware_cairo_stark_verifier_air_lib - starkware_cairo_stark_verifier_core_stark_lib - starkware_python_utils_lib - pip_eth_hash - pip_pytest -) - -full_python_test(starkware_cairo_stark_verifier_air_test - PREFIX starkware/cairo/stark_verifier/air - PYTHON ${PYTHON_COMMAND} - TESTED_MODULES starkware/cairo/stark_verifier/air - - FILES - stark_test.py - - LIBS - starkware_cairo_stark_verifier_air_test_base_lib -) diff --git a/src/starkware/cairo/stark_verifier/air/layouts/BUILD b/src/starkware/cairo/stark_verifier/air/layouts/BUILD new file mode 100644 index 00000000..c80c3fdc --- /dev/null +++ b/src/starkware/cairo/stark_verifier/air/layouts/BUILD @@ -0,0 +1,12 @@ +load(":layouts_gen.bzl", "generate_layouts_libs") + +layouts = [ + "all_cairo", + "dex", + "recursive", + "small", + "starknet", + "starknet_with_keccak", +] + +generate_layouts_libs(layouts) diff --git a/src/starkware/cairo/stark_verifier/air/layouts/CMakeLists.txt b/src/starkware/cairo/stark_verifier/air/layouts/CMakeLists.txt deleted file mode 100644 index 6911dcb1..00000000 --- a/src/starkware/cairo/stark_verifier/air/layouts/CMakeLists.txt +++ /dev/null @@ -1,23 +0,0 @@ -function(stark_cairo_verifier_layout LAYOUT_NAME) - python_lib(starkware_cairo_stark_verifier_air_${LAYOUT_NAME}_lib - PREFIX starkware/cairo/stark_verifier/air/layouts - - FILES - ${LAYOUT_NAME}/autogenerated.cairo - ${LAYOUT_NAME}/composition.cairo - ${LAYOUT_NAME}/global_values.cairo - ${LAYOUT_NAME}/periodic_columns.cairo - ${LAYOUT_NAME}/public_verify.cairo - ${LAYOUT_NAME}/verify.cairo - - LIBS - starkware_cairo_stark_verifier_core_stark_lib - ) -endfunction() - -stark_cairo_verifier_layout(recursive) -stark_cairo_verifier_layout(dex) -stark_cairo_verifier_layout(small) -stark_cairo_verifier_layout(starknet) -stark_cairo_verifier_layout(all_cairo) -stark_cairo_verifier_layout(starknet_with_keccak) diff --git a/src/starkware/cairo/stark_verifier/air/layouts/all_cairo/BUILD b/src/starkware/cairo/stark_verifier/air/layouts/all_cairo/BUILD new file mode 100644 index 00000000..57905545 --- /dev/null +++ b/src/starkware/cairo/stark_verifier/air/layouts/all_cairo/BUILD @@ -0,0 +1,3 @@ +package(default_visibility = ["//visibility:public"]) + +exports_files(glob(["*.cairo"])) diff --git a/src/starkware/cairo/stark_verifier/air/layouts/dex/BUILD b/src/starkware/cairo/stark_verifier/air/layouts/dex/BUILD new file mode 100644 index 00000000..57905545 --- /dev/null +++ b/src/starkware/cairo/stark_verifier/air/layouts/dex/BUILD @@ -0,0 +1,3 @@ +package(default_visibility = ["//visibility:public"]) + +exports_files(glob(["*.cairo"])) diff --git a/src/starkware/cairo/stark_verifier/air/layouts/layouts_gen.bzl b/src/starkware/cairo/stark_verifier/air/layouts/layouts_gen.bzl new file mode 100644 index 00000000..ecbaf58b --- /dev/null +++ b/src/starkware/cairo/stark_verifier/air/layouts/layouts_gen.bzl @@ -0,0 +1,23 @@ +def generate_layouts_libs(layouts): + for layout in layouts: + native.py_library( + name = "starkware_cairo_stark_verifier_air_{}_lib".format(layout), + srcs = [ + ], + data = [ + "//src/starkware/cairo/stark_verifier/air/layouts/{}:autogenerated.cairo".format(layout), + "//src/starkware/cairo/stark_verifier/air/layouts/{}:composition.cairo".format(layout), + "//src/starkware/cairo/stark_verifier/air/layouts/{}:global_values.cairo".format(layout), + "//src/starkware/cairo/stark_verifier/air/layouts/{}:periodic_columns.cairo".format(layout), + "//src/starkware/cairo/stark_verifier/air/layouts/{}:public_verify.cairo".format(layout), + "//src/starkware/cairo/stark_verifier/air/layouts/{}:verify.cairo".format(layout), + ], + tags = [ + "external_cairo", + "external_cairo-docs", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/starkware/cairo/stark_verifier/core:starkware_cairo_stark_verifier_core_stark_lib", + ], + ) diff --git a/src/starkware/cairo/stark_verifier/air/layouts/recursive/BUILD b/src/starkware/cairo/stark_verifier/air/layouts/recursive/BUILD new file mode 100644 index 00000000..57905545 --- /dev/null +++ b/src/starkware/cairo/stark_verifier/air/layouts/recursive/BUILD @@ -0,0 +1,3 @@ +package(default_visibility = ["//visibility:public"]) + +exports_files(glob(["*.cairo"])) diff --git a/src/starkware/cairo/stark_verifier/air/layouts/small/BUILD b/src/starkware/cairo/stark_verifier/air/layouts/small/BUILD new file mode 100644 index 00000000..57905545 --- /dev/null +++ b/src/starkware/cairo/stark_verifier/air/layouts/small/BUILD @@ -0,0 +1,3 @@ +package(default_visibility = ["//visibility:public"]) + +exports_files(glob(["*.cairo"])) diff --git a/src/starkware/cairo/stark_verifier/air/layouts/starknet/BUILD b/src/starkware/cairo/stark_verifier/air/layouts/starknet/BUILD new file mode 100644 index 00000000..57905545 --- /dev/null +++ b/src/starkware/cairo/stark_verifier/air/layouts/starknet/BUILD @@ -0,0 +1,3 @@ +package(default_visibility = ["//visibility:public"]) + +exports_files(glob(["*.cairo"])) diff --git a/src/starkware/cairo/stark_verifier/air/layouts/starknet_with_keccak/BUILD b/src/starkware/cairo/stark_verifier/air/layouts/starknet_with_keccak/BUILD new file mode 100644 index 00000000..57905545 --- /dev/null +++ b/src/starkware/cairo/stark_verifier/air/layouts/starknet_with_keccak/BUILD @@ -0,0 +1,3 @@ +package(default_visibility = ["//visibility:public"]) + +exports_files(glob(["*.cairo"])) diff --git a/src/starkware/cairo/stark_verifier/core/BUILD b/src/starkware/cairo/stark_verifier/core/BUILD new file mode 100644 index 00000000..93f115ec --- /dev/null +++ b/src/starkware/cairo/stark_verifier/core/BUILD @@ -0,0 +1,65 @@ +load("//bazel_utils:python.bzl", "pytest_test") + +package(default_visibility = ["//visibility:public"]) + +exports_files(glob(["*.cairo"])) + +py_library( + name = "starkware_cairo_stark_verifier_core_lib", + srcs = [ + ], + data = [ + "air_interface.cairo", + "channel.cairo", + "proof_of_work.cairo", + "queries.cairo", + "table_commitment.cairo", + "utils.cairo", + "vector_commitment.cairo", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/starkware/cairo/common:cairo_common_lib", + ], +) + +py_library( + name = "starkware_cairo_stark_verifier_core_stark_lib", + srcs = [ + ], + data = [ + "config.cairo", + "domains.cairo", + "stark.cairo", + ], + visibility = ["//visibility:public"], + deps = [ + "starkware_cairo_stark_verifier_core_lib", + "//src/starkware/cairo/common:cairo_common_lib", + "//src/starkware/cairo/stark_verifier/core/fri:starkware_cairo_stark_verifier_core_fri_lib", + ], +) + +pytest_test( + name = "starkware_cairo_stark_verifier_core_test", + srcs = [ + "channel_test.py", + "proof_of_work_test.py", + "table_commitment_test.py", + "utils_test.py", + "vector_commitment_test.py", + ], + data = [ + "channel_test.cairo", + "merkle_test_data.json", + ], + visibility = ["//visibility:public"], + deps = [ + "starkware_cairo_stark_verifier_core_lib", + "//src/starkware/cairo/common:cairo_common_lib", + "//src/starkware/cairo/common:cairo_common_validate_utils_lib", + "//src/starkware/cairo/common:cairo_function_runner_lib", + "//src/starkware/cairo/lang/compiler:cairo_compile_lib", + "//src/starkware/python:starkware_python_test_utils_lib", + ], +) diff --git a/src/starkware/cairo/stark_verifier/core/CMakeLists.txt b/src/starkware/cairo/stark_verifier/core/CMakeLists.txt deleted file mode 100644 index 91d0e7ff..00000000 --- a/src/starkware/cairo/stark_verifier/core/CMakeLists.txt +++ /dev/null @@ -1,52 +0,0 @@ -add_subdirectory(fri) - -python_lib(starkware_cairo_stark_verifier_core_lib - PREFIX starkware/cairo/stark_verifier/core - FILES - air_interface.cairo - channel.cairo - proof_of_work.cairo - queries.cairo - table_commitment.cairo - utils.cairo - vector_commitment.cairo - - LIBS - cairo_common_lib -) - -python_lib(starkware_cairo_stark_verifier_core_stark_lib - PREFIX starkware/cairo/stark_verifier/core - FILES - config.cairo - domains.cairo - stark.cairo - - LIBS - cairo_common_lib - starkware_cairo_stark_verifier_core_fri_lib - starkware_cairo_stark_verifier_core_lib -) - -full_python_test(starkware_cairo_stark_verifier_core_test - PREFIX starkware/cairo/stark_verifier/core - PYTHON python3.9 - - FILES - channel_test.cairo - channel_test.py - merkle_test_data.json - proof_of_work_test.py - table_commitment_test.py - utils_test.py - vector_commitment_test.py - - LIBS - cairo_common_lib - cairo_common_validate_utils_lib - cairo_compile_lib - cairo_function_runner_lib - starkware_cairo_stark_verifier_core_lib - starkware_python_test_utils_lib - pip_pytest -) diff --git a/src/starkware/cairo/stark_verifier/core/fri/BUILD b/src/starkware/cairo/stark_verifier/core/fri/BUILD new file mode 100644 index 00000000..e6ab4ec2 --- /dev/null +++ b/src/starkware/cairo/stark_verifier/core/fri/BUILD @@ -0,0 +1,44 @@ +load("//bazel_utils:python.bzl", "pytest_test") + +package(default_visibility = ["//visibility:public"]) + +exports_files([ + "config.cairo", + "fri.cairo", + "fri_formula.cairo", + "fri_layer.cairo", +]) + +py_library( + name = "starkware_cairo_stark_verifier_core_fri_lib", + srcs = [ + ], + data = [ + "config.cairo", + "fri.cairo", + "fri_formula.cairo", + "fri_layer.cairo", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/starkware/cairo/common:cairo_common_lib", + "//src/starkware/cairo/stark_verifier/core:starkware_cairo_stark_verifier_core_lib", + ], +) + +pytest_test( + name = "starkware_cairo_stark_verifier_core_fri_test", + srcs = [ + "fri_formula_test.py", + "fri_layer_test.py", + "fri_test.py", + "test_utils.py", + ], + visibility = ["//visibility:public"], + deps = [ + "starkware_cairo_stark_verifier_core_fri_lib", + "//src/starkware/cairo/common:cairo_function_runner_lib", + "//src/starkware/cairo/lang/compiler:cairo_compile_lib", + "//src/starkware/python:starkware_python_test_utils_lib", + ], +) diff --git a/src/starkware/cairo/stark_verifier/core/fri/CMakeLists.txt b/src/starkware/cairo/stark_verifier/core/fri/CMakeLists.txt deleted file mode 100644 index bb6eb14d..00000000 --- a/src/starkware/cairo/stark_verifier/core/fri/CMakeLists.txt +++ /dev/null @@ -1,30 +0,0 @@ -python_lib(starkware_cairo_stark_verifier_core_fri_lib - PREFIX starkware/cairo/stark_verifier/core/fri - FILES - config.cairo - fri.cairo - fri_formula.cairo - fri_layer.cairo - - LIBS - cairo_common_lib - starkware_cairo_stark_verifier_core_lib -) - -full_python_test(starkware_cairo_stark_verifier_core_fri_test - PREFIX starkware/cairo/stark_verifier/core/fri - PYTHON python3.9 - - FILES - fri_formula_test.py - fri_layer_test.py - fri_test.py - test_utils.py - - LIBS - cairo_compile_lib - cairo_function_runner_lib - starkware_cairo_stark_verifier_core_fri_lib - starkware_python_test_utils_lib - pip_pytest -) diff --git a/src/starkware/cairo/vars.bzl b/src/starkware/cairo/vars.bzl new file mode 100644 index 00000000..9ff5d914 --- /dev/null +++ b/src/starkware/cairo/vars.bzl @@ -0,0 +1,6 @@ +CAIRO_LANG_VENV_ADDITIONAL_LIBS = [] +CAIRO_VM_CRYPTO_ADDITIONAL_LIBS = [] +CAIRO_COMMON_LIB_ADDITIONAL_FILES = [] +CAIRO_COMMON_LIB_ADDITIONAL_LIBS = [] +CAIRO_INSTANCES_LIB_ADDITIONAL_FILES = [] +CAIRO_COMPILER_ARCHIVE = "cairo-compiler-archive-1.0.0" diff --git a/src/starkware/crypto/BUILD b/src/starkware/crypto/BUILD new file mode 100644 index 00000000..79ee1b30 --- /dev/null +++ b/src/starkware/crypto/BUILD @@ -0,0 +1,24 @@ +load("//bazel_utils/python:defs.bzl", "requirement") + +py_library( + name = "starkware_crypto_lib", + srcs = [ + "//src/starkware/crypto/signature:fast_pedersen_hash.py", + "//src/starkware/crypto/signature:math_utils.py", + "//src/starkware/crypto/signature:nothing_up_my_sleeve_gen.py", + "//src/starkware/crypto/signature:signature.py", + ], + data = [ + "//src/starkware/crypto/signature:pedersen_params.json", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/starkware/python:starkware_python_utils_lib", + requirement("ecdsa"), + requirement("fastecdsa"), + requirement("mpmath"), + requirement("sympy"), + ], +) + +package(default_visibility = ["//visibility:public"]) diff --git a/src/starkware/crypto/CMakeLists.txt b/src/starkware/crypto/CMakeLists.txt deleted file mode 100644 index 27119978..00000000 --- a/src/starkware/crypto/CMakeLists.txt +++ /dev/null @@ -1,17 +0,0 @@ -python_lib(starkware_crypto_lib - PREFIX starkware/crypto - - FILES - signature/fast_pedersen_hash.py - signature/math_utils.py - signature/nothing_up_my_sleeve_gen.py - signature/pedersen_params.json - signature/signature.py - - LIBS - starkware_python_utils_lib - pip_ecdsa - pip_fastecdsa - pip_mpmath - pip_sympy -) diff --git a/src/starkware/crypto/signature/BUILD b/src/starkware/crypto/signature/BUILD new file mode 100644 index 00000000..744c6669 --- /dev/null +++ b/src/starkware/crypto/signature/BUILD @@ -0,0 +1,6 @@ +exports_files(glob([ + "*.json", + "*.py", +])) + +package(default_visibility = ["//visibility:public"]) diff --git a/src/starkware/eth/BUILD b/src/starkware/eth/BUILD new file mode 100644 index 00000000..8377c225 --- /dev/null +++ b/src/starkware/eth/BUILD @@ -0,0 +1,27 @@ +load("//bazel_utils/python:defs.bzl", "requirement") + +package(default_visibility = ["//visibility:public"]) + +py_library( + name = "starkware_eth_test_utils_lib", + srcs = [ + "eth_test_utils.py", + ], + data = ["@npm_ganache//ganache/bin:ganache"], + visibility = ["//visibility:public"], + deps = [ + requirement("web3"), + "//src/starkware/eth:web3_wrapper_lib", + ], +) + +py_library( + name = "web3_wrapper_lib", + srcs = [ + "web3_wrapper.py", + ], + visibility = ["//visibility:public"], + deps = [ + requirement("web3"), + ], +) diff --git a/src/starkware/eth/CMakeLists.txt b/src/starkware/eth/CMakeLists.txt deleted file mode 100644 index 84adf13a..00000000 --- a/src/starkware/eth/CMakeLists.txt +++ /dev/null @@ -1,21 +0,0 @@ -python_lib(starkware_eth_test_utils_lib - PREFIX starkware/eth - - FILES - eth_test_utils.py - - LIBS - pip_pytest - pip_web3 - web3_wrapper_lib -) - -python_lib(web3_wrapper_lib - PREFIX starkware/eth - - FILES - web3_wrapper.py - - LIBS - pip_web3 -) diff --git a/src/starkware/eth/web3_wrapper.py b/src/starkware/eth/web3_wrapper.py index e0038dc1..44640986 100644 --- a/src/starkware/eth/web3_wrapper.py +++ b/src/starkware/eth/web3_wrapper.py @@ -1,18 +1,47 @@ -from web3 import Web3 +from typing import Dict + +from web3 import Web3, eth # Noqa. + +web3_api_new_to_old: Dict[str, str] = { + "to_checksum_address": "toChecksumAddress", + "is_checksum_address": "isChecksumAddress", + "is_connected": "isConnected", + "solidity_keccak": "solidityKeccak", + "client_version": "clientVersion", + "toJSON": "to_json", + "toWei": "to_wei", +} + +eth_api_new_to_old: Dict[str, str] = { + "chain_id": "chainId", + "send_raw_transaction": "sendRawTransaction", + "wait_for_transaction_receipt": "waitForTransactionReceipt", + "get_transaction_count": "getTransactionCount", + "estimate_gas": "estimateGas", + "set_gas_price_strategy": "setGasPriceStrategy", + "get_transaction": "getTransaction", + "get_transaction_receipt": "getTransactionReceipt", + "get_block": "getBlock", + "get_balance": "getBalance", + "send_transaction": "sendTransaction", +} def web3_type_fix(): - if not hasattr(Web3, "to_checksum_address"): - Web3.to_checksum_address = Web3.toChecksumAddress # type: ignore - if not hasattr(Web3, "is_checksum_address"): - Web3.is_checksum_address = Web3.isChecksumAddress # type: ignore - if not hasattr(Web3, "is_connected"): - Web3.is_connected = Web3.isConnected # type: ignore + web3_type_fix_over_version6_generic() + + +def web3_type_fix_over_version6_generic(): + for api in web3_api_new_to_old.keys(): + if not hasattr(Web3, api): + setattr(Web3, api, getattr(Web3, web3_api_new_to_old[api])) -def web3_contract_create_filter_fix(event): +def web3_contract_event_fix(event): if not hasattr(event, "create_filter"): event.create_filter = event.createFilter + if not hasattr(event, "process_receipt"): + event.process_receipt = event.processReceipt web3_type_fix() diff --git a/src/starkware/python/BUILD b/src/starkware/python/BUILD new file mode 100644 index 00000000..95087cb1 --- /dev/null +++ b/src/starkware/python/BUILD @@ -0,0 +1,87 @@ +load("//bazel_utils/python:defs.bzl", "requirement") +load("//bazel_utils:python.bzl", "pytest_test") + +py_library( + name = "starkware_python_utils_lib", + srcs = [ + "async_subprocess.py", + "fixed_point.py", + "math_utils.py", + "object_utils.py", + "python_dependencies.py", + "utils.py", + "utils_stub_module.py", + ], + visibility = ["//visibility:public"], + deps = [ + requirement("numpy"), + requirement("pyyaml"), + requirement("sympy"), + requirement("typing_extensions"), + "@bazel_tools//tools/python/runfiles", + ], +) + +package(default_visibility = ["//visibility:public"]) + +exports_files(glob(["*.py"])) + +py_library( + name = "starkware_expression_string_lib", + srcs = [ + "expression_string.py", + ], + visibility = ["//visibility:public"], + deps = [ + ], +) + +py_library( + name = "starkware_json_rpc_lib", + srcs = [ + "//src/starkware/python/json_rpc:client.py", + ], + visibility = ["//visibility:public"], + deps = [ + ], +) + +py_library( + name = "starkware_merkle_tree_lib", + srcs = [ + "merkle_tree.py", + ], + visibility = ["//visibility:public"], + deps = [ + ], +) + +py_library( + name = "starkware_python_test_utils_lib", + srcs = [ + "random_test_utils.py", + "test_utils.py", + ], + visibility = ["//visibility:public"], + deps = [ + requirement("mypy_extensions"), + ], +) + +pytest_test( + name = "starkware_python_utils_test", + srcs = [ + "expression_string_test.py", + "math_utils_test.py", + "test_utils_test.py", + "utils_test.py", + ], + visibility = ["//visibility:public"], + deps = [ + "starkware_expression_string_lib", + "starkware_json_rpc_lib", + "starkware_python_test_utils_lib", + "starkware_python_utils_lib", + requirement("pytest_asyncio"), + ], +) diff --git a/src/starkware/python/CMakeLists.txt b/src/starkware/python/CMakeLists.txt deleted file mode 100644 index 56dd8405..00000000 --- a/src/starkware/python/CMakeLists.txt +++ /dev/null @@ -1 +0,0 @@ -include(CMakeLists_common.txt) diff --git a/src/starkware/python/CMakeLists_common.txt b/src/starkware/python/CMakeLists_common.txt deleted file mode 100644 index 6b7d5022..00000000 --- a/src/starkware/python/CMakeLists_common.txt +++ /dev/null @@ -1,68 +0,0 @@ -python_lib(starkware_python_utils_lib - PREFIX starkware/python - FILES - async_subprocess.py - math_utils.py - fixed_point.py - object_utils.py - python_dependencies.py - utils.py - utils_stub_module.py - utils_stub_module.pyi - - LIBS - pip_numpy - pip_pyyaml - pip_sympy - pip_typing_extensions -) - -python_lib(starkware_expression_string_lib - PREFIX starkware/python - FILES - expression_string.py -) - -python_lib(starkware_json_rpc_lib - PREFIX starkware/python - FILES - json_rpc/client.py -) - -python_lib(starkware_merkle_tree_lib - PREFIX starkware/python - FILES - merkle_tree.py -) - -python_lib(starkware_python_test_utils_lib - PREFIX starkware/python - FILES - random_test_utils.py - test_utils.py - LIBS - pip_mypy_extensions - pip_pytest -) - -full_python_test(starkware_python_utils_test - PREFIX starkware/python - PYTHON ${PYTHON_COMMAND} - TESTED_MODULES starkware/python - - FILES - expression_string_test.py - math_utils_test.py - test_utils_test.py - utils_test.py - - LIBS - starkware_expression_string_lib - starkware_json_rpc_lib - starkware_python_test_utils_lib - starkware_python_utils_lib - pip_pytest - pip_pytest_asyncio -) - -add_subdirectory(json_rpc) diff --git a/src/starkware/python/json_rpc/BUILD b/src/starkware/python/json_rpc/BUILD new file mode 100644 index 00000000..33d5dceb --- /dev/null +++ b/src/starkware/python/json_rpc/BUILD @@ -0,0 +1,25 @@ +load("//bazel_utils/python:defs.bzl", "requirement") +load("//bazel_utils:python.bzl", "pytest_test") + +package(default_visibility = ["//visibility:public"]) + +exports_files([ + "client.py", + "common.py", + "server.py", +]) + +pytest_test( + name = "json_rpc_client_test", + srcs = [ + "client_test.py", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/starkware/python:starkware_expression_string_lib", + "//src/starkware/python:starkware_json_rpc_lib", + "//src/starkware/python:starkware_python_test_utils_lib", + "//src/starkware/python:starkware_python_utils_lib", + requirement("pytest_asyncio"), + ], +) diff --git a/src/starkware/python/json_rpc/CMakeLists.txt b/src/starkware/python/json_rpc/CMakeLists.txt deleted file mode 100644 index 7740232b..00000000 --- a/src/starkware/python/json_rpc/CMakeLists.txt +++ /dev/null @@ -1,16 +0,0 @@ -full_python_test(json_rpc_client_test - PREFIX starkware/python/json_rpc - PYTHON ${PYTHON_COMMAND} - TESTED_MODULES starkware/python/json_rpc - - FILES - client_test.py - - LIBS - starkware_expression_string_lib - starkware_json_rpc_lib - starkware_python_test_utils_lib - starkware_python_utils_lib - pip_pytest - pip_pytest_asyncio -) diff --git a/src/starkware/python/utils.py b/src/starkware/python/utils.py index 0acc460d..13fe3449 100644 --- a/src/starkware/python/utils.py +++ b/src/starkware/python/utils.py @@ -150,6 +150,7 @@ def get_source_dir_path(rel_path: str = "", default_value: Optional[str] = None) Returns a path to a file inside the source directory. Does not work in docker. rel_path is the relative path of the file with respect to the source directory. """ + if "BUILD_ROOT" in os.environ: source_root = os.path.join(os.environ["BUILD_ROOT"], "../../") assert os.path.exists(os.path.join(source_root, "src")) diff --git a/src/starkware/python/utils_test.py b/src/starkware/python/utils_test.py index 7b016a56..7487f66f 100644 --- a/src/starkware/python/utils_test.py +++ b/src/starkware/python/utils_test.py @@ -223,16 +223,22 @@ async def test_execute_coroutine_threadsafe(): async def foo(x: int) -> int: return x - def sync_foo(x: int) -> int: - return execute_coroutine_threadsafe(coroutine=foo(x), loop=loop) - # Positive flow - run in a separate thread. x = 5 - assert x == await loop.run_in_executor(executor=None, func=functools.partial(sync_foo, x=x)) + foo_coroutine = foo(x=x) + result = await loop.run_in_executor( + executor=None, + func=functools.partial(execute_coroutine_threadsafe, coroutine=foo_coroutine, loop=loop), + ) + assert result == x # Negative flow - try to run in the main thread. + foo_coroutine = foo(x=x) with pytest.raises(AssertionError, match="Cannot run foo synchronously in main thread."): - sync_foo(x=x) + execute_coroutine_threadsafe(coroutine=foo_coroutine, loop=loop) + + # Cleanup. + await foo_coroutine @pytest.mark.asyncio diff --git a/src/starkware/solidity/BUILD b/src/starkware/solidity/BUILD new file mode 100644 index 00000000..6f2e1b4d --- /dev/null +++ b/src/starkware/solidity/BUILD @@ -0,0 +1,11 @@ +package(default_visibility = ["//visibility:public"]) + +py_library( + name = "starkware_contracts_utils_lib", + srcs = [ + "utils.py", + ], + visibility = ["//visibility:public"], + deps = [ + ], +) diff --git a/src/starkware/solidity/CMakeLists.txt b/src/starkware/solidity/CMakeLists.txt deleted file mode 100644 index ba9227d8..00000000 --- a/src/starkware/solidity/CMakeLists.txt +++ /dev/null @@ -1,5 +0,0 @@ -include(utils.cmake) - -add_subdirectory(components) -add_subdirectory(interfaces) -add_subdirectory(libraries) diff --git a/src/starkware/solidity/components/BUILD b/src/starkware/solidity/components/BUILD new file mode 100644 index 00000000..a0cba6a6 --- /dev/null +++ b/src/starkware/solidity/components/BUILD @@ -0,0 +1,30 @@ +load("//bazel_utils:solidity.bzl", "sol_library") + +package(default_visibility = ["//visibility:public"]) + +sol_library( + name = "governance_contract_sol", + srcs = [ + "GenericGovernance.sol", + "Governance.sol", + "GovernanceStorage.sol", + "Operator.sol", + ], + deps = [ + "//src/starkware/solidity/interfaces:governance_interface_sol", + ], +) + +sol_library( + name = "solidity_contracts_components_sol", + srcs = [ + "FactRegistry.sol", + "GovernedFinalizable.sol", + "OnchainDataFactTreeEncoder.sol", + ], + deps = [ + "//src/starkware/solidity/interfaces:governance_interface_sol", + "//src/starkware/solidity/interfaces:solidity_contracts_interfaces_sol", + "//src/starkware/solidity/libraries:named_storage_sol", + ], +) diff --git a/src/starkware/solidity/components/CMakeLists.txt b/src/starkware/solidity/components/CMakeLists.txt deleted file mode 100644 index 2381d081..00000000 --- a/src/starkware/solidity/components/CMakeLists.txt +++ /dev/null @@ -1,24 +0,0 @@ -python_lib(solidity_contracts_components_sol - PREFIX starkware/solidity/components - FILES - FactRegistry.sol - GovernedFinalizable.sol - OnchainDataFactTreeEncoder.sol - - LIBS - governance_interface_sol - named_storage_sol - solidity_contracts_interfaces_sol -) - -python_lib(governance_contract_sol - PREFIX starkware/solidity/components - FILES - GenericGovernance.sol - Governance.sol - GovernanceStorage.sol - Operator.sol - - LIBS - governance_interface_sol -) diff --git a/src/starkware/solidity/interfaces/BUILD b/src/starkware/solidity/interfaces/BUILD new file mode 100644 index 00000000..5da77ed7 --- /dev/null +++ b/src/starkware/solidity/interfaces/BUILD @@ -0,0 +1,40 @@ +load("//bazel_utils:solidity.bzl", "sol_library") + +sol_library( + name = "solidity_contracts_interfaces_sol", + srcs = [ + "BlockDirectCall.sol", + "IFactRegistry.sol", + "IQueryableFactRegistry.sol", + "Identity.sol", + ], + visibility = ["//visibility:public"], + deps = [ + ], +) + +sol_library( + name = "governance_interface_sol", + srcs = [ + "MGovernance.sol", + "MOperator.sol", + ], + visibility = ["//visibility:public"], + deps = [ + ], +) + +sol_library( + name = "solidity_contract_initializer_sol", + srcs = [ + "ContractInitializer.sol", + "ExternalInitializer.sol", + "ProxySupport.sol", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/starkware/solidity/components:governance_contract_sol", + "//src/starkware/solidity/interfaces:solidity_contracts_interfaces_sol", + "//src/starkware/solidity/libraries:common_library_sol", + ], +) diff --git a/src/starkware/solidity/interfaces/CMakeLists.txt b/src/starkware/solidity/interfaces/CMakeLists.txt deleted file mode 100644 index d083379a..00000000 --- a/src/starkware/solidity/interfaces/CMakeLists.txt +++ /dev/null @@ -1,28 +0,0 @@ -python_lib(solidity_contracts_interfaces_sol - PREFIX starkware/solidity/interfaces - FILES - BlockDirectCall.sol - IFactRegistry.sol - Identity.sol - IQueryableFactRegistry.sol -) - -python_lib(governance_interface_sol - PREFIX starkware/solidity/interfaces - FILES - MGovernance.sol - MOperator.sol -) - -python_lib(solidity_contract_initializer_sol - PREFIX starkware/solidity/interfaces - FILES - ExternalInitializer.sol - ContractInitializer.sol - ProxySupport.sol - - LIBS - common_library_sol - governance_contract_sol - solidity_contracts_interfaces_sol -) diff --git a/src/starkware/solidity/libraries/BUILD b/src/starkware/solidity/libraries/BUILD new file mode 100644 index 00000000..52d71131 --- /dev/null +++ b/src/starkware/solidity/libraries/BUILD @@ -0,0 +1,19 @@ +load("//bazel_utils:solidity.bzl", "sol_library") + +sol_library( + name = "named_storage_sol", + srcs = [ + "NamedStorage.sol", + ], + visibility = ["//visibility:public"], + deps = [], +) + +sol_library( + name = "common_library_sol", + srcs = [ + "Addresses.sol", + ], + visibility = ["//visibility:public"], + deps = [], +) diff --git a/src/starkware/solidity/libraries/CMakeLists.txt b/src/starkware/solidity/libraries/CMakeLists.txt deleted file mode 100644 index 500be57c..00000000 --- a/src/starkware/solidity/libraries/CMakeLists.txt +++ /dev/null @@ -1,11 +0,0 @@ -python_lib(named_storage_sol - PREFIX starkware/solidity/libraries - FILES - NamedStorage.sol -) - -python_lib(common_library_sol - PREFIX starkware/solidity/libraries - FILES - Addresses.sol -) diff --git a/src/starkware/solidity/utils.cmake b/src/starkware/solidity/utils.cmake deleted file mode 100644 index 1b463dc1..00000000 --- a/src/starkware/solidity/utils.cmake +++ /dev/null @@ -1,5 +0,0 @@ -python_lib(starkware_contracts_utils_lib - PREFIX starkware/solidity - FILES - utils.py -) diff --git a/src/starkware/starknet/BUILD b/src/starkware/starknet/BUILD new file mode 100644 index 00000000..ffd0fb0c --- /dev/null +++ b/src/starkware/starknet/BUILD @@ -0,0 +1 @@ +package(default_visibility = ["//visibility:public"]) diff --git a/src/starkware/starknet/CMakeLists.txt b/src/starkware/starknet/CMakeLists.txt deleted file mode 100644 index 5d7c76e6..00000000 --- a/src/starkware/starknet/CMakeLists.txt +++ /dev/null @@ -1,17 +0,0 @@ -add_subdirectory(builtins) -add_subdirectory(business_logic) -add_subdirectory(cli) -add_subdirectory(common) -add_subdirectory(compiler) -add_subdirectory(core) -add_subdirectory(definitions) -add_subdirectory(public) -add_subdirectory(scripts) -add_subdirectory(security) -add_subdirectory(services) -add_subdirectory(solidity) -add_subdirectory(storage) -add_subdirectory(testing) -add_subdirectory(third_party) -add_subdirectory(utils) -add_subdirectory(wallets) diff --git a/src/starkware/starknet/builtins/CMakeLists.txt b/src/starkware/starknet/builtins/CMakeLists.txt deleted file mode 100644 index ea1e3754..00000000 --- a/src/starkware/starknet/builtins/CMakeLists.txt +++ /dev/null @@ -1 +0,0 @@ -add_subdirectory(segment_arena) diff --git a/src/starkware/starknet/builtins/segment_arena/BUILD b/src/starkware/starknet/builtins/segment_arena/BUILD new file mode 100644 index 00000000..af288f13 --- /dev/null +++ b/src/starkware/starknet/builtins/segment_arena/BUILD @@ -0,0 +1,47 @@ +load("//bazel_utils:python.bzl", "pytest_test") +load("//src/starkware/cairo/lang:cairo_rules.bzl", "cairo_library") + +package(default_visibility = ["//visibility:public"]) + +cairo_library( + name = "segment_arena_cairo_lib", + srcs = [ + "segment_arena.cairo", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/starkware/cairo/common:cairo_common_cairo_lib", + ], +) + +py_library( + name = "segment_arena_builtin_lib", + srcs = [ + "segment_arena_builtin_runner.py", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/starkware/cairo/common:cairo_common_lib", + "//src/starkware/cairo/lang/vm:cairo_relocatable_lib", + "//src/starkware/cairo/lang/vm:cairo_vm_lib", + "//src/starkware/python:starkware_python_utils_lib", + ], +) + +pytest_test( + name = "segment_arena_test", + srcs = [ + "segment_arena_test.py", + ], + data = [ + "segment_arena_test.cairo", + ":segment_arena_cairo_lib", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/starkware/cairo/common:cairo_common_lib", + "//src/starkware/cairo/common:cairo_function_runner_lib", + "//src/starkware/cairo/lang:cairo_constants_lib", + "//src/starkware/cairo/lang/compiler:cairo_compile_lib", + ], +) diff --git a/src/starkware/starknet/builtins/segment_arena/CMakeLists.txt b/src/starkware/starknet/builtins/segment_arena/CMakeLists.txt deleted file mode 100644 index 0a6d039b..00000000 --- a/src/starkware/starknet/builtins/segment_arena/CMakeLists.txt +++ /dev/null @@ -1,27 +0,0 @@ -python_lib(segment_arena_builtin_lib - PREFIX starkware/starknet/builtins/segment_arena - - FILES - segment_arena_builtin_runner.py - - LIBS - cairo_vm_lib -) - -full_python_test(segment_arena_test - PREFIX starkware/starknet/builtins/segment_arena - PYTHON ${PYTHON_COMMAND} - TESTED_MODULES starkware/starknet/builtins/segment_arena - - FILES - segment_arena.cairo - segment_arena_test.cairo - segment_arena_test.py - - LIBS - cairo_common_lib - cairo_function_runner_lib - cairo_constants_lib - cairo_compile_lib - pip_pytest -) diff --git a/src/starkware/starknet/builtins/segment_arena/segment_arena.cairo b/src/starkware/starknet/builtins/segment_arena/segment_arena.cairo index a23340e7..fec61941 100644 --- a/src/starkware/starknet/builtins/segment_arena/segment_arena.cairo +++ b/src/starkware/starknet/builtins/segment_arena/segment_arena.cairo @@ -1,5 +1,4 @@ from starkware.cairo.common.alloc import alloc -from starkware.cairo.common.segments import relocate_segment // The segment arena builtin allows Sierra libfuncs to allocate memory segments and only track their // ends (rather than both the start and the end). When the segment is finalized, the arena can @@ -84,7 +83,12 @@ func _verify_continuity(infos: SegmentInfo*, n_segments_minus_one: felt) { // is strictly bigger than the end of the previous segment. // This is required for proving the soundness of this construction, in the case where a segment // has length zero. - relocate_segment(infos[1].start, infos[0].end + 1); + + // Note: the following code was copied from relocate_segment() for efficiency reasons. + let src_ptr = infos[1].start; + let dest_ptr = infos[0].end + 1; + %{ memory.add_relocation_rule(src_ptr=ids.src_ptr, dest_ptr=ids.dest_ptr) %} + assert src_ptr = dest_ptr; return _verify_continuity(infos=&infos[1], n_segments_minus_one=n_segments_minus_one - 1); } diff --git a/src/starkware/starknet/business_logic/BUILD b/src/starkware/starknet/business_logic/BUILD new file mode 100644 index 00000000..46832d48 --- /dev/null +++ b/src/starkware/starknet/business_logic/BUILD @@ -0,0 +1,27 @@ +package(default_visibility = ["//visibility:public"]) + +py_library( + name = "starknet_business_logic_utils_lib", + srcs = [ + "utils.py", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/starkware/cairo/common:cairo_function_runner_lib", + "//src/starkware/cairo/lang/builtins:cairo_all_builtins_lib", + "//src/starkware/cairo/lang/vm:cairo_vm_lib", + "//src/starkware/python:starkware_python_utils_lib", + "//src/starkware/starknet/business_logic/execution:starknet_execution_usage_lib", + "//src/starkware/starknet/business_logic/execution:starknet_transaction_execution_objects_lib", + "//src/starkware/starknet/business_logic/fact_state:starknet_business_logic_patricia_state_lib", + "//src/starkware/starknet/business_logic/state:starknet_business_logic_state_lib", + "//src/starkware/starknet/core/os/transaction_hash:starknet_transaction_hash_lib", + "//src/starkware/starknet/definitions:starknet_definitions_lib", + "//src/starkware/starknet/definitions:starknet_general_config_lib", + "//src/starkware/starknet/public:starknet_abi_lib", + "//src/starkware/starknet/services/api/contract_class:starknet_contract_class_lib", + "//src/starkware/starkware_utils:starkware_error_handling_lib", + "//src/starkware/storage:starkware_abstract_storage_lib", + "//src/starkware/storage:starkware_storage_lib", + ], +) diff --git a/src/starkware/starknet/business_logic/CMakeLists.txt b/src/starkware/starknet/business_logic/CMakeLists.txt deleted file mode 100644 index a3119a8e..00000000 --- a/src/starkware/starknet/business_logic/CMakeLists.txt +++ /dev/null @@ -1,28 +0,0 @@ -add_subdirectory(execution) -add_subdirectory(fact_state) -add_subdirectory(state) -add_subdirectory(transaction) - -python_lib(starknet_business_logic_utils_lib - PREFIX starkware/starknet/business_logic - - FILES - utils.py - - LIBS - cairo_function_runner_lib - cairo_vm_lib - starknet_abi_lib - starknet_business_logic_patricia_state_lib - starknet_business_logic_state_lib - starknet_contract_class_lib - starknet_definitions_lib - starknet_execution_usage_lib - starknet_general_config_lib - starknet_transaction_execution_objects_lib - starknet_transaction_hash_lib - starkware_abstract_storage_lib - starkware_error_handling_lib - starkware_python_utils_lib - starkware_storage_lib -) diff --git a/src/starkware/starknet/business_logic/execution/BUILD b/src/starkware/starknet/business_logic/execution/BUILD new file mode 100644 index 00000000..eb641999 --- /dev/null +++ b/src/starkware/starknet/business_logic/execution/BUILD @@ -0,0 +1,92 @@ +load("//bazel_utils/python:defs.bzl", "requirement") + +package(default_visibility = ["//visibility:public"]) + +py_library( + name = "starknet_transaction_execution_objects_lib", + srcs = [ + "objects.py", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/services/everest/business_logic:everest_transaction_execution_objects_lib", + "//src/services/everest/definitions:everest_definitions_lib", + "//src/starkware/cairo/lang/vm:cairo_relocatable_lib", + "//src/starkware/cairo/lang/vm:cairo_vm_lib", + "//src/starkware/python:starkware_python_utils_lib", + "//src/starkware/starknet/business_logic/fact_state:starknet_business_logic_patricia_state_lib", + "//src/starkware/starknet/business_logic/state:starknet_business_logic_state_lib", + "//src/starkware/starknet/definitions:starknet_definitions_lib", + "//src/starkware/starknet/public:starknet_abi_lib", + "//src/starkware/starknet/services/api/contract_class:starknet_contract_class_lib", + "//src/starkware/starknet/services/api/gateway:starknet_transaction_lib", + "//src/starkware/starkware_utils:starkware_dataclasses_field_utils_lib", + "//src/starkware/starkware_utils:starkware_dataclasses_utils_lib", + "//src/starkware/starkware_utils:starkware_error_handling_lib", + requirement("marshmallow"), + requirement("marshmallow_dataclass"), + ], +) + +py_library( + name = "starknet_execute_entry_point_base_lib", + srcs = [ + "execute_entry_point_base.py", + ], + visibility = ["//visibility:public"], + deps = [ + "starknet_transaction_execution_objects_lib", + "//src/starkware/starknet/business_logic/state:starknet_business_logic_state_lib", + "//src/starkware/starknet/definitions:starknet_general_config_lib", + "//src/starkware/starknet/services/api/contract_class:starknet_contract_class_lib", + "//src/starkware/starkware_utils:starkware_dataclasses_utils_lib", + ], +) + +py_library( + name = "starknet_execute_entry_point_lib", + srcs = [ + "execute_entry_point.py", + ], + visibility = ["//visibility:public"], + deps = [ + "starknet_execute_entry_point_base_lib", + "starknet_transaction_execution_objects_lib", + "//src/starkware/cairo/common:cairo_function_runner_lib", + "//src/starkware/cairo/lang/vm:cairo_relocatable_lib", + "//src/starkware/cairo/lang/vm:cairo_vm_lib", + "//src/starkware/python:starkware_python_utils_lib", + "//src/starkware/starknet/builtins/segment_arena:segment_arena_builtin_lib", + "//src/starkware/starknet/business_logic:starknet_business_logic_utils_lib", + "//src/starkware/starknet/business_logic/state:starknet_business_logic_state_lib", + "//src/starkware/starknet/core/os:starknet_deprecated_syscall_handler_lib", + "//src/starkware/starknet/core/os:starknet_os_utils_lib", + "//src/starkware/starknet/core/os:starknet_syscall_handler_lib", + "//src/starkware/starknet/definitions:starknet_definitions_lib", + "//src/starkware/starknet/definitions:starknet_general_config_lib", + "//src/starkware/starknet/public:starknet_abi_lib", + "//src/starkware/starknet/services/api/contract_class:starknet_contract_class_lib", + "//src/starkware/starknet/storage:starknet_storage_lib", + "//src/starkware/starkware_utils:starkware_error_handling_lib", + ], +) + +py_library( + name = "starknet_execution_usage_lib", + srcs = [ + "gas_usage.py", + "os_usage.py", + ], + data = [ + "os_resources.json", + ], + visibility = ["//visibility:public"], + deps = [ + "starknet_transaction_execution_objects_lib", + "//src/services/external_api:services_eth_gas_constants_lib", + "//src/starkware/cairo/lang/vm:cairo_vm_lib", + "//src/starkware/starknet/definitions:starknet_definitions_lib", + "//src/starkware/starkware_utils:starkware_dataclasses_utils_lib", + requirement("marshmallow_dataclass"), + ], +) diff --git a/src/starkware/starknet/business_logic/execution/CMakeLists.txt b/src/starkware/starknet/business_logic/execution/CMakeLists.txt deleted file mode 100644 index af3a5a1f..00000000 --- a/src/starkware/starknet/business_logic/execution/CMakeLists.txt +++ /dev/null @@ -1,81 +0,0 @@ -python_lib(starknet_transaction_execution_objects_lib - PREFIX starkware/starknet/business_logic/execution - - FILES - objects.py - - LIBS - cairo_relocatable_lib - cairo_vm_lib - everest_definitions_lib - everest_transaction_execution_objects_lib - starknet_abi_lib - starknet_business_logic_patricia_state_lib - starknet_business_logic_state_lib - starknet_contract_class_lib - starknet_definitions_lib - starknet_transaction_lib - starkware_dataclasses_field_utils_lib - starkware_dataclasses_utils_lib - starkware_error_handling_lib - starkware_python_utils_lib - pip_marshmallow - pip_marshmallow_dataclass -) - -python_lib(starknet_execute_entry_point_base_lib - PREFIX starkware/starknet/business_logic/execution - - FILES - execute_entry_point_base.py - - LIBS - starknet_business_logic_state_lib - starknet_contract_class_lib - starknet_general_config_lib - starknet_transaction_execution_objects_lib - starkware_dataclasses_utils_lib -) - -python_lib(starknet_execute_entry_point_lib - PREFIX starkware/starknet/business_logic/execution - - FILES - execute_entry_point.py - - LIBS - cairo_function_runner_lib - cairo_relocatable_lib - cairo_vm_lib - everest_definitions_lib - segment_arena_builtin_lib - starknet_abi_lib - starknet_business_logic_state_lib - starknet_business_logic_utils_lib - starknet_contract_class_lib - starknet_definitions_lib - starknet_execute_entry_point_base_lib - starknet_general_config_lib - starknet_os_utils_lib - starknet_storage_lib - starknet_transaction_execution_objects_lib - starkware_error_handling_lib - starkware_python_utils_lib -) - -python_lib(starknet_execution_usage_lib - PREFIX starkware/starknet/business_logic/execution - - FILES - os_resources.json - os_usage.py - gas_usage.py - - LIBS - cairo_vm_lib - services_eth_gas_constants_lib - starknet_definitions_lib - starknet_transaction_execution_objects_lib - starkware_dataclasses_utils_lib - pip_marshmallow_dataclass -) diff --git a/src/starkware/starknet/business_logic/execution/execute_entry_point.py b/src/starkware/starknet/business_logic/execution/execute_entry_point.py index 848de279..746df9c9 100644 --- a/src/starkware/starknet/business_logic/execution/execute_entry_point.py +++ b/src/starkware/starknet/business_logic/execution/execute_entry_point.py @@ -1,4 +1,5 @@ import asyncio +import contextlib import dataclasses import functools import logging @@ -36,10 +37,8 @@ validate_contract_deployed, ) from starkware.starknet.core.os import os_utils, syscall_utils -from starkware.starknet.core.os.syscall_handler import ( - BusinessLogicSyscallHandler, - DeprecatedBlSyscallHandler, -) +from starkware.starknet.core.os.deprecated_syscall_handler import DeprecatedBlSyscallHandler +from starkware.starknet.core.os.syscall_handler import BusinessLogicSyscallHandler from starkware.starknet.definitions import fields from starkware.starknet.definitions.constants import GasCost from starkware.starknet.definitions.error_codes import StarknetErrorCode @@ -299,39 +298,40 @@ def _execute( ] # Run. - self._run( - runner=runner, - entry_point_offset=entry_point.offset, - entry_point_args=entry_point_args, - hint_locals={"syscall_handler": syscall_handler}, - run_resources=tx_execution_context.run_resources, - program_segment_size=len(runner.program.data) + len(program_extra_data), - allow_tmp_segments=True, - ) + with clean_leaks(runner=runner, syscall_handler=syscall_handler): + self._run( + runner=runner, + entry_point_offset=entry_point.offset, + entry_point_args=entry_point_args, + hint_locals={"syscall_handler": syscall_handler}, + run_resources=tx_execution_context.run_resources, + program_segment_size=len(runner.program.data) + len(program_extra_data), + allow_tmp_segments=True, + ) - # We should not count (possibly) unsued code as holes. - runner.mark_as_accessed(address=core_program_end_ptr, size=len(program_extra_data)) + # We should not count (possibly) unsued code as holes. + runner.mark_as_accessed(address=core_program_end_ptr, size=len(program_extra_data)) - # Complete validations. - os_utils.validate_and_process_os_implicit_args( - runner=runner, - syscall_handler=syscall_handler, - initial_implicit_args=implicit_args, - ) + # Complete validations. + os_utils.validate_and_process_os_implicit_args( + runner=runner, + syscall_handler=syscall_handler, + initial_implicit_args=implicit_args, + ) - # Update resources usage (for the bouncer and fee calculation). - resources_manager.cairo_usage += runner.get_execution_resources() + # Update resources usage (for the bouncer and fee calculation). + resources_manager.cairo_usage += runner.get_execution_resources() - # Build and return the call info. - return self._build_call_info( - class_hash=class_hash, - execution_resources=resources_manager.cairo_usage - previous_cairo_usage, - storage=syscall_handler.storage, - result=get_call_result(runner=runner, initial_gas=self.initial_gas), - events=syscall_handler.events, - l2_to_l1_messages=syscall_handler.l2_to_l1_messages, - internal_calls=syscall_handler.internal_calls, - ) + # Build and return the call info. + return self._build_call_info( + class_hash=class_hash, + execution_resources=resources_manager.cairo_usage - previous_cairo_usage, + storage=syscall_handler.storage, + result=get_call_result(runner=runner, initial_gas=self.initial_gas), + events=syscall_handler.events, + l2_to_l1_messages=syscall_handler.l2_to_l1_messages, + internal_calls=syscall_handler.internal_calls, + ) def _run( self, @@ -562,33 +562,78 @@ def _execute_version0_class( ) entry_point_offset = entry_point.offset - # Run. - self._run( - runner=runner, - entry_point_offset=entry_point_offset, - entry_point_args=entry_point_args, - hint_locals={"syscall_handler": syscall_handler}, - run_resources=tx_execution_context.run_resources, - allow_tmp_segments=False, - ) + with clean_leaks(runner=runner, syscall_handler=syscall_handler): + # Run. + self._run( + runner=runner, + entry_point_offset=entry_point_offset, + entry_point_args=entry_point_args, + hint_locals={"syscall_handler": syscall_handler}, + run_resources=tx_execution_context.run_resources, + allow_tmp_segments=False, + ) - # Complete validations. - os_utils.validate_and_process_os_context_for_version0_class( - runner=runner, - syscall_handler=syscall_handler, - initial_os_context=implicit_args, - ) + # Complete validations. + os_utils.validate_and_process_os_context_for_version0_class( + runner=runner, + syscall_handler=syscall_handler, + initial_os_context=implicit_args, + ) - # Update resources usage (for the bouncer and fee calculation). - resources_manager.cairo_usage += runner.get_execution_resources() - - # Build and return the call info. - return self._build_call_info( - storage=syscall_handler.starknet_storage, - events=syscall_handler.events, - l2_to_l1_messages=syscall_handler.l2_to_l1_messages, - internal_calls=syscall_handler.internal_calls, - execution_resources=resources_manager.cairo_usage - previous_cairo_usage, - result=get_call_result_for_version0_class(runner=runner), - class_hash=class_hash, - ) + # Update resources usage (for the bouncer and fee calculation). + resources_manager.cairo_usage += runner.get_execution_resources() + + # Build and return the call info. + return self._build_call_info( + storage=syscall_handler.starknet_storage, + events=syscall_handler.events, + l2_to_l1_messages=syscall_handler.l2_to_l1_messages, + internal_calls=syscall_handler.internal_calls, + execution_resources=resources_manager.cairo_usage - previous_cairo_usage, + result=get_call_result_for_version0_class(runner=runner), + class_hash=class_hash, + ) + + +@contextlib.contextmanager +def clean_leaks( + runner: CairoFunctionRunner, + syscall_handler: Union[DeprecatedBlSyscallHandler, BusinessLogicSyscallHandler], +): + # There are memory leaks around these objects; delete some of them as a temporary fix. + try: + yield + finally: + del runner.program + del runner.memory + del runner.segments + del runner.vm.hints + del runner.vm.exec_scopes + del runner.vm.program + del runner.vm.error_message_attributes + del runner.vm.validated_memory + del runner.vm.accessed_addresses + del runner.vm.hint_pc_and_index + del runner.vm.trace + del runner.vm.builtin_runners + del runner.vm.run_context.memory + del runner.vm.run_context + del runner + + del syscall_handler.internal_calls + del syscall_handler.events + del syscall_handler.segments.memory + del syscall_handler._segments + del syscall_handler.read_only_segments + del syscall_handler.resources_manager + del syscall_handler.tx_execution_context + if isinstance(syscall_handler, DeprecatedBlSyscallHandler): + del syscall_handler.block_info + del syscall_handler.sync_state + del syscall_handler.starknet_storage + else: + assert isinstance(syscall_handler, BusinessLogicSyscallHandler) + del syscall_handler.state + del syscall_handler.storage + + del syscall_handler diff --git a/src/starkware/starknet/business_logic/execution/objects.py b/src/starkware/starknet/business_logic/execution/objects.py index 4c13680e..befc4c5b 100644 --- a/src/starkware/starknet/business_logic/execution/objects.py +++ b/src/starkware/starknet/business_logic/execution/objects.py @@ -128,9 +128,9 @@ class OrderedEvent(ValidatedDataclass): order: int = field(metadata=sequential_id_metadata("Event order")) # The keys by which the event will be indexed. - keys: List[int] = field(metadata=fields.felt_list_metadata) + keys: List[int] = field(metadata=fields.felt_as_hex_or_str_list_metadata) # The data of the event. - data: List[int] = field(metadata=fields.felt_list_metadata) + data: List[int] = field(metadata=fields.felt_as_hex_or_str_list_metadata) @dataclasses.dataclass(frozen=True) @@ -165,7 +165,7 @@ class OrderedL2ToL1Message(ValidatedDataclass): order: int = field(metadata=sequential_id_metadata("L2-to-L1 message order")) to_address: int = field(metadata=everest_fields.EthAddressIntField.metadata("to_address")) - payload: List[int] = field(metadata=fields.felt_list_metadata) + payload: List[int] = field(metadata=fields.felt_as_hex_or_str_list_metadata) @dataclasses.dataclass(frozen=True) @@ -176,7 +176,7 @@ class L2ToL1MessageInfo(ValidatedDataclass): from_address: int = field(metadata=fields.L2AddressField.metadata(field_name="from_address")) to_address: int = field(metadata=everest_fields.EthAddressIntField.metadata("to_address")) - payload: List[int] = field(metadata=fields.felt_list_metadata) + payload: List[int] = field(metadata=fields.felt_as_hex_or_str_list_metadata) @classmethod def create(cls, message_content: OrderedL2ToL1Message, sending_contract_address: int): diff --git a/src/starkware/starknet/business_logic/execution/os_resources.json b/src/starkware/starknet/business_logic/execution/os_resources.json index 4a2846cc..eb0fecf9 100644 --- a/src/starkware/starknet/business_logic/execution/os_resources.json +++ b/src/starkware/starknet/business_logic/execution/os_resources.json @@ -54,6 +54,11 @@ "n_memory_holes": 0, "n_steps": 36 }, + "get_execution_info": { + "builtin_instance_counter": {}, + "n_memory_holes": 0, + "n_steps": 29 + }, "get_sequencer_address": { "builtin_instance_counter": {}, "n_memory_holes": 0, diff --git a/src/starkware/starknet/business_logic/execution/os_usage.py b/src/starkware/starknet/business_logic/execution/os_usage.py index cce3b2ef..68855dc6 100644 --- a/src/starkware/starknet/business_logic/execution/os_usage.py +++ b/src/starkware/starknet/business_logic/execution/os_usage.py @@ -1,5 +1,6 @@ import functools import os.path +from functools import lru_cache from typing import Mapping import marshmallow_dataclass @@ -20,15 +21,16 @@ class OsResources(ValidatedMarshmallowDataclass): execute_txs_inner: Mapping[TransactionType, ExecutionResources] -# Empirical costs; accounted during transaction execution. -os_resources: OsResources = OsResources.loads( - data=open(os.path.join(DIR, "os_resources.json")).read() -) +@lru_cache() +def get_os_resources() -> OsResources: + # Empirical costs; accounted during transaction execution. + return OsResources.loads(data=open(os.path.join(DIR, "os_resources.json")).read()) -def get_additional_os_resources( +def get_tx_additional_os_resources( syscall_counter: Mapping[str, int], tx_type: TransactionType ) -> ExecutionResources: + os_resources = get_os_resources() # Calculate the additional resources needed for the OS to run the given syscalls; # i.e., the resources of the function execute_syscalls(). os_additional_resources = functools.reduce( diff --git a/src/starkware/starknet/business_logic/fact_state/BUILD b/src/starkware/starknet/business_logic/fact_state/BUILD new file mode 100644 index 00000000..70de3925 --- /dev/null +++ b/src/starkware/starknet/business_logic/fact_state/BUILD @@ -0,0 +1,69 @@ +load("//bazel_utils/python:defs.bzl", "requirement") + +package(default_visibility = ["//visibility:public"]) + +py_library( + name = "starknet_business_logic_fact_state_lib", + srcs = [ + "state.py", + ], + visibility = ["//visibility:public"], + deps = [ + "starknet_business_logic_fact_state_utils_lib", + "starknet_business_logic_patricia_state_lib", + "//src/services/everest/business_logic:everest_business_logic_lib", + "//src/starkware/cairo/common:poseidon_utils_lib", + "//src/starkware/cairo/lang/vm:cairo_vm_crypto_lib", + "//src/starkware/cairo/lang/vm:cairo_vm_lib", + "//src/starkware/python:starkware_python_utils_lib", + "//src/starkware/starknet/business_logic/state:starknet_business_logic_state_lib", + "//src/starkware/starknet/definitions:starknet_definitions_lib", + "//src/starkware/starknet/definitions:starknet_general_config_lib", + "//src/starkware/starknet/services/api/gateway:starknet_transaction_lib", + "//src/starkware/starkware_utils:starkware_config_utils_lib", + "//src/starkware/starkware_utils:starkware_error_handling_lib", + "//src/starkware/starkware_utils:starkware_utils_lib", + "//src/starkware/storage:starkware_abstract_storage_lib", + "//src/starkware/storage:starkware_storage_lib", + requirement("marshmallow_dataclass"), + ], +) + +py_library( + name = "starknet_business_logic_patricia_state_lib", + srcs = [ + "contract_class_objects.py", + "contract_state_objects.py", + "patricia_state.py", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/services/everest/business_logic:everest_business_logic_lib", + "//src/starkware/cairo/lang/vm:cairo_vm_crypto_lib", + "//src/starkware/python:starkware_python_utils_lib", + "//src/starkware/starknet/business_logic/state:starknet_business_logic_state_lib", + "//src/starkware/starknet/core/os/contract_class:starknet_os_abi_lib", + "//src/starkware/starknet/definitions:starknet_definitions_lib", + "//src/starkware/starknet/definitions:starknet_general_config_lib", + "//src/starkware/starknet/services/api/contract_class:starknet_contract_class_lib", + "//src/starkware/starknet/storage:starknet_storage_lib", + "//src/starkware/starkware_utils:starkware_commitment_tree_facts_lib", + "//src/starkware/starkware_utils:starkware_dataclasses_utils_lib", + "//src/starkware/starkware_utils:starkware_error_handling_lib", + "//src/starkware/starkware_utils:starkware_utils_lib", + "//src/starkware/storage:starkware_abstract_storage_lib", + "//src/starkware/storage:starkware_storage_lib", + requirement("marshmallow_dataclass"), + ], +) + +py_library( + name = "starknet_business_logic_fact_state_utils_lib", + srcs = [ + "utils.py", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/starkware/starknet/business_logic/state:starknet_business_logic_state_lib", + ], +) diff --git a/src/starkware/starknet/business_logic/fact_state/CMakeLists.txt b/src/starkware/starknet/business_logic/fact_state/CMakeLists.txt deleted file mode 100644 index a98446a0..00000000 --- a/src/starkware/starknet/business_logic/fact_state/CMakeLists.txt +++ /dev/null @@ -1,62 +0,0 @@ -python_lib(starknet_business_logic_fact_state_lib - PREFIX starkware/starknet/business_logic/fact_state - - FILES - state.py - - LIBS - cairo_vm_crypto_lib - cairo_vm_lib - everest_business_logic_lib - poseidon_utils_lib - starknet_business_logic_fact_state_utils_lib - starknet_business_logic_patricia_state_lib - starknet_business_logic_state_lib - starknet_definitions_lib - starknet_general_config_lib - starknet_transaction_lib - starkware_abstract_storage_lib - starkware_config_utils_lib - starkware_error_handling_lib - starkware_python_utils_lib - starkware_storage_lib - starkware_utils_lib - pip_marshmallow_dataclass -) - -python_lib(starknet_business_logic_patricia_state_lib - PREFIX starkware/starknet/business_logic/fact_state - - FILES - contract_class_objects.py - contract_state_objects.py - patricia_state.py - - LIBS - cairo_vm_crypto_lib - everest_business_logic_lib - starknet_business_logic_state_lib - starknet_contract_class_lib - starknet_definitions_lib - starknet_general_config_lib - starknet_os_abi_lib - starknet_storage_lib - starkware_abstract_storage_lib - starkware_commitment_tree_facts_lib - starkware_dataclasses_utils_lib - starkware_error_handling_lib - starkware_python_utils_lib - starkware_storage_lib - starkware_utils_lib - pip_marshmallow_dataclass -) - -python_lib(starknet_business_logic_fact_state_utils_lib - PREFIX starkware/starknet/business_logic/fact_state - - FILES - utils.py - - LIBS - starknet_business_logic_state_lib -) diff --git a/src/starkware/starknet/business_logic/fact_state/patricia_state.py b/src/starkware/starknet/business_logic/fact_state/patricia_state.py index 41319b74..c75a6a61 100644 --- a/src/starkware/starknet/business_logic/fact_state/patricia_state.py +++ b/src/starkware/starknet/business_logic/fact_state/patricia_state.py @@ -30,7 +30,7 @@ class PatriciaStateReader(StateReader): def __init__( self, - global_state_root: PatriciaTree, + contract_state_root: PatriciaTree, contract_class_root: Optional[PatriciaTree], ffc: FactFetchingContext, contract_class_storage: Storage, @@ -41,7 +41,7 @@ def __init__( self.contract_class_storage = contract_class_storage # Last committed state roots. - self.global_state_root = global_state_root + self.contract_state_root = contract_state_root self.contract_class_root = contract_class_root # A mapping from contract address to its state. @@ -108,7 +108,7 @@ async def _get_contract_state(self, contract_address: int) -> ContractState: return self.contract_states[contract_address] async def _fetch_contract_state(self, contract_address: int) -> ContractState: - return await self.global_state_root.get_leaf( + return await self.contract_state_root.get_leaf( ffc=self.ffc, index=contract_address, fact_cls=ContractState ) diff --git a/src/starkware/starknet/business_logic/fact_state/state.py b/src/starkware/starknet/business_logic/fact_state/state.py index 94afa0c3..06394148 100644 --- a/src/starkware/starknet/business_logic/fact_state/state.py +++ b/src/starkware/starknet/business_logic/fact_state/state.py @@ -104,12 +104,12 @@ async def empty_for_testing( state = CachedState( block_info=shared_state.block_info, state_reader=PatriciaStateReader( - global_state_root=shared_state.contract_states, + contract_state_root=shared_state.contract_states, contract_class_root=shared_state.contract_classes, ffc=ffc, contract_class_storage=ffc.storage, ), - contract_class_cache={}, + compiled_class_cache={}, ) return cls( parent_state=None, @@ -284,7 +284,7 @@ def to_carried_state(self, ffc: FactFetchingContext) -> CarriedState: state = CachedState( block_info=self.block_info, state_reader=PatriciaStateReader( - global_state_root=self.contract_states, + contract_state_root=self.contract_states, contract_class_root=self.contract_classes, ffc=ffc, contract_class_storage=ffc.storage, diff --git a/src/starkware/starknet/business_logic/state/BUILD b/src/starkware/starknet/business_logic/state/BUILD new file mode 100644 index 00000000..45a0bba1 --- /dev/null +++ b/src/starkware/starknet/business_logic/state/BUILD @@ -0,0 +1,25 @@ +load("//bazel_utils/python:defs.bzl", "requirement") + +package(default_visibility = ["//visibility:public"]) + +py_library( + name = "starknet_business_logic_state_lib", + srcs = [ + "state.py", + "state_api.py", + "state_api_objects.py", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/services/everest/business_logic:everest_business_logic_state_api_lib", + "//src/starkware/cairo/lang:cairo_version_lib", + "//src/starkware/python:starkware_python_utils_lib", + "//src/starkware/starknet/definitions:starknet_definitions_lib", + "//src/starkware/starknet/definitions:starknet_general_config_lib", + "//src/starkware/starknet/services/api/contract_class:starknet_contract_class_lib", + "//src/starkware/starkware_utils:starkware_dataclasses_utils_lib", + "//src/starkware/starkware_utils:starkware_error_handling_lib", + "//src/starkware/starkware_utils:starkware_utils_lib", + requirement("marshmallow_dataclass"), + ], +) diff --git a/src/starkware/starknet/business_logic/state/CMakeLists.txt b/src/starkware/starknet/business_logic/state/CMakeLists.txt deleted file mode 100644 index fc785af2..00000000 --- a/src/starkware/starknet/business_logic/state/CMakeLists.txt +++ /dev/null @@ -1,20 +0,0 @@ -python_lib(starknet_business_logic_state_lib - PREFIX starkware/starknet/business_logic/state - - FILES - state.py - state_api.py - state_api_objects.py - - LIBS - cairo_version_lib - everest_business_logic_state_api_lib - starknet_contract_class_lib - starknet_definitions_lib - starknet_general_config_lib - starkware_dataclasses_utils_lib - starkware_error_handling_lib - starkware_python_utils_lib - starkware_utils_lib - pip_marshmallow_dataclass -) diff --git a/src/starkware/starknet/business_logic/state/state.py b/src/starkware/starknet/business_logic/state/state.py index 091569a4..04f30f86 100644 --- a/src/starkware/starknet/business_logic/state/state.py +++ b/src/starkware/starknet/business_logic/state/state.py @@ -39,7 +39,7 @@ class StateSyncifier(SyncState): """ def __init__(self, async_state: State, loop: asyncio.AbstractEventLoop): - # State to sychronize. + # State to synchronize. self.async_state = async_state # Current running event loop; used for running async tasks in a synchronous context. @@ -204,32 +204,32 @@ def __init__( self, block_info: BlockInfo, state_reader: StateReader, - contract_class_cache: Optional[CompiledClassCache] = None, + compiled_class_cache: Optional[CompiledClassCache] = None, ): self.block_info = block_info self.state_reader = state_reader self.cache = StateCache() - self._contract_classes: Optional[CompiledClassCache] = contract_class_cache + self._compiled_classes: Optional[CompiledClassCache] = compiled_class_cache @property - def contract_classes(self) -> CompiledClassCache: - assert self._contract_classes is not None, "contract_classes mapping is not initialized." - return self._contract_classes + def compiled_classes(self) -> CompiledClassCache: + assert self._compiled_classes is not None, "compiled_classes mapping is not initialized." + return self._compiled_classes - def set_contract_class_cache(self, contract_classes: CompiledClassCache): - assert self._contract_classes is None, "contract_classes mapping is already initialized." - self._contract_classes = contract_classes + def set_compiled_class_cache(self, compiled_classes: CompiledClassCache): + assert self._compiled_classes is None, "compiled_classes mapping is already initialized." + self._compiled_classes = compiled_classes def update_block_info(self, block_info: BlockInfo): self.block_info = block_info async def get_compiled_class(self, compiled_class_hash: int) -> CompiledClassBase: - if compiled_class_hash not in self.contract_classes: - self.contract_classes[compiled_class_hash] = await self.state_reader.get_compiled_class( + if compiled_class_hash not in self.compiled_classes: + self.compiled_classes[compiled_class_hash] = await self.state_reader.get_compiled_class( compiled_class_hash=compiled_class_hash ) - return self.contract_classes[compiled_class_hash] + return self.compiled_classes[compiled_class_hash] async def get_compiled_class_hash(self, class_hash: int) -> int: if class_hash not in self.cache.class_hash_to_compiled_class_hash: @@ -290,7 +290,7 @@ def _copy(self) -> "CachedState": return CachedState( block_info=self.block_info, state_reader=self, - contract_class_cache=self.contract_classes, + compiled_class_cache=self.compiled_classes, ) def _apply(self, parent: "CachedState"): @@ -319,36 +319,36 @@ def __init__( self, block_info: BlockInfo, state_reader: SyncStateReader, - contract_class_cache: Optional[CompiledClassCache] = None, + compiled_class_cache: Optional[CompiledClassCache] = None, ): self._block_info = block_info self.state_reader = state_reader self.cache = StateCache() - self._contract_classes: Optional[CompiledClassCache] = contract_class_cache + self._compiled_classes: Optional[CompiledClassCache] = compiled_class_cache @property def block_info(self) -> BlockInfo: return self._block_info @property - def contract_classes(self) -> CompiledClassCache: - assert self._contract_classes is not None, "contract_classes mapping is not initialized." - return self._contract_classes + def compiled_classes(self) -> CompiledClassCache: + assert self._compiled_classes is not None, "compiled_classes mapping is not initialized." + return self._compiled_classes def update_block_info(self, block_info: BlockInfo): self._block_info = block_info - def set_contract_class_cache(self, contract_classes: CompiledClassCache): - assert self._contract_classes is None, "contract_classes mapping is already initialized." - self._contract_classes = contract_classes + def set_compiled_class_cache(self, compiled_classes: CompiledClassCache): + assert self._compiled_classes is None, "compiled_classes mapping is already initialized." + self._compiled_classes = compiled_classes def get_compiled_class(self, compiled_class_hash: int) -> CompiledClassBase: - if compiled_class_hash not in self.contract_classes: - self.contract_classes[compiled_class_hash] = self.state_reader.get_compiled_class( + if compiled_class_hash not in self.compiled_classes: + self.compiled_classes[compiled_class_hash] = self.state_reader.get_compiled_class( compiled_class_hash=compiled_class_hash ) - return self.contract_classes[compiled_class_hash] + return self.compiled_classes[compiled_class_hash] def get_compiled_class_hash(self, class_hash: int) -> int: if class_hash not in self.cache.class_hash_to_compiled_class_hash: @@ -401,6 +401,30 @@ def increment_nonce(self, contract_address: int): def set_storage_at(self, contract_address: int, key: int, value: int): self.cache._storage_writes[(contract_address, key)] = value + def _copy(self) -> "CachedSyncState": + # Note that the reader's cache may be updated by this copy's read requests. + return CachedSyncState( + block_info=self.block_info, + state_reader=self, + compiled_class_cache=self.compiled_classes, + ) + + def _apply(self, parent: "CachedSyncState"): + """ + Apply updates to parent state. + """ + assert self.state_reader is parent, "Current reader expected to be the parent state." + + parent._block_info = self.block_info + parent.cache.update_writes_from_other(other=self.cache) + + @contextlib.contextmanager + def copy_and_apply(self: "CachedSyncState") -> Iterator["CachedSyncState"]: + copied_state = self._copy() + # The exit logic will not be called in case an exception is raised inside the context. + yield copied_state + copied_state._apply(parent=self) # Apply to self. + class ContractStorageState: """ diff --git a/src/starkware/starknet/business_logic/state/state_api.py b/src/starkware/starknet/business_logic/state/state_api.py index 1e32671f..1d816947 100644 --- a/src/starkware/starknet/business_logic/state/state_api.py +++ b/src/starkware/starknet/business_logic/state/state_api.py @@ -15,7 +15,7 @@ class StateReader(ABC): """ - A read-only API for accessing StarkNet global state. + A read-only API for accessing Starknet global state. """ @abstractmethod @@ -73,7 +73,7 @@ async def get_compiled_class_by_class_hash(self, class_hash: int) -> CompiledCla class State(StateProxy, StateReader): """ - A class defining the API for accessing StarkNet global state. + A class defining the API for accessing Starknet global state. Reader functionality is injected through dependency, rather than inherited (only the abstract API is inherited). diff --git a/src/starkware/starknet/business_logic/state/state_api_objects.py b/src/starkware/starknet/business_logic/state/state_api_objects.py index 6ff66a6b..aa775c00 100644 --- a/src/starkware/starknet/business_logic/state/state_api_objects.py +++ b/src/starkware/starknet/business_logic/state/state_api_objects.py @@ -28,7 +28,7 @@ class BlockInfo(ValidatedMarshmallowDataclass): # The sequencer address of this block. sequencer_address: Optional[int] = field(metadata=fields.optional_sequencer_address_metadata) - # The version of StarkNet system (e.g. "0.11.0"). + # The version of StarkNet system (e.g. "0.11.1"). starknet_version: Optional[str] = field(metadata=fields.starknet_version_metadata) @classmethod diff --git a/src/starkware/starknet/business_logic/state/test_utils.py b/src/starkware/starknet/business_logic/state/test_utils.py new file mode 100644 index 00000000..e3d42292 --- /dev/null +++ b/src/starkware/starknet/business_logic/state/test_utils.py @@ -0,0 +1,48 @@ +from starkware.starknet.business_logic.state.state_api import ( + StateReader, + SyncStateReader, + get_stark_exception_on_undeclared_contract, +) +from starkware.starknet.services.api.contract_class.contract_class import CompiledClassBase + + +class EmptyStateReader(StateReader): + """ + Implements a reader of an empty state. + """ + + async def get_compiled_class(self, compiled_class_hash: int) -> CompiledClassBase: + raise get_stark_exception_on_undeclared_contract(class_hash=compiled_class_hash) + + async def get_compiled_class_hash(self, class_hash: int) -> int: + return 0 + + async def get_class_hash_at(self, contract_address: int) -> int: + return 0 + + async def get_nonce_at(self, contract_address: int) -> int: + return 0 + + async def get_storage_at(self, contract_address: int, key: int) -> int: + return 0 + + +class EmptySyncStateReader(SyncStateReader): + """ + A synchronous version of EmptyStateReader. + """ + + def get_compiled_class(self, compiled_class_hash: int) -> CompiledClassBase: + raise get_stark_exception_on_undeclared_contract(class_hash=compiled_class_hash) + + def get_compiled_class_hash(self, class_hash: int) -> int: + return 0 + + def get_class_hash_at(self, contract_address: int) -> int: + return 0 + + def get_nonce_at(self, contract_address: int) -> int: + return 0 + + def get_storage_at(self, contract_address: int, key: int) -> int: + return 0 diff --git a/src/starkware/starknet/business_logic/transaction/BUILD b/src/starkware/starknet/business_logic/transaction/BUILD new file mode 100644 index 00000000..dc2476b2 --- /dev/null +++ b/src/starkware/starknet/business_logic/transaction/BUILD @@ -0,0 +1,87 @@ +load("//bazel_utils/python:defs.bzl", "requirement") + +package(default_visibility = ["//visibility:public"]) + +py_library( + name = "starknet_transaction_objects_lib", + srcs = [ + "objects.py", + ], + visibility = ["//visibility:public"], + deps = [ + "starknet_transaction_fee_lib", + "starknet_transaction_state_objects_lib", + "//src/services/everest/api/gateway:everest_transaction_lib", + "//src/services/everest/business_logic:everest_business_logic_lib", + "//src/services/everest/business_logic:everest_business_logic_state_api_lib", + "//src/services/everest/business_logic:everest_internal_transaction_lib", + "//src/services/everest/definitions:everest_definitions_lib", + "//src/starkware/python:starkware_python_utils_lib", + "//src/starkware/starknet/business_logic:starknet_business_logic_utils_lib", + "//src/starkware/starknet/business_logic/execution:starknet_execute_entry_point_lib", + "//src/starkware/starknet/business_logic/execution:starknet_transaction_execution_objects_lib", + "//src/starkware/starknet/business_logic/fact_state:starknet_business_logic_patricia_state_lib", + "//src/starkware/starknet/business_logic/state:starknet_business_logic_state_lib", + "//src/starkware/starknet/core/os/contract_address:starknet_contract_address_lib", + "//src/starkware/starknet/core/os/contract_class:starknet_os_abi_lib", + "//src/starkware/starknet/core/os/transaction_hash:starknet_transaction_hash_lib", + "//src/starkware/starknet/definitions:starknet_definitions_lib", + "//src/starkware/starknet/definitions:starknet_general_config_lib", + "//src/starkware/starknet/public:starknet_abi_lib", + "//src/starkware/starknet/services/api/contract_class:starknet_contract_class_lib", + "//src/starkware/starknet/services/api/gateway:starknet_transaction_lib", + "//src/starkware/starknet/services/api/gateway:starknet_transaction_utils_lib", + "//src/starkware/starkware_utils:starkware_config_utils_lib", + "//src/starkware/starkware_utils:starkware_dataclasses_field_utils_lib", + "//src/starkware/starkware_utils:starkware_error_handling_lib", + "//src/starkware/storage:starkware_abstract_storage_lib", + "//src/starkware/storage:starkware_storage_lib", + requirement("marshmallow"), + requirement("marshmallow_dataclass"), + requirement("marshmallow_enum"), + requirement("marshmallow_oneofschema"), + ], +) + +py_library( + name = "starknet_transaction_state_objects_lib", + srcs = [ + "state_objects.py", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/services/everest/api/gateway:everest_transaction_lib", + "//src/services/everest/business_logic:everest_business_logic_lib", + "//src/services/everest/business_logic:everest_business_logic_state_api_lib", + "//src/services/everest/business_logic:everest_internal_transaction_lib", + "//src/starkware/cairo/lang/vm:cairo_vm_lib", + "//src/starkware/starknet/business_logic/execution:starknet_transaction_execution_objects_lib", + "//src/starkware/starknet/business_logic/fact_state:starknet_business_logic_fact_state_lib", + "//src/starkware/starknet/business_logic/fact_state:starknet_business_logic_patricia_state_lib", + "//src/starkware/starknet/business_logic/state:starknet_business_logic_state_lib", + "//src/starkware/starknet/definitions:starknet_definitions_lib", + "//src/starkware/starknet/definitions:starknet_general_config_lib", + "//src/starkware/starknet/services/api/gateway:starknet_transaction_lib", + "//src/starkware/starkware_utils:starkware_config_utils_lib", + "//src/starkware/starkware_utils:starkware_error_handling_lib", + ], +) + +py_library( + name = "starknet_transaction_fee_lib", + srcs = [ + "fee.py", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/starkware/starknet/business_logic:starknet_business_logic_utils_lib", + "//src/starkware/starknet/business_logic/execution:starknet_execute_entry_point_lib", + "//src/starkware/starknet/business_logic/execution:starknet_transaction_execution_objects_lib", + "//src/starkware/starknet/business_logic/state:starknet_business_logic_state_lib", + "//src/starkware/starknet/definitions:starknet_definitions_lib", + "//src/starkware/starknet/definitions:starknet_general_config_lib", + "//src/starkware/starknet/public:starknet_abi_lib", + "//src/starkware/starknet/services/api/contract_class:starknet_contract_class_lib", + "//src/starkware/starkware_utils:starkware_error_handling_lib", + ], +) diff --git a/src/starkware/starknet/business_logic/transaction/CMakeLists.txt b/src/starkware/starknet/business_logic/transaction/CMakeLists.txt deleted file mode 100644 index ac2550a0..00000000 --- a/src/starkware/starknet/business_logic/transaction/CMakeLists.txt +++ /dev/null @@ -1,81 +0,0 @@ -python_lib(starknet_transaction_objects_lib - PREFIX starkware/starknet/business_logic/transaction - - FILES - objects.py - - LIBS - everest_business_logic_lib - everest_business_logic_state_api_lib - everest_definitions_lib - everest_internal_transaction_lib - everest_transaction_lib - starknet_abi_lib - starknet_business_logic_patricia_state_lib - starknet_business_logic_state_lib - starknet_business_logic_utils_lib - starknet_contract_address_lib - starknet_contract_class_lib - starknet_definitions_lib - starknet_execute_entry_point_lib - starknet_general_config_lib - starknet_transaction_state_objects_lib - starknet_os_abi_lib - starknet_os_utils_lib - starknet_transaction_execution_objects_lib - starknet_transaction_fee_lib - starknet_transaction_hash_lib - starknet_transaction_lib - starknet_transaction_utils_lib - starkware_abstract_storage_lib - starkware_config_utils_lib - starkware_dataclasses_field_utils_lib - starkware_error_handling_lib - starkware_python_utils_lib - starkware_storage_lib - pip_marshmallow - pip_marshmallow_dataclass - pip_marshmallow_enum - pip_marshmallow_oneofschema -) - -python_lib(starknet_transaction_state_objects_lib - PREFIX starkware/starknet/business_logic/transaction - - FILES - state_objects.py - - LIBS - cairo_vm_lib - everest_business_logic_lib - everest_business_logic_state_api_lib - everest_internal_transaction_lib - everest_transaction_lib - starknet_business_logic_fact_state_lib - starknet_business_logic_patricia_state_lib - starknet_business_logic_state_lib - starknet_definitions_lib - starknet_general_config_lib - starknet_transaction_lib - starknet_transaction_execution_objects_lib - starkware_config_utils_lib - starkware_error_handling_lib -) - -python_lib(starknet_transaction_fee_lib - PREFIX starkware/starknet/business_logic/transaction - - FILES - fee.py - - LIBS - starknet_abi_lib - starknet_business_logic_state_lib - starknet_business_logic_utils_lib - starknet_contract_class_lib - starknet_definitions_lib - starknet_execute_entry_point_lib - starknet_general_config_lib - starknet_transaction_execution_objects_lib - starkware_error_handling_lib -) diff --git a/src/starkware/starknet/business_logic/utils.py b/src/starkware/starknet/business_logic/utils.py index 2d1a621c..0bdd27c4 100644 --- a/src/starkware/starknet/business_logic/utils.py +++ b/src/starkware/starknet/business_logic/utils.py @@ -1,9 +1,11 @@ import asyncio import contextlib +import dataclasses import logging from typing import Dict, Iterable, List, Optional, Tuple, cast from starkware.cairo.common.cairo_function_runner import CairoFunctionRunner +from starkware.cairo.lang.builtins.all_builtins import with_suffix from starkware.cairo.lang.vm.cairo_pie import ExecutionResources from starkware.python.utils import from_bytes, sub_counters, to_bytes from starkware.starknet.business_logic.execution.gas_usage import calculate_tx_gas_usage @@ -14,7 +16,7 @@ ResourcesMapping, TransactionExecutionInfo, ) -from starkware.starknet.business_logic.execution.os_usage import get_additional_os_resources +from starkware.starknet.business_logic.execution.os_usage import get_tx_additional_os_resources from starkware.starknet.business_logic.fact_state.contract_class_objects import ( CompiledClassFact, ContractClassFact, @@ -224,10 +226,23 @@ def calculate_tx_resources( n_class_updates=n_class_updates, ) - cairo_usage = resources_manager.cairo_usage + cairo_usage_with_segment_arena_builtin = resources_manager.cairo_usage + # "segment_arena" built-in is not a SHARP built-in - i.e., it is not part of any proof layout. + # Each instance requires approximately 10 steps in the OS. + builtin_instance_counter = dict(cairo_usage_with_segment_arena_builtin.builtin_instance_counter) + n_steps = cairo_usage_with_segment_arena_builtin.n_steps + 10 * builtin_instance_counter.pop( + with_suffix("segment_arena"), 0 + ) + cairo_usage = dataclasses.replace( + cairo_usage_with_segment_arena_builtin, + n_steps=n_steps, + builtin_instance_counter=builtin_instance_counter, + ) tx_syscall_counter = resources_manager.syscall_counter # Add additional Cairo resources needed for the OS to run the transaction. - cairo_usage += get_additional_os_resources(syscall_counter=tx_syscall_counter, tx_type=tx_type) + cairo_usage += get_tx_additional_os_resources( + syscall_counter=tx_syscall_counter, tx_type=tx_type + ) return dict(l1_gas_usage=l1_gas_usage, **cairo_usage.filter_unused_builtins().to_dict()) diff --git a/src/starkware/starknet/cli/BUILD b/src/starkware/starknet/cli/BUILD new file mode 100644 index 00000000..d02aba6d --- /dev/null +++ b/src/starkware/starknet/cli/BUILD @@ -0,0 +1,84 @@ +load("//bazel_utils/python:defs.bzl", "requirement") +load("//bazel_utils:python.bzl", "py_exe", "pytest_test") + +package(default_visibility = ["//visibility:public"]) + +py_library( + name = "starknet_cli_utils_lib", + srcs = [ + "starknet_cli_utils.py", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/services/external_api:services_external_api_lib", + "//src/starkware/cairo/lang/compiler:cairo_compile_lib", + "//src/starkware/python:starkware_python_utils_lib", + "//src/starkware/starknet/definitions:starknet_definitions_lib", + "//src/starkware/starknet/definitions:starknet_general_config_lib", + "//src/starkware/starknet/public:starknet_abi_lib", + "//src/starkware/starknet/services/api/contract_class:starknet_contract_class_lib", + "//src/starkware/starknet/services/api/feeder_gateway:starknet_feeder_gateway_client_lib", + "//src/starkware/starknet/services/api/feeder_gateway:starknet_feeder_gateway_request_objects_lib", + "//src/starkware/starknet/services/api/feeder_gateway:starknet_feeder_gateway_response_objects_lib", + "//src/starkware/starknet/services/api/gateway:starknet_gateway_client_lib", + "//src/starkware/starknet/services/api/gateway:starknet_transaction_lib", + "//src/starkware/starknet/wallets:starknet_wallets_lib", + "//src/starkware/starkware_utils:starkware_error_handling_lib", + ], +) + +py_library( + name = "starknet_cli_lib", + srcs = [ + "class_hash.py", + "compiled_class_hash.py", + "reconstruct_starknet_traceback.py", + "starknet_cli.py", + ], + visibility = ["//visibility:public"], + deps = [ + "starknet_cli_utils_lib", + "//src/services/everest/definitions:everest_definitions_lib", + "//src/starkware/cairo/lang:cairo_version_lib", + "//src/starkware/cairo/lang/compiler:cairo_compile_lib", + "//src/starkware/cairo/lang/vm:cairo_vm_crypto_lib", + "//src/starkware/cairo/lang/vm:cairo_vm_utils_lib", + "//src/starkware/python:starkware_python_utils_lib", + "//src/starkware/starknet/compiler:starknet_compile_lib", + "//src/starkware/starknet/core/os/contract_class:starknet_os_abi_lib", + "//src/starkware/starknet/definitions:starknet_definitions_lib", + "//src/starkware/starknet/definitions:starknet_general_config_lib", + "//src/starkware/starknet/public:starknet_abi_lib", + "//src/starkware/starknet/services/api/contract_class:starknet_contract_class_lib", + "//src/starkware/starknet/services/api/contract_class:starknet_contract_class_utils_lib", + "//src/starkware/starknet/services/api/feeder_gateway:starknet_feeder_gateway_client_lib", + "//src/starkware/starknet/services/api/feeder_gateway:starknet_feeder_gateway_request_objects_lib", + "//src/starkware/starknet/services/api/feeder_gateway:starknet_feeder_gateway_response_objects_lib", + "//src/starkware/starknet/services/api/gateway:starknet_gateway_client_lib", + "//src/starkware/starknet/services/api/gateway:starknet_transaction_lib", + "//src/starkware/starknet/utils:starknet_api_utils_lib", + "//src/starkware/starknet/wallets:starknet_standard_wallets_lib", + "//src/starkware/starknet/wallets:starknet_wallets_lib", + requirement("eth_utils"), + ], +) + +py_exe( + name = "starknet_cli", + module = "starkware.starknet.cli.starknet_cli", + deps = [ + "starknet_cli_lib", + ], +) + +pytest_test( + name = "starknet_cli_lib_test", + srcs = [ + "reconstruct_starknet_traceback_test.py", + ], + visibility = ["//visibility:public"], + deps = [ + "starknet_cli_lib", + "//src/starkware/cairo/lang:cairo_constants_lib", + ], +) diff --git a/src/starkware/starknet/cli/CMakeLists.txt b/src/starkware/starknet/cli/CMakeLists.txt deleted file mode 100644 index 9e98e946..00000000 --- a/src/starkware/starknet/cli/CMakeLists.txt +++ /dev/null @@ -1,83 +0,0 @@ -python_lib(starknet_cli_utils_lib - PREFIX starkware/starknet/cli - - FILES - starknet_cli_utils.py - - LIBS - cairo_compile_lib - services_external_api_lib - starknet_abi_lib - starknet_contract_class_lib - starknet_definitions_lib - starknet_feeder_gateway_client_lib - starknet_feeder_gateway_response_objects_lib - starknet_feeder_gateway_request_objects_lib - starknet_gateway_client_lib - starknet_general_config_lib - starknet_transaction_lib - starknet_wallets_lib - starkware_error_handling_lib - starkware_python_utils_lib -) - -python_lib(starknet_cli_lib - PREFIX starkware/starknet/cli - - FILES - class_hash.py - compiled_class_hash.py - reconstruct_starknet_traceback.py - starknet_cli.py - - LIBS - cairo_compile_lib - cairo_version_lib - cairo_vm_crypto_lib - cairo_vm_utils_lib - everest_definitions_lib - starknet_abi_lib - starknet_api_utils_lib - starknet_cli_utils_lib - starknet_compile_lib - starknet_contract_class_lib - starknet_contract_class_utils_lib - starknet_definitions_lib - starknet_feeder_gateway_client_lib - starknet_feeder_gateway_request_objects_lib - starknet_feeder_gateway_response_objects_lib - starknet_gateway_client_lib - starknet_general_config_lib - starknet_os_abi_lib - starknet_standard_wallets_lib - starknet_transaction_lib - starknet_wallets_lib - starkware_python_utils_lib - pip_eth_utils -) - -python_venv(starknet_cli_venv - PYTHON ${PYTHON_COMMAND} - - LIBS - starknet_cli_lib -) - -python_exe(starknet_cli - VENV starknet_cli_venv - MODULE starkware.starknet.cli.starknet_cli -) - -full_python_test(starknet_cli_lib_test - PREFIX starkware/starknet/cli - PYTHON ${PYTHON_COMMAND} - TESTED_MODULES starkware/starknet/cli - - FILES - reconstruct_starknet_traceback_test.py - - LIBS - starknet_cli_lib - cairo_constants_lib - pip_pytest -) diff --git a/src/starkware/starknet/cli/starknet_cli.py b/src/starkware/starknet/cli/starknet_cli.py index 5e679f1f..c820765b 100755 --- a/src/starkware/starknet/cli/starknet_cli.py +++ b/src/starkware/starknet/cli/starknet_cli.py @@ -1206,7 +1206,7 @@ async def simulate_tx_inner( def print_invoke_tx(tx: InvokeFunction, chain_id: int): sn_config_dict = StarknetGeneralConfig().dump() - sn_config_dict["starknet_os_config"]["chain_id"] = StarknetChainId(chain_id).name + sn_config_dict["starknet_os_config"]["chain_id"] = StarknetChainId(chain_id).value sn_config = StarknetGeneralConfig.load(sn_config_dict) tx_hash = tx.calculate_hash(sn_config) out_dict = { diff --git a/src/starkware/starknet/common/BUILD b/src/starkware/starknet/common/BUILD new file mode 100644 index 00000000..40ec0c18 --- /dev/null +++ b/src/starkware/starknet/common/BUILD @@ -0,0 +1,53 @@ +load("//src/starkware/cairo/lang:cairo_rules.bzl", "cairo_library") +load("//bazel_utils:python.bzl", "pytest_test") + +cairo_library( + name = "starknet_common_cairo_lib", + srcs = [ + "constants.cairo", + "eth_utils.cairo", + "messages.cairo", + "new_syscalls.cairo", + "storage.cairo", + "syscalls.cairo", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/starkware/cairo/common:cairo_common_cairo_lib", + ], +) + +py_library( + name = "starknet_common_lib", + data = [ + ":starknet_common_cairo_lib", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/starkware/cairo/common:cairo_common_lib", + ], +) + +package(default_visibility = ["//visibility:public"]) + +exports_files([ + "constants.cairo", + "new_syscalls.cairo", + "storage.cairo", + "syscalls.cairo", +]) + +pytest_test( + name = "starknet_common_lib_test", + srcs = [ + "eth_utils_test.py", + "storage_test.py", + ], + visibility = ["//visibility:public"], + deps = [ + "starknet_common_lib", + "//src/starkware/cairo/common:cairo_function_runner_lib", + "//src/starkware/python:starkware_python_test_utils_lib", + "//src/starkware/starknet/public:starknet_abi_lib", + ], +) diff --git a/src/starkware/starknet/common/CMakeLists.txt b/src/starkware/starknet/common/CMakeLists.txt deleted file mode 100644 index 2ee0d672..00000000 --- a/src/starkware/starknet/common/CMakeLists.txt +++ /dev/null @@ -1,38 +0,0 @@ -cairo_compile(starknet_syscalls - starknet_syscalls.json syscalls.cairo "--debug_info_with_source" -) -cairo_compile(starknet_new_syscalls - starknet_new_syscalls.json new_syscalls.cairo "--debug_info_with_source" -) - -python_lib(starknet_common_lib - PREFIX starkware/starknet/common - - FILES - constants.cairo - eth_utils.cairo - messages.cairo - syscalls.cairo - storage.cairo - new_syscalls.cairo - - LIBS - cairo_common_lib -) - -full_python_test(starknet_common_lib_test - PREFIX starkware/starknet/common - PYTHON ${PYTHON_COMMAND} - TESTED_MODULES starkware/starknet/common - - FILES - storage_test.py - eth_utils_test.py - - LIBS - cairo_function_runner_lib - starknet_abi_lib - starknet_common_lib - starkware_python_test_utils_lib - pip_pytest -) diff --git a/src/starkware/starknet/common/new_syscalls.cairo b/src/starkware/starknet/common/new_syscalls.cairo index 942d8dd0..b1e347cb 100644 --- a/src/starkware/starknet/common/new_syscalls.cairo +++ b/src/starkware/starknet/common/new_syscalls.cairo @@ -4,6 +4,7 @@ const CALL_CONTRACT_SELECTOR = 'CallContract'; const DEPLOY_SELECTOR = 'Deploy'; const EMIT_EVENT_SELECTOR = 'EmitEvent'; const GET_EXECUTION_INFO_SELECTOR = 'GetExecutionInfo'; +const KECCAK_SELECTOR = 'Keccak'; const LIBRARY_CALL_SELECTOR = 'LibraryCall'; const REPLACE_CLASS_SELECTOR = 'ReplaceClass'; const SEND_MESSAGE_TO_L1_SELECTOR = 'SendMessageToL1'; @@ -113,6 +114,13 @@ struct DeployRequest { deploy_from_zero: felt, } +struct KeccakRequest { + // The Span to be hashed. + // See `keccak_padded_input` for more details. + input_start: felt*, + input_end: felt*, +} + struct StorageReadRequest { reserved: felt, key: felt, @@ -154,6 +162,11 @@ struct DeployResponse { constructor_retdata_end: felt*, } +struct KeccakResponse { + result_low: felt, + result_high: felt, +} + struct StorageReadResponse { value: felt, } diff --git a/src/starkware/starknet/compiler/BUILD b/src/starkware/starknet/compiler/BUILD new file mode 100644 index 00000000..f10d9f9a --- /dev/null +++ b/src/starkware/starknet/compiler/BUILD @@ -0,0 +1,76 @@ +load("//bazel_utils/python:defs.bzl", "requirement") +load("//bazel_utils:python.bzl", "py_exe", "pytest_test") +load("//src/starkware/cairo/lang/compiler:vars.bzl", "IS_COMPILER_PYPY") + +package(default_visibility = ["//visibility:public"]) + +py_exe( + name = "starknet_compile_exe", + is_pypy = IS_COMPILER_PYPY, + module = "starkware.starknet.compiler.compile", + deps = [ + "starknet_compile_lib", + ], +) + +py_library( + name = "starknet_compile_lib", + srcs = [ + "compile.py", + "contract_interface.py", + "data_encoder.py", + "event.py", + "external_wrapper.py", + "starknet_pass_manager.py", + "starknet_preprocessor.py", + "storage_var.py", + "validation_utils.py", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/starkware/cairo/lang:cairo_constants_lib", + "//src/starkware/cairo/lang/compiler:cairo_compile_lib", + "//src/starkware/python:starkware_python_utils_lib", + "//src/starkware/starknet/common:starknet_common_lib", + "//src/starkware/starknet/definitions:starknet_definitions_lib", + "//src/starkware/starknet/public:starknet_abi_lib", + "//src/starkware/starknet/security:starknet_hints_whitelist_lib", + "//src/starkware/starknet/security:starknet_security_lib", + "//src/starkware/starknet/services/api/contract_class:starknet_contract_class_lib", + "//src/starkware/starkware_utils:starkware_utils_lib", + requirement("typing_extensions"), + ], +) + +py_library( + name = "starknet_compile_test_utils_lib", + srcs = [ + "test_utils.py", + ], + visibility = ["//visibility:public"], + deps = [ + "starknet_compile_lib", + "//src/starkware/cairo/lang:cairo_constants_lib", + "//src/starkware/cairo/lang/compiler:cairo_compile_lib", + "//src/starkware/cairo/lang/compiler:cairo_compile_test_utils_lib", + ], +) + +pytest_test( + name = "starknet_compile_test", + srcs = [ + "contract_interface_test.py", + "data_encoder_test.py", + "event_test.py", + "external_wrapper_test.py", + "starknet_preprocessor_test.py", + "storage_var_test.py", + "validation_utils_test.py", + ], + visibility = ["//visibility:public"], + deps = [ + "starknet_compile_lib", + "starknet_compile_test_utils_lib", + "//src/starkware/cairo/lang/compiler:cairo_compile_test_utils_lib", + ], +) diff --git a/src/starkware/starknet/compiler/CMakeLists.txt b/src/starkware/starknet/compiler/CMakeLists.txt deleted file mode 100644 index 9a5c3fa8..00000000 --- a/src/starkware/starknet/compiler/CMakeLists.txt +++ /dev/null @@ -1,67 +0,0 @@ -add_subdirectory(v1) - - -python_lib(starknet_compile_lib - PREFIX starkware/starknet/compiler - - FILES - data_encoder.py - compile.py - contract_interface.py - event.py - external_wrapper.py - starknet_pass_manager.py - starknet_preprocessor.py - storage_var.py - validation_utils.py - - LIBS - cairo_compile_lib - cairo_constants_lib - starknet_abi_lib - starknet_common_lib - starknet_contract_class_lib - starknet_definitions_lib - starknet_hints_whitelist_lib - starknet_security_lib - starkware_python_utils_lib - starkware_utils_lib - pip_typing_extensions -) - -set(STARKNET_COMPILE_LIB starknet_compile_lib) -include(compiler.cmake) - -python_lib(starknet_compile_test_utils_lib - PREFIX starkware/starknet/compiler - - FILES - test_utils.py - - LIBS - cairo_compile_lib - cairo_compile_test_utils_lib - cairo_constants_lib - starknet_compile_lib -) - -full_python_test(starknet_compile_test - PREFIX starkware/starknet/compiler - PYTHON ${CAIRO_PYTHON_INTERPRETER} - TESTED_MODULES starkware/starknet/compiler - - FILES - data_encoder_test.py - contract_interface_test.py - event_test.py - external_wrapper_test.py - starknet_preprocessor_test.py - storage_var_test.py - validation_utils_test.py - - LIBS - cairo_compile_test_utils_lib - starknet_compile_test_utils_lib - starknet_compile_lib - pip_pytest -) diff --git a/src/starkware/starknet/compiler/compiler.cmake b/src/starkware/starknet/compiler/compiler.cmake deleted file mode 100644 index cdf9ac4e..00000000 --- a/src/starkware/starknet/compiler/compiler.cmake +++ /dev/null @@ -1,18 +0,0 @@ -if (NOT DEFINED CAIRO_PYTHON_INTERPRETER) - set(CAIRO_PYTHON_INTERPRETER python3.9) -endif() -if (NOT DEFINED STARKNET_COMPILE_LIB) - set(STARKNET_COMPILE_LIB pip_cairo_lang) -endif() - -python_venv(starknet_compile_venv - PYTHON ${CAIRO_PYTHON_INTERPRETER} - - LIBS - ${STARKNET_COMPILE_LIB} -) - -python_exe(starknet_compile_exe - VENV starknet_compile_venv - MODULE starkware.starknet.compiler.compile -) diff --git a/src/starkware/starknet/compiler/starknet_cmake_rules.cmake b/src/starkware/starknet/compiler/starknet_cmake_rules.cmake deleted file mode 100644 index 23d9f713..00000000 --- a/src/starkware/starknet/compiler/starknet_cmake_rules.cmake +++ /dev/null @@ -1,12 +0,0 @@ -# Compiles a StarkNet Contract. -# Usage example: -# starknet_compile(mytarget contract_compiled.json contract.cairo "--debug_info_with_source") -function(starknet_compile TARGET_NAME COMPILED_PROGRAM_NAME SOURCE_FILE COMPILE_FLAGS) - cairo_compile_base( - ${TARGET_NAME} - "${CMAKE_BINARY_DIR}/src/starkware/starknet/compiler/starknet_compile_exe" - "${COMPILED_PROGRAM_NAME}" - "${SOURCE_FILE}" - "${COMPILE_FLAGS}" - ) -endfunction() diff --git a/src/starkware/starknet/compiler/v1/BUILD b/src/starkware/starknet/compiler/v1/BUILD new file mode 100644 index 00000000..89aed654 --- /dev/null +++ b/src/starkware/starknet/compiler/v1/BUILD @@ -0,0 +1,21 @@ +load("//src/starkware/cairo:vars.bzl", "CAIRO_COMPILER_ARCHIVE") + +package(default_visibility = ["//visibility:public"]) + +py_library( + name = "starknet_compile_v1_lib", + srcs = [ + "compile.py", + ], + data = [ + "@" + CAIRO_COMPILER_ARCHIVE, + "mainnet_libfuncs.json", + "testnet2_libfuncs.json", + "testnet_libfuncs.json", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/starkware/starknet/definitions:starknet_definitions_lib", + "//src/starkware/starkware_utils:starkware_error_handling_lib", + ], +) diff --git a/src/starkware/starknet/compiler/v1/BUILD.cairo-lang-1.0.0 b/src/starkware/starknet/compiler/v1/BUILD.cairo-compiler-archive-1.0.0 similarity index 76% rename from src/starkware/starknet/compiler/v1/BUILD.cairo-lang-1.0.0 rename to src/starkware/starknet/compiler/v1/BUILD.cairo-compiler-archive-1.0.0 index 8d99c63c..bf38bd7e 100644 --- a/src/starkware/starknet/compiler/v1/BUILD.cairo-lang-1.0.0 +++ b/src/starkware/starknet/compiler/v1/BUILD.cairo-compiler-archive-1.0.0 @@ -1,7 +1,7 @@ package(default_visibility = ["//visibility:public"]) filegroup( - name = "cairo-lang-1.0.0", + name = "cairo-compiler-archive-1.0.0", srcs = glob(["**/*"]), visibility = ["//visibility:public"], ) diff --git a/src/starkware/starknet/compiler/v1/CMakeLists.txt b/src/starkware/starknet/compiler/v1/CMakeLists.txt deleted file mode 100644 index 5e89cc83..00000000 --- a/src/starkware/starknet/compiler/v1/CMakeLists.txt +++ /dev/null @@ -1,111 +0,0 @@ -set(CAIRO_COMPILER_DUMMY_FILE "${CMAKE_CURRENT_BINARY_DIR}/cairo_compiler_v1") -set(CAIRO_COMPILER_DIR "${CMAKE_CURRENT_BINARY_DIR}/cairo") - -set(CAIRO_COMPILER_FILES - "${CAIRO_COMPILER_DIR}/bin/cairo-compile" - "${CAIRO_COMPILER_DIR}/bin/cairo-format" - "${CAIRO_COMPILER_DIR}/bin/cairo-language-server" - "${CAIRO_COMPILER_DIR}/bin/cairo-run" - "${CAIRO_COMPILER_DIR}/bin/cairo-test" - "${CAIRO_COMPILER_DIR}/bin/sierra-compile" - "${CAIRO_COMPILER_DIR}/bin/starknet-compile" - "${CAIRO_COMPILER_DIR}/bin/starknet-sierra-compile" - "${CAIRO_COMPILER_DIR}/corelib/cairo_project.toml" - "${CAIRO_COMPILER_DIR}/corelib/Scarb.toml" - "${CAIRO_COMPILER_DIR}/corelib/src/array.cairo" - "${CAIRO_COMPILER_DIR}/corelib/src/box.cairo" - "${CAIRO_COMPILER_DIR}/corelib/src/clone.cairo" - "${CAIRO_COMPILER_DIR}/corelib/src/debug.cairo" - "${CAIRO_COMPILER_DIR}/corelib/src/dict.cairo" - "${CAIRO_COMPILER_DIR}/corelib/src/ec.cairo" - "${CAIRO_COMPILER_DIR}/corelib/src/ecdsa.cairo" - "${CAIRO_COMPILER_DIR}/corelib/src/gas.cairo" - "${CAIRO_COMPILER_DIR}/corelib/src/hash.cairo" - "${CAIRO_COMPILER_DIR}/corelib/src/integer.cairo" - "${CAIRO_COMPILER_DIR}/corelib/src/internal.cairo" - "${CAIRO_COMPILER_DIR}/corelib/src/lib.cairo" - "${CAIRO_COMPILER_DIR}/corelib/src/nullable.cairo" - "${CAIRO_COMPILER_DIR}/corelib/src/option.cairo" - "${CAIRO_COMPILER_DIR}/corelib/src/result.cairo" - "${CAIRO_COMPILER_DIR}/corelib/src/serde.cairo" - "${CAIRO_COMPILER_DIR}/corelib/src/starknet.cairo" - "${CAIRO_COMPILER_DIR}/corelib/src/starknet/class_hash.cairo" - "${CAIRO_COMPILER_DIR}/corelib/src/starknet/contract_address.cairo" - "${CAIRO_COMPILER_DIR}/corelib/src/starknet/info.cairo" - "${CAIRO_COMPILER_DIR}/corelib/src/starknet/storage_access.cairo" - "${CAIRO_COMPILER_DIR}/corelib/src/starknet/syscalls.cairo" - "${CAIRO_COMPILER_DIR}/corelib/src/starknet/testing.cairo" - "${CAIRO_COMPILER_DIR}/corelib/src/test.cairo" - "${CAIRO_COMPILER_DIR}/corelib/src/testing.cairo" - "${CAIRO_COMPILER_DIR}/corelib/src/traits.cairo" - "${CAIRO_COMPILER_DIR}/corelib/src/zeroable.cairo" -) - -set(CAIRO_COMPILER_ARTIFACTS - "${CAIRO_COMPILER_DIR}/bin/cairo-compile bin/cairo-compile" - "${CAIRO_COMPILER_DIR}/bin/cairo-format bin/cairo-format" - "${CAIRO_COMPILER_DIR}/bin/cairo-language-server bin/cairo-language-server" - "${CAIRO_COMPILER_DIR}/bin/cairo-run bin/cairo-run" - "${CAIRO_COMPILER_DIR}/bin/cairo-test bin/cairo-test" - "${CAIRO_COMPILER_DIR}/bin/sierra-compile bin/sierra-compile" - "${CAIRO_COMPILER_DIR}/bin/starknet-compile bin/starknet-compile" - "${CAIRO_COMPILER_DIR}/bin/starknet-sierra-compile bin/starknet-sierra-compile" - "${CAIRO_COMPILER_DIR}/corelib/cairo_project.toml corelib/cairo_project.toml" - "${CAIRO_COMPILER_DIR}/corelib/Scarb.toml corelib/Scarb.toml" - "${CAIRO_COMPILER_DIR}/corelib/src/array.cairo corelib/src/array.cairo" - "${CAIRO_COMPILER_DIR}/corelib/src/box.cairo corelib/src/box.cairo" - "${CAIRO_COMPILER_DIR}/corelib/src/clone.cairo corelib/src/clone.cairo" - "${CAIRO_COMPILER_DIR}/corelib/src/debug.cairo corelib/src/debug.cairo" - "${CAIRO_COMPILER_DIR}/corelib/src/dict.cairo corelib/src/dict.cairo" - "${CAIRO_COMPILER_DIR}/corelib/src/ec.cairo corelib/src/ec.cairo" - "${CAIRO_COMPILER_DIR}/corelib/src/ecdsa.cairo corelib/src/ecdsa.cairo" - "${CAIRO_COMPILER_DIR}/corelib/src/gas.cairo corelib/src/gas.cairo" - "${CAIRO_COMPILER_DIR}/corelib/src/hash.cairo corelib/src/hash.cairo" - "${CAIRO_COMPILER_DIR}/corelib/src/integer.cairo corelib/src/integer.cairo" - "${CAIRO_COMPILER_DIR}/corelib/src/internal.cairo corelib/src/internal.cairo" - "${CAIRO_COMPILER_DIR}/corelib/src/lib.cairo corelib/src/lib.cairo" - "${CAIRO_COMPILER_DIR}/corelib/src/nullable.cairo corelib/src/nullable.cairo" - "${CAIRO_COMPILER_DIR}/corelib/src/option.cairo corelib/src/option.cairo" - "${CAIRO_COMPILER_DIR}/corelib/src/result.cairo corelib/src/result.cairo" - "${CAIRO_COMPILER_DIR}/corelib/src/serde.cairo corelib/src/serde.cairo" - "${CAIRO_COMPILER_DIR}/corelib/src/starknet.cairo corelib/src/starknet.cairo" - "${CAIRO_COMPILER_DIR}/corelib/src/starknet/class_hash.cairo corelib/src/starknet/class_hash.cairo" - "${CAIRO_COMPILER_DIR}/corelib/src/starknet/contract_address.cairo corelib/src/starknet/contract_address.cairo" - "${CAIRO_COMPILER_DIR}/corelib/src/starknet/info.cairo corelib/src/starknet/info.cairo" - "${CAIRO_COMPILER_DIR}/corelib/src/starknet/storage_access.cairo corelib/src/starknet/storage_access.cairo" - "${CAIRO_COMPILER_DIR}/corelib/src/starknet/syscalls.cairo corelib/src/starknet/syscalls.cairo" - "${CAIRO_COMPILER_DIR}/corelib/src/starknet/testing.cairo corelib/src/starknet/testing.cairo" - "${CAIRO_COMPILER_DIR}/corelib/src/test.cairo corelib/src/test.cairo" - "${CAIRO_COMPILER_DIR}/corelib/src/testing.cairo corelib/src/testing.cairo" - "${CAIRO_COMPILER_DIR}/corelib/src/traits.cairo corelib/src/traits.cairo" - "${CAIRO_COMPILER_DIR}/corelib/src/zeroable.cairo corelib/src/zeroable.cairo" -) - -add_custom_command( - OUTPUT "${CAIRO_COMPILER_DUMMY_FILE}" "${CAIRO_COMPILER_FILES}" - COMMAND curl -Lo release-x86_64-unknown-linux-musl.tar.gz https://github.com/starkware-libs/cairo/releases/download/v1.0.0-alpha.6/release-x86_64-unknown-linux-musl.tar.gz - COMMAND tar -xf release-x86_64-unknown-linux-musl.tar.gz - COMMAND touch "${CAIRO_COMPILER_DUMMY_FILE}" - COMMENT "Downloading cairo compiler." -) - -add_custom_target(get_cairo_compiler DEPENDS ${CAIRO_COMPILER_DUMMY_FILE}) - -python_lib(starknet_compile_v1_lib - PREFIX starkware/starknet/compiler/v1 - - FILES - compile.py - mainnet_libfuncs.json - testnet_libfuncs.json - testnet2_libfuncs.json - - ARTIFACTS - "${CAIRO_COMPILER_ARTIFACTS}" - - LIBS - starknet_definitions_lib - starkware_error_handling_lib -) - -add_dependencies(starknet_compile_v1_lib get_cairo_compiler) diff --git a/src/starkware/starknet/compiler/v1/compile.py b/src/starkware/starknet/compiler/v1/compile.py index 5add4618..d305f044 100644 --- a/src/starkware/starknet/compiler/v1/compile.py +++ b/src/starkware/starknet/compiler/v1/compile.py @@ -14,7 +14,7 @@ r = runfiles.Create() - COMPILER_DIR = r.Rlocation("cairo-lang-1.0.0/bin") + COMPILER_DIR = r.Rlocation("cairo-compiler-archive-1.0.0/bin") else: COMPILER_DIR = os.path.join(os.path.dirname(__file__), "bin") diff --git a/src/starkware/starknet/compiler/v1/testnet2_libfuncs.json b/src/starkware/starknet/compiler/v1/testnet2_libfuncs.json index a7829800..eab55f5f 100644 --- a/src/starkware/starknet/compiler/v1/testnet2_libfuncs.json +++ b/src/starkware/starknet/compiler/v1/testnet2_libfuncs.json @@ -42,10 +42,10 @@ "enum_snapshot_match", "felt252_add", "felt252_const", + "felt252_dict_entry_finalize", + "felt252_dict_entry_get", "felt252_dict_new", - "felt252_dict_read", "felt252_dict_squash", - "felt252_dict_write", "felt252_div", "felt252_is_zero", "felt252_mul", @@ -61,7 +61,6 @@ "null", "nullable_from_box", "pedersen", - "redeposit_gas", "rename", "replace_class_syscall", "revoke_ap_tracking", @@ -83,19 +82,16 @@ "u128_const", "u128_eq", "u128_is_zero", - "u128_le", - "u128_lt", "u128_overflowing_add", "u128_overflowing_sub", "u128_safe_divmod", "u128_to_felt252", - "u128_wide_mul", + "u128_guarantee_mul", + "u128_mul_guarantee_verify", "u128s_from_felt252", "u16_const", "u16_eq", "u16_is_zero", - "u16_le", - "u16_lt", "u16_overflowing_add", "u16_overflowing_sub", "u16_safe_divmod", @@ -105,8 +101,6 @@ "u32_const", "u32_eq", "u32_is_zero", - "u32_le", - "u32_lt", "u32_overflowing_add", "u32_overflowing_sub", "u32_safe_divmod", @@ -116,8 +110,6 @@ "u64_const", "u64_eq", "u64_is_zero", - "u64_le", - "u64_lt", "u64_overflowing_add", "u64_overflowing_sub", "u64_safe_divmod", @@ -127,8 +119,6 @@ "u8_const", "u8_eq", "u8_is_zero", - "u8_le", - "u8_lt", "u8_overflowing_add", "u8_overflowing_sub", "u8_safe_divmod", diff --git a/src/starkware/starknet/compiler/v1/testnet_libfuncs.json b/src/starkware/starknet/compiler/v1/testnet_libfuncs.json index e2389d9b..eab55f5f 100644 --- a/src/starkware/starknet/compiler/v1/testnet_libfuncs.json +++ b/src/starkware/starknet/compiler/v1/testnet_libfuncs.json @@ -25,6 +25,16 @@ "disable_ap_tracking", "drop", "dup", + "ec_neg", + "ec_point_from_x_nz", + "ec_point_is_zero", + "ec_point_try_new_nz", + "ec_point_unwrap", + "ec_point_zero", + "ec_state_add", + "ec_state_add_mul", + "ec_state_init", + "ec_state_try_finalize_nz", "emit_event_syscall", "enable_ap_tracking", "enum_init", @@ -32,6 +42,10 @@ "enum_snapshot_match", "felt252_add", "felt252_const", + "felt252_dict_entry_finalize", + "felt252_dict_entry_get", + "felt252_dict_new", + "felt252_dict_squash", "felt252_div", "felt252_is_zero", "felt252_mul", @@ -47,7 +61,6 @@ "null", "nullable_from_box", "pedersen", - "redeposit_gas", "rename", "replace_class_syscall", "revoke_ap_tracking", @@ -69,19 +82,16 @@ "u128_const", "u128_eq", "u128_is_zero", - "u128_le", - "u128_lt", "u128_overflowing_add", "u128_overflowing_sub", "u128_safe_divmod", "u128_to_felt252", - "u128_wide_mul", + "u128_guarantee_mul", + "u128_mul_guarantee_verify", "u128s_from_felt252", "u16_const", "u16_eq", "u16_is_zero", - "u16_le", - "u16_lt", "u16_overflowing_add", "u16_overflowing_sub", "u16_safe_divmod", @@ -91,8 +101,6 @@ "u32_const", "u32_eq", "u32_is_zero", - "u32_le", - "u32_lt", "u32_overflowing_add", "u32_overflowing_sub", "u32_safe_divmod", @@ -102,8 +110,6 @@ "u64_const", "u64_eq", "u64_is_zero", - "u64_le", - "u64_lt", "u64_overflowing_add", "u64_overflowing_sub", "u64_safe_divmod", @@ -113,8 +119,6 @@ "u8_const", "u8_eq", "u8_is_zero", - "u8_le", - "u8_lt", "u8_overflowing_add", "u8_overflowing_sub", "u8_safe_divmod", diff --git a/src/starkware/starknet/core/CMakeLists.txt b/src/starkware/starknet/core/CMakeLists.txt deleted file mode 100644 index 90f0f508..00000000 --- a/src/starkware/starknet/core/CMakeLists.txt +++ /dev/null @@ -1,2 +0,0 @@ -add_subdirectory(os) -add_subdirectory(test_contract) diff --git a/src/starkware/starknet/core/os/BUILD b/src/starkware/starknet/core/os/BUILD new file mode 100644 index 00000000..9cd3595c --- /dev/null +++ b/src/starkware/starknet/core/os/BUILD @@ -0,0 +1,194 @@ +load("//src/starkware/cairo/lang:cairo_rules.bzl", "cairo_binary", "cairo_library") +load("//bazel_utils/python:defs.bzl", "requirement") +load("//bazel_utils:python.bzl", "pytest_test") + +cairo_library( + name = "starknet_os_program_cairo_lib", + srcs = [ + "block_context.cairo", + "builtins.cairo", + "constants.cairo", + "os.cairo", + "output.cairo", + "state.cairo", + "//src/starkware/starknet/core/os/contract_address:contract_address.cairo", + "//src/starkware/starknet/core/os/contract_class:compiled_class.cairo", + "//src/starkware/starknet/core/os/contract_class:deprecated_compiled_class.cairo", + "//src/starkware/starknet/core/os/execution:deprecated_execute_entry_point.cairo", + "//src/starkware/starknet/core/os/execution:deprecated_execute_syscalls.cairo", + "//src/starkware/starknet/core/os/execution:execute_entry_point.cairo", + "//src/starkware/starknet/core/os/execution:execute_syscalls.cairo", + "//src/starkware/starknet/core/os/execution:execute_transactions.cairo", + "//src/starkware/starknet/core/os/os_config:os_config.cairo", + "//src/starkware/starknet/core/os/transaction_hash:transaction_hash.cairo", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/starkware/cairo/builtin_selection:cairo_builtin_selection_cairo_lib", + "//src/starkware/cairo/common:cairo_common_cairo_lib", + "//src/starkware/starknet/builtins/segment_arena:segment_arena_cairo_lib", + "//src/starkware/starknet/core/os/contract_class:starknet_os_abi_cairo_lib", + ], +) + +cairo_library( + name = "starknet_os_program_lib", + srcs = [ + "//src/starkware/starknet/common:constants.cairo", + "//src/starkware/starknet/common:new_syscalls.cairo", + "//src/starkware/starknet/common:storage.cairo", + "//src/starkware/starknet/common:syscalls.cairo", + ], + deps = [ + ":starknet_os_program_cairo_lib", + ], +) + +cairo_binary( + name = "starknet_os_program", + cairoopts = [ + "--debug_info_with_source", + ], + compiled_program_name = "starknet_os_compiled.json", + main = "os.cairo", + deps = [":starknet_os_program_lib"], +) + +cairo_binary( + name = "starknet_syscalls", + cairoopts = [ + "--debug_info_with_source", + ], + compiled_program_name = "starknet_syscalls.json", + main = "//src/starkware/starknet/common:syscalls.cairo", + deps = [":starknet_os_program_lib"], +) + +cairo_binary( + name = "starknet_new_syscalls", + cairoopts = [ + "--debug_info_with_source", + ], + compiled_program_name = "starknet_new_syscalls.json", + main = "//src/starkware/starknet/common:new_syscalls.cairo", + deps = [":starknet_os_program_lib"], +) + +py_library( + name = "starknet_os_utils_lib", + srcs = [ + "os_utils.py", + "segment_utils.py", + ], + visibility = ["//visibility:public"], + deps = [ + ":starknet_deprecated_syscall_handler_lib", + ":starknet_syscall_handler_lib", + "//src/starkware/cairo/common:cairo_common_lib", + "//src/starkware/cairo/common:cairo_function_runner_lib", + "//src/starkware/cairo/lang/vm:cairo_relocatable_lib", + "//src/starkware/cairo/lang/vm:cairo_vm_lib", + "//src/starkware/python:starkware_python_utils_lib", + "//src/starkware/starknet/business_logic/execution:starknet_execute_entry_point_base_lib", + "//src/starkware/starknet/business_logic/execution:starknet_transaction_execution_objects_lib", + "//src/starkware/starknet/definitions:starknet_definitions_lib", + "//src/starkware/starknet/definitions:starknet_general_config_lib", + "//src/starkware/starknet/public:starknet_abi_lib", + "//src/starkware/starknet/services/api/contract_class:starknet_contract_class_lib", + "//src/starkware/starknet/storage:starknet_storage_lib", + "//src/starkware/starkware_utils:starkware_error_handling_lib", + ], +) + +py_library( + name = "starknet_os_program_py_lib", + srcs = [ + "os_program.py", + ], + data = [ + "starknet_os_compiled.json", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/starkware/cairo/bootloaders:cairo_hash_program_lib", + "//src/starkware/cairo/lang/compiler:cairo_compile_lib", + requirement("cachetools"), + ], +) + +py_library( + name = "starknet_syscall_handler_lib", + srcs = [ + "syscall_handler.py", + "syscall_utils.py", + ], + data = [ + "starknet_new_syscalls.json", + "starknet_syscalls.json", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/starkware/cairo/common:cairo_common_lib", + "//src/starkware/cairo/common:cairo_function_runner_lib", + "//src/starkware/cairo/lang/compiler:cairo_compile_lib", + "//src/starkware/cairo/lang/vm:cairo_relocatable_lib", + "//src/starkware/cairo/lang/vm:cairo_vm_lib", + "//src/starkware/python:starkware_python_utils_lib", + "//src/starkware/starknet/business_logic/execution:starknet_execute_entry_point_base_lib", + "//src/starkware/starknet/business_logic/execution:starknet_transaction_execution_objects_lib", + "//src/starkware/starknet/business_logic/state:starknet_business_logic_state_lib", + "//src/starkware/starknet/core/os/contract_address:starknet_contract_address_lib", + "//src/starkware/starknet/definitions:starknet_definitions_lib", + "//src/starkware/starknet/definitions:starknet_general_config_lib", + "//src/starkware/starknet/public:starknet_abi_lib", + "//src/starkware/starknet/services/api/contract_class:starknet_contract_class_lib", + "//src/starkware/starknet/storage:starknet_storage_lib", + "//src/starkware/starkware_utils:starkware_error_handling_lib", + requirement("cachetools"), + ], +) + +py_library( + name = "starknet_deprecated_syscall_handler_lib", + srcs = [ + "deprecated_syscall_handler.py", + ], + visibility = ["//visibility:public"], + deps = [ + ":starknet_syscall_handler_lib", + "//src/starkware/cairo/common:cairo_common_lib", + "//src/starkware/cairo/common:cairo_function_runner_lib", + "//src/starkware/cairo/lang/vm:cairo_relocatable_lib", + "//src/starkware/cairo/lang/vm:cairo_vm_lib", + "//src/starkware/python:starkware_python_utils_lib", + "//src/starkware/starknet/business_logic/execution:starknet_execute_entry_point_base_lib", + "//src/starkware/starknet/business_logic/execution:starknet_transaction_execution_objects_lib", + "//src/starkware/starknet/business_logic/state:starknet_business_logic_state_lib", + "//src/starkware/starknet/core/os/contract_address:starknet_contract_address_lib", + "//src/starkware/starknet/definitions:starknet_definitions_lib", + "//src/starkware/starknet/definitions:starknet_general_config_lib", + "//src/starkware/starknet/public:starknet_abi_lib", + "//src/starkware/starknet/services/api/contract_class:starknet_contract_class_lib", + "//src/starkware/starkware_utils:starkware_error_handling_lib", + ], +) + +package(default_visibility = ["//visibility:public"]) + +exports_files(["program_hash.json"]) + +pytest_test( + name = "starknet_os_program_hash_test", + srcs = [ + "program_hash_test.py", + ], + data = [ + "program_hash.json", + "starknet_os_compiled.json", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/starkware/cairo/bootloaders:program_hash_test_utils_lib", + "//src/starkware/python:starkware_python_utils_lib", + ], +) diff --git a/src/starkware/starknet/core/os/CMakeLists.txt b/src/starkware/starknet/core/os/CMakeLists.txt deleted file mode 100644 index cadbef3e..00000000 --- a/src/starkware/starknet/core/os/CMakeLists.txt +++ /dev/null @@ -1,70 +0,0 @@ -add_subdirectory(block_hash) -add_subdirectory(contract_address) -add_subdirectory(contract_class) -add_subdirectory(execution) -add_subdirectory(os_config) -add_subdirectory(transaction_hash) - -cairo_compile(starknet_os_program - starknet_os_compiled.json os.cairo "--debug_info_with_source") - -python_lib(starknet_os_utils_lib - PREFIX starkware/starknet/core/os - - FILES - os_program.py - os_utils.py - segment_utils.py - syscall_handler.py - syscall_utils.py - - ARTIFACTS - "${CMAKE_CURRENT_BINARY_DIR}/starknet_os_compiled.json starknet_os_compiled.json" - "${CMAKE_BINARY_DIR}/src/starkware/starknet/common/starknet_syscalls.json starknet_syscalls.json" - "${CMAKE_BINARY_DIR}/src/starkware/starknet/common/starknet_new_syscalls.json starknet_new_syscalls.json" - - LIBS - cairo_common_lib - cairo_compile_lib - cairo_function_runner_lib - cairo_hash_program_lib - cairo_relocatable_lib - cairo_run_lib - cairo_vm_lib - starknet_abi_lib - starknet_business_logic_patricia_state_lib - starknet_business_logic_state_lib - starknet_contract_address_lib - starknet_contract_class_lib - starknet_definitions_lib - starknet_execute_entry_point_base_lib - starknet_general_config_lib - starknet_storage_lib - starknet_transaction_lib - starknet_transaction_execution_objects_lib - starkware_error_handling_lib - starkware_python_utils_lib - pip_cachetools -) - -add_dependencies(starknet_os_utils_lib starknet_os_program) -add_dependencies(starknet_os_utils_lib starknet_syscalls) -add_dependencies(starknet_os_utils_lib starknet_new_syscalls) - - -full_python_test(starknet_os_program_hash_test - PREFIX starkware/starknet/core/os - PYTHON ${PYTHON_COMMAND} - TESTED_MODULES starkware/starknet/core/os - - FILES - program_hash_test.py - program_hash.json - - LIBS - cairo_hash_program_lib - program_hash_test_utils_lib - starknet_os_utils_lib - starkware_python_utils_lib - pip_pytest -) diff --git a/src/starkware/starknet/core/os/block_hash/BUILD b/src/starkware/starknet/core/os/block_hash/BUILD new file mode 100644 index 00000000..940f18ea --- /dev/null +++ b/src/starkware/starknet/core/os/block_hash/BUILD @@ -0,0 +1,20 @@ +package(default_visibility = ["//visibility:public"]) + +py_library( + name = "starknet_block_hash_lib", + srcs = [ + "block_hash.py", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/starkware/cairo/common:cairo_common_lib", + "//src/starkware/cairo/lang/vm:cairo_vm_crypto_lib", + "//src/starkware/python:starkware_python_utils_lib", + "//src/starkware/starknet/definitions:starknet_general_config_lib", + "//src/starkware/starkware_utils:starkware_utils_lib", + "//src/starkware/storage:starkware_abstract_storage_lib", + "//src/starkware/storage:starkware_dict_storage_lib", + "//src/starkware/storage:starkware_storage_lib", + "//src/starkware/storage:starkware_storage_utils_lib", + ], +) diff --git a/src/starkware/starknet/core/os/block_hash/CMakeLists.txt b/src/starkware/starknet/core/os/block_hash/CMakeLists.txt deleted file mode 100644 index a5f165fd..00000000 --- a/src/starkware/starknet/core/os/block_hash/CMakeLists.txt +++ /dev/null @@ -1,17 +0,0 @@ -python_lib(starknet_block_hash_lib - PREFIX starkware/starknet/core/os/block_hash - - FILES - block_hash.py - - LIBS - cairo_common_lib - cairo_vm_crypto_lib - starknet_general_config_lib - starkware_abstract_storage_lib - starkware_dict_storage_lib - starkware_python_utils_lib - starkware_storage_lib - starkware_storage_utils_lib - starkware_utils_lib -) diff --git a/src/starkware/starknet/core/os/constants.cairo b/src/starkware/starknet/core/os/constants.cairo index d7d3add4..fd2ab1e7 100644 --- a/src/starkware/starknet/core/os/constants.cairo +++ b/src/starkware/starknet/core/os/constants.cairo @@ -81,5 +81,9 @@ const STORAGE_WRITE_GAS_COST = SYSCALL_BASE_GAS_COST + 50 * STEP_GAS_COST; const EMIT_EVENT_GAS_COST = SYSCALL_BASE_GAS_COST + 10 * STEP_GAS_COST; const SEND_MESSAGE_TO_L1_GAS_COST = SYSCALL_BASE_GAS_COST + 50 * STEP_GAS_COST; +const KECCAK_GAS_COST = SYSCALL_BASE_GAS_COST; +const KECCAK_ROUND_COST_GAS_COST = 180000; + // Cairo 1.0 error codes. const ERROR_OUT_OF_GAS = 'Out of gas'; +const ERROR_INVALID_INPUT_LEN = 'Invalid input length'; diff --git a/src/starkware/starknet/core/os/contract_address/BUILD b/src/starkware/starknet/core/os/contract_address/BUILD new file mode 100644 index 00000000..c38a0b44 --- /dev/null +++ b/src/starkware/starknet/core/os/contract_address/BUILD @@ -0,0 +1,42 @@ +load("//bazel_utils/python:defs.bzl", "requirement") +load("//bazel_utils:python.bzl", "pytest_test") + +package(default_visibility = ["//visibility:public"]) + +exports_files(["contract_address.cairo"]) + +py_library( + name = "starknet_contract_address_lib", + srcs = [ + "contract_address.py", + ], + data = [ + "contract_address.cairo", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/starkware/cairo/common:cairo_common_lib", + "//src/starkware/cairo/lang/vm:cairo_vm_crypto_lib", + "//src/starkware/python:starkware_python_utils_lib", + "//src/starkware/starknet/common:starknet_common_lib", + "//src/starkware/starknet/core/os/contract_class:starknet_os_abi_lib", + "//src/starkware/starknet/definitions:starknet_definitions_lib", + "//src/starkware/starknet/services/api/contract_class:starknet_contract_class_lib", + ], +) + +pytest_test( + name = "starknet_contract_address_cairo_test", + srcs = [ + "contract_address_cairo_test.py", + ], + visibility = ["//visibility:public"], + deps = [ + ":starknet_contract_address_lib", + "//src/starkware/cairo/common:cairo_common_lib", + "//src/starkware/cairo/common:cairo_function_runner_lib", + "//src/starkware/crypto:starkware_crypto_lib", + "//src/starkware/starknet/definitions:starknet_general_config_lib", + requirement("pytest_asyncio"), + ], +) diff --git a/src/starkware/starknet/core/os/contract_address/CMakeLists.txt b/src/starkware/starknet/core/os/contract_address/CMakeLists.txt deleted file mode 100644 index 124ec831..00000000 --- a/src/starkware/starknet/core/os/contract_address/CMakeLists.txt +++ /dev/null @@ -1,36 +0,0 @@ -python_lib(starknet_contract_address_lib - PREFIX starkware/starknet/core/os/contract_address - - FILES - contract_address.py - contract_address.cairo - - LIBS - cairo_common_lib - cairo_vm_crypto_lib - starknet_common_lib - starknet_contract_class_lib - starknet_definitions_lib - starknet_os_abi_lib - starkware_python_utils_lib -) - -full_python_test(starknet_contract_address_cairo_test - PREFIX starkware/starknet/core/os/contract_address - PYTHON ${PYTHON_COMMAND} - TESTED_MODULES starkware/starknet/core/os/contract_address - - FILES - contract_address_cairo_test.py - - LIBS - cairo_common_lib - cairo_function_runner_lib - starknet_contract_address_lib - starknet_general_config_lib - starknet_os_utils_lib - starknet_transaction_hash_lib - starkware_crypto_lib - pip_pytest - pip_pytest_asyncio -) diff --git a/src/starkware/starknet/core/os/contract_class/BUILD b/src/starkware/starknet/core/os/contract_class/BUILD new file mode 100644 index 00000000..e99e252e --- /dev/null +++ b/src/starkware/starknet/core/os/contract_class/BUILD @@ -0,0 +1,53 @@ +load("//src/starkware/cairo/lang:cairo_rules.bzl", "cairo_library") +load("//bazel_utils/python:defs.bzl", "requirement") + +cairo_library( + name = "starknet_os_abi_cairo_lib", + srcs = [ + "compiled_class.cairo", + "deprecated_compiled_class.cairo", + ], + deps = [ + "//src/starkware/cairo/common:cairo_common_cairo_lib", + ], +) + +package(default_visibility = ["//visibility:public"]) + +exports_files([ + "compiled_class.cairo", + "deprecated_compiled_class.cairo", +]) + +py_library( + name = "starknet_os_abi_lib", + srcs = [ + "class_hash.py", + "class_hash_utils.py", + "compiled_class_hash.py", + "compiled_class_hash_utils.py", + "deprecated_class_hash.py", + "utils.py", + ], + data = [ + "compiled_class.cairo", + "contract_class.cairo", + "deprecated_compiled_class.cairo", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/starkware/cairo/common:cairo_common_lib", + "//src/starkware/cairo/common:cairo_function_runner_lib", + "//src/starkware/cairo/common:poseidon_utils_lib", + "//src/starkware/cairo/lang:cairo_constants_lib", + "//src/starkware/cairo/lang/builtins:cairo_run_builtins_lib", + "//src/starkware/cairo/lang/compiler:cairo_compile_lib", + "//src/starkware/cairo/lang/vm:cairo_vm_crypto_lib", + "//src/starkware/python:starkware_python_utils_lib", + "//src/starkware/starknet/definitions:starknet_definitions_lib", + "//src/starkware/starknet/public:starknet_abi_lib", + "//src/starkware/starknet/services/api/contract_class:starknet_contract_class_lib", + "//src/starkware/starkware_utils:starkware_error_handling_lib", + requirement("cachetools"), + ], +) diff --git a/src/starkware/starknet/core/os/contract_class/CMakeLists.txt b/src/starkware/starknet/core/os/contract_class/CMakeLists.txt deleted file mode 100644 index a6a427d5..00000000 --- a/src/starkware/starknet/core/os/contract_class/CMakeLists.txt +++ /dev/null @@ -1,29 +0,0 @@ -python_lib(starknet_os_abi_lib - PREFIX starkware/starknet/core/os/contract_class - - FILES - class_hash.py - class_hash_utils.py - compiled_class.cairo - compiled_class_hash.py - compiled_class_hash_utils.py - contract_class.cairo - deprecated_class_hash.py - deprecated_compiled_class.cairo - utils.py - - LIBS - cairo_common_lib - cairo_compile_lib - cairo_constants_lib - cairo_function_runner_lib - cairo_run_builtins_lib - cairo_vm_crypto_lib - poseidon_utils_lib - starknet_abi_lib - starknet_contract_class_lib - starknet_definitions_lib - starkware_error_handling_lib - starkware_python_utils_lib - pip_cachetools -) diff --git a/src/starkware/starknet/core/os/contract_class/compiled_class_hash.py b/src/starkware/starknet/core/os/contract_class/compiled_class_hash.py index d321b067..99a15d56 100644 --- a/src/starkware/starknet/core/os/contract_class/compiled_class_hash.py +++ b/src/starkware/starknet/core/os/contract_class/compiled_class_hash.py @@ -26,6 +26,12 @@ def compute_compiled_class_hash(compiled_class: CompiledClass) -> int: def _compute_compiled_class_hash_inner(compiled_class: CompiledClass) -> int: + runner = run_compiled_class_hash(compiled_class=compiled_class) + _, class_hash = runner.get_return_values(2) + return class_hash + + +def run_compiled_class_hash(compiled_class: CompiledClass) -> CairoFunctionRunner: program = load_compiled_class_cairo_program() compiled_class_struct = get_compiled_class_struct( identifiers=program.identifiers, compiled_class=compiled_class @@ -39,5 +45,4 @@ def _compute_compiled_class_hash_inner(compiled_class: CompiledClass) -> int: use_full_name=True, verify_secure=False, ) - _, class_hash = runner.get_return_values(2) - return class_hash + return runner diff --git a/src/starkware/starknet/core/os/deprecated_syscall_handler.py b/src/starkware/starknet/core/os/deprecated_syscall_handler.py new file mode 100644 index 00000000..86bc552d --- /dev/null +++ b/src/starkware/starknet/core/os/deprecated_syscall_handler.py @@ -0,0 +1,771 @@ +from abc import ABC, abstractmethod +from typing import Iterable, List, Optional, Tuple, Type, cast + +from starkware.cairo.common.cairo_function_runner import CairoFunctionRunner +from starkware.cairo.common.structs import CairoStructProxy +from starkware.cairo.lang.vm.memory_segments import MemorySegmentManager +from starkware.cairo.lang.vm.relocatable import MaybeRelocatable, RelocatableValue +from starkware.python.utils import camel_to_snake_case +from starkware.starknet.business_logic.execution.execute_entry_point_base import ( + ExecuteEntryPointBase, +) +from starkware.starknet.business_logic.execution.objects import ( + CallInfo, + CallResult, + CallType, + ExecutionResourcesManager, + OrderedEvent, + OrderedL2ToL1Message, + TransactionExecutionContext, +) +from starkware.starknet.business_logic.state.state import ContractStorageState +from starkware.starknet.business_logic.state.state_api import SyncState +from starkware.starknet.business_logic.state.state_api_objects import BlockInfo +from starkware.starknet.core.os.contract_address.contract_address import ( + calculate_contract_address_from_hash, +) +from starkware.starknet.core.os.syscall_handler import OsExecutionHelper +from starkware.starknet.core.os.syscall_utils import ( + cast_to_int, + get_deprecated_syscall_structs_and_info, + validate_runtime_request_type, + wrap_with_handler_exception, +) +from starkware.starknet.definitions.constants import GasCost +from starkware.starknet.definitions.error_codes import StarknetErrorCode +from starkware.starknet.definitions.general_config import StarknetGeneralConfig +from starkware.starknet.public.abi import CONSTRUCTOR_ENTRY_POINT_SELECTOR +from starkware.starknet.services.api.contract_class.contract_class import EntryPointType +from starkware.starkware_utils.error_handling import stark_assert + + +class DeprecatedSysCallHandlerBase(ABC): + """ + Base class for execution of system calls in the StarkNet OS. + """ + + def __init__(self, block_info: BlockInfo, segments: Optional[MemorySegmentManager]): + self._segments = segments + self.block_info = block_info + + self.syscall_structs, self.syscall_info = get_deprecated_syscall_structs_and_info() + + def set_segments(self, segments: MemorySegmentManager): + assert self._segments is None, "segments is already set." + self._segments = segments + + @property + def segments(self) -> MemorySegmentManager: + assert self._segments is not None, "segments must be set before using the SysCallHandler." + return self._segments + + # Public API. + + # Segments argument is kept in public API for backward compatibility. + def call_contract(self, segments: MemorySegmentManager, syscall_ptr: RelocatableValue): + self._call_contract_and_write_response( + syscall_name="call_contract", syscall_ptr=syscall_ptr + ) + + def delegate_call(self, segments: MemorySegmentManager, syscall_ptr: RelocatableValue): + self._call_contract_and_write_response( + syscall_name="delegate_call", syscall_ptr=syscall_ptr + ) + + def delegate_l1_handler(self, segments: MemorySegmentManager, syscall_ptr: RelocatableValue): + self._call_contract_and_write_response( + syscall_name="delegate_l1_handler", syscall_ptr=syscall_ptr + ) + + def deploy(self, segments: MemorySegmentManager, syscall_ptr: RelocatableValue): + """ + Handles the deploy system call. + """ + contract_address = self._deploy(syscall_ptr=syscall_ptr) + response = self.syscall_structs.DeployResponse( + contract_address=contract_address, + constructor_retdata_size=0, + constructor_retdata=0, + ) + self._write_syscall_response( + syscall_name="Deploy", response=response, syscall_ptr=syscall_ptr + ) + + def emit_event(self, segments: MemorySegmentManager, syscall_ptr: RelocatableValue): + return + + def get_caller_address(self, segments: MemorySegmentManager, syscall_ptr: RelocatableValue): + """ + Handles the get_caller_address system call. + """ + caller_address = self._get_caller_address(syscall_ptr=syscall_ptr) + + response = self.syscall_structs.GetCallerAddressResponse(caller_address=caller_address) + self._write_syscall_response( + syscall_name="GetCallerAddress", response=response, syscall_ptr=syscall_ptr + ) + + def get_contract_address(self, segments: MemorySegmentManager, syscall_ptr: RelocatableValue): + contract_address = self._get_contract_address(syscall_ptr=syscall_ptr) + + response = self.syscall_structs.GetContractAddressResponse( + contract_address=contract_address + ) + self._write_syscall_response( + syscall_name="GetContractAddress", response=response, syscall_ptr=syscall_ptr + ) + + def get_block_number(self, segments: MemorySegmentManager, syscall_ptr: RelocatableValue): + """ + Handles the get_block_number system call. + """ + self._read_and_validate_syscall_request( + syscall_name="get_block_number", syscall_ptr=syscall_ptr + ) + + block_number = self.block_info.block_number + + response = self.syscall_structs.GetBlockNumberResponse(block_number=block_number) + self._write_syscall_response( + syscall_name="GetBlockNumber", response=response, syscall_ptr=syscall_ptr + ) + + def get_sequencer_address(self, segments: MemorySegmentManager, syscall_ptr: RelocatableValue): + """ + Handles the get_sequencer_address system call. + """ + self._read_and_validate_syscall_request( + syscall_name="get_sequencer_address", syscall_ptr=syscall_ptr + ) + + response = self.syscall_structs.GetSequencerAddressResponse( + sequencer_address=0 + if self.block_info.sequencer_address is None + else self.block_info.sequencer_address + ) + self._write_syscall_response( + syscall_name="GetSequencerAddress", response=response, syscall_ptr=syscall_ptr + ) + + def get_tx_info(self, segments: MemorySegmentManager, syscall_ptr: RelocatableValue): + """ + Handles the get_tx_info system call. + """ + self._read_and_validate_syscall_request(syscall_name="get_tx_info", syscall_ptr=syscall_ptr) + + response = self.syscall_structs.GetTxInfoResponse(tx_info=self._get_tx_info_ptr()) + self._write_syscall_response( + syscall_name="GetTxInfo", response=response, syscall_ptr=syscall_ptr + ) + + def send_message_to_l1(self, segments: MemorySegmentManager, syscall_ptr: RelocatableValue): + return + + def get_block_timestamp(self, segments: MemorySegmentManager, syscall_ptr: RelocatableValue): + """ + Handles the get_block_timestamp system call. + """ + self._read_and_validate_syscall_request( + syscall_name="get_block_timestamp", syscall_ptr=syscall_ptr + ) + + block_timestamp = self.block_info.block_timestamp + + response = self.syscall_structs.GetBlockTimestampResponse(block_timestamp=block_timestamp) + self._write_syscall_response( + syscall_name="GetBlockTimestamp", response=response, syscall_ptr=syscall_ptr + ) + + def get_tx_signature(self, segments: MemorySegmentManager, syscall_ptr: RelocatableValue): + """ + Handles the get_tx_signature system call. + """ + self._read_and_validate_syscall_request( + syscall_name="get_tx_signature", syscall_ptr=syscall_ptr + ) + tx_info_ptr = self._get_tx_info_ptr() + tx_info = self.syscall_structs.TxInfo.from_ptr( + memory=self.segments.memory, addr=tx_info_ptr + ) + response = self.syscall_structs.GetTxSignatureResponse( + signature_len=tx_info.signature_len, signature=tx_info.signature + ) + + self._write_syscall_response( + syscall_name="GetTxSignature", response=response, syscall_ptr=syscall_ptr + ) + + def library_call(self, segments: MemorySegmentManager, syscall_ptr: RelocatableValue): + self._call_contract_and_write_response(syscall_name="library_call", syscall_ptr=syscall_ptr) + + def library_call_l1_handler( + self, segments: MemorySegmentManager, syscall_ptr: RelocatableValue + ): + self._call_contract_and_write_response( + syscall_name="library_call_l1_handler", syscall_ptr=syscall_ptr + ) + + def replace_class(self, segments: MemorySegmentManager, syscall_ptr: RelocatableValue): + """ + Handles the replace_class system call. + """ + request = self._read_and_validate_syscall_request( + syscall_name="replace_class", syscall_ptr=syscall_ptr + ) + self._replace_class(class_hash=cast_to_int(request.class_hash)) + + def storage_read(self, segments: MemorySegmentManager, syscall_ptr: RelocatableValue): + """ + Handles the storage_read system call. + """ + request = self._read_and_validate_syscall_request( + syscall_name="storage_read", syscall_ptr=syscall_ptr + ) + + value = self._storage_read(cast_to_int(request.address)) + response = self.syscall_structs.StorageReadResponse(value=value) + + self._write_syscall_response( + syscall_name="StorageRead", response=response, syscall_ptr=syscall_ptr + ) + + def storage_write(self, segments: MemorySegmentManager, syscall_ptr: RelocatableValue): + """ + Handles the storage_write system call. + """ + request = self._read_and_validate_syscall_request( + syscall_name="storage_write", syscall_ptr=syscall_ptr + ) + self._storage_write(address=cast_to_int(request.address), value=cast_to_int(request.value)) + + # Private helpers. + + @abstractmethod + def _get_tx_info_ptr(self): + """ + Returns a pointer to the TxInfo struct. + """ + + @abstractmethod + def _deploy(self, syscall_ptr: RelocatableValue) -> int: + """ + Returns the address of the newly deployed contract. + """ + + def _read_syscall_request( + self, syscall_name: str, syscall_ptr: RelocatableValue + ) -> CairoStructProxy: + """ + Returns the system call request written in the syscall segment, starting at syscall_ptr. + """ + syscall_info = self.syscall_info[syscall_name] + return syscall_info.syscall_request_struct.from_ptr( + memory=self.segments.memory, addr=syscall_ptr + ) + + @abstractmethod + def _read_and_validate_syscall_request( + self, syscall_name: str, syscall_ptr: RelocatableValue + ) -> CairoStructProxy: + """ + Returns the system call request written in the syscall segment, starting at syscall_ptr. + Performs validations on the request. + """ + + def _write_syscall_response( + self, + syscall_name: str, + response: CairoStructProxy, + syscall_ptr: RelocatableValue, + ): + assert ( + camel_to_snake_case(syscall_name) in self.syscall_info + ), f"Illegal system call {syscall_name}." + + syscall_struct: CairoStructProxy = getattr(self.syscall_structs, syscall_name) + response_offset = syscall_struct.struct_definition_.members["response"].offset + self.segments.write_arg(ptr=syscall_ptr + response_offset, arg=response) + + @abstractmethod + def _call_contract(self, syscall_ptr: RelocatableValue, syscall_name: str) -> CallResult: + """ + Returns the call's result. + + syscall_name can be "call_contract", "delegate_call", "delegate_l1_handler", "library_call" + or "library_call_l1_handler". + """ + + def _call_contract_and_write_response(self, syscall_name: str, syscall_ptr: RelocatableValue): + """ + Executes the contract call and fills the CallContractResponse struct. + """ + result = self._call_contract(syscall_ptr=syscall_ptr, syscall_name=syscall_name) + assert not result.failure_flag, "Unexpected reverted call." + response = self.syscall_structs.CallContractResponse( + retdata_size=len(result.retdata), retdata=self._allocate_segment(data=result.retdata) + ) + self._write_syscall_response( + syscall_name="CallContract", response=response, syscall_ptr=syscall_ptr + ) + + @abstractmethod + def _get_caller_address(self, syscall_ptr: RelocatableValue) -> int: + """ + Specific implementation of the get_caller_address system call. + """ + + @abstractmethod + def _get_contract_address(self, syscall_ptr: RelocatableValue) -> int: + """ + Specific implementation of the get_contract_address system call. + """ + + @abstractmethod + def _replace_class(self, class_hash: int): + """ + replaces the running contracts class hash with the given hash. + """ + + @abstractmethod + def _storage_read(self, address: int) -> int: + """ + Returns the value of the contract's storage at the given address. + """ + + @abstractmethod + def _storage_write(self, address: int, value: int): + """ + Write the value to the contract's storage at the given address. + """ + + @abstractmethod + def _allocate_segment(self, data: Iterable[MaybeRelocatable]) -> RelocatableValue: + """ + Allocates and returns a new (read-only) segment with the given data. + Note that unlike MemorySegmentManager.write_arg, this function doesn't work well with + recursive input - call _allocate_segment for the inner items if needed. + """ + + +class DeprecatedBlSyscallHandler(DeprecatedSysCallHandlerBase): + """ + The SysCallHandler implementation that is used by the batcher. + """ + + def __init__( + self, + execute_entry_point_cls: Type[ExecuteEntryPointBase], + tx_execution_context: TransactionExecutionContext, + state: SyncState, + resources_manager: ExecutionResourcesManager, + caller_address: int, + contract_address: int, + general_config: StarknetGeneralConfig, + initial_syscall_ptr: RelocatableValue, + segments: MemorySegmentManager, + ): + super().__init__(block_info=state.block_info, segments=segments) + + # Configuration objects. + self.general_config = general_config + + # Execution-related objects. + self.execute_entry_point_cls = execute_entry_point_cls + self.tx_execution_context = tx_execution_context + self.sync_state = state + self.resources_manager = resources_manager + self.caller_address = caller_address + self.contract_address = contract_address + + # Storage-related members. + self.starknet_storage = ContractStorageState( + state=self.sync_state, contract_address=contract_address + ) + + # Internal calls executed by the current contract call. + self.internal_calls: List[CallInfo] = [] + # Events emitted by the current contract call. + self.events: List[OrderedEvent] = [] + # Messages sent by the current contract call to L1. + self.l2_to_l1_messages: List[OrderedL2ToL1Message] = [] + + # Kept for validations during the run. + self.expected_syscall_ptr = initial_syscall_ptr + + # A pointer to the Cairo TxInfo struct. + self.tx_info_ptr: Optional[RelocatableValue] = None + + # A list of dynamically allocated segments that are expected to be read-only. + self.read_only_segments: List[Tuple[RelocatableValue, int]] = [] + + def _allocate_segment(self, data: Iterable[MaybeRelocatable]) -> RelocatableValue: + segment_start = self.segments.add() + segment_end = self.segments.write_arg(ptr=segment_start, arg=data) + self.read_only_segments.append((segment_start, segment_end - segment_start)) + return segment_start + + def _count_syscall(self, syscall_name: str): + previous_syscall_count = self.resources_manager.syscall_counter.get(syscall_name, 0) + self.resources_manager.syscall_counter[syscall_name] = previous_syscall_count + 1 + + def _read_and_validate_syscall_request( + self, syscall_name: str, syscall_ptr: RelocatableValue + ) -> CairoStructProxy: + """ + Returns the system call request written in the syscall segment, starting at syscall_ptr. + Performs validations on the request. + """ + # Update syscall count. + self._count_syscall(syscall_name=syscall_name) + + request = self._read_syscall_request(syscall_name=syscall_name, syscall_ptr=syscall_ptr) + + assert ( + syscall_ptr == self.expected_syscall_ptr + ), f"Bad syscall_ptr, Expected {self.expected_syscall_ptr}, got {syscall_ptr}." + + syscall_info = self.syscall_info[syscall_name] + self.expected_syscall_ptr += syscall_info.syscall_size + + selector = request.selector + assert isinstance(selector, int), ( + f"The selector argument to syscall {syscall_name} is of unexpected type. " + f"Expected: int; got: {type(selector).__name__}." + ) + assert ( + selector == syscall_info.selector + ), f"Bad syscall selector, expected {syscall_info.selector}. Got: {selector}" + + validate_runtime_request_type( + request_values=request, request_struct=syscall_info.syscall_request_struct + ) + + return request + + def _call_contract(self, syscall_ptr: RelocatableValue, syscall_name: str) -> CallResult: + # Parse request and prepare the call. + request = self._read_and_validate_syscall_request( + syscall_name=syscall_name, syscall_ptr=syscall_ptr + ) + calldata = self.segments.memory.get_range_as_ints( + addr=request.calldata, size=request.calldata_size + ) + + code_address: Optional[int] = None + class_hash: Optional[int] = None + if syscall_name == "call_contract": + code_address = cast_to_int(request.contract_address) + contract_address = code_address + caller_address = self.contract_address + entry_point_type = EntryPointType.EXTERNAL + call_type = CallType.CALL + elif syscall_name == "delegate_call": + code_address = cast_to_int(request.contract_address) + contract_address = self.contract_address + caller_address = self.caller_address + entry_point_type = EntryPointType.EXTERNAL + call_type = CallType.DELEGATE + elif syscall_name == "delegate_l1_handler": + code_address = cast_to_int(request.contract_address) + contract_address = self.contract_address + caller_address = self.caller_address + entry_point_type = EntryPointType.L1_HANDLER + call_type = CallType.DELEGATE + elif syscall_name == "library_call": + class_hash = cast_to_int(request.class_hash) + contract_address = self.contract_address + caller_address = self.caller_address + entry_point_type = EntryPointType.EXTERNAL + call_type = CallType.DELEGATE + elif syscall_name == "library_call_l1_handler": + class_hash = cast_to_int(request.class_hash) + contract_address = self.contract_address + caller_address = self.caller_address + entry_point_type = EntryPointType.L1_HANDLER + call_type = CallType.DELEGATE + else: + raise NotImplementedError(f"Unsupported call type {syscall_name}.") + + call = self.execute_entry_point_cls( + call_type=call_type, + class_hash=class_hash, + contract_address=contract_address, + code_address=code_address, + entry_point_selector=cast_to_int(request.function_selector), + initial_gas=GasCost.INITIAL.value, + entry_point_type=entry_point_type, + calldata=calldata, + caller_address=caller_address, + ) + + return self.execute_entry_point(call=call) + + def _deploy(self, syscall_ptr: RelocatableValue) -> int: + """ + Initializes and runs the constructor of the new contract. + Returns the address of the newly deployed contract. + """ + request = self._read_and_validate_syscall_request( + syscall_name="deploy", syscall_ptr=syscall_ptr + ) + assert request.deploy_from_zero in [ + 0, + 1, + ], "The deploy_from_zero field in the deploy system call must be 0 or 1." + constructor_calldata = self.segments.memory.get_range_as_ints( + addr=cast(RelocatableValue, request.constructor_calldata), + size=cast_to_int(request.constructor_calldata_size), + ) + class_hash = cast_to_int(request.class_hash) + + deployer_address = self.contract_address if request.deploy_from_zero == 0 else 0 + contract_address = calculate_contract_address_from_hash( + salt=cast_to_int(request.contract_address_salt), + class_hash=class_hash, + constructor_calldata=constructor_calldata, + deployer_address=deployer_address, + ) + + # Instantiate the contract. + self.sync_state.deploy_contract(contract_address=contract_address, class_hash=class_hash) + + self.execute_constructor_entry_point( + contract_address=contract_address, + class_hash=class_hash, + constructor_calldata=constructor_calldata, + ) + + return contract_address + + def execute_constructor_entry_point( + self, contract_address: int, class_hash: int, constructor_calldata: List[int] + ): + contract_class = self.sync_state.get_compiled_class_by_class_hash(class_hash=class_hash) + constructor_entry_points = contract_class.entry_points_by_type[EntryPointType.CONSTRUCTOR] + if len(constructor_entry_points) == 0: + # Contract has no constructor. + assert ( + len(constructor_calldata) == 0 + ), "Cannot pass calldata to a contract with no constructor." + + call_info = CallInfo.empty_constructor_call( + contract_address=contract_address, + caller_address=self.contract_address, + class_hash=class_hash, + ) + self.internal_calls.append(call_info) + + return + + call = self.execute_entry_point_cls( + call_type=CallType.CALL, + class_hash=None, + contract_address=contract_address, + code_address=contract_address, + entry_point_selector=CONSTRUCTOR_ENTRY_POINT_SELECTOR, + initial_gas=GasCost.INITIAL.value, + entry_point_type=EntryPointType.CONSTRUCTOR, + calldata=constructor_calldata, + caller_address=self.contract_address, + ) + self.execute_entry_point(call=call) + + def execute_entry_point(self, call: ExecuteEntryPointBase) -> CallResult: + with wrap_with_handler_exception(call=call): + # Execute contract call. + call_info = call.execute( + state=self.sync_state, + resources_manager=self.resources_manager, + tx_execution_context=self.tx_execution_context, + general_config=self.general_config, + ) + + # Update execution info. + self.internal_calls.append(call_info) + + return call_info.result() + + def emit_event(self, segments: MemorySegmentManager, syscall_ptr: RelocatableValue): + """ + Handles the emit_event system call. + """ + request = self._read_and_validate_syscall_request( + syscall_name="emit_event", syscall_ptr=syscall_ptr + ) + + self.events.append( + OrderedEvent( + order=self.tx_execution_context.n_emitted_events, + keys=self.segments.memory.get_range_as_ints( + addr=cast(RelocatableValue, request.keys), size=cast_to_int(request.keys_len) + ), + data=self.segments.memory.get_range_as_ints( + addr=cast(RelocatableValue, request.data), size=cast_to_int(request.data_len) + ), + ) + ) + + # Update events count. + self.tx_execution_context.n_emitted_events += 1 + + def _get_tx_info_ptr(self) -> RelocatableValue: + if self.tx_info_ptr is None: + tx_info = self.syscall_structs.TxInfo( + version=self.tx_execution_context.version, + account_contract_address=self.tx_execution_context.account_contract_address, + max_fee=self.tx_execution_context.max_fee, + transaction_hash=self.tx_execution_context.transaction_hash, + signature_len=len(self.tx_execution_context.signature), + signature=self._allocate_segment(data=self.tx_execution_context.signature), + chain_id=self.general_config.chain_id.value, + nonce=self.tx_execution_context.nonce, + ) + self.tx_info_ptr = self._allocate_segment(data=tx_info) + + return self.tx_info_ptr + + def send_message_to_l1(self, segments: MemorySegmentManager, syscall_ptr: RelocatableValue): + request = self._read_and_validate_syscall_request( + syscall_name="send_message_to_l1", syscall_ptr=syscall_ptr + ) + payload = self.segments.memory.get_range_as_ints( + addr=cast(RelocatableValue, request.payload_ptr), size=cast_to_int(request.payload_size) + ) + + self.l2_to_l1_messages.append( + # Note that the constructor of OrderedL2ToL1Message might fail as it is + # more restrictive than the Cairo code. + OrderedL2ToL1Message( + order=self.tx_execution_context.n_sent_messages, + to_address=cast_to_int(request.to_address), + payload=payload, + ) + ) + + # Update messages count. + self.tx_execution_context.n_sent_messages += 1 + + def _get_caller_address(self, syscall_ptr: RelocatableValue) -> int: + self._read_and_validate_syscall_request( + syscall_name="get_caller_address", syscall_ptr=syscall_ptr + ) + + return self.caller_address + + def _get_contract_address(self, syscall_ptr: RelocatableValue) -> int: + self._read_and_validate_syscall_request( + syscall_name="get_contract_address", syscall_ptr=syscall_ptr + ) + + return self.contract_address + + def _replace_class(self, class_hash: int): + # Assert the replacement class is valid (by reading it). + self.sync_state.get_compiled_class_by_class_hash(class_hash=class_hash) + + # Replace the class. + self.sync_state.set_class_hash_at( + contract_address=self.contract_address, class_hash=class_hash + ) + + def _storage_read(self, address: int) -> int: + return self.starknet_storage.read(address=address) + + def _storage_write(self, address: int, value: int): + # Read the value before the write operation in order to log it in the read_values list. + # This value is needed to create the DictAccess while executing the corresponding + # storage_write system call. + self.starknet_storage.read(address=address) + + self.starknet_storage.write(address=address, value=value) + + def validate_read_only_segments(self, runner: CairoFunctionRunner): + """ + Validates that there were no out of bounds writes to read-only segments and marks + them as accessed. + """ + assert self.segments is runner.segments, "Inconsistent segments." + + for segment_ptr, segment_size in self.read_only_segments: + used_size = self.segments.get_segment_used_size(segment_index=segment_ptr.segment_index) + stark_assert( + used_size == segment_size, + code=StarknetErrorCode.SECURITY_ERROR, + message="Out of bounds write to a read-only segment.", + ) + + runner.mark_as_accessed(address=segment_ptr, size=segment_size) + + def post_run(self, runner: CairoFunctionRunner, syscall_stop_ptr: MaybeRelocatable): + """ + Performs post run syscall related tasks. + """ + expected_stop_ptr = self.expected_syscall_ptr + stark_assert( + syscall_stop_ptr == expected_stop_ptr, + code=StarknetErrorCode.SECURITY_ERROR, + message=f"Bad syscall_stop_ptr, Expected {expected_stop_ptr}, got {syscall_stop_ptr}.", + ) + + self.validate_read_only_segments(runner=runner) + + +class DeprecatedOsSysCallHandler(DeprecatedSysCallHandlerBase): + """ + The SysCallHandler implementation that is used by the gps ambassador. + """ + + def __init__( + self, + execution_helper: OsExecutionHelper, + block_info: BlockInfo, + # Note that a non-optional segments must be set before using the SysCallHandler. + segments: Optional[MemorySegmentManager] = None, + ): + super().__init__(block_info=block_info, segments=segments) + self.execution_helper = execution_helper + + def _read_and_validate_syscall_request( + self, syscall_name: str, syscall_ptr: RelocatableValue + ) -> CairoStructProxy: + """ + Returns the system call request written in the syscall segment, starting at syscall_ptr. + Does not perform validations on the request, since it was validated in the BL. + """ + return self._read_syscall_request(syscall_name=syscall_name, syscall_ptr=syscall_ptr) + + def _allocate_segment(self, data: Iterable[MaybeRelocatable]) -> RelocatableValue: + """ + Allocates and returns a new temporary segment. + """ + segment_start = self.segments.add_temp_segment() + self.segments.write_arg(ptr=segment_start, arg=data) + return segment_start + + def _call_contract(self, syscall_ptr: RelocatableValue, syscall_name: str) -> CallResult: + return next(self.execution_helper.result_iterator) + + def _deploy(self, syscall_ptr: RelocatableValue) -> int: + next(self.execution_helper.result_iterator) + return next(self.execution_helper.deployed_contracts_iterator) + + def _get_caller_address(self, syscall_ptr: RelocatableValue) -> int: + return self.execution_helper.call_info.caller_address + + def _get_contract_address(self, syscall_ptr: RelocatableValue) -> int: + return self.execution_helper.call_info.contract_address + + def _get_tx_info_ptr(self) -> RelocatableValue: + assert self.execution_helper.tx_info_ptr is not None + return self.execution_helper.tx_info_ptr + + def _replace_class(self, class_hash: int): + return + + def _storage_read(self, address: int) -> int: + return next(self.execution_helper.execute_code_read_iterator) + + def _storage_write(self, address: int, value: int): + # Advance execute_code_read_iterators since the previous storage value is written + # in each write operation. See DeprecatedBlSyscallHandler._storage_write(). + next(self.execution_helper.execute_code_read_iterator) diff --git a/src/starkware/starknet/core/os/execution/BUILD b/src/starkware/starknet/core/os/execution/BUILD new file mode 100644 index 00000000..64c21178 --- /dev/null +++ b/src/starkware/starknet/core/os/execution/BUILD @@ -0,0 +1,9 @@ +package(default_visibility = ["//visibility:public"]) + +exports_files([ + "deprecated_execute_entry_point.cairo", + "deprecated_execute_syscalls.cairo", + "execute_entry_point.cairo", + "execute_syscalls.cairo", + "execute_transactions.cairo", +]) diff --git a/src/starkware/starknet/core/os/execution/execute_syscalls.cairo b/src/starkware/starknet/core/os/execution/execute_syscalls.cairo index 3267a6f4..3e3a8b11 100644 --- a/src/starkware/starknet/core/os/execution/execute_syscalls.cairo +++ b/src/starkware/starknet/core/os/execution/execute_syscalls.cairo @@ -614,7 +614,7 @@ func reduce_syscall_gas_and_write_response_header{range_check_ptr, syscall_ptr: ); if (success != 0) { // Reduction has succeded; write the response header. - tempvar response_header = cast(syscall_ptr, ResponseHeader*); + let response_header = cast(syscall_ptr, ResponseHeader*); // Advance syscall pointer to the response body. let syscall_ptr = syscall_ptr + ResponseHeader.SIZE; assert [response_header] = ResponseHeader(gas=remaining_gas, failure_flag=0); diff --git a/src/starkware/starknet/core/os/os_config/BUILD b/src/starkware/starknet/core/os/os_config/BUILD new file mode 100644 index 00000000..89d84062 --- /dev/null +++ b/src/starkware/starknet/core/os/os_config/BUILD @@ -0,0 +1,66 @@ +load("//bazel_utils/python:defs.bzl", "requirement") +load("//bazel_utils:python.bzl", "pytest_test") + +package(default_visibility = ["//visibility:public"]) + +exports_files([ + "os_config.cairo", + "os_config_hash.json", +]) + +py_library( + name = "starknet_os_config_hash_lib", + srcs = [ + "os_config_hash.py", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/starkware/cairo/common:cairo_common_lib", + "//src/starkware/starknet/definitions:starknet_general_config_lib", + ], +) + +py_library( + name = "starknet_os_config_hash_test_base_lib", + srcs = [ + "os_config_hash_test.py", + ], + data = [ + "os_config_hash.json", + "private_os_config_hash.json", + ], + visibility = ["//visibility:public"], + deps = [ + "starknet_os_config_hash_lib", + "//src/starkware/cairo/common:cairo_common_lib", + "//src/starkware/cairo/common:cairo_function_runner_lib", + "//src/starkware/python:starkware_python_test_utils_lib", + "//src/starkware/python:starkware_python_utils_lib", + "//src/starkware/starknet/core/os:starknet_os_program_py_lib", + "//src/starkware/starknet/definitions:starknet_definitions_lib", + "//src/starkware/starknet/definitions:starknet_general_config_lib", + requirement("pytest_asyncio"), + ], +) + +pytest_test( + name = "starknet_os_config_hash_test", + srcs = [ + "os_config_hash_test.py", + ], + data = [ + "os_config_hash.json", + "private_os_config_hash.json", + ], + visibility = ["//visibility:public"], + deps = [ + "starknet_os_config_hash_lib", + "//src/starkware/cairo/common:cairo_common_lib", + "//src/starkware/cairo/common:cairo_function_runner_lib", + "//src/starkware/python:starkware_python_test_utils_lib", + "//src/starkware/python:starkware_python_utils_lib", + "//src/starkware/starknet/core/os:starknet_os_program_py_lib", + "//src/starkware/starknet/definitions:starknet_general_config_lib", + requirement("pytest_asyncio"), + ], +) diff --git a/src/starkware/starknet/core/os/os_config/CMakeLists.txt b/src/starkware/starknet/core/os/os_config/CMakeLists.txt deleted file mode 100644 index ed99a9c4..00000000 --- a/src/starkware/starknet/core/os/os_config/CMakeLists.txt +++ /dev/null @@ -1,59 +0,0 @@ -python_lib(starknet_os_config_hash_lib - PREFIX starkware/starknet/core/os/os_config - - FILES - os_config_hash.py - - LIBS - cairo_common_lib - starknet_general_config_lib -) - -python_lib(starknet_os_config_hash_test_base_lib - PREFIX starkware/starknet/core/os/os_config - - FILES - os_config_hash_test.py - os_config_hash.json - private_os_config_hash.json - - LIBS - cairo_common_lib - cairo_function_runner_lib - starknet_definitions_lib - starknet_os_config_hash_lib - starknet_general_config_lib - starknet_os_utils_lib - starkware_python_test_utils_lib - starkware_python_utils_lib - pip_pytest - pip_pytest_asyncio -) - -full_python_test(starknet_os_config_hash_test - PREFIX starkware/starknet/core/os/os_config - PYTHON ${PYTHON_COMMAND} - TESTED_MODULES starkware/starknet/core/os - - FILES - os_config_hash_test.py - os_config_hash.json - private_os_config_hash.json - - LIBS - cairo_common_lib - cairo_function_runner_lib - starknet_os_config_hash_lib - starknet_general_config_lib - starknet_os_utils_lib - starkware_python_test_utils_lib - starkware_python_utils_lib - pip_pytest - pip_pytest_asyncio -) - -python_exe(starknet_os_config_hash_fix - VENV starknet_os_config_hash_test_venv - MODULE starkware.starknet.core.os.os_config.os_config_hash_test - ARGS "--fix" -) diff --git a/src/starkware/starknet/core/os/os_input.py b/src/starkware/starknet/core/os/os_input.py index 47fba66e..4f539988 100644 --- a/src/starkware/starknet/core/os/os_input.py +++ b/src/starkware/starknet/core/os/os_input.py @@ -6,11 +6,8 @@ from starkware.starknet.business_logic.fact_state.contract_state_objects import ContractState from starkware.starknet.business_logic.transaction.objects import InternalTransaction -from starkware.starknet.core.os.syscall_handler import ( - DeprecatedOsSysCallHandler, - OsExecutionHelper, - OsSyscallHandler, -) +from starkware.starknet.core.os.deprecated_syscall_handler import DeprecatedOsSysCallHandler +from starkware.starknet.core.os.syscall_handler import OsExecutionHelper, OsSyscallHandler from starkware.starknet.definitions import fields from starkware.starknet.definitions.general_config import StarknetGeneralConfig from starkware.starknet.services.api.contract_class.contract_class import ( @@ -40,6 +37,7 @@ class StarknetOsInput(ValidatedMarshmallowDataclass): class_hash_to_compiled_class_hash: Dict[int, int] general_config: StarknetGeneralConfig transactions: List[InternalTransaction] + block_hash: int @dataclasses.dataclass(frozen=True) diff --git a/src/starkware/starknet/core/os/os_utils.py b/src/starkware/starknet/core/os/os_utils.py index 523dc023..522b00cf 100644 --- a/src/starkware/starknet/core/os/os_utils.py +++ b/src/starkware/starknet/core/os/os_utils.py @@ -4,10 +4,8 @@ from starkware.cairo.lang.vm.memory_dict import MemoryDict from starkware.cairo.lang.vm.relocatable import MaybeRelocatable, RelocatableValue from starkware.starknet.core.os import segment_utils -from starkware.starknet.core.os.syscall_handler import ( - BusinessLogicSyscallHandler, - DeprecatedBlSyscallHandler, -) +from starkware.starknet.core.os.deprecated_syscall_handler import DeprecatedBlSyscallHandler +from starkware.starknet.core.os.syscall_handler import BusinessLogicSyscallHandler from starkware.starknet.definitions.error_codes import StarknetErrorCode from starkware.starknet.public.abi import SYSCALL_PTR_OFFSET_IN_VERSION0 from starkware.starkware_utils.error_handling import wrap_with_stark_exception diff --git a/src/starkware/starknet/core/os/output.cairo b/src/starkware/starknet/core/os/output.cairo index 8aa7c75a..1c72ba66 100644 --- a/src/starkware/starknet/core/os/output.cairo +++ b/src/starkware/starknet/core/os/output.cairo @@ -54,6 +54,8 @@ func os_output_serialize{output_ptr: felt*}( serialize_word(state_update_output.final_root); serialize_word(block_context.block_info.block_number); + // Currently, the block hash is not enforced by the OS. + serialize_word(nondet %{ os_input.block_hash %}); serialize_word(starknet_os_config_hash); let messages_to_l1_segment_size = ( diff --git a/src/starkware/starknet/core/os/program_hash.json b/src/starkware/starknet/core/os/program_hash.json index a7e87edf..27274d84 100644 --- a/src/starkware/starknet/core/os/program_hash.json +++ b/src/starkware/starknet/core/os/program_hash.json @@ -1,3 +1,3 @@ { - "program_hash": "0x6c8e862f81a33d0940ae371bbac8d9e8cd1f0128f947f3b1ba031a1c1e9b90a" + "program_hash": "0x43faf393d35439a5f360746ccedf400ddedd5278020858b5ff27f3663841022" } diff --git a/src/starkware/starknet/core/os/syscall_handler.py b/src/starkware/starknet/core/os/syscall_handler.py index 03a3ee38..6cff6676 100644 --- a/src/starkware/starknet/core/os/syscall_handler.py +++ b/src/starkware/starknet/core/os/syscall_handler.py @@ -18,10 +18,18 @@ import cachetools from starkware.cairo.common.cairo_function_runner import CairoFunctionRunner +from starkware.cairo.common.keccak_utils.keccak_utils import keccak_f from starkware.cairo.common.structs import CairoStructProxy from starkware.cairo.lang.vm.memory_segments import MemorySegmentManager from starkware.cairo.lang.vm.relocatable import MaybeRelocatable, RelocatableValue -from starkware.python.utils import as_non_optional, assert_exhausted, camel_to_snake_case +from starkware.python.utils import ( + as_non_optional, + assert_exhausted, + blockify, + from_bytes, + safe_zip, + to_bytes, +) from starkware.starknet.business_logic.execution.execute_entry_point_base import ( ExecuteEntryPointBase, ) @@ -37,14 +45,12 @@ ) from starkware.starknet.business_logic.state.state import ContractStorageState from starkware.starknet.business_logic.state.state_api import SyncState -from starkware.starknet.business_logic.state.state_api_objects import BlockInfo from starkware.starknet.core.os.contract_address.contract_address import ( calculate_contract_address_from_hash, ) from starkware.starknet.core.os.syscall_utils import ( STARKNET_SYSCALLS_COMPILED_PATH, cast_to_int, - get_deprecated_syscall_structs_and_info, get_selector_from_program, get_syscall_structs, load_program, @@ -64,6 +70,8 @@ ["SyscallHandlerBase", int, CairoStructProxy], SyscallFullResponse ] +KECCAK_FULL_RATE_IN_U64S = 17 + @dataclasses.dataclass(frozen=True) class SyscallInfo: @@ -106,6 +114,11 @@ def get_selector_to_syscall_info(cls) -> Dict[int, SyscallInfo]: execute_callback=cls.deploy, request_struct=structs.DeployRequest, ), + get_selector("keccak"): SyscallInfo( + name="keccak", + execute_callback=cls.keccak, + request_struct=structs.KeccakRequest, + ), get_selector("get_execution_info"): SyscallInfo( name="get_execution_info", execute_callback=cls.get_execution_info, @@ -166,6 +179,7 @@ def syscall(self, syscall_ptr: RelocatableValue): selector = cast_to_int(request_header.selector) syscall_info = self.selector_to_syscall_info.get(selector) assert syscall_info is not None, f"Unsupported syscall selector {selector}." + self._count_syscall(syscall_name=syscall_info.name) request = self._read_and_validate_request(request_struct=syscall_info.request_struct) # Check and reduce gas (after validating the syscall selector for consistency with the OS). @@ -246,6 +260,32 @@ def get_execution_info( response = self.structs.GetExecutionInfoResponse(execution_info=execution_info_ptr) return response_header, response + def keccak(self, remaining_gas: int, request: CairoStructProxy) -> SyscallFullResponse: + assert isinstance(request.input_end, RelocatableValue) + assert isinstance(request.input_start, RelocatableValue) + input_len = cast(int, request.input_end - request.input_start) + if input_len == 0 or input_len % KECCAK_FULL_RATE_IN_U64S != 0: + return self._handle_failure( + final_gas=remaining_gas, + error_code=CairoErrorCode.INVALID_INPUT_LEN, + ) + + gas_cost = (input_len * GasCost.KECCAK_ROUND_COST.value) // KECCAK_FULL_RATE_IN_U64S + if gas_cost > remaining_gas: + return self._handle_failure( + final_gas=remaining_gas, + error_code=CairoErrorCode.OUT_OF_GAS, + ) + + input_array = self._get_felt_range( + start_addr=request.input_start, end_addr=request.input_end + ) + result = self._keccak(input_array) + + response_header = self.structs.ResponseHeader(gas=remaining_gas - gas_cost, failure_flag=0) + response = self.structs.KeccakResponse(result_low=result[0], result_high=result[1]) + return response_header, response + def storage_read(self, remaining_gas: int, request: CairoStructProxy) -> SyscallFullResponse: assert request.reserved == 0, f"Unsupported address domain: {request.reserved}." value = self._storage_read(key=cast_to_int(request.key)) @@ -313,6 +353,26 @@ def _get_execution_info_ptr(self) -> RelocatableValue: Returns a pointer to the ExecutionInfo struct. """ + def _keccak(self, input_array: List[int]) -> List[int]: + """ + Returns the keccak of the input. + """ + + state = bytearray(200) + for chunk in blockify(input_array, chunk_size=KECCAK_FULL_RATE_IN_U64S): + for i, val in safe_zip(range(0, KECCAK_FULL_RATE_IN_U64S * 8, 8), chunk): + state[i : i + 8] = to_bytes( + value=from_bytes(value=state[i : i + 8], byte_order="little") ^ val, + length=8, + byte_order="little", + ) + state = bytearray(keccak_f(state)) + + return [ + from_bytes(state[0:16], byte_order="little"), + from_bytes(state[16:32], byte_order="little"), + ] + @abstractmethod def _storage_read(self, key: int) -> int: """ @@ -353,14 +413,17 @@ def _get_required_gas(self, name: str) -> int: # Refund the base amount the was pre-charged. return total_gas_cost - GasCost.SYSCALL_BASE.value - def _handle_out_of_gas(self, initial_gas: int) -> SyscallFullResponse: - response_header = self.structs.ResponseHeader(gas=initial_gas, failure_flag=1) - data = [CairoErrorCode.OUT_OF_GAS.to_felt()] + def _handle_failure(self, final_gas: int, error_code: CairoErrorCode) -> SyscallFullResponse: + response_header = self.structs.ResponseHeader(gas=final_gas, failure_flag=1) + data = [error_code.to_felt()] start = self.allocate_segment(data=data) failure_reason = self.structs.FailureReason(start=start, end=start + len(data)) return response_header, failure_reason + def _handle_out_of_gas(self, initial_gas: int) -> SyscallFullResponse: + return self._handle_failure(final_gas=initial_gas, error_code=CairoErrorCode.OUT_OF_GAS) + def _get_felt_range(self, start_addr: Any, end_addr: Any) -> List[int]: assert isinstance(start_addr, RelocatableValue) assert isinstance(end_addr, RelocatableValue) @@ -411,6 +474,9 @@ def _write_response(self, response: tuple): # Write response and update syscall pointer. self._syscall_ptr = self.segments.write_arg(ptr=self.syscall_ptr, arg=response) + def _count_syscall(self, syscall_name: str): + return + class BusinessLogicSyscallHandler(SyscallHandlerBase): """ @@ -694,6 +760,10 @@ def _validate_read_only_segments(self, runner: CairoFunctionRunner): runner.mark_as_accessed(address=segment_ptr, size=segment_size) + def _count_syscall(self, syscall_name: str): + previous_syscall_count = self.resources_manager.syscall_counter.get(syscall_name, 0) + self.resources_manager.syscall_counter[syscall_name] = previous_syscall_count + 1 + class OsExecutionHelper: """ @@ -882,738 +952,3 @@ def _replace_class(self, class_hash: int): def _send_message_to_l1(self, to_address: int, payload: List[int]): return - - -# Deprecated handlers. - - -class DeprecatedSysCallHandlerBase(ABC): - """ - Base class for execution of system calls in the StarkNet OS. - """ - - def __init__(self, block_info: BlockInfo, segments: Optional[MemorySegmentManager]): - self._segments = segments - self.block_info = block_info - - self.syscall_structs, self.syscall_info = get_deprecated_syscall_structs_and_info() - - def set_segments(self, segments: MemorySegmentManager): - assert self._segments is None, "segments is already set." - self._segments = segments - - @property - def segments(self) -> MemorySegmentManager: - assert self._segments is not None, "segments must be set before using the SysCallHandler." - return self._segments - - # Public API. - - # Segments argument is kept in public API for backward compatibility. - def call_contract(self, segments: MemorySegmentManager, syscall_ptr: RelocatableValue): - self._call_contract_and_write_response( - syscall_name="call_contract", syscall_ptr=syscall_ptr - ) - - def delegate_call(self, segments: MemorySegmentManager, syscall_ptr: RelocatableValue): - self._call_contract_and_write_response( - syscall_name="delegate_call", syscall_ptr=syscall_ptr - ) - - def delegate_l1_handler(self, segments: MemorySegmentManager, syscall_ptr: RelocatableValue): - self._call_contract_and_write_response( - syscall_name="delegate_l1_handler", syscall_ptr=syscall_ptr - ) - - def deploy(self, segments: MemorySegmentManager, syscall_ptr: RelocatableValue): - """ - Handles the deploy system call. - """ - contract_address = self._deploy(syscall_ptr=syscall_ptr) - response = self.syscall_structs.DeployResponse( - contract_address=contract_address, - constructor_retdata_size=0, - constructor_retdata=0, - ) - self._write_syscall_response( - syscall_name="Deploy", response=response, syscall_ptr=syscall_ptr - ) - - def emit_event(self, segments: MemorySegmentManager, syscall_ptr: RelocatableValue): - return - - def get_caller_address(self, segments: MemorySegmentManager, syscall_ptr: RelocatableValue): - """ - Handles the get_caller_address system call. - """ - caller_address = self._get_caller_address(syscall_ptr=syscall_ptr) - - response = self.syscall_structs.GetCallerAddressResponse(caller_address=caller_address) - self._write_syscall_response( - syscall_name="GetCallerAddress", response=response, syscall_ptr=syscall_ptr - ) - - def get_contract_address(self, segments: MemorySegmentManager, syscall_ptr: RelocatableValue): - contract_address = self._get_contract_address(syscall_ptr=syscall_ptr) - - response = self.syscall_structs.GetContractAddressResponse( - contract_address=contract_address - ) - self._write_syscall_response( - syscall_name="GetContractAddress", response=response, syscall_ptr=syscall_ptr - ) - - def get_block_number(self, segments: MemorySegmentManager, syscall_ptr: RelocatableValue): - """ - Handles the get_block_number system call. - """ - self._read_and_validate_syscall_request( - syscall_name="get_block_number", syscall_ptr=syscall_ptr - ) - - block_number = self.block_info.block_number - - response = self.syscall_structs.GetBlockNumberResponse(block_number=block_number) - self._write_syscall_response( - syscall_name="GetBlockNumber", response=response, syscall_ptr=syscall_ptr - ) - - def get_sequencer_address(self, segments: MemorySegmentManager, syscall_ptr: RelocatableValue): - """ - Handles the get_sequencer_address system call. - """ - self._read_and_validate_syscall_request( - syscall_name="get_sequencer_address", syscall_ptr=syscall_ptr - ) - - response = self.syscall_structs.GetSequencerAddressResponse( - sequencer_address=0 - if self.block_info.sequencer_address is None - else self.block_info.sequencer_address - ) - self._write_syscall_response( - syscall_name="GetSequencerAddress", response=response, syscall_ptr=syscall_ptr - ) - - def get_tx_info(self, segments: MemorySegmentManager, syscall_ptr: RelocatableValue): - """ - Handles the get_tx_info system call. - """ - self._read_and_validate_syscall_request(syscall_name="get_tx_info", syscall_ptr=syscall_ptr) - - response = self.syscall_structs.GetTxInfoResponse(tx_info=self._get_tx_info_ptr()) - self._write_syscall_response( - syscall_name="GetTxInfo", response=response, syscall_ptr=syscall_ptr - ) - - def send_message_to_l1(self, segments: MemorySegmentManager, syscall_ptr: RelocatableValue): - return - - def get_block_timestamp(self, segments: MemorySegmentManager, syscall_ptr: RelocatableValue): - """ - Handles the get_block_timestamp system call. - """ - self._read_and_validate_syscall_request( - syscall_name="get_block_timestamp", syscall_ptr=syscall_ptr - ) - - block_timestamp = self.block_info.block_timestamp - - response = self.syscall_structs.GetBlockTimestampResponse(block_timestamp=block_timestamp) - self._write_syscall_response( - syscall_name="GetBlockTimestamp", response=response, syscall_ptr=syscall_ptr - ) - - def get_tx_signature(self, segments: MemorySegmentManager, syscall_ptr: RelocatableValue): - """ - Handles the get_tx_signature system call. - """ - self._read_and_validate_syscall_request( - syscall_name="get_tx_signature", syscall_ptr=syscall_ptr - ) - tx_info_ptr = self._get_tx_info_ptr() - tx_info = self.syscall_structs.TxInfo.from_ptr( - memory=self.segments.memory, addr=tx_info_ptr - ) - response = self.syscall_structs.GetTxSignatureResponse( - signature_len=tx_info.signature_len, signature=tx_info.signature - ) - - self._write_syscall_response( - syscall_name="GetTxSignature", response=response, syscall_ptr=syscall_ptr - ) - - def library_call(self, segments: MemorySegmentManager, syscall_ptr: RelocatableValue): - self._call_contract_and_write_response(syscall_name="library_call", syscall_ptr=syscall_ptr) - - def library_call_l1_handler( - self, segments: MemorySegmentManager, syscall_ptr: RelocatableValue - ): - self._call_contract_and_write_response( - syscall_name="library_call_l1_handler", syscall_ptr=syscall_ptr - ) - - def replace_class(self, segments: MemorySegmentManager, syscall_ptr: RelocatableValue): - """ - Handles the replace_class system call. - """ - request = self._read_and_validate_syscall_request( - syscall_name="replace_class", syscall_ptr=syscall_ptr - ) - self._replace_class(class_hash=cast_to_int(request.class_hash)) - - def storage_read(self, segments: MemorySegmentManager, syscall_ptr: RelocatableValue): - """ - Handles the storage_read system call. - """ - request = self._read_and_validate_syscall_request( - syscall_name="storage_read", syscall_ptr=syscall_ptr - ) - - value = self._storage_read(cast_to_int(request.address)) - response = self.syscall_structs.StorageReadResponse(value=value) - - self._write_syscall_response( - syscall_name="StorageRead", response=response, syscall_ptr=syscall_ptr - ) - - def storage_write(self, segments: MemorySegmentManager, syscall_ptr: RelocatableValue): - """ - Handles the storage_write system call. - """ - request = self._read_and_validate_syscall_request( - syscall_name="storage_write", syscall_ptr=syscall_ptr - ) - self._storage_write(address=cast_to_int(request.address), value=cast_to_int(request.value)) - - # Private helpers. - - @abstractmethod - def _get_tx_info_ptr(self): - """ - Returns a pointer to the TxInfo struct. - """ - - @abstractmethod - def _deploy(self, syscall_ptr: RelocatableValue) -> int: - """ - Returns the address of the newly deployed contract. - """ - - def _read_syscall_request( - self, syscall_name: str, syscall_ptr: RelocatableValue - ) -> CairoStructProxy: - """ - Returns the system call request written in the syscall segment, starting at syscall_ptr. - """ - syscall_info = self.syscall_info[syscall_name] - return syscall_info.syscall_request_struct.from_ptr( - memory=self.segments.memory, addr=syscall_ptr - ) - - @abstractmethod - def _read_and_validate_syscall_request( - self, syscall_name: str, syscall_ptr: RelocatableValue - ) -> CairoStructProxy: - """ - Returns the system call request written in the syscall segment, starting at syscall_ptr. - Performs validations on the request. - """ - - def _write_syscall_response( - self, - syscall_name: str, - response: CairoStructProxy, - syscall_ptr: RelocatableValue, - ): - assert ( - camel_to_snake_case(syscall_name) in self.syscall_info - ), f"Illegal system call {syscall_name}." - - syscall_struct: CairoStructProxy = getattr(self.syscall_structs, syscall_name) - response_offset = syscall_struct.struct_definition_.members["response"].offset - self.segments.write_arg(ptr=syscall_ptr + response_offset, arg=response) - - @abstractmethod - def _call_contract(self, syscall_ptr: RelocatableValue, syscall_name: str) -> CallResult: - """ - Returns the call's result. - - syscall_name can be "call_contract", "delegate_call", "delegate_l1_handler", "library_call" - or "library_call_l1_handler". - """ - - def _call_contract_and_write_response(self, syscall_name: str, syscall_ptr: RelocatableValue): - """ - Executes the contract call and fills the CallContractResponse struct. - """ - result = self._call_contract(syscall_ptr=syscall_ptr, syscall_name=syscall_name) - assert not result.failure_flag, "Unexpected reverted call." - response = self.syscall_structs.CallContractResponse( - retdata_size=len(result.retdata), retdata=self._allocate_segment(data=result.retdata) - ) - self._write_syscall_response( - syscall_name="CallContract", response=response, syscall_ptr=syscall_ptr - ) - - @abstractmethod - def _get_caller_address(self, syscall_ptr: RelocatableValue) -> int: - """ - Specific implementation of the get_caller_address system call. - """ - - @abstractmethod - def _get_contract_address(self, syscall_ptr: RelocatableValue) -> int: - """ - Specific implementation of the get_contract_address system call. - """ - - @abstractmethod - def _replace_class(self, class_hash: int): - """ - replaces the running contracts class hash with the given hash. - """ - - @abstractmethod - def _storage_read(self, address: int) -> int: - """ - Returns the value of the contract's storage at the given address. - """ - - @abstractmethod - def _storage_write(self, address: int, value: int): - """ - Write the value to the contract's storage at the given address. - """ - - @abstractmethod - def _allocate_segment(self, data: Iterable[MaybeRelocatable]) -> RelocatableValue: - """ - Allocates and returns a new (read-only) segment with the given data. - Note that unlike MemorySegmentManager.write_arg, this function doesn't work well with - recursive input - call _allocate_segment for the inner items if needed. - """ - - -class DeprecatedBlSyscallHandler(DeprecatedSysCallHandlerBase): - """ - The SysCallHandler implementation that is used by the batcher. - """ - - def __init__( - self, - execute_entry_point_cls: Type[ExecuteEntryPointBase], - tx_execution_context: TransactionExecutionContext, - state: SyncState, - resources_manager: ExecutionResourcesManager, - caller_address: int, - contract_address: int, - general_config: StarknetGeneralConfig, - initial_syscall_ptr: RelocatableValue, - segments: MemorySegmentManager, - ): - super().__init__(block_info=state.block_info, segments=segments) - - # Configuration objects. - self.general_config = general_config - - # Execution-related objects. - self.execute_entry_point_cls = execute_entry_point_cls - self.tx_execution_context = tx_execution_context - self.sync_state = state - self.resources_manager = resources_manager - self.caller_address = caller_address - self.contract_address = contract_address - - # Storage-related members. - self.starknet_storage = ContractStorageState( - state=self.sync_state, contract_address=contract_address - ) - - # Internal calls executed by the current contract call. - self.internal_calls: List[CallInfo] = [] - # Events emitted by the current contract call. - self.events: List[OrderedEvent] = [] - # Messages sent by the current contract call to L1. - self.l2_to_l1_messages: List[OrderedL2ToL1Message] = [] - - # Kept for validations during the run. - self.expected_syscall_ptr = initial_syscall_ptr - - # A pointer to the Cairo TxInfo struct. - self.tx_info_ptr: Optional[RelocatableValue] = None - - # A list of dynamically allocated segments that are expected to be read-only. - self.read_only_segments: List[Tuple[RelocatableValue, int]] = [] - - def _allocate_segment(self, data: Iterable[MaybeRelocatable]) -> RelocatableValue: - segment_start = self.segments.add() - segment_end = self.segments.write_arg(ptr=segment_start, arg=data) - self.read_only_segments.append((segment_start, segment_end - segment_start)) - return segment_start - - def _count_syscall(self, syscall_name: str): - previous_syscall_count = self.resources_manager.syscall_counter.get(syscall_name, 0) - self.resources_manager.syscall_counter[syscall_name] = previous_syscall_count + 1 - - def _read_and_validate_syscall_request( - self, syscall_name: str, syscall_ptr: RelocatableValue - ) -> CairoStructProxy: - """ - Returns the system call request written in the syscall segment, starting at syscall_ptr. - Performs validations on the request. - """ - # Update syscall count. - self._count_syscall(syscall_name=syscall_name) - - request = self._read_syscall_request(syscall_name=syscall_name, syscall_ptr=syscall_ptr) - - assert ( - syscall_ptr == self.expected_syscall_ptr - ), f"Bad syscall_ptr, Expected {self.expected_syscall_ptr}, got {syscall_ptr}." - - syscall_info = self.syscall_info[syscall_name] - self.expected_syscall_ptr += syscall_info.syscall_size - - selector = request.selector - assert isinstance(selector, int), ( - f"The selector argument to syscall {syscall_name} is of unexpected type. " - f"Expected: int; got: {type(selector).__name__}." - ) - assert ( - selector == syscall_info.selector - ), f"Bad syscall selector, expected {syscall_info.selector}. Got: {selector}" - - validate_runtime_request_type( - request_values=request, request_struct=syscall_info.syscall_request_struct - ) - - return request - - def _call_contract(self, syscall_ptr: RelocatableValue, syscall_name: str) -> CallResult: - # Parse request and prepare the call. - request = self._read_and_validate_syscall_request( - syscall_name=syscall_name, syscall_ptr=syscall_ptr - ) - calldata = self.segments.memory.get_range_as_ints( - addr=request.calldata, size=request.calldata_size - ) - - code_address: Optional[int] = None - class_hash: Optional[int] = None - if syscall_name == "call_contract": - code_address = cast_to_int(request.contract_address) - contract_address = code_address - caller_address = self.contract_address - entry_point_type = EntryPointType.EXTERNAL - call_type = CallType.CALL - elif syscall_name == "delegate_call": - code_address = cast_to_int(request.contract_address) - contract_address = self.contract_address - caller_address = self.caller_address - entry_point_type = EntryPointType.EXTERNAL - call_type = CallType.DELEGATE - elif syscall_name == "delegate_l1_handler": - code_address = cast_to_int(request.contract_address) - contract_address = self.contract_address - caller_address = self.caller_address - entry_point_type = EntryPointType.L1_HANDLER - call_type = CallType.DELEGATE - elif syscall_name == "library_call": - class_hash = cast_to_int(request.class_hash) - contract_address = self.contract_address - caller_address = self.caller_address - entry_point_type = EntryPointType.EXTERNAL - call_type = CallType.DELEGATE - elif syscall_name == "library_call_l1_handler": - class_hash = cast_to_int(request.class_hash) - contract_address = self.contract_address - caller_address = self.caller_address - entry_point_type = EntryPointType.L1_HANDLER - call_type = CallType.DELEGATE - else: - raise NotImplementedError(f"Unsupported call type {syscall_name}.") - - call = self.execute_entry_point_cls( - call_type=call_type, - class_hash=class_hash, - contract_address=contract_address, - code_address=code_address, - entry_point_selector=cast_to_int(request.function_selector), - initial_gas=GasCost.INITIAL.value, - entry_point_type=entry_point_type, - calldata=calldata, - caller_address=caller_address, - ) - - return self.execute_entry_point(call=call) - - def _deploy(self, syscall_ptr: RelocatableValue) -> int: - """ - Initializes and runs the constructor of the new contract. - Returns the address of the newly deployed contract. - """ - request = self._read_and_validate_syscall_request( - syscall_name="deploy", syscall_ptr=syscall_ptr - ) - assert request.deploy_from_zero in [ - 0, - 1, - ], "The deploy_from_zero field in the deploy system call must be 0 or 1." - constructor_calldata = self.segments.memory.get_range_as_ints( - addr=cast(RelocatableValue, request.constructor_calldata), - size=cast_to_int(request.constructor_calldata_size), - ) - class_hash = cast_to_int(request.class_hash) - - deployer_address = self.contract_address if request.deploy_from_zero == 0 else 0 - contract_address = calculate_contract_address_from_hash( - salt=cast_to_int(request.contract_address_salt), - class_hash=class_hash, - constructor_calldata=constructor_calldata, - deployer_address=deployer_address, - ) - - # Instantiate the contract. - self.sync_state.deploy_contract(contract_address=contract_address, class_hash=class_hash) - - self.execute_constructor_entry_point( - contract_address=contract_address, - class_hash=class_hash, - constructor_calldata=constructor_calldata, - ) - - return contract_address - - def execute_constructor_entry_point( - self, contract_address: int, class_hash: int, constructor_calldata: List[int] - ): - contract_class = self.sync_state.get_compiled_class_by_class_hash(class_hash=class_hash) - constructor_entry_points = contract_class.entry_points_by_type[EntryPointType.CONSTRUCTOR] - if len(constructor_entry_points) == 0: - # Contract has no constructor. - assert ( - len(constructor_calldata) == 0 - ), "Cannot pass calldata to a contract with no constructor." - - call_info = CallInfo.empty_constructor_call( - contract_address=contract_address, - caller_address=self.contract_address, - class_hash=class_hash, - ) - self.internal_calls.append(call_info) - - return - - call = self.execute_entry_point_cls( - call_type=CallType.CALL, - class_hash=None, - contract_address=contract_address, - code_address=contract_address, - entry_point_selector=CONSTRUCTOR_ENTRY_POINT_SELECTOR, - initial_gas=GasCost.INITIAL.value, - entry_point_type=EntryPointType.CONSTRUCTOR, - calldata=constructor_calldata, - caller_address=self.contract_address, - ) - self.execute_entry_point(call=call) - - def execute_entry_point(self, call: ExecuteEntryPointBase) -> CallResult: - with wrap_with_handler_exception(call=call): - # Execute contract call. - call_info = call.execute( - state=self.sync_state, - resources_manager=self.resources_manager, - tx_execution_context=self.tx_execution_context, - general_config=self.general_config, - ) - - # Update execution info. - self.internal_calls.append(call_info) - - return call_info.result() - - def emit_event(self, segments: MemorySegmentManager, syscall_ptr: RelocatableValue): - """ - Handles the emit_event system call. - """ - request = self._read_and_validate_syscall_request( - syscall_name="emit_event", syscall_ptr=syscall_ptr - ) - - self.events.append( - OrderedEvent( - order=self.tx_execution_context.n_emitted_events, - keys=self.segments.memory.get_range_as_ints( - addr=cast(RelocatableValue, request.keys), size=cast_to_int(request.keys_len) - ), - data=self.segments.memory.get_range_as_ints( - addr=cast(RelocatableValue, request.data), size=cast_to_int(request.data_len) - ), - ) - ) - - # Update events count. - self.tx_execution_context.n_emitted_events += 1 - - def _get_tx_info_ptr(self) -> RelocatableValue: - if self.tx_info_ptr is None: - tx_info = self.syscall_structs.TxInfo( - version=self.tx_execution_context.version, - account_contract_address=self.tx_execution_context.account_contract_address, - max_fee=self.tx_execution_context.max_fee, - transaction_hash=self.tx_execution_context.transaction_hash, - signature_len=len(self.tx_execution_context.signature), - signature=self._allocate_segment(data=self.tx_execution_context.signature), - chain_id=self.general_config.chain_id.value, - nonce=self.tx_execution_context.nonce, - ) - self.tx_info_ptr = self._allocate_segment(data=tx_info) - - return self.tx_info_ptr - - def send_message_to_l1(self, segments: MemorySegmentManager, syscall_ptr: RelocatableValue): - request = self._read_and_validate_syscall_request( - syscall_name="send_message_to_l1", syscall_ptr=syscall_ptr - ) - payload = self.segments.memory.get_range_as_ints( - addr=cast(RelocatableValue, request.payload_ptr), size=cast_to_int(request.payload_size) - ) - - self.l2_to_l1_messages.append( - # Note that the constructor of OrderedL2ToL1Message might fail as it is - # more restrictive than the Cairo code. - OrderedL2ToL1Message( - order=self.tx_execution_context.n_sent_messages, - to_address=cast_to_int(request.to_address), - payload=payload, - ) - ) - - # Update messages count. - self.tx_execution_context.n_sent_messages += 1 - - def _get_caller_address(self, syscall_ptr: RelocatableValue) -> int: - self._read_and_validate_syscall_request( - syscall_name="get_caller_address", syscall_ptr=syscall_ptr - ) - - return self.caller_address - - def _get_contract_address(self, syscall_ptr: RelocatableValue) -> int: - self._read_and_validate_syscall_request( - syscall_name="get_contract_address", syscall_ptr=syscall_ptr - ) - - return self.contract_address - - def _replace_class(self, class_hash: int): - # Assert the replacement class is valid (by reading it). - self.sync_state.get_compiled_class_by_class_hash(class_hash=class_hash) - - # Replace the class. - self.sync_state.set_class_hash_at( - contract_address=self.contract_address, class_hash=class_hash - ) - - def _storage_read(self, address: int) -> int: - return self.starknet_storage.read(address=address) - - def _storage_write(self, address: int, value: int): - # Read the value before the write operation in order to log it in the read_values list. - # This value is needed to create the DictAccess while executing the corresponding - # storage_write system call. - self.starknet_storage.read(address=address) - - self.starknet_storage.write(address=address, value=value) - - def validate_read_only_segments(self, runner: CairoFunctionRunner): - """ - Validates that there were no out of bounds writes to read-only segments and marks - them as accessed. - """ - assert self.segments is runner.segments, "Inconsistent segments." - - for segment_ptr, segment_size in self.read_only_segments: - used_size = self.segments.get_segment_used_size(segment_index=segment_ptr.segment_index) - stark_assert( - used_size == segment_size, - code=StarknetErrorCode.SECURITY_ERROR, - message="Out of bounds write to a read-only segment.", - ) - - runner.mark_as_accessed(address=segment_ptr, size=segment_size) - - def post_run(self, runner: CairoFunctionRunner, syscall_stop_ptr: MaybeRelocatable): - """ - Performs post run syscall related tasks. - """ - expected_stop_ptr = self.expected_syscall_ptr - stark_assert( - syscall_stop_ptr == expected_stop_ptr, - code=StarknetErrorCode.SECURITY_ERROR, - message=f"Bad syscall_stop_ptr, Expected {expected_stop_ptr}, got {syscall_stop_ptr}.", - ) - - self.validate_read_only_segments(runner=runner) - - -class DeprecatedOsSysCallHandler(DeprecatedSysCallHandlerBase): - """ - The SysCallHandler implementation that is used by the gps ambassador. - """ - - def __init__( - self, - execution_helper: OsExecutionHelper, - block_info: BlockInfo, - # Note that a non-optional segments must be set before using the SysCallHandler. - segments: Optional[MemorySegmentManager] = None, - ): - super().__init__(block_info=block_info, segments=segments) - self.execution_helper = execution_helper - - def _read_and_validate_syscall_request( - self, syscall_name: str, syscall_ptr: RelocatableValue - ) -> CairoStructProxy: - """ - Returns the system call request written in the syscall segment, starting at syscall_ptr. - Does not perform validations on the request, since it was validated in the BL. - """ - return self._read_syscall_request(syscall_name=syscall_name, syscall_ptr=syscall_ptr) - - def _allocate_segment(self, data: Iterable[MaybeRelocatable]) -> RelocatableValue: - """ - Allocates and returns a new temporary segment. - """ - segment_start = self.segments.add_temp_segment() - self.segments.write_arg(ptr=segment_start, arg=data) - return segment_start - - def _call_contract(self, syscall_ptr: RelocatableValue, syscall_name: str) -> CallResult: - return next(self.execution_helper.result_iterator) - - def _deploy(self, syscall_ptr: RelocatableValue) -> int: - next(self.execution_helper.result_iterator) - return next(self.execution_helper.deployed_contracts_iterator) - - def _get_caller_address(self, syscall_ptr: RelocatableValue) -> int: - return self.execution_helper.call_info.caller_address - - def _get_contract_address(self, syscall_ptr: RelocatableValue) -> int: - return self.execution_helper.call_info.contract_address - - def _get_tx_info_ptr(self) -> RelocatableValue: - assert self.execution_helper.tx_info_ptr is not None - return self.execution_helper.tx_info_ptr - - def _replace_class(self, class_hash: int): - return - - def _storage_read(self, address: int) -> int: - return next(self.execution_helper.execute_code_read_iterator) - - def _storage_write(self, address: int, value: int): - # Advance execute_code_read_iterators since the previous storage value is written - # in each write operation. See DeprecatedBlSyscallHandler._storage_write(). - next(self.execution_helper.execute_code_read_iterator) diff --git a/src/starkware/starknet/core/os/transaction_hash/BUILD b/src/starkware/starknet/core/os/transaction_hash/BUILD new file mode 100644 index 00000000..750d6f0c --- /dev/null +++ b/src/starkware/starknet/core/os/transaction_hash/BUILD @@ -0,0 +1,44 @@ +load("//bazel_utils/python:defs.bzl", "requirement") +load("//bazel_utils:python.bzl", "pytest_test") + +package(default_visibility = ["//visibility:public"]) + +exports_files(["transaction_hash.cairo"]) + +pytest_test( + name = "starknet_transaction_hash_test", + srcs = [ + "transaction_hash_test.py", + ], + visibility = ["//visibility:public"], + deps = [ + "starknet_transaction_hash_lib", + "//src/starkware/cairo/common:cairo_common_lib", + "//src/starkware/cairo/common:cairo_function_runner_lib", + "//src/starkware/crypto:starkware_crypto_lib", + "//src/starkware/starknet/core/os:starknet_os_program_py_lib", + "//src/starkware/starknet/core/os/contract_class:starknet_os_abi_lib", + "//src/starkware/starknet/core/test_contract:starknet_test_external_contract_test_utils_lib", + "//src/starkware/starknet/definitions:starknet_definitions_lib", + "//src/starkware/starknet/definitions:starknet_general_config_lib", + "//src/starkware/starknet/public:starknet_abi_lib", + requirement("pytest_asyncio"), + ], +) + +py_library( + name = "starknet_transaction_hash_lib", + srcs = [ + "transaction_hash.py", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/starkware/cairo/common:cairo_common_lib", + "//src/starkware/cairo/lang/vm:cairo_vm_crypto_lib", + "//src/starkware/python:starkware_python_utils_lib", + "//src/starkware/starknet/core/os/contract_class:starknet_os_abi_lib", + "//src/starkware/starknet/definitions:starknet_definitions_lib", + "//src/starkware/starknet/public:starknet_abi_lib", + "//src/starkware/starknet/services/api/contract_class:starknet_contract_class_lib", + ], +) diff --git a/src/starkware/starknet/core/os/transaction_hash/CMakeLists.txt b/src/starkware/starknet/core/os/transaction_hash/CMakeLists.txt deleted file mode 100644 index b8a64ca4..00000000 --- a/src/starkware/starknet/core/os/transaction_hash/CMakeLists.txt +++ /dev/null @@ -1,38 +0,0 @@ -full_python_test(starknet_transaction_hash_test - PREFIX starkware/starknet/core/os/transaction_hash - PYTHON ${PYTHON_COMMAND} - TESTED_MODULES starkware/starknet/core/os/transaction_hash - - FILES - transaction_hash_test.py - - LIBS - cairo_common_lib - cairo_function_runner_lib - starknet_abi_lib - starknet_definitions_lib - starknet_general_config_lib - starknet_os_abi_lib - starknet_os_utils_lib - starknet_test_external_contract_test_utils_lib - starknet_transaction_hash_lib - starkware_crypto_lib - pip_pytest - pip_pytest_asyncio -) - -python_lib(starknet_transaction_hash_lib - PREFIX starkware/starknet/core/os/transaction_hash - - FILES - transaction_hash.py - - LIBS - cairo_common_lib - cairo_vm_crypto_lib - starknet_abi_lib - starknet_contract_class_lib - starknet_definitions_lib - starknet_os_abi_lib - starkware_python_utils_lib -) diff --git a/src/starkware/starknet/core/test_contract/BUILD b/src/starkware/starknet/core/test_contract/BUILD new file mode 100644 index 00000000..9020b3e6 --- /dev/null +++ b/src/starkware/starknet/core/test_contract/BUILD @@ -0,0 +1,43 @@ +load("//src/starkware/starknet:starknet_rules_v0.bzl", "starknet_contract_v0") + +starknet_contract_v0( + name = "delegate_proxy", + srcs = [ + "delegate_proxy.cairo", + ], + compiled_program_name = "delegate_proxy.json", + main = "delegate_proxy.cairo", +) + +starknet_contract_v0( + name = "dummy_account", + srcs = ["dummy_account.cairo"], + cairoopts = ["--account_contract"], + compiled_program_name = "dummy_account.json", + main = "dummy_account.cairo", +) + +py_library( + name = "starknet_external_compiled_contracts_lib", + data = [ + "delegate_proxy.json", + "dummy_account.json", + ], + visibility = ["//visibility:public"], +) + +package(default_visibility = ["//visibility:public"]) + +py_library( + name = "starknet_test_external_contract_test_utils_lib", + srcs = [ + "test_utils.py", + ], + visibility = ["//visibility:public"], + deps = [ + "starknet_external_compiled_contracts_lib", + "//src/starkware/cairo/lang:cairo_constants_lib", + "//src/starkware/cairo/lang/compiler:cairo_compile_lib", + "//src/starkware/starknet/services/api/contract_class:starknet_contract_class_lib", + ], +) diff --git a/src/starkware/starknet/core/test_contract/CMakeLists.txt b/src/starkware/starknet/core/test_contract/CMakeLists.txt deleted file mode 100644 index 20b953d1..00000000 --- a/src/starkware/starknet/core/test_contract/CMakeLists.txt +++ /dev/null @@ -1,28 +0,0 @@ -starknet_compile(compile_delegate_proxy delegate_proxy.json delegate_proxy.cairo "") -starknet_compile(compile_dummy_account_contract - dummy_account.json dummy_account.cairo "--account_contract") - -python_lib(starknet_external_compiled_contracts_lib - PREFIX starkware/starknet/core/test_contract - - ARTIFACTS - "${CMAKE_CURRENT_BINARY_DIR}/delegate_proxy.json delegate_proxy.json" - "${CMAKE_CURRENT_BINARY_DIR}/dummy_account.json dummy_account.json" -) -add_dependencies(starknet_external_compiled_contracts_lib - compile_delegate_proxy - compile_dummy_account_contract -) - -python_lib(starknet_test_external_contract_test_utils_lib - PREFIX starkware/starknet/core/test_contract - - FILES - test_utils.py - - LIBS - cairo_compile_lib - cairo_constants_lib - starknet_contract_class_lib - starknet_external_compiled_contracts_lib -) diff --git a/src/starkware/starknet/definitions/BUILD b/src/starkware/starknet/definitions/BUILD new file mode 100644 index 00000000..79f4b3eb --- /dev/null +++ b/src/starkware/starknet/definitions/BUILD @@ -0,0 +1,56 @@ +load("//bazel_utils/python:defs.bzl", "requirement") + +package(default_visibility = ["//visibility:public"]) + +exports_files(["general_config.yml"]) + +py_library( + name = "starknet_definitions_lib", + srcs = [ + "constants.py", + "error_codes.py", + "fields.py", + "transaction_type.py", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/services/everest/api/gateway:everest_transaction_type_lib", + "//src/services/everest/definitions:everest_definitions_lib", + "//src/starkware/cairo/lang/tracer:cairo_tracer_lib", + "//src/starkware/cairo/lang/vm:cairo_vm_crypto_lib", + "//src/starkware/crypto:starkware_crypto_lib", + "//src/starkware/python:starkware_python_utils_lib", + "//src/starkware/starkware_utils:starkware_dataclasses_field_utils_lib", + "//src/starkware/starkware_utils:starkware_dataclasses_utils_lib", + "//src/starkware/starkware_utils:starkware_error_handling_lib", + "//src/starkware/storage:starkware_abstract_storage_lib", + "//src/starkware/storage:starkware_storage_lib", + requirement("marshmallow"), + ], +) + +py_library( + name = "starknet_general_config_lib", + srcs = [ + "chain_ids.py", + "general_config.py", + ], + data = [ + "general_config.yml", + ], + visibility = ["//visibility:public"], + deps = [ + "starknet_definitions_lib", + "//src/services/everest/definitions:everest_general_config_lib", + "//src/starkware/cairo/lang:cairo_instances_lib", + "//src/starkware/cairo/lang/builtins:cairo_all_builtins_lib", + "//src/starkware/cairo/lang/builtins:cairo_run_builtins_lib", + "//src/starkware/python:starkware_python_utils_lib", + "//src/starkware/starkware_utils:starkware_config_utils_lib", + "//src/starkware/starkware_utils:starkware_dataclasses_field_utils_lib", + "//src/starkware/starkware_utils:starkware_dataclasses_utils_lib", + requirement("marshmallow"), + requirement("marshmallow_dataclass"), + requirement("marshmallow_enum"), + ], +) diff --git a/src/starkware/starknet/definitions/CMakeLists.txt b/src/starkware/starknet/definitions/CMakeLists.txt deleted file mode 100644 index 376549e3..00000000 --- a/src/starkware/starknet/definitions/CMakeLists.txt +++ /dev/null @@ -1,46 +0,0 @@ -python_lib(starknet_definitions_lib - PREFIX starkware/starknet/definitions - - FILES - constants.py - error_codes.py - fields.py - transaction_type.py - - LIBS - cairo_tracer_lib - cairo_vm_crypto_lib - everest_definitions_lib - everest_transaction_type_lib - starkware_abstract_storage_lib - starkware_crypto_lib - starkware_dataclasses_field_utils_lib - starkware_dataclasses_utils_lib - starkware_error_handling_lib - starkware_python_utils_lib - starkware_storage_lib - pip_marshmallow -) - -python_lib(starknet_general_config_lib - PREFIX starkware/starknet/definitions - - FILES - general_config.py - general_config.yml - chain_ids.py - - LIBS - cairo_all_builtins_lib - cairo_instances_lib - cairo_run_builtins_lib - everest_general_config_lib - starknet_definitions_lib - starkware_config_utils_lib - starkware_dataclasses_field_utils_lib - starkware_dataclasses_utils_lib - starkware_python_utils_lib - pip_marshmallow - pip_marshmallow_dataclass - pip_marshmallow_enum -) diff --git a/src/starkware/starknet/definitions/constants.py b/src/starkware/starknet/definitions/constants.py index 98eb9b0c..6f5f6ebb 100644 --- a/src/starkware/starknet/definitions/constants.py +++ b/src/starkware/starknet/definitions/constants.py @@ -40,9 +40,9 @@ GAS_PRICE_LOWER_BOUND = 0 GAS_PRICE_UPPER_BOUND = 2**128 MAX_MESSAGE_TO_L1_LENGTH = 100 -MAX_CALLDATA_LENGTH = 2**30 NONCE_LOWER_BOUND = 0 NONCE_UPPER_BOUND = 2**NONCE_BITS +SIERRA_ARRAY_LEN_BOUND = 2**32 SYSCALL_SELECTOR_UPPER_BOUND = FIELD_SIZE TRANSACTION_COMMITMENT_TREE_HEIGHT = 64 TRANSACTION_HASH_LOWER_BOUND = 0 @@ -70,6 +70,9 @@ QUERY_VERSION_BASE + 1, ) +# Sierra -> Casm compilation version. +SIERRA_VERSION = [1, 0, 0] + # The version of contract class leaf. CONTRACT_CLASS_LEAF_VERSION: bytes = b"CONTRACT_CLASS_LEAF_V0" @@ -101,6 +104,14 @@ VALIDATE_RETDATA = [from_bytes(b"VALID")] +class OsOutputConstant(Enum): + MERKLE_UPDATE_OFFSET = 0 + BLOCK_NUMBER_OFFSET = 2 + BLOCK_HASH_OFFSET = 3 + CONFIG_HASH_OFFSET = 4 + HEADER_SIZE = 5 + + class GasCost(Enum): """ See documentation in core/os/constants.cairo. @@ -121,6 +132,8 @@ class GasCost(Enum): CALL_CONTRACT = SYSCALL_BASE + 10 * STEP + ENTRY_POINT DEPLOY = SYSCALL_BASE + 200 * STEP + ENTRY_POINT GET_EXECUTION_INFO = SYSCALL_BASE + 10 * STEP + KECCAK = SYSCALL_BASE + KECCAK_ROUND_COST = 180000 LIBRARY_CALL = CALL_CONTRACT REPLACE_CLASS = SYSCALL_BASE + 50 * STEP STORAGE_READ = SYSCALL_BASE + 50 * STEP diff --git a/src/starkware/starknet/definitions/error_codes.py b/src/starkware/starknet/definitions/error_codes.py index 4f090f8b..73e9f0ca 100644 --- a/src/starkware/starknet/definitions/error_codes.py +++ b/src/starkware/starknet/definitions/error_codes.py @@ -7,6 +7,7 @@ class StarknetErrorCode(ErrorCode): BLOCK_NOT_FOUND = 0 + SENDER_ADDRESS_IS_BLOCKED = auto() CLASS_ALREADY_DECLARED = auto() COMPILATION_FAILED = auto() CONTRACT_ADDRESS_UNAVAILABLE = auto() @@ -103,6 +104,7 @@ class StarknetErrorCode(ErrorCode): [ *common_error_codes, StarknetErrorCode.DEPRECATED_TRANSACTION, + StarknetErrorCode.SENDER_ADDRESS_IS_BLOCKED, # Signature validation errors. StarkErrorCode.INVALID_SIGNATURE, # External deploy loading errors. @@ -170,6 +172,7 @@ class CairoErrorCode(Enum): """ OUT_OF_GAS = "Out of gas" + INVALID_INPUT_LEN = "Invalid input length" def to_felt(self) -> int: return from_bytes(self.value.encode("ascii")) diff --git a/src/starkware/starknet/definitions/fields.py b/src/starkware/starknet/definitions/fields.py index bb42c80a..eeeb5dfd 100644 --- a/src/starkware/starknet/definitions/fields.py +++ b/src/starkware/starknet/definitions/fields.py @@ -11,13 +11,16 @@ from starkware.starknet.definitions import constants from starkware.starknet.definitions.error_codes import StarknetErrorCode from starkware.starknet.definitions.transaction_type import TransactionType -from starkware.starkware_utils.field_validators import validate_non_negative, validate_positive +from starkware.starkware_utils.field_validators import ( + validate_max_length, + validate_non_negative, + validate_positive, +) from starkware.starkware_utils.marshmallow_dataclass_fields import ( BackwardCompatibleIntAsHex, BytesAsHex, EnumField, FrozenDictField, - IntAsStr, StrictRequiredInteger, VariadicLengthTupleField, ) @@ -33,6 +36,15 @@ marshmallow_field=mfields.List(everest_fields.FeltField.get_marshmallow_field()) ) +felt_as_hex_bounded_list_metadata = dict( + marshmallow_field=mfields.List( + everest_fields.FeltField.get_marshmallow_field(), + validate=validate_max_length( + field_name="felt_list", max_length=constants.SIERRA_ARRAY_LEN_BOUND - 1 + ), + ) +) + felt_as_hex_or_str_list_metadata = dict( marshmallow_field=mfields.List( BackwardCompatibleIntAsHex( @@ -41,10 +53,15 @@ ) ) -calldata_metadata = felt_as_hex_or_str_list_metadata - -felt_list_metadata = dict( - marshmallow_field=mfields.List(IntAsStr(validate=everest_fields.FeltField.validate)) +felt_as_hex_or_str_bounded_list_metadata = dict( + marshmallow_field=mfields.List( + BackwardCompatibleIntAsHex( + allow_decimal_loading=True, validate=everest_fields.FeltField.validate + ), + validate=validate_max_length( + field_name="felt_list", max_length=constants.SIERRA_ARRAY_LEN_BOUND - 1 + ), + ) ) @@ -71,6 +88,11 @@ def new_class_hash_dict_keys_metadata( marshmallow_field=StrictRequiredInteger(validate=validate_non_negative("timestamp")) ) +calldata_metadata = felt_as_hex_or_str_bounded_list_metadata +signature_metadata = felt_as_hex_or_str_bounded_list_metadata +calldata_as_hex_metadata = felt_as_hex_bounded_list_metadata +retdata_as_hex_metadata = felt_as_hex_list_metadata + # Address. @@ -154,15 +176,6 @@ def address_metadata(name: str, error_code: StarknetErrorCode) -> Dict[str, Any] field_name="Transaction index", required=False, load_default=None ) - -# InvokeFunction. - -call_data_as_hex_metadata = felt_as_hex_list_metadata -signature_as_hex_metadata = felt_as_hex_or_str_list_metadata -signature_metadata = felt_list_metadata -retdata_as_hex_metadata = felt_as_hex_list_metadata - - # L1Handler. payload_metadata = felt_as_hex_list_metadata @@ -189,6 +202,8 @@ def address_metadata(name: str, error_code: StarknetErrorCode) -> Dict[str, Any] error_code=StarknetErrorCode.OUT_OF_RANGE_CONTRACT_ADDRESS, formatter=hex, ) + + contract_address_metadata = L2AddressField.metadata(field_name="contract address") OptionalCodeAddressField = OptionalField( @@ -266,6 +281,13 @@ def class_hash_from_bytes(class_hash: bytes) -> str: ) ) +address_to_timestamp_metadata = dict( + marshmallow_field=FrozenDictField( + keys=L2AddressField.get_marshmallow_field(), + values=StrictRequiredInteger(validate=validate_non_negative("timestamp")), + ), +) + def validate_optional_new_class_hash(class_hash: Optional[int]): if class_hash is not None: diff --git a/src/starkware/starknet/definitions/general_config.py b/src/starkware/starknet/definitions/general_config.py index 98c5c306..bf652043 100644 --- a/src/starkware/starknet/definitions/general_config.py +++ b/src/starkware/starknet/definitions/general_config.py @@ -65,7 +65,6 @@ DEFAULT_CAIRO_RESOURCE_FEE_WEIGHTS = { N_STEPS_RESOURCE: 1.0, **{builtin: 0.0 for builtin in ALL_BUILTINS.except_for(KECCAK_BUILTIN).with_suffix()}, - "segment_arena_builtin": 0.0, } @@ -130,19 +129,6 @@ class StarknetGeneralConfig(EverestGeneralConfig): default=constants.TRANSACTION_COMMITMENT_TREE_HEIGHT, ) - tx_version: int = field( - metadata=additional_metadata( - marshmallow_field=StrictRequiredInteger( - validate=validate_non_negative("Transaction version."), - ), - description=( - "Current transaction version - " - "in order to identify transactions from unsupported versions." - ), - ), - default=constants.TRANSACTION_VERSION, - ) - event_commitment_tree_height: int = field( metadata=additional_metadata( marshmallow_field=StrictRequiredInteger( @@ -218,6 +204,5 @@ def build_general_config(raw_general_config: Dict[str, Any]) -> StarknetGeneralC }, } ) - cairo_resource_fee_weights["segment_arena_builtin"] = n_steps_weight * 10 return StarknetGeneralConfig.load(data=raw_general_config) diff --git a/src/starkware/starknet/definitions/general_config.yml b/src/starkware/starknet/definitions/general_config.yml index 45c6ed98..cc711af1 100644 --- a/src/starkware/starknet/definitions/general_config.yml +++ b/src/starkware/starknet/definitions/general_config.yml @@ -7,10 +7,9 @@ event_commitment_tree_height: 64 global_state_commitment_tree_height: 251 invoke_tx_max_n_steps: 1000000 min_gas_price: 100000000000 -sequencer_address: '0xbebe7dec64b911aeffecc184afcefa6470e3b3652a1605e42d643e1ea9093d' +sequencer_address: "0x4035e7e01f09b8bc746a549fdf1bafa8d975bdbc53d25646635d0ab58425f30" starknet_os_config: - chain_id: 1536727068981429685321 # StarknetChainId.TESTNET.value. - fee_token_address: '0x3a6cd58432f67900cbdda0df46a58b135f5f4e29bee5328099aec79b95cb51' + chain_id: 1536727068981429685321 # StarknetChainId.TESTNET.value + fee_token_address: "0x3d946ac56929feafba12eee7bf5d07e0416a710087fdcb3a224d53b4e56f6cb" tx_commitment_tree_height: 64 -tx_version: 1 validate_max_n_steps: 1000000 diff --git a/src/starkware/starknet/public/BUILD b/src/starkware/starknet/public/BUILD new file mode 100644 index 00000000..fb0c6681 --- /dev/null +++ b/src/starkware/starknet/public/BUILD @@ -0,0 +1,32 @@ +load("//bazel_utils/python:defs.bzl", "requirement") +load("//bazel_utils:python.bzl", "pytest_test") + +package(default_visibility = ["//visibility:public"]) + +py_library( + name = "starknet_abi_lib", + srcs = [ + "abi.py", + "abi_structs.py", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/starkware/cairo/lang/compiler:cairo_compile_lib", + "//src/starkware/cairo/lang/vm:cairo_vm_crypto_lib", + "//src/starkware/python:starkware_python_utils_lib", + requirement("eth_hash"), + requirement("pycryptodome"), + ], +) + +pytest_test( + name = "starknet_abi_lib_test", + srcs = [ + "abi_structs_test.py", + "abi_test.py", + ], + visibility = ["//visibility:public"], + deps = [ + "starknet_abi_lib", + ], +) diff --git a/src/starkware/starknet/public/CMakeLists.txt b/src/starkware/starknet/public/CMakeLists.txt deleted file mode 100644 index e8764181..00000000 --- a/src/starkware/starknet/public/CMakeLists.txt +++ /dev/null @@ -1,28 +0,0 @@ -python_lib(starknet_abi_lib - PREFIX starkware/starknet/public - FILES - abi.py - abi_structs.py - - LIBS - cairo_compile_lib - cairo_vm_crypto_lib - starkware_python_utils_lib - pip_eth_hash - pip_pycryptodome -) - - -full_python_test(starknet_abi_lib_test - PREFIX starkware/starknet/public - PYTHON ${PYTHON_COMMAND} - TESTED_MODULES starkware/starknet/public/ - - FILES - abi_structs_test.py - abi_test.py - - LIBS - starknet_abi_lib - pip_pytest -) diff --git a/src/starkware/starknet/scripts/BUILD b/src/starkware/starknet/scripts/BUILD new file mode 100644 index 00000000..44be08d0 --- /dev/null +++ b/src/starkware/starknet/scripts/BUILD @@ -0,0 +1,15 @@ +package(default_visibility = ["//visibility:public"]) + +py_library( + name = "starknet_script_lib", + data = [ + "starknet", + "starknet-class-hash", + "starknet-compile-deprecated", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/starkware/starknet/cli:starknet_cli_lib", + "//src/starkware/starknet/compiler:starknet_compile_lib", + ], +) diff --git a/src/starkware/starknet/scripts/CMakeLists.txt b/src/starkware/starknet/scripts/CMakeLists.txt deleted file mode 100644 index 0fdf63ae..00000000 --- a/src/starkware/starknet/scripts/CMakeLists.txt +++ /dev/null @@ -1,12 +0,0 @@ -python_lib(starknet_script_lib - PREFIX starkware/starknet/scripts - FILES - starknet - starknet-class-hash - starknet-compile-deprecated - - LIBS - starknet_cli_lib - starknet_compile_lib - starknet_standard_wallets_lib -) diff --git a/src/starkware/starknet/scripts/starknet b/src/starkware/starknet/scripts/starknet index a015287a..8a9b083a 100755 --- a/src/starkware/starknet/scripts/starknet +++ b/src/starkware/starknet/scripts/starknet @@ -1,12 +1,11 @@ #!/usr/bin/env python3 +import asyncio import os import sys -import asyncio - -sys.path.insert(0, os.path.join(os.path.dirname(__file__), '../../..')) +sys.path.insert(0, os.path.join(os.path.dirname(__file__), "../../..")) from starkware.starknet.cli.starknet_cli import main # noqa -if __name__ == '__main__': +if __name__ == "__main__": sys.exit(asyncio.run(main())) diff --git a/src/starkware/starknet/scripts/starknet-class-hash b/src/starkware/starknet/scripts/starknet-class-hash old mode 100644 new mode 100755 index fbdf839e..7463e7c3 --- a/src/starkware/starknet/scripts/starknet-class-hash +++ b/src/starkware/starknet/scripts/starknet-class-hash @@ -3,8 +3,8 @@ import os import sys -sys.path.insert(0, os.path.join(os.path.dirname(__file__), '../../..')) +sys.path.insert(0, os.path.join(os.path.dirname(__file__), "../../..")) from starkware.starknet.cli.class_hash import main # noqa -if __name__ == '__main__': +if __name__ == "__main__": sys.exit(main()) diff --git a/src/starkware/starknet/scripts/starknet-compile-deprecated b/src/starkware/starknet/scripts/starknet-compile-deprecated index c6998082..d90288a1 100755 --- a/src/starkware/starknet/scripts/starknet-compile-deprecated +++ b/src/starkware/starknet/scripts/starknet-compile-deprecated @@ -3,8 +3,8 @@ import os import sys -sys.path.insert(0, os.path.join(os.path.dirname(__file__), '../../..')) +sys.path.insert(0, os.path.join(os.path.dirname(__file__), "../../..")) from starkware.starknet.compiler.compile import main # noqa -if __name__ == '__main__': +if __name__ == "__main__": sys.exit(main()) diff --git a/src/starkware/starknet/security/BUILD b/src/starkware/starknet/security/BUILD new file mode 100644 index 00000000..ccbddf1e --- /dev/null +++ b/src/starkware/starknet/security/BUILD @@ -0,0 +1,67 @@ +load("//bazel_utils:python.bzl", "pytest_test") +load("//bazel_utils/python:defs.bzl", "requirement") + +package(default_visibility = ["//visibility:public"]) + +py_library( + name = "starknet_security_lib", + srcs = [ + "secure_hints.py", + "simple_references.py", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/starkware/cairo/lang/compiler:cairo_compile_lib", + "//src/starkware/starkware_utils:starkware_dataclasses_utils_lib", + requirement("marshmallow"), + requirement("marshmallow_dataclass"), + ], +) + +py_library( + name = "starknet_hints_whitelist_lib", + srcs = [ + "hints_whitelist.py", + ], + data = [ + "//src/starkware/starknet/security/whitelists:0.10.3.json", + "//src/starkware/starknet/security/whitelists:0.6.0.json", + "//src/starkware/starknet/security/whitelists:0.8.2.json", + "//src/starkware/starknet/security/whitelists:384_bit_prime_field.json", + "//src/starkware/starknet/security/whitelists:cairo_blake2s.json", + "//src/starkware/starknet/security/whitelists:cairo_keccak.json", + "//src/starkware/starknet/security/whitelists:cairo_secp.json", + "//src/starkware/starknet/security/whitelists:cairo_sha256.json", + "//src/starkware/starknet/security/whitelists:cairo_sha256_arbitrary_input_length.json", + "//src/starkware/starknet/security/whitelists:ec_bigint.json", + "//src/starkware/starknet/security/whitelists:ec_recover.json", + "//src/starkware/starknet/security/whitelists:encode_packed.json", + "//src/starkware/starknet/security/whitelists:latest.json", + "//src/starkware/starknet/security/whitelists:uint256_improvements.json", + "//src/starkware/starknet/security/whitelists:vrf.json", + ], + visibility = ["//visibility:public"], + deps = [ + "starknet_security_lib", + ], +) + +pytest_test( + name = "starknet_hints_latest_whitelist_test", + srcs = [ + "latest_whitelist_test.py", + "secure_hints_test.py", + "simple_references_test.py", + ], + data = [ + "starknet_common.cairo", + ], + visibility = ["//visibility:public"], + deps = [ + "starknet_security_lib", + "//src/starkware/cairo/lang:cairo_constants_lib", + "//src/starkware/python:starkware_python_utils_lib", + "//src/starkware/starknet/common:starknet_common_lib", + "//src/starkware/starknet/security:starknet_hints_whitelist_lib", + ], +) diff --git a/src/starkware/starknet/security/CMakeLists.txt b/src/starkware/starknet/security/CMakeLists.txt deleted file mode 100644 index e1931d91..00000000 --- a/src/starkware/starknet/security/CMakeLists.txt +++ /dev/null @@ -1,64 +0,0 @@ -python_lib(starknet_security_lib - PREFIX starkware/starknet/security - FILES - secure_hints.py - simple_references.py - - LIBS - cairo_compile_lib - starkware_dataclasses_utils_lib - pip_marshmallow - pip_marshmallow_dataclass -) - -full_python_test(starknet_hints_latest_whitelist_test - PREFIX starkware/starknet/security - PYTHON ${PYTHON_COMMAND} - TESTED_MODULES starkware/starknet/security - - FILES - latest_whitelist_test.py - secure_hints_test.py - simple_references_test.py - starknet_common.cairo - - LIBS - cairo_common_lib - cairo_constants_lib - starknet_common_lib - starknet_hints_whitelist_lib - starknet_security_lib - starkware_python_utils_lib - pip_pytest -) - -python_exe(starknet_hints_latest_whitelist_fix - VENV starknet_hints_latest_whitelist_test_venv - MODULE starkware.starknet.security.latest_whitelist_test - ARGS "--fix" -) - -python_lib(starknet_hints_whitelist_lib - PREFIX starkware/starknet/security - - FILES - hints_whitelist.py - whitelists/0.6.0.json - whitelists/0.8.2.json - whitelists/0.10.3.json - whitelists/384_bit_prime_field.json - whitelists/cairo_blake2s.json - whitelists/cairo_keccak.json - whitelists/cairo_secp.json - whitelists/cairo_sha256.json - whitelists/cairo_sha256_arbitrary_input_length.json - whitelists/ec_bigint.json - whitelists/ec_recover.json - whitelists/encode_packed.json - whitelists/latest.json - whitelists/uint256_improvements.json - whitelists/vrf.json - - LIBS - starknet_security_lib -) diff --git a/src/starkware/starknet/security/whitelists/BUILD b/src/starkware/starknet/security/whitelists/BUILD new file mode 100644 index 00000000..a0b3cf8d --- /dev/null +++ b/src/starkware/starknet/security/whitelists/BUILD @@ -0,0 +1,3 @@ +package(default_visibility = ["//visibility:public"]) + +exports_files(glob(["*.json"])) diff --git a/src/starkware/starknet/security/whitelists/cairo_secp.json b/src/starkware/starknet/security/whitelists/cairo_secp.json index 5524324e..73315e07 100644 --- a/src/starkware/starknet/security/whitelists/cairo_secp.json +++ b/src/starkware/starknet/security/whitelists/cairo_secp.json @@ -87,6 +87,13 @@ "x = pack(ids.x, PRIME) % SECP_P" ] }, + { + "allowed_expressions": [], + "hint_lines": [ + "from starkware.cairo.common.cairo_secp.secp_utils import pack", + "value = pack(ids.x, PRIME) % SECP_P" + ] + }, { "allowed_expressions": [], "hint_lines": [ diff --git a/src/starkware/starknet/services/CMakeLists.txt b/src/starkware/starknet/services/CMakeLists.txt deleted file mode 100644 index 9b599545..00000000 --- a/src/starkware/starknet/services/CMakeLists.txt +++ /dev/null @@ -1,2 +0,0 @@ -add_subdirectory(api) -add_subdirectory(utils) diff --git a/src/starkware/starknet/services/api/BUILD b/src/starkware/starknet/services/api/BUILD new file mode 100644 index 00000000..5fcb1b0a --- /dev/null +++ b/src/starkware/starknet/services/api/BUILD @@ -0,0 +1,18 @@ +package(default_visibility = ["//visibility:public"]) + +py_library( + name = "starknet_messages_lib", + srcs = [ + "messages.py", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/services/everest/definitions:everest_definitions_lib", + "//src/starkware/cairo/bootloaders:cairo_bootloader_generate_fact_lib", + "//src/starkware/python:starkware_python_utils_lib", + "//src/starkware/starknet/business_logic/transaction:starknet_transaction_objects_lib", + "//src/starkware/starknet/definitions:starknet_definitions_lib", + "//src/starkware/starkware_utils:starkware_dataclasses_utils_lib", + "//src/starkware/starkware_utils:starkware_error_handling_lib", + ], +) diff --git a/src/starkware/starknet/services/api/CMakeLists.txt b/src/starkware/starknet/services/api/CMakeLists.txt deleted file mode 100644 index 479f55bc..00000000 --- a/src/starkware/starknet/services/api/CMakeLists.txt +++ /dev/null @@ -1,19 +0,0 @@ -add_subdirectory(feeder_gateway) -add_subdirectory(gateway) -add_subdirectory(contract_class) - -python_lib(starknet_messages_lib - PREFIX starkware/starknet/services/api - - FILES - messages.py - - LIBS - cairo_bootloader_generate_fact_lib - everest_definitions_lib - starknet_definitions_lib - starknet_transaction_objects_lib - starkware_dataclasses_utils_lib - starkware_error_handling_lib - starkware_python_utils_lib -) diff --git a/src/starkware/starknet/services/api/contract_class/BUILD b/src/starkware/starknet/services/api/contract_class/BUILD new file mode 100644 index 00000000..b7f4d668 --- /dev/null +++ b/src/starkware/starknet/services/api/contract_class/BUILD @@ -0,0 +1,36 @@ +load("//bazel_utils/python:defs.bzl", "requirement") + +package(default_visibility = ["//visibility:public"]) + +py_library( + name = "starknet_contract_class_lib", + srcs = [ + "contract_class.py", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/starkware/cairo/lang:cairo_constants_lib", + "//src/starkware/cairo/lang/compiler:cairo_compile_lib", + "//src/starkware/python:starkware_python_utils_lib", + "//src/starkware/starknet/definitions:starknet_definitions_lib", + "//src/starkware/starknet/public:starknet_abi_lib", + "//src/starkware/starkware_utils:starkware_dataclasses_utils_lib", + "//src/starkware/starkware_utils:starkware_error_handling_lib", + "//src/starkware/starkware_utils:starkware_utils_lib", + requirement("marshmallow"), + requirement("marshmallow_dataclass"), + ], +) + +py_library( + name = "starknet_contract_class_utils_lib", + srcs = [ + "contract_class_utils.py", + ], + visibility = ["//visibility:public"], + deps = [ + "starknet_contract_class_lib", + "//src/starkware/cairo/lang/compiler:cairo_compile_lib", + "//src/starkware/starknet/compiler/v1:starknet_compile_v1_lib", + ], +) diff --git a/src/starkware/starknet/services/api/contract_class/CMakeLists.txt b/src/starkware/starknet/services/api/contract_class/CMakeLists.txt deleted file mode 100644 index 5e85deb0..00000000 --- a/src/starkware/starknet/services/api/contract_class/CMakeLists.txt +++ /dev/null @@ -1,31 +0,0 @@ -python_lib(starknet_contract_class_lib - PREFIX starkware/starknet/services/api/contract_class - - FILES - contract_class.py - - LIBS - cairo_compile_lib - cairo_constants_lib - starknet_abi_lib - starknet_definitions_lib - starkware_dataclasses_utils_lib - starkware_error_handling_lib - starkware_python_utils_lib - starkware_utils_lib - pip_marshmallow - pip_marshmallow_dataclass -) - -python_lib(starknet_contract_class_utils_lib - PREFIX starkware/starknet/services/api/contract_class - PYTHON ${PYTHON_COMMAND} - - FILES - contract_class_utils.py - - LIBS - cairo_compile_lib - starknet_compile_v1_lib - starknet_contract_class_lib -) diff --git a/src/starkware/starknet/services/api/contract_class/contracts/test_contract_cairo1.cairo b/src/starkware/starknet/services/api/contract_class/contracts/test_contract_cairo1.cairo deleted file mode 100644 index 445fff35..00000000 --- a/src/starkware/starknet/services/api/contract_class/contracts/test_contract_cairo1.cairo +++ /dev/null @@ -1,171 +0,0 @@ -#[contract] -mod TestContract { - use starknet::storage_read_syscall; - use starknet::storage_write_syscall; - use starknet::syscalls::emit_event_syscall; - use starknet::syscalls::send_message_to_l1_syscall; - use starknet::StorageAddress; - use starknet::ContractAddress; - use starknet::storage_access::storage_base_address_from_felt252; - use starknet::storage_access::storage_address_from_base_and_offset; - use starknet::class_hash::ClassHash; - use starknet::class_hash::ClassHashSerde; - use starknet::ContractAddressIntoFelt252; - use traits::Into; - use array::SpanTrait; - use array::ArrayTrait; - use box::BoxTrait; - use dict::Felt252DictTrait; - - const UNEXPECTED_ERROR: felt252 = 'UNEXPECTED ERROR'; - - struct Storage { - my_storage_var: felt252, - public_key: felt252 - } - - #[constructor] - fn constructor() { - public_key::write('public_key'); - } - - #[external] - fn test(ref arg: felt252, arg1: felt252, arg2: felt252) -> felt252 { - let x = my_storage_var::read(); - my_storage_var::write(x + 1); - x + 1 - } - - #[external] - fn test_storage_read(address: felt252) -> felt252 { - let domain_address = 0_u32; // Only address_domain 0 is currently supported. - let storage_address = storage_address_from_base_and_offset( - storage_base_address_from_felt252(address), 0_u8 - ); - storage_read_syscall(domain_address, storage_address).unwrap_syscall() - } - - #[external] - fn test_storage_write(address: felt252, value: felt252) { - let domain_address = 0_u32; // Only address_domain 0 is currently supported. - let storage_address = storage_address_from_base_and_offset( - storage_base_address_from_felt252(address), 0_u8 - ); - storage_write_syscall(domain_address, storage_address, value).unwrap_syscall(); - } - - #[external] - fn test_get_execution_info( - // Expected block info. - block_number: felt252, - block_timestamp: felt252, - sequencer_address: felt252, - // Expected transaction info. - version: felt252, - account_address: felt252, - max_fee: felt252, - chain_id: felt252, - nonce: felt252, - // Expected call info. - caller_address: felt252, - contract_address: felt252, - entry_point_selector: felt252, - ) { - let execution_info = starknet::get_execution_info().unbox(); - let block_info = execution_info.block_info.unbox(); - assert(block_info.block_number.into() == block_number, UNEXPECTED_ERROR); - assert(block_info.block_timestamp.into() == block_timestamp, UNEXPECTED_ERROR); - assert(block_info.sequencer_address.into() == sequencer_address, UNEXPECTED_ERROR); - - let tx_info = execution_info.tx_info.unbox(); - assert(tx_info.version == version, UNEXPECTED_ERROR); - assert(tx_info.account_contract_address.into() == account_address, UNEXPECTED_ERROR); - assert(tx_info.max_fee.into() == max_fee, UNEXPECTED_ERROR); - assert(tx_info.signature.len() == 1_u32, UNEXPECTED_ERROR); - let transaction_hash = *tx_info.signature.at(0_u32); - assert(tx_info.transaction_hash == transaction_hash, UNEXPECTED_ERROR); - assert(tx_info.chain_id == chain_id, UNEXPECTED_ERROR); - assert(tx_info.nonce == nonce, UNEXPECTED_ERROR); - - assert(execution_info.caller_address.into() == caller_address, UNEXPECTED_ERROR); - assert(execution_info.contract_address.into() == contract_address, UNEXPECTED_ERROR); - assert( - execution_info.entry_point_selector == entry_point_selector, UNEXPECTED_ERROR - ); - } - - #[external] - fn test_emit_event(keys: Array::, data: Array::) { - emit_event_syscall(keys.span(), data.span()).unwrap_syscall(); - } - - #[external] - fn test_send_message_to_l1(to_address: felt252, payload: Array::) { - send_message_to_l1_syscall(to_address, payload.span()).unwrap_syscall(); - } - - #[external] - fn test_emit_simple_event( - argument: felt252, my_array: Array::, another_argument: felt252 - ) { - simple_event(argument, my_array); - } - - #[event] - fn simple_event(argument: felt252, my_array: Array::) {} - - #[external] - fn test_call_contract( - contract_address: ContractAddress, entry_point_selector: felt252, calldata: Array:: - ) { - starknet::call_contract_syscall( - contract_address, entry_point_selector, calldata.span() - ).unwrap_syscall(); - } - - #[external] - fn test_library_call( - class_hash: ClassHash, entry_point_selector: felt252, calldata: Array:: - ) { - starknet::syscalls::library_call_syscall( - class_hash, entry_point_selector, calldata.span() - ).unwrap_syscall(); - } - - #[external] - fn assert_eq(x: felt252, y: felt252) -> felt252{ - assert(x == y, 'x != y'); - 'success' - } - - /// Tests the segment arena builtin, by creating dictionaries (`felt252_dict_new()` and - /// `squash()` use the segment arena builtin). - /// - /// Expected return value: 200. - #[external] - fn test_segment_arena() -> felt252 { - let mut x = felt252_dict_new::(); - let mut y = felt252_dict_new::(); - x.insert(0, 100); - y.insert(1, 200); - // x.get(1) returns 0 (the default value), y.get(1) returns 200. - let z = x.get(1) + y.get(1); - y.squash(); - x.squash(); - z - } - - #[external] - fn test_deploy( - class_hash: ClassHash, - contract_address_salt: felt252, - calldata: Array::, - deploy_from_zero: bool, - ) { - starknet::syscalls::deploy_syscall( - class_hash, contract_address_salt, calldata.span(), deploy_from_zero - ).unwrap_syscall(); - - } -} - diff --git a/src/starkware/starknet/services/api/feeder_gateway/BUILD b/src/starkware/starknet/services/api/feeder_gateway/BUILD new file mode 100644 index 00000000..ac755bb9 --- /dev/null +++ b/src/starkware/starknet/services/api/feeder_gateway/BUILD @@ -0,0 +1,66 @@ +load("//bazel_utils/python:defs.bzl", "requirement") + +package(default_visibility = ["//visibility:public"]) + +py_library( + name = "starknet_feeder_gateway_client_lib", + srcs = [ + "feeder_gateway_client.py", + ], + visibility = ["//visibility:public"], + deps = [ + "starknet_feeder_gateway_request_objects_lib", + "starknet_feeder_gateway_response_objects_lib", + "//src/services/everest/api/feeder_gateway:everest_feeder_gateway_client_lib", + "//src/services/external_api:services_external_api_lib", + "//src/starkware/starknet/definitions:starknet_definitions_lib", + "//src/starkware/starknet/services/api/gateway:starknet_transaction_lib", + "//src/starkware/starkware_utils:starkware_dataclasses_utils_lib", + requirement("typing_extensions"), + ], +) + +py_library( + name = "starknet_feeder_gateway_response_objects_lib", + srcs = [ + "response_objects.py", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/services/everest/api/feeder_gateway:everest_feeder_gateway_response_objects_lib", + "//src/services/everest/business_logic:everest_transaction_execution_objects_lib", + "//src/services/everest/definitions:everest_definitions_lib", + "//src/starkware/cairo/lang/vm:cairo_vm_lib", + "//src/starkware/eth:web3_wrapper_lib", + "//src/starkware/python:starkware_python_utils_lib", + "//src/starkware/starknet/business_logic/execution:starknet_transaction_execution_objects_lib", + "//src/starkware/starknet/business_logic/transaction:starknet_transaction_objects_lib", + "//src/starkware/starknet/definitions:starknet_definitions_lib", + "//src/starkware/starknet/services/api/contract_class:starknet_contract_class_lib", + "//src/starkware/starknet/services/api/gateway:starknet_transaction_utils_lib", + "//src/starkware/starkware_utils:starkware_dataclasses_field_utils_lib", + "//src/starkware/starkware_utils:starkware_dataclasses_utils_lib", + requirement("marshmallow"), + requirement("marshmallow_dataclass"), + requirement("marshmallow_enum"), + requirement("marshmallow_oneofschema"), + requirement("typing_extensions"), + requirement("web3"), + ], +) + +py_library( + name = "starknet_feeder_gateway_request_objects_lib", + srcs = [ + "request_objects.py", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/services/everest/definitions:everest_definitions_lib", + "//src/starkware/starknet/business_logic/execution:starknet_execute_entry_point_lib", + "//src/starkware/starknet/business_logic/transaction:starknet_transaction_objects_lib", + "//src/starkware/starknet/definitions:starknet_definitions_lib", + "//src/starkware/starkware_utils:starkware_dataclasses_utils_lib", + requirement("marshmallow_dataclass"), + ], +) diff --git a/src/starkware/starknet/services/api/feeder_gateway/CMakeLists.txt b/src/starkware/starknet/services/api/feeder_gateway/CMakeLists.txt deleted file mode 100644 index 2cab3d26..00000000 --- a/src/starkware/starknet/services/api/feeder_gateway/CMakeLists.txt +++ /dev/null @@ -1,59 +0,0 @@ -python_lib(starknet_feeder_gateway_client_lib - PREFIX starkware/starknet/services/api/feeder_gateway - - FILES - feeder_gateway_client.py - - LIBS - everest_feeder_gateway_client_lib - services_external_api_lib - starknet_definitions_lib - starknet_feeder_gateway_request_objects_lib - starknet_feeder_gateway_response_objects_lib - starknet_transaction_lib - starkware_dataclasses_utils_lib - pip_typing_extensions -) - -python_lib(starknet_feeder_gateway_response_objects_lib - PREFIX starkware/starknet/services/api/feeder_gateway - - FILES - response_objects.py - - LIBS - cairo_vm_lib - everest_definitions_lib - everest_feeder_gateway_response_objects_lib - everest_transaction_execution_objects_lib - starknet_contract_class_lib - starknet_definitions_lib - starknet_transaction_objects_lib - starknet_transaction_execution_objects_lib - starknet_transaction_utils_lib - starkware_dataclasses_field_utils_lib - starkware_dataclasses_utils_lib - starkware_python_utils_lib - pip_marshmallow - pip_marshmallow_dataclass - pip_marshmallow_enum - pip_marshmallow_oneofschema - pip_typing_extensions - pip_web3 - web3_wrapper_lib -) - -python_lib(starknet_feeder_gateway_request_objects_lib - PREFIX starkware/starknet/services/api/feeder_gateway - - FILES - request_objects.py - - LIBS - everest_definitions_lib - starknet_definitions_lib - starknet_execute_entry_point_lib - starknet_transaction_objects_lib - starkware_dataclasses_utils_lib - pip_marshmallow_dataclass -) diff --git a/src/starkware/starknet/services/api/feeder_gateway/response_objects.py b/src/starkware/starknet/services/api/feeder_gateway/response_objects.py index 87ab6258..b819bdc7 100644 --- a/src/starkware/starknet/services/api/feeder_gateway/response_objects.py +++ b/src/starkware/starknet/services/api/feeder_gateway/response_objects.py @@ -261,7 +261,7 @@ def from_internal(cls, internal_tx: InternalTransaction) -> "TransactionSpecific @marshmallow_dataclass.dataclass(frozen=True) # type: ignore[misc] class AccountTransactionSpecificInfo(TransactionSpecificInfo): max_fee: int = field(metadata=fields.fee_metadata) - signature: List[int] = field(metadata=fields.signature_as_hex_metadata) + signature: List[int] = field(metadata=fields.signature_metadata) nonce: Optional[int] = field(metadata=fields.optional_nonce_metadata) @property @@ -307,7 +307,7 @@ class DeploySpecificInfo(TransactionSpecificInfo): contract_address: int = field(metadata=fields.contract_address_metadata) contract_address_salt: int = field(metadata=fields.contract_address_salt_metadata) class_hash: Optional[int] = field(metadata=fields.OptionalClassHashIntField.metadata()) - constructor_calldata: List[int] = field(metadata=fields.call_data_as_hex_metadata) + constructor_calldata: List[int] = field(metadata=fields.calldata_as_hex_metadata) tx_type: ClassVar[TransactionType] = TransactionType.DEPLOY @@ -328,7 +328,7 @@ class DeployAccountSpecificInfo(AccountTransactionSpecificInfo): contract_address: int = field(metadata=fields.contract_address_metadata) contract_address_salt: int = field(metadata=fields.contract_address_salt_metadata) class_hash: int = field(metadata=fields.ClassHashIntField.metadata()) - constructor_calldata: List[int] = field(metadata=fields.call_data_as_hex_metadata) + constructor_calldata: List[int] = field(metadata=fields.calldata_as_hex_metadata) version: int = field(metadata=fields.tx_version_metadata) # Repeat `nonce` to narrow its type to non-optional int. nonce: int = field(metadata=fields.nonce_metadata) @@ -364,7 +364,7 @@ class InvokeSpecificInfo(AccountTransactionSpecificInfo): entry_point_selector: Optional[int] = field( metadata=fields.optional_entry_point_selector_metadata ) - calldata: List[int] = field(metadata=fields.call_data_as_hex_metadata) + calldata: List[int] = field(metadata=fields.calldata_as_hex_metadata) tx_type: ClassVar[TransactionType] = TransactionType.INVOKE_FUNCTION @@ -379,7 +379,9 @@ def remove_entry_point_type_and_make_selector_optional( if "entry_point_type" in data: del data["entry_point_type"] - version = fields.TransactionVersionField.load_value(data["version"]) + # Version field may be missing in old transactions. + raw_version = data.get("version", "0x0") + version = fields.TransactionVersionField.load_value(raw_version) if version != 0: data["entry_point_selector"] = None return data @@ -421,7 +423,7 @@ class L1HandlerSpecificInfo(TransactionSpecificInfo): contract_address: int = field(metadata=fields.contract_address_metadata) entry_point_selector: int = field(metadata=fields.entry_point_selector_metadata) nonce: Optional[int] = field(metadata=fields.optional_nonce_metadata) - calldata: List[int] = field(metadata=fields.call_data_as_hex_metadata) + calldata: List[int] = field(metadata=fields.calldata_as_hex_metadata) tx_type: ClassVar[TransactionType] = TransactionType.L1_HANDLER @@ -698,10 +700,16 @@ class BlockStateUpdate(ValidatedResponseObject): """ block_hash: Optional[int] = field(metadata=fields.optional_block_hash_metadata) - new_root: bytes = field(metadata=fields.state_root_metadata) + new_root: Optional[bytes] = field(metadata=fields.optional_state_root_metadata) old_root: bytes = field(metadata=fields.state_root_metadata) state_diff: StateDiff + def __post_init__(self): + super().__post_init__() + assert (self.block_hash is None) == ( + self.new_root is None + ), "new_root must appear in state update for any block other than pending block." + @dataclasses.dataclass(frozen=True) class OrderedL2ToL1MessageResponse(ValidatedDataclass): @@ -756,7 +764,7 @@ class FunctionInvocation(BaseResponseObject, SerializableMarshmallowDataclass): metadata=fields.L2AddressField.metadata(field_name="caller_address") ) contract_address: int = field(metadata=fields.contract_address_metadata) - calldata: List[int] = field(metadata=fields.call_data_as_hex_metadata) + calldata: List[int] = field(metadata=fields.calldata_as_hex_metadata) call_type: Optional[CallType] = field(metadata=nonrequired_optional_metadata) class_hash: Optional[int] = field(metadata=fields.OptionalClassHashIntField.metadata()) selector: Optional[int] = field(metadata=fields.optional_entry_point_selector_metadata) @@ -813,7 +821,7 @@ class TransactionTrace(ValidatedResponseObject): validate_invocation: Optional[FunctionInvocation] function_invocation: Optional[FunctionInvocation] fee_transfer_invocation: Optional[FunctionInvocation] - signature: List[int] = field(metadata=fields.signature_as_hex_metadata) + signature: List[int] = field(metadata=fields.signature_metadata) @marshmallow_dataclass.dataclass(frozen=True) diff --git a/src/starkware/starknet/services/api/gateway/BUILD b/src/starkware/starknet/services/api/gateway/BUILD new file mode 100644 index 00000000..93eff528 --- /dev/null +++ b/src/starkware/starknet/services/api/gateway/BUILD @@ -0,0 +1,50 @@ +load("//bazel_utils/python:defs.bzl", "requirement") + +package(default_visibility = ["//visibility:public"]) + +py_library( + name = "starknet_transaction_lib", + srcs = [ + "transaction.py", + ], + visibility = ["//visibility:public"], + deps = [ + "starknet_transaction_utils_lib", + "//src/services/everest/api/gateway:everest_transaction_lib", + "//src/starkware/starknet/core/os/contract_address:starknet_contract_address_lib", + "//src/starkware/starknet/core/os/transaction_hash:starknet_transaction_hash_lib", + "//src/starkware/starknet/definitions:starknet_definitions_lib", + "//src/starkware/starknet/definitions:starknet_general_config_lib", + "//src/starkware/starknet/public:starknet_abi_lib", + "//src/starkware/starknet/services/api/contract_class:starknet_contract_class_lib", + requirement("marshmallow"), + requirement("marshmallow_dataclass"), + requirement("marshmallow_enum"), + requirement("marshmallow_oneofschema"), + ], +) + +py_library( + name = "starknet_transaction_utils_lib", + srcs = [ + "transaction_utils.py", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/services/external_api:services_external_api_lib", + "//src/starkware/starknet/definitions:starknet_definitions_lib", + "//src/starkware/starkware_utils:starkware_error_handling_lib", + ], +) + +py_library( + name = "starknet_gateway_client_lib", + srcs = [ + "gateway_client.py", + ], + visibility = ["//visibility:public"], + deps = [ + "starknet_transaction_lib", + "//src/services/everest/api/gateway:everest_gateway_client_lib", + ], +) diff --git a/src/starkware/starknet/services/api/gateway/CMakeLists.txt b/src/starkware/starknet/services/api/gateway/CMakeLists.txt deleted file mode 100644 index 87ef0bd7..00000000 --- a/src/starkware/starknet/services/api/gateway/CMakeLists.txt +++ /dev/null @@ -1,43 +0,0 @@ -python_lib(starknet_transaction_lib - PREFIX starkware/starknet/services/api/gateway - - FILES - transaction.py - - LIBS - everest_transaction_lib - starknet_abi_lib - starknet_contract_address_lib - starknet_contract_class_lib - starknet_definitions_lib - starknet_general_config_lib - starknet_transaction_hash_lib - starknet_transaction_utils_lib - pip_marshmallow - pip_marshmallow_dataclass - pip_marshmallow_enum - pip_marshmallow_oneofschema -) - -python_lib(starknet_transaction_utils_lib - PREFIX starkware/starknet/services/api/gateway - - FILES - transaction_utils.py - - LIBS - services_external_api_lib - starknet_definitions_lib - starkware_error_handling_lib -) - -python_lib(starknet_gateway_client_lib - PREFIX starkware/starknet/services/api/gateway - - FILES - gateway_client.py - - LIBS - everest_gateway_client_lib - starknet_transaction_lib -) diff --git a/src/starkware/starknet/services/api/gateway/transaction.py b/src/starkware/starknet/services/api/gateway/transaction.py index eba7d3d0..de234d2f 100644 --- a/src/starkware/starknet/services/api/gateway/transaction.py +++ b/src/starkware/starknet/services/api/gateway/transaction.py @@ -330,7 +330,9 @@ def get_obj_type(self, obj: Transaction) -> str: def get_data_type(self, data: Dict[str, Any]) -> str: data_type = data.get(self.type_field) - version = fields.TransactionVersionField.load_value(data["version"]) + # Version field may be missing in old transactions. + raw_version = data.get("version", "0x0") + version = fields.TransactionVersionField.load_value(raw_version) if ( data_type == TransactionType.DECLARE.name and version in constants.DEPRECATED_DECLARE_VERSIONS diff --git a/src/starkware/starknet/services/api/messages.py b/src/starkware/starknet/services/api/messages.py index e7ef5b37..3e33953e 100644 --- a/src/starkware/starknet/services/api/messages.py +++ b/src/starkware/starknet/services/api/messages.py @@ -33,7 +33,7 @@ class StarknetMessageToL1(StarknetMessage): to_address: int = field( metadata=everest_fields.EthAddressIntField.metadata(field_name="to_address") ) - payload: List[int] = field(metadata=fields.felt_list_metadata) + payload: List[int] = field(metadata=fields.felt_as_hex_or_str_list_metadata) def encode(self) -> List[int]: return [self.from_address, self.to_address, len(self.payload)] + self.payload @@ -53,7 +53,7 @@ class StarknetMessageToL2(StarknetMessage): ) to_address: int = field(metadata=fields.L2AddressField.metadata(field_name="to_address")) l1_handler_selector: int - payload: List[int] = field(metadata=fields.felt_list_metadata) + payload: List[int] = field(metadata=fields.felt_as_hex_or_str_list_metadata) nonce: int = field(metadata=fields.nonce_metadata) def encode(self) -> List[int]: diff --git a/src/starkware/starknet/services/utils/BUILD b/src/starkware/starknet/services/utils/BUILD new file mode 100644 index 00000000..6b3048a3 --- /dev/null +++ b/src/starkware/starknet/services/utils/BUILD @@ -0,0 +1,22 @@ +package(default_visibility = ["//visibility:public"]) + +py_library( + name = "starknet_sequencer_api_utils_lib", + srcs = [ + "sequencer_api_utils.py", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/services/everest/api/gateway:everest_transaction_lib", + "//src/starkware/starknet/business_logic/execution:starknet_transaction_execution_objects_lib", + "//src/starkware/starknet/business_logic/state:starknet_business_logic_state_lib", + "//src/starkware/starknet/business_logic/transaction:starknet_transaction_fee_lib", + "//src/starkware/starknet/business_logic/transaction:starknet_transaction_objects_lib", + "//src/starkware/starknet/business_logic/transaction:starknet_transaction_state_objects_lib", + "//src/starkware/starknet/definitions:starknet_general_config_lib", + "//src/starkware/starknet/services/api/feeder_gateway:starknet_feeder_gateway_response_objects_lib", + "//src/starkware/starknet/services/api/gateway:starknet_transaction_lib", + "//src/starkware/starkware_utils:starkware_config_utils_lib", + "//src/starkware/starkware_utils:starkware_utils_lib", + ], +) diff --git a/src/starkware/starknet/services/utils/CMakeLists.txt b/src/starkware/starknet/services/utils/CMakeLists.txt deleted file mode 100644 index 08254b5f..00000000 --- a/src/starkware/starknet/services/utils/CMakeLists.txt +++ /dev/null @@ -1,19 +0,0 @@ -python_lib(starknet_sequencer_api_utils_lib - PREFIX starkware/starknet/services/utils - - FILES - sequencer_api_utils.py - - LIBS - everest_transaction_lib - starknet_business_logic_state_lib - starknet_feeder_gateway_response_objects_lib - starknet_general_config_lib - starknet_transaction_execution_objects_lib - starknet_transaction_fee_lib - starknet_transaction_lib - starknet_transaction_objects_lib - starknet_transaction_state_objects_lib - starkware_config_utils_lib - starkware_utils_lib -) diff --git a/src/starkware/starknet/solidity/BUILD b/src/starkware/starknet/solidity/BUILD new file mode 100644 index 00000000..526ba039 --- /dev/null +++ b/src/starkware/starknet/solidity/BUILD @@ -0,0 +1,57 @@ +load("//bazel_utils:solidity.bzl", "sol_contract", "sol_library") + +sol_library( + name = "starknet_messaging_sol", + srcs = [ + "IStarknetMessaging.sol", + "IStarknetMessagingEvents.sol", + "StarknetMessaging.sol", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/starkware/solidity/libraries:named_storage_sol", + ], +) + +sol_library( + name = "starknet_governance_sol", + srcs = [ + "StarknetGovernance.sol", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/starkware/solidity/components:governance_contract_sol", + ], +) + +sol_library( + name = "starknet_core_sol", + srcs = [ + "Output.sol", + "Starknet.sol", + "StarknetOperator.sol", + "StarknetState.sol", + ], + visibility = ["//visibility:public"], + deps = [ + "starknet_governance_sol", + "starknet_messaging_sol", + "//src/starkware/solidity/components:governance_contract_sol", + "//src/starkware/solidity/components:solidity_contracts_components_sol", + "//src/starkware/solidity/interfaces:solidity_contract_initializer_sol", + "//src/starkware/solidity/interfaces:solidity_contracts_interfaces_sol", + "//src/starkware/solidity/libraries:named_storage_sol", + ], +) + +sol_contract( + name = "starknet_core_contract", + contracts = [ + "Starknet.json", + ], + deps = [ + "starknet_core_sol", + ], +) + +package(default_visibility = ["//visibility:public"]) diff --git a/src/starkware/starknet/solidity/CMakeLists.txt b/src/starkware/starknet/solidity/CMakeLists.txt deleted file mode 100644 index 6fd2818b..00000000 --- a/src/starkware/starknet/solidity/CMakeLists.txt +++ /dev/null @@ -1,27 +0,0 @@ -include(solidity.cmake) - -python_lib(starknet_core_sol - PREFIX starkware/starknet/solidity - FILES - Output.sol - Starknet.sol - StarknetOperator.sol - StarknetState.sol - - LIBS - governance_contract_sol - named_storage_sol - solidity_contract_initializer_sol - solidity_contracts_interfaces_sol - solidity_contracts_components_sol - starknet_governance_sol - starknet_messaging_sol -) - -solidity_env(starknet_core_contract - CONTRACTS - Starknet - - LIBS - starknet_core_sol -) diff --git a/src/starkware/starknet/solidity/Output.sol b/src/starkware/starknet/solidity/Output.sol index d51a9138..95f56e9c 100644 --- a/src/starkware/starknet/solidity/Output.sol +++ b/src/starkware/starknet/solidity/Output.sol @@ -28,8 +28,9 @@ library CommitmentTreeUpdateOutput { library StarknetOutput { uint256 internal constant MERKLE_UPDATE_OFFSET = 0; uint256 internal constant BLOCK_NUMBER_OFFSET = 2; - uint256 internal constant CONFIG_HASH_OFFSET = 3; - uint256 internal constant HEADER_SIZE = 4; + uint256 internal constant BLOCK_HASH_OFFSET = 3; + uint256 internal constant CONFIG_HASH_OFFSET = 4; + uint256 internal constant HEADER_SIZE = 5; uint256 constant MESSAGE_TO_L1_FROM_ADDRESS_OFFSET = 0; uint256 constant MESSAGE_TO_L1_TO_ADDRESS_OFFSET = 1; diff --git a/src/starkware/starknet/solidity/Starknet.sol b/src/starkware/starknet/solidity/Starknet.sol index 91f3757d..81167cb4 100644 --- a/src/starkware/starknet/solidity/Starknet.sol +++ b/src/starkware/starknet/solidity/Starknet.sol @@ -26,12 +26,26 @@ contract Starknet is { using StarknetState for StarknetState.State; + // Indicates a change of the Starknet config hash. + event ConfigHashChanged( + address indexed changedBy, + uint256 oldConfigHash, + uint256 newConfigHash + ); + // Logs the new state following a state update. - event LogStateUpdate(uint256 globalRoot, int256 blockNumber); + event LogStateUpdate(uint256 globalRoot, int256 blockNumber, uint256 blockHash); // Logs a stateTransitionFact that was used to update the state. event LogStateTransitionFact(bytes32 stateTransitionFact); + // Indicates a change of the Starknet OS program hash. + event ProgramHashChanged( + address indexed changedBy, + uint256 oldProgramHash, + uint256 newProgramHash + ); + // Random storage slot tags. string internal constant PROGRAM_HASH_TAG = "STARKNET_1.0_INIT_PROGRAM_HASH_UINT"; string internal constant VERIFIER_ADDRESS_TAG = "STARKNET_1.0_INIT_VERIFIER_ADDRESS"; @@ -41,10 +55,12 @@ contract Starknet is string internal constant CONFIG_HASH_TAG = "STARKNET_1.0_STARKNET_CONFIG_HASH"; function setProgramHash(uint256 newProgramHash) external notFinalized onlyGovernance { + emit ProgramHashChanged(msg.sender, programHash(), newProgramHash); programHash(newProgramHash); } function setConfigHash(uint256 newConfigHash) external notFinalized onlyGovernance { + emit ConfigHashChanged(msg.sender, configHash(), newConfigHash); configHash(newConfigHash); } @@ -102,7 +118,7 @@ contract Starknet is } function validateInitData(bytes calldata data) internal view override { - require(data.length == 5 * 32, "ILLEGAL_INIT_DATA_SIZE"); + require(data.length == 6 * 32, "ILLEGAL_INIT_DATA_SIZE"); uint256 programHash_ = abi.decode(data[:32], (uint256)); require(programHash_ != 0, "BAD_INITIALIZATION"); } @@ -128,7 +144,7 @@ contract Starknet is Returns a string that identifies the contract. */ function identify() external pure override returns (string memory) { - return "StarkWare_Starknet_2023_5"; + return "StarkWare_Starknet_2023_6"; } /** @@ -145,6 +161,13 @@ contract Starknet is return state().blockNumber; } + /** + Returns the current block hash. + */ + function stateBlockHash() external view returns (uint256) { + return state().blockHash; + } + /** Updates the state of the StarkNet, based on a proof of the StarkNet OS that the state transition is valid. @@ -208,7 +231,7 @@ contract Starknet is // followed by storage changes. StarknetState.State storage state_ = state(); - emit LogStateUpdate(state_.globalRoot, state_.blockNumber); + emit LogStateUpdate(state_.globalRoot, state_.blockNumber, state_.blockHash); // Re-entrancy protection (see above). require(state_.blockNumber == initialBlockNumber + 1, "INVALID_FINAL_BLOCK_NUMBER"); } diff --git a/src/starkware/starknet/solidity/StarknetState.sol b/src/starkware/starknet/solidity/StarknetState.sol index 3fd648ef..981a0f94 100644 --- a/src/starkware/starknet/solidity/StarknetState.sol +++ b/src/starkware/starknet/solidity/StarknetState.sol @@ -7,11 +7,13 @@ library StarknetState { struct State { uint256 globalRoot; int256 blockNumber; + uint256 blockHash; } function copy(State storage state, State memory stateFrom) internal { state.globalRoot = stateFrom.globalRoot; state.blockNumber = stateFrom.blockNumber; + state.blockHash = stateFrom.blockHash; } /** @@ -26,6 +28,8 @@ library StarknetState { "INVALID_BLOCK_NUMBER" ); + state.blockHash = starknetOutput[StarknetOutput.BLOCK_HASH_OFFSET]; + uint256[] calldata commitment_tree_update = StarknetOutput.getMerkleUpdate(starknetOutput); require( state.globalRoot == CommitmentTreeUpdateOutput.getPrevRoot(commitment_tree_update), diff --git a/src/starkware/starknet/solidity/solidity.cmake b/src/starkware/starknet/solidity/solidity.cmake deleted file mode 100644 index d2cc6508..00000000 --- a/src/starkware/starknet/solidity/solidity.cmake +++ /dev/null @@ -1,19 +0,0 @@ -python_lib(starknet_governance_sol - PREFIX starkware/starknet/solidity - FILES - StarknetGovernance.sol - - LIBS - governance_contract_sol -) - -python_lib(starknet_messaging_sol - PREFIX starkware/starknet/solidity - FILES - IStarknetMessaging.sol - IStarknetMessagingEvents.sol - StarknetMessaging.sol - - LIBS - named_storage_sol -) diff --git a/src/starkware/starknet/starknet_rules.bzl b/src/starkware/starknet/starknet_rules.bzl new file mode 100644 index 00000000..62711533 --- /dev/null +++ b/src/starkware/starknet/starknet_rules.bzl @@ -0,0 +1,122 @@ +""" +Compiles a Cairo 1.0 Starknet contract to Sierra, and then to CASM. + +Both exe can be replaced if needed. +Arguments can be passed to the compiler by using `cairoopts`. + +Args: + main: The Cairo file to compile. + compiled_sierra_name: optional, the json file name to write the Sierra output to. + compiled_casm_name: optional, the json file name to write the CASM output to. + **kwargs: contains at least- compile_cairo_to_sierra_exe, compile_sierra_to_casm_exe, cairoopts. +""" + +load("//src/starkware/cairo/lang:cairo_rules.bzl", "CairoInfo") +load("//src/starkware/cairo:vars.bzl", "CAIRO_COMPILER_ARCHIVE") + +def get_transitive_cairo_srcs(srcs, deps): + """ + Returns the Cairo source files for a target and its transitive dependencies. + """ + return depset(srcs, transitive = [dep[CairoInfo].transitive_sources for dep in deps]) + +def _starknet_contract_impl(ctx): + compiled_sierra_name = ctx.outputs.compiled_sierra_name + compiled_casm_name = ctx.outputs.compiled_casm_name + if compiled_sierra_name == None and compiled_casm_name == None: + fail(msg = "At least one output file must be declared, either Sierra or Casm.") + + compile_cairo_to_sierra_exe = ctx.executable.compile_cairo_to_sierra_exe + compile_sierra_to_casm_exe = ctx.executable.compile_sierra_to_casm_exe + + trans_srcs = get_transitive_cairo_srcs(srcs = ctx.files.srcs, deps = ctx.attr.deps) + srcs_list = trans_srcs.to_list() + if ctx.file.cairo_project_file != None: + srcs_list.append(ctx.file.cairo_project_file) + + if compiled_sierra_name == None: + compiled_sierra_name = ctx.actions.declare_file(ctx.label.name + ".sierra.json") + outs = [] + else: + outs = [compiled_sierra_name] + + _compile_internal( + ctx = ctx, + srcs_list = srcs_list, + main = ctx.file.main, + compiled_file_name = compiled_sierra_name, + compile_exe = compile_cairo_to_sierra_exe, + outs = [compiled_sierra_name], + cairoopts = ctx.attr.cairoopts, + progress_message = "Compiling cairo to sierra %s..." % ctx.file.main.path, + ) + + if compiled_casm_name != None: + _compile_internal( + ctx = ctx, + srcs_list = [compiled_sierra_name], + main = compiled_sierra_name, + compiled_file_name = compiled_casm_name, + compile_exe = compile_sierra_to_casm_exe, + outs = [compiled_casm_name], + cairoopts = ctx.attr.cairoopts + ["--add-pythonic-hints"], + progress_message = "Compiling sierra to casm %s..." % ctx.file.main.path, + ) + outs.append(compiled_casm_name) + + return [DefaultInfo(files = depset(outs))] + +def _compile_internal( + ctx, + srcs_list, + main, + compiled_file_name, + compile_exe, + outs, + cairoopts, + progress_message): + ctx.actions.run( + executable = compile_exe, + # https://github.com/starkware-libs/cairo/blob/main/crates/cairo-lang-runner/README.md + # Arguments order: + # File to compile. + # Output file. + arguments = [ + main.path, + compiled_file_name.path, + ] + cairoopts, + inputs = srcs_list + [compile_exe] + ctx.files.compiler_data, + outputs = outs, + progress_message = progress_message, + ) + +starknet_contract = rule( + implementation = _starknet_contract_impl, + attrs = { + "srcs": attr.label_list(allow_files = [".cairo"]), + "deps": attr.label_list(providers = [CairoInfo]), + "compiler_data": attr.label_list( + allow_files = True, + default = ["@" + CAIRO_COMPILER_ARCHIVE], + ), + "compile_cairo_to_sierra_exe": attr.label( + default = Label("@" + CAIRO_COMPILER_ARCHIVE + "//:bin/starknet-compile"), + allow_files = True, + executable = True, + # See https://bazel.build/rules/rules#configurations. + cfg = "exec", + ), + "compile_sierra_to_casm_exe": attr.label( + default = Label("@" + CAIRO_COMPILER_ARCHIVE + "//:bin/starknet-sierra-compile"), + allow_files = True, + executable = True, + # See https://bazel.build/rules/rules#configurations. + cfg = "exec", + ), + "compiled_sierra_name": attr.output(), + "compiled_casm_name": attr.output(), + "cairoopts": attr.string_list(default = []), + "main": attr.label(allow_single_file = True, mandatory = True), + "cairo_project_file": attr.label(allow_single_file = True), + }, +) diff --git a/src/starkware/starknet/starknet_rules_v0.bzl b/src/starkware/starknet/starknet_rules_v0.bzl new file mode 100644 index 00000000..57be30d5 --- /dev/null +++ b/src/starkware/starknet/starknet_rules_v0.bzl @@ -0,0 +1,14 @@ +load("//src/starkware/cairo/lang:cairo_rules.bzl", "cairo_binary") + +def starknet_contract_v0( + name, + compiled_program_name, + cairo_compile_exe = "//src/starkware/starknet/compiler:starknet_compile_exe", + **kwargs): + cairo_binary( + name = name, + abi = "%s_abi.json" % name, + compiled_program_name = compiled_program_name, + cairo_compile_exe = cairo_compile_exe, + **kwargs + ) diff --git a/src/starkware/starknet/storage/BUILD b/src/starkware/starknet/storage/BUILD new file mode 100644 index 00000000..12c6414c --- /dev/null +++ b/src/starkware/starknet/storage/BUILD @@ -0,0 +1,19 @@ +package(default_visibility = ["//visibility:public"]) + +py_library( + name = "starknet_storage_lib", + srcs = [ + "starknet_storage.py", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/starkware/python:starkware_python_utils_lib", + "//src/starkware/starknet/definitions:starknet_definitions_lib", + "//src/starkware/starkware_utils:starkware_commitment_tree_facts_lib", + "//src/starkware/starkware_utils:starkware_commitment_tree_leaf_fact_utils_lib", + "//src/starkware/starkware_utils:starkware_dataclasses_utils_lib", + "//src/starkware/starkware_utils:starkware_utils_lib", + "//src/starkware/storage:starkware_abstract_storage_lib", + "//src/starkware/storage:starkware_storage_lib", + ], +) diff --git a/src/starkware/starknet/storage/CMakeLists.txt b/src/starkware/starknet/storage/CMakeLists.txt deleted file mode 100644 index ebb50af0..00000000 --- a/src/starkware/starknet/storage/CMakeLists.txt +++ /dev/null @@ -1,16 +0,0 @@ -python_lib(starknet_storage_lib - PREFIX starkware/starknet/storage - - FILES - starknet_storage.py - - LIBS - starknet_definitions_lib - starkware_abstract_storage_lib - starkware_commitment_tree_facts_lib - starkware_commitment_tree_leaf_fact_utils_lib - starkware_dataclasses_utils_lib - starkware_python_utils_lib - starkware_storage_lib - starkware_utils_lib -) diff --git a/src/starkware/starknet/testing/BUILD b/src/starkware/starknet/testing/BUILD new file mode 100644 index 00000000..2eee22ab --- /dev/null +++ b/src/starkware/starknet/testing/BUILD @@ -0,0 +1,128 @@ +load("//bazel_utils:solidity.bzl", "sol_contract", "sol_library") +load("//bazel_utils/python:defs.bzl", "requirement") +load("//bazel_utils:python.bzl", "pytest_test") + +sol_library( + name = "starknet_mock_messaging_sol", + srcs = [ + "MockStarknetMessaging.sol", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/starkware/starknet/solidity:starknet_messaging_sol", + ], +) + +sol_contract( + name = "mock_starknet_messaging_sol_env", + contracts = [ + "MockStarknetMessaging.json", + ], + deps = [ + "starknet_mock_messaging_sol", + ], +) + +py_library( + name = "starknet_mock_messaging_contracts_lib", + srcs = [ + "contracts.py", + ], + data = [ + ":mock_starknet_messaging_sol_env", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/starkware/solidity:starkware_contracts_utils_lib", + ], +) + +pytest_test( + name = "starknet_testing_test", + srcs = [ + "conftest.py", + "contract_test.py", + "mock_starknet_messaging_test.py", + "postman_test.py", + "starknet_test.py", + ], + data = [ + "test.cairo", + "test_cairo1.cairo", + "test_unwhitelisted_hint.cairo", + ], + visibility = ["//visibility:public"], + deps = [ + "starknet_mock_messaging_contracts_lib", + "starknet_testing_lib", + "//src/starkware/cairo/common:cairo_common_lib", + "//src/starkware/eth:starkware_eth_test_utils_lib", + "//src/starkware/starknet/compiler/v1:starknet_compile_v1_lib", + "//src/starkware/starknet/core/test_contract:starknet_test_external_contract_test_utils_lib", + requirement("pytest_asyncio"), + ], +) + +py_library( + name = "starknet_testing_test_utils_lib", + srcs = [ + "test_utils.py", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/starkware/starknet/business_logic/transaction:starknet_transaction_objects_lib", + "//src/starkware/starknet/core/os/contract_address:starknet_contract_address_lib", + "//src/starkware/starknet/core/os/contract_class:starknet_os_abi_lib", + "//src/starkware/starknet/public:starknet_abi_lib", + "//src/starkware/starknet/services/api/contract_class:starknet_contract_class_lib", + ], +) + +package(default_visibility = ["//visibility:public"]) + +py_library( + name = "starknet_testing_lib", + srcs = [ + "contract.py", + "contract_utils.py", + "objects.py", + "postman.py", + "starknet.py", + "state.py", + ], + visibility = ["//visibility:public"], + deps = [ + "starknet_mock_messaging_contracts_lib", + "//src/starkware/cairo/lang/compiler:cairo_compile_lib", + "//src/starkware/cairo/lang/vm:cairo_vm_crypto_lib", + "//src/starkware/cairo/lang/vm:cairo_vm_lib", + "//src/starkware/eth:starkware_eth_test_utils_lib", + "//src/starkware/eth:web3_wrapper_lib", + "//src/starkware/python:starkware_python_utils_lib", + "//src/starkware/starknet/business_logic/execution:starknet_execute_entry_point_lib", + "//src/starkware/starknet/business_logic/execution:starknet_transaction_execution_objects_lib", + "//src/starkware/starknet/business_logic/fact_state:starknet_business_logic_fact_state_lib", + "//src/starkware/starknet/business_logic/fact_state:starknet_business_logic_patricia_state_lib", + "//src/starkware/starknet/business_logic/state:starknet_business_logic_state_lib", + "//src/starkware/starknet/business_logic/transaction:starknet_transaction_objects_lib", + "//src/starkware/starknet/compiler:starknet_compile_lib", + "//src/starkware/starknet/compiler/v1:starknet_compile_v1_lib", + "//src/starkware/starknet/core/os/contract_class:starknet_os_abi_lib", + "//src/starkware/starknet/core/test_contract:starknet_test_external_contract_test_utils_lib", + "//src/starkware/starknet/definitions:starknet_definitions_lib", + "//src/starkware/starknet/definitions:starknet_general_config_lib", + "//src/starkware/starknet/public:starknet_abi_lib", + "//src/starkware/starknet/services/api:starknet_messages_lib", + "//src/starkware/starknet/services/api/contract_class:starknet_contract_class_lib", + "//src/starkware/starknet/services/api/contract_class:starknet_contract_class_utils_lib", + "//src/starkware/starknet/services/api/feeder_gateway:starknet_feeder_gateway_response_objects_lib", + "//src/starkware/starknet/services/api/gateway:starknet_transaction_lib", + "//src/starkware/starknet/testing:starknet_testing_test_utils_lib", + "//src/starkware/starknet/utils:starknet_api_utils_lib", + "//src/starkware/starkware_utils:starkware_dataclasses_utils_lib", + "//src/starkware/storage:starkware_abstract_storage_lib", + "//src/starkware/storage:starkware_dict_storage_lib", + "//src/starkware/storage:starkware_storage_lib", + requirement("typeguard"), + ], +) diff --git a/src/starkware/starknet/testing/CMakeLists.txt b/src/starkware/starknet/testing/CMakeLists.txt deleted file mode 100644 index 94ba6702..00000000 --- a/src/starkware/starknet/testing/CMakeLists.txt +++ /dev/null @@ -1,111 +0,0 @@ -python_lib(starknet_mock_messaging_sol - PREFIX starkware/starknet/testing - FILES - MockStarknetMessaging.sol - - LIBS - starknet_messaging_sol -) - -solidity_env(mock_starknet_messaging_sol_env - CONTRACTS - MockStarknetMessaging - - LIBS - starknet_mock_messaging_sol -) - -python_lib(starknet_mock_messaging_contracts_lib - PREFIX starkware/starknet/testing - FILES - contracts.py - - LIBS - starkware_contracts_utils_lib - - ARTIFACTS - "${CMAKE_CURRENT_BINARY_DIR}/MockStarknetMessaging.json MockStarknetMessaging.json" -) -add_dependencies(starknet_mock_messaging_contracts_lib mock_starknet_messaging_sol_env) - -python_lib(starknet_testing_test_utils_lib - PREFIX starkware/starknet/testing - - FILES - test_utils.py - - LIBS - starknet_abi_lib - starknet_contract_address_lib - starknet_contract_class_lib - starknet_os_abi_lib - starknet_transaction_objects_lib -) - -python_lib(starknet_testing_lib - PREFIX starkware/starknet/testing - - FILES - contract.py - contract_utils.py - objects.py - postman.py - starknet.py - state.py - - LIBS - cairo_compile_lib - cairo_vm_crypto_lib - cairo_vm_lib - starknet_abi_lib - starknet_api_utils_lib - starknet_business_logic_fact_state_lib - starknet_business_logic_patricia_state_lib - starknet_business_logic_state_lib - starknet_compile_lib - starknet_contract_class_lib - starknet_definitions_lib - starknet_execute_entry_point_lib - starknet_feeder_gateway_response_objects_lib - starknet_general_config_lib - starknet_test_external_contract_test_utils_lib - starknet_testing_test_utils_lib - starknet_transaction_objects_lib - starknet_messages_lib - starknet_mock_messaging_contracts_lib - starknet_os_abi_lib - starknet_test_external_contract_test_utils_lib - starknet_transaction_execution_objects_lib - starknet_transaction_lib - starkware_abstract_storage_lib - starkware_dataclasses_utils_lib - starkware_dict_storage_lib - starkware_eth_test_utils_lib - starkware_python_utils_lib - starkware_storage_lib - pip_typeguard - web3_wrapper_lib -) - -full_python_test(starknet_testing_test - PREFIX starkware/starknet/testing - PYTHON ${PYTHON_COMMAND} - TESTED_MODULES starkware/starknet/testing - - FILES - conftest.py - contract_test.py - mock_starknet_messaging_test.py - postman_test.py - starknet_test.py - test.cairo - test_unwhitelisted_hint.cairo - - LIBS - cairo_common_lib - starknet_mock_messaging_contracts_lib - starknet_testing_lib - starkware_eth_test_utils_lib - pip_pytest - pip_pytest_asyncio -) diff --git a/src/starkware/starknet/testing/contract.py b/src/starkware/starknet/testing/contract.py index 39cb4e44..1f9b1c54 100644 --- a/src/starkware/starknet/testing/contract.py +++ b/src/starkware/starknet/testing/contract.py @@ -2,7 +2,7 @@ import sys import types from collections import namedtuple -from typing import Any, Callable, Dict, List, Tuple +from typing import Any, Callable, Dict, List, Optional, Tuple from typeguard import check_type @@ -19,6 +19,7 @@ from starkware.starknet.public.abi import AbiType from starkware.starknet.testing.contract_utils import ( RAW_OUTPUT_ARG_LIST, + CastableToAddress, EventManager, StructManager, build_arguments, @@ -26,7 +27,7 @@ parse_arguments, ) from starkware.starknet.testing.objects import StarknetCallInfo -from starkware.starknet.testing.state import CastableToAddress, StarknetState +from starkware.starknet.testing.state import StarknetState from starkware.starknet.utils.api_utils import cast_to_felts # Represents Python types, in particular those that are parallel to the cairo ones: @@ -52,12 +53,10 @@ def __init__( state: StarknetState, abi: AbiType, contract_address: CastableToAddress, - deploy_call_info: StarknetCallInfo, + constructor_call_info: Optional[StarknetCallInfo] = None, ): self.state = state self.abi = abi - self.deploy_call_info = deploy_call_info - self.struct_manager = StructManager(abi=abi) self.event_manager = EventManager(abi=abi) @@ -72,6 +71,7 @@ def __init__( contract_address = int(contract_address, 16) assert isinstance(contract_address, int) self.contract_address = contract_address + self.constructor_call_info = constructor_call_info def __dir__(self): return list(object.__dir__(self)) + list(self._abi_function_mapping.keys()) @@ -243,10 +243,7 @@ def replace_abi( implementation contract. """ return StarknetContract( - state=self.state, - abi=impl_contract_abi, - contract_address=self.contract_address, - deploy_call_info=self.deploy_call_info, + state=self.state, abi=impl_contract_abi, contract_address=self.contract_address ) diff --git a/src/starkware/starknet/testing/contract_test.py b/src/starkware/starknet/testing/contract_test.py index c3e62269..1930586a 100644 --- a/src/starkware/starknet/testing/contract_test.py +++ b/src/starkware/starknet/testing/contract_test.py @@ -25,33 +25,27 @@ async def starknet() -> Starknet: @pytest_asyncio.fixture async def test_contract(starknet: Starknet) -> StarknetContract: - return await starknet.deploy( - source=CONTRACT_FILE, - constructor_calldata=[], - ) + declare_info = await starknet.deprecated_declare(source=CONTRACT_FILE) + return await starknet.deploy(class_hash=declare_info.class_hash, constructor_calldata=[]) @pytest_asyncio.fixture async def test_class(starknet: Starknet) -> DeclaredClass: - return await starknet.declare(source=CONTRACT_FILE) + return await starknet.deprecated_declare(source=CONTRACT_FILE) @pytest_asyncio.fixture async def proxy_contract(starknet: Starknet) -> StarknetContract: contract_class = get_deprecated_compiled_class("delegate_proxy") - return await starknet.deploy( - constructor_calldata=[], - contract_class=contract_class, - ) + declare_info = await starknet.deprecated_declare(contract_class=contract_class) + return await starknet.deploy(constructor_calldata=[], class_hash=declare_info.class_hash) @pytest_asyncio.fixture async def account_contract(starknet: Starknet) -> StarknetContract: contract_class = get_deprecated_compiled_class("dummy_account") - return await starknet.deploy( - constructor_calldata=[], - contract_class=contract_class, - ) + declare_info = await starknet.deprecated_declare(contract_class=contract_class) + return await starknet.deploy(constructor_calldata=[], class_hash=declare_info.class_hash) # Tests. diff --git a/src/starkware/starknet/testing/contract_utils.py b/src/starkware/starknet/testing/contract_utils.py index a6e1b1e5..65c91fd0 100644 --- a/src/starkware/starknet/testing/contract_utils.py +++ b/src/starkware/starknet/testing/contract_utils.py @@ -12,14 +12,18 @@ from starkware.cairo.lang.compiler.identifier_definition import StructDefinition from starkware.cairo.lang.compiler.parser import parse_type from starkware.cairo.lang.compiler.type_system import mark_type_resolved -from starkware.python.utils import as_non_optional, assert_exhausted -from starkware.starknet.business_logic.execution.objects import Event, TransactionExecutionInfo +from starkware.python.utils import assert_exhausted +from starkware.starknet.business_logic.execution.objects import CallInfo, Event from starkware.starknet.compiler.compile import compile_starknet_files from starkware.starknet.public.abi import AbiType, get_selector_from_name from starkware.starknet.public.abi_structs import struct_definition_from_abi_entry from starkware.starknet.services.api.contract_class.contract_class import DeprecatedCompiledClass from starkware.starknet.testing.objects import Dataclass, StarknetCallInfo +CastableToFelt = Union[str, int] +CastableToAddress = CastableToFelt +CastableToAddressSalt = CastableToFelt + EventIdentifier = Union[str, int] RAW_OUTPUT_ARG_LIST = ["retdata_size", "retdata"] @@ -211,12 +215,9 @@ def build_arg( return res -def execution_info_to_call_info( - execution_info: TransactionExecutionInfo, abi: AbiType -) -> StarknetCallInfo: +def external_call_info_from_internal(call_info: CallInfo, abi: AbiType) -> StarknetCallInfo: event_manager = EventManager(abi=abi) struct_manager = StructManager(abi=abi) - call_info = as_non_optional(execution_info.call_info) events = call_info.get_sorted_events() main_events = event_manager.build_events(raw_events=events, struct_manager=struct_manager) return StarknetCallInfo.from_internal( @@ -311,3 +312,11 @@ def gather_deprecated_compiled_class( assert cairo_path is None, "The cairo_path argument can only be used with the source argument." assert contract_class is not None return contract_class + + +def cast_to_int(value: CastableToFelt) -> int: + if isinstance(value, str): + return int(value, 16) + + assert isinstance(value, int) + return value diff --git a/src/starkware/starknet/testing/postman.py b/src/starkware/starknet/testing/postman.py index a49c155d..bf02c208 100644 --- a/src/starkware/starknet/testing/postman.py +++ b/src/starkware/starknet/testing/postman.py @@ -1,7 +1,7 @@ from typing import Type, TypeVar from starkware.eth.eth_test_utils import EthContract, EthTestUtils -from starkware.eth.web3_wrapper import web3_contract_create_filter_fix +from starkware.eth.web3_wrapper import web3_contract_event_fix from starkware.starknet.services.api.feeder_gateway.response_objects import LATEST_BLOCK_ID from starkware.starknet.testing.contracts import MockStarknetMessaging from starkware.starknet.testing.starknet import Starknet @@ -21,7 +21,7 @@ def __init__( # Create a filter to collect LogMessageToL2 events. w3_contract = self.mock_starknet_messaging_contract.w3_contract - web3_contract_create_filter_fix(w3_contract.events.LogMessageToL2) + web3_contract_event_fix(w3_contract.events.LogMessageToL2) self.message_to_l2_filter = w3_contract.events.LogMessageToL2.create_filter( # type: ignore fromBlock=LATEST_BLOCK_ID ) diff --git a/src/starkware/starknet/testing/postman_test.py b/src/starkware/starknet/testing/postman_test.py index c4a7f38a..52126b21 100644 --- a/src/starkware/starknet/testing/postman_test.py +++ b/src/starkware/starknet/testing/postman_test.py @@ -20,7 +20,8 @@ async def postman(eth_test_utils: EthTestUtils) -> Postman: @pytest_asyncio.fixture async def test_contract(postman: Postman) -> StarknetContract: - return await postman.starknet.deploy(source=CONTRACT_FILE) + declare_info = await postman.starknet.deprecated_declare(source=CONTRACT_FILE) + return await postman.starknet.deploy(class_hash=declare_info.class_hash) @pytest.mark.asyncio diff --git a/src/starkware/starknet/testing/starknet.py b/src/starkware/starknet/testing/starknet.py index 99c64e58..fae71841 100644 --- a/src/starkware/starknet/testing/starknet.py +++ b/src/starkware/starknet/testing/starknet.py @@ -1,28 +1,40 @@ import copy -from typing import List, Optional, Union +from typing import List, MutableMapping, Optional, Union +from starkware.python.utils import as_non_optional from starkware.starknet.business_logic.execution.objects import TransactionExecutionInfo from starkware.starknet.business_logic.transaction.objects import ( InternalDeployAccount, InternalL1Handler, ) +from starkware.starknet.compiler.v1.compile import JsonObject from starkware.starknet.core.os.contract_class.deprecated_class_hash import ( compute_deprecated_class_hash, ) from starkware.starknet.core.test_contract.test_utils import get_deprecated_compiled_class -from starkware.starknet.definitions import fields +from starkware.starknet.definitions import constants, fields from starkware.starknet.definitions.general_config import StarknetGeneralConfig -from starkware.starknet.public.abi import get_selector_from_name -from starkware.starknet.services.api.contract_class.contract_class import DeprecatedCompiledClass +from starkware.starknet.public.abi import AbiType, get_selector_from_name +from starkware.starknet.services.api.contract_class.contract_class import ( + ContractClass, + DeprecatedCompiledClass, +) +from starkware.starknet.services.api.contract_class.contract_class_utils import ( + load_sierra, + load_sierra_from_dict, +) from starkware.starknet.services.api.messages import StarknetMessageToL1 from starkware.starknet.testing.contract import DeclaredClass, StarknetContract from starkware.starknet.testing.contract_utils import ( - execution_info_to_call_info, + CastableToAddress, + CastableToAddressSalt, + CastableToFelt, + cast_to_int, + external_call_info_from_internal, gather_deprecated_compiled_class, get_deprecated_compiled_class_abi, ) -from starkware.starknet.testing.state import CastableToAddress, CastableToAddressSalt, StarknetState -from starkware.starknet.testing.test_utils import create_internal_deploy_tx_for_testing +from starkware.starknet.testing.state import StarknetState class Starknet: @@ -30,25 +42,39 @@ class Starknet: A high level interface to a StarkNet state object. Example: starknet = await Starknet.empty() - contract = await starknet.deploy('contract.cairo') + declare_info = await starknet.deprecated_declare(source='contract.cairo') + contract = await starknet.deploy(class_hash=declare_info.class_hash) await contract.foo(a=1, b=[2, 3]).execute() """ - def __init__(self, state: StarknetState): + def __init__( + self, state: StarknetState, default_account_address: Optional[CastableToAddress] = None + ): self.state = state # l1_to_l2_nonce starts from 2**128 to avoid nonce collisions with # messages that were sent using starkware.starknet.testing.postman.Postman. self.l1_to_l2_nonce = 2**128 + self.class_hash_to_abi: MutableMapping[int, AbiType] = {} + self._default_account_address = default_account_address + + @property + def default_account_address(self) -> CastableToAddress: + assert ( + self._default_account_address is not None + ), "Default account address is not initialized." + return self._default_account_address @classmethod async def empty(cls, general_config: Optional[StarknetGeneralConfig] = None) -> "Starknet": - return Starknet(state=await StarknetState.empty(general_config=general_config)) + starknet = Starknet(state=await StarknetState.empty(general_config=general_config)) + starknet._default_account_address = await starknet.deploy_simple_account() + return starknet def copy(self) -> "Starknet": return copy.deepcopy(self) - async def declare( + async def deprecated_declare( self, source: Optional[str] = None, contract_class: Optional[DeprecatedCompiledClass] = None, @@ -65,42 +91,78 @@ async def declare( cairo_path=cairo_path, disable_hint_validation=disable_hint_validation, ) - class_hash, _ = await self.state.declare(contract_class=contract_class) - assert class_hash is not None - return DeclaredClass( - class_hash=class_hash, - abi=get_deprecated_compiled_class_abi(contract_class=contract_class), + class_hash, _ = await self.state.deprecated_declare(contract_class=contract_class) + abi = get_deprecated_compiled_class_abi(contract_class=contract_class) + self.class_hash_to_abi[class_hash] = abi + return DeclaredClass(class_hash=class_hash, abi=abi) + + async def declare( + self, + abi: AbiType, + sierra_path: Optional[str] = None, + sierra_dict: Optional[JsonObject] = None, + contract_class: Optional[ContractClass] = None, + sender_address: Optional[CastableToAddress] = None, + ) -> int: + """ + Declares a Cairo 1.0 contract class in the StarkNet network. + Returns the hash of the contract. + """ + assert (sierra_path is not None) + (sierra_dict is not None) + ( + contract_class is not None + ) == 1, "Exactly one of sierra_path, sierra_dict, contract_class should be supplied." + + if contract_class is None: + if sierra_path is not None: + contract_class = load_sierra(sierra_path=sierra_path) + else: + assert sierra_dict is not None + contract_class = load_sierra_from_dict(sierra_dict) + + if sender_address is None: + sender_address = self.default_account_address + + class_hash, _ = await self.state.declare( + contract_class=contract_class, sender_address=sender_address ) + self.class_hash_to_abi[class_hash] = abi + + return class_hash async def deploy( self, - source: Optional[str] = None, - contract_class: Optional[DeprecatedCompiledClass] = None, + class_hash: CastableToFelt, contract_address_salt: Optional[CastableToAddressSalt] = None, - cairo_path: Optional[List[str]] = None, constructor_calldata: Optional[List[int]] = None, - disable_hint_validation: bool = False, + sender_address: Optional[CastableToAddress] = None, ) -> StarknetContract: - contract_class = gather_deprecated_compiled_class( - source=source, - contract_class=contract_class, - cairo_path=cairo_path, - disable_hint_validation=disable_hint_validation, - ) - address, execution_info = await self.state.deploy( - contract_class=contract_class, - contract_address_salt=contract_address_salt, + if sender_address is None: + sender_address = self.default_account_address + + abi = self.class_hash_to_abi.get(cast_to_int(class_hash)) + assert abi is not None, f"Missing abi for class of hash {class_hash}." + + # Deploy. + deployed_contract_address, execution_info = await self.state.deploy( + class_hash=class_hash, constructor_calldata=[] if constructor_calldata is None else constructor_calldata, + sender_address=sender_address, + contract_address_salt=contract_address_salt, ) - abi = get_deprecated_compiled_class_abi(contract_class=contract_class) - deploy_call_info = execution_info_to_call_info(execution_info=execution_info, abi=abi) - return StarknetContract( + # Prepare the constructor call info and the StarknetContract object. + main_call_info = as_non_optional(execution_info.call_info) + (internal_constructor_call_info,) = main_call_info.internal_calls + constructor_call_info = external_call_info_from_internal( + call_info=internal_constructor_call_info, abi=abi + ) + deployed_contract = StarknetContract( state=self.state, abi=abi, - contract_address=address, - deploy_call_info=deploy_call_info, + contract_address=deployed_contract_address, + constructor_call_info=constructor_call_info, ) + return deployed_contract def consume_message_from_l2(self, from_address: int, to_address: int, payload: List[int]): """ @@ -119,7 +181,6 @@ async def send_message_to_l2( to_address: CastableToAddress, selector: Union[int, str], payload: List[int], - max_fee: int = 0, nonce: Optional[int] = None, paid_fee_on_l1: Optional[int] = None, ) -> TransactionExecutionInfo: @@ -129,10 +190,6 @@ async def send_message_to_l2( Takes an optional nonce paramater to force a specific nonce, this should only be used by the Postman class. """ - if isinstance(to_address, str): - to_address = int(to_address, 16) - assert isinstance(to_address, int) - if isinstance(selector, str): selector = get_selector_from_name(selector) assert isinstance(selector, int) @@ -142,7 +199,7 @@ async def send_message_to_l2( self.l1_to_l2_nonce += 1 tx = InternalL1Handler.create( - contract_address=to_address, + contract_address=cast_to_int(to_address), entry_point_selector=selector, calldata=[from_address, *payload], nonce=nonce, @@ -152,13 +209,14 @@ async def send_message_to_l2( return await self.state.execute_tx(tx=tx) - async def deploy_mock_account(self) -> int: + async def deploy_simple_account(self) -> int: """ - Declares and deploys a mock/dummy account contract and returns its address. + Declares and deploys the `dummy_account.cairo` contract and returns its address. + This contract has no signature validation nor multicall support. """ # Declare the dummy_account contract class. dummy_account_contract_class = get_deprecated_compiled_class("dummy_account") - await self.declare(contract_class=dummy_account_contract_class) + await self.deprecated_declare(contract_class=dummy_account_contract_class) general_config = self.state.general_config salt = fields.ContractAddressSalt.get_random_value() # Deploy the dummy_account contract. @@ -168,49 +226,10 @@ async def deploy_mock_account(self) -> int: contract_address_salt=salt, nonce=0, max_fee=0, - version=general_config.tx_version, + version=constants.TRANSACTION_VERSION, chain_id=general_config.chain_id.value, signature=[], ) await self.state.execute_tx(tx=deploy_account_tx) return deploy_account_tx.sender_address - - async def deploy_contract_from( - self, - contract_class: DeprecatedCompiledClass, - constructor_calldata: List[int], - deploy_from: int, - nonce: int, - signature: Optional[List[int]] = None, - ) -> StarknetContract: - """ - Declares and deploys a contract from a given address. - Note: deploy_from is currently assumed to be controlled by a mock account, so signing is not - required. - """ - # Declare contract class. - await self.declare(contract_class=contract_class) - # Construct the deployment tx. - salt = fields.ContractAddressSalt.get_random_value() - deployed_contract_address, deploy_tx = create_internal_deploy_tx_for_testing( - account_address=deploy_from, - contract_class=contract_class, - constructor_calldata=constructor_calldata, - salt=salt, - max_fee=0, - nonce=nonce, - signature=signature, - ) - # Execute the deployment tx. - execution_info = await self.state.execute_tx(tx=deploy_tx) - # Wrap and return the deployed contract. - abi = get_deprecated_compiled_class_abi(contract_class=contract_class) - deploy_call_info = execution_info_to_call_info(execution_info=execution_info, abi=abi) - deployed_contract = StarknetContract( - state=self.state, - abi=abi, - contract_address=deployed_contract_address, - deploy_call_info=deploy_call_info, - ) - return deployed_contract diff --git a/src/starkware/starknet/testing/starknet_test.py b/src/starkware/starknet/testing/starknet_test.py index a6ac6887..8b654733 100644 --- a/src/starkware/starknet/testing/starknet_test.py +++ b/src/starkware/starknet/testing/starknet_test.py @@ -6,11 +6,14 @@ from starkware.cairo.lang.compiler.preprocessor.preprocessor_error import PreprocessorError from starkware.starknet.compiler.compile import compile_starknet_files +from starkware.starknet.compiler.v1.compile import compile_cairo_to_sierra +from starkware.starknet.services.api.contract_class.contract_class import DeprecatedCompiledClass from starkware.starknet.testing.contract import StarknetContract from starkware.starknet.testing.starknet import Starknet CONTRACT_FILE = os.path.join(os.path.dirname(__file__), "test.cairo") HINT_CONTRACT_FILE = os.path.join(os.path.dirname(__file__), "test_unwhitelisted_hint.cairo") +TEST_CAIRO1_FILE = os.path.join(os.path.dirname(__file__), "test_cairo1.cairo") @pytest_asyncio.fixture @@ -18,16 +21,24 @@ async def starknet() -> Starknet: return await Starknet.empty() +@pytest.fixture(scope="session") +def contract_class() -> DeprecatedCompiledClass: + return compile_starknet_files(files=[CONTRACT_FILE]) + + +@pytest_asyncio.fixture +async def class_hash(starknet: Starknet, contract_class: DeprecatedCompiledClass) -> int: + declare_info = await starknet.deprecated_declare(contract_class=contract_class) + return declare_info.class_hash + + @pytest_asyncio.fixture -async def contract(starknet: Starknet) -> StarknetContract: - return await starknet.deploy(source=CONTRACT_FILE) +async def contract(starknet: Starknet, class_hash: int) -> StarknetContract: + return await starknet.deploy(class_hash=class_hash) @pytest.mark.asyncio async def test_basic(starknet: Starknet, contract: StarknetContract): - call_info = contract.deploy_call_info - assert call_info.result == () - call_info = await contract.increase_value(address=100, value=5).execute() assert call_info.result == () call_info = await contract.get_value(address=100).call() @@ -39,10 +50,6 @@ async def test_basic(starknet: Starknet, contract: StarknetContract): call_info = await contract.get_caller().execute(caller_address=1234) assert call_info.result == (1234,) - # Check deploy without compilation. - contract_class = compile_starknet_files(files=[CONTRACT_FILE]) - await starknet.deploy(contract_class=contract_class) - @pytest.mark.asyncio async def test_l2_to_l1_message(starknet: Starknet, contract: StarknetContract): @@ -80,10 +87,9 @@ async def test_l1_to_l2_message(starknet: Starknet, contract: StarknetContract): @pytest.mark.asyncio -async def test_contract_interaction(starknet: Starknet): - contract_class = compile_starknet_files([CONTRACT_FILE], debug_info=True) - contract = await starknet.deploy(contract_class=contract_class) - proxy_contract = await starknet.deploy(contract_class=contract_class) +async def test_contract_interaction(starknet: Starknet, class_hash: int): + contract = await starknet.deploy(class_hash=class_hash) + proxy_contract = await starknet.deploy(class_hash=class_hash) await proxy_contract.call_increase_value(contract.contract_address, 123, 234).execute() assert (await proxy_contract.get_value(123).execute()).result == (0,) @@ -91,9 +97,8 @@ async def test_contract_interaction(starknet: Starknet): @pytest.mark.asyncio -async def test_struct_arrays(starknet: Starknet): - contract_class = compile_starknet_files([CONTRACT_FILE], debug_info=True) - contract = await starknet.deploy(contract_class=contract_class) +async def test_struct_arrays(starknet: Starknet, class_hash: int): + contract = await starknet.deploy(class_hash=class_hash) assert (await contract.transpose([(123, 234), (4, 5)]).execute()).result == ( [ contract.Point(x=123, y=4), @@ -116,21 +121,33 @@ async def test_declare_unwhitelisted_hint_contract(starknet: Starknet): "This may indicate that this library function cannot be used in StarkNet contracts." ), ): - await starknet.declare(source=HINT_CONTRACT_FILE) + await starknet.deprecated_declare(source=HINT_CONTRACT_FILE) # Check that declare() does not throw an error with disable_hint_validation. - await starknet.declare(source=HINT_CONTRACT_FILE, disable_hint_validation=True) + await starknet.deprecated_declare(source=HINT_CONTRACT_FILE, disable_hint_validation=True) @pytest.mark.asyncio -async def test_deploy_unwhitelisted_hint_contract(starknet: Starknet): - with pytest.raises( - PreprocessorError, - match=re.escape( - "This may indicate that this library function cannot be used in StarkNet contracts." - ), - ): - await starknet.deploy(source=HINT_CONTRACT_FILE) - - # Check that deploy() does not throw an error with disable_hint_validation. - await starknet.deploy(source=HINT_CONTRACT_FILE, disable_hint_validation=True) +async def test_cairo1_flow(starknet: Starknet): + sierra_dict = compile_cairo_to_sierra(cairo_path=TEST_CAIRO1_FILE) + abi = [ + { + "type": "function", + "name": "write", + "inputs": [{"name": "key", "type": "felt"}, {"name": "value", "type": "felt"}], + "outputs": [], + }, + { + "type": "function", + "name": "read", + "inputs": [{"name": "key", "type": "felt"}], + "outputs": [{"name": "value", "type": "felt"}], + }, + ] + class_hash = await starknet.declare(sierra_dict=sierra_dict, abi=abi) + contract = await starknet.deploy(class_hash=class_hash) + + key, value = 1991, 6 + call_info = await contract.write(key=key, value=value).execute() + call_info = await contract.read(key=key).call() + assert call_info.result == (value,) diff --git a/src/starkware/starknet/testing/state.py b/src/starkware/starknet/testing/state.py index 1ca7b5a4..1f168e7b 100644 --- a/src/starkware/starknet/testing/state.py +++ b/src/starkware/starknet/testing/state.py @@ -2,7 +2,6 @@ from typing import List, MutableMapping, Optional, Tuple, Union from starkware.cairo.lang.vm.crypto import pedersen_hash_func -from starkware.python.utils import from_bytes from starkware.starknet.business_logic.execution.execute_entry_point import ExecuteEntryPoint from starkware.starknet.business_logic.execution.objects import ( CallInfo, @@ -16,35 +15,46 @@ from starkware.starknet.business_logic.state.state_api_objects import BlockInfo from starkware.starknet.business_logic.transaction.objects import ( InternalDeclare, - InternalDeploy, InternalInvokeFunction, InternalTransaction, ) +from starkware.starknet.core.os.contract_class.compiled_class_hash import ( + compute_compiled_class_hash, +) from starkware.starknet.definitions import constants, fields from starkware.starknet.definitions.general_config import StarknetGeneralConfig from starkware.starknet.public.abi import get_selector_from_name from starkware.starknet.services.api.contract_class.contract_class import ( + ContractClass, DeprecatedCompiledClass, EntryPointType, ) +from starkware.starknet.services.api.contract_class.contract_class_utils import ( + compile_contract_class, +) from starkware.starknet.services.api.gateway.transaction import DEFAULT_DECLARE_SENDER_ADDRESS from starkware.starknet.services.api.messages import StarknetMessageToL1 +from starkware.starknet.testing.contract_utils import ( + CastableToAddress, + CastableToAddressSalt, + CastableToFelt, + cast_to_int, +) +from starkware.starknet.testing.test_utils import create_internal_deploy_tx_for_testing from starkware.storage.dict_storage import DictStorage from starkware.storage.storage import FactFetchingContext -CastableToAddress = Union[str, int] -CastableToAddressSalt = Union[str, int] - class StarknetState: """ - StarkNet testing object. Represents a state of a StarkNet network. + Starknet testing object. Represents a state of a Starknet network. Example usage: - starknet = await StarknetState.empty() + state = await StarknetState.empty() contract_class = compile_starknet_files([CONTRACT_FILE], debug_info=True) - contract_address, _ = await starknet.deploy(contract_class=contract_class) - res = await starknet.invoke_raw( + class_hash, _ = await state.deprecated_declare(contract_class=contract_class) + contract_address, _ = await state.deploy(class_hash=class_hash) + res = await state.invoke_raw( contract_address=contract_address, selector="func", calldata=[1, 2]) """ @@ -79,7 +89,7 @@ async def empty(cls, general_config: Optional[StarknetGeneralConfig] = None) -> ffc = FactFetchingContext(storage=DictStorage(), hash_func=pedersen_hash_func) empty_shared_state = await SharedState.empty(ffc=ffc, general_config=general_config) state_reader = PatriciaStateReader( - global_state_root=empty_shared_state.contract_states, + contract_state_root=empty_shared_state.contract_states, contract_class_root=empty_shared_state.contract_classes, ffc=ffc, contract_class_storage=ffc.storage, @@ -87,12 +97,12 @@ async def empty(cls, general_config: Optional[StarknetGeneralConfig] = None) -> state = CachedState( block_info=BlockInfo.empty(sequencer_address=general_config.sequencer_address), state_reader=state_reader, - contract_class_cache={}, + compiled_class_cache={}, ) return cls(state=state, general_config=general_config) - async def declare( + async def deprecated_declare( self, contract_class: DeprecatedCompiledClass ) -> Tuple[int, TransactionExecutionInfo]: """ @@ -111,7 +121,41 @@ async def declare( signature=[], nonce=0, ) - self.state.contract_classes[tx.class_hash] = contract_class + self.state.compiled_classes[tx.class_hash] = contract_class + + with self.state.copy_and_apply() as state_copy: + tx_execution_info = await tx.apply_state_updates( + state=state_copy, general_config=self.general_config + ) + + return tx.class_hash, tx_execution_info + + async def declare( + self, + contract_class: ContractClass, + sender_address: CastableToAddress, + ) -> Tuple[int, TransactionExecutionInfo]: + """ + Declares a Cairo 1.0 contract class. + Returns the class hash and the execution info. + + Args: + contract_class - a compiled StarkNet contract. + """ + compiled_class = compile_contract_class(contract_class=contract_class) + compiled_class_hash = compute_compiled_class_hash(compiled_class=compiled_class) + sender_address = cast_to_int(sender_address) + tx = InternalDeclare.create( + contract_class=contract_class, + compiled_class_hash=compiled_class_hash, + chain_id=self.general_config.chain_id.value, + sender_address=sender_address, + max_fee=0, + version=constants.DECLARE_VERSION, + signature=[], + nonce=await self.state.get_nonce_at(contract_address=sender_address), + ) + self.state.compiled_classes[compiled_class_hash] = compiled_class with self.state.copy_and_apply() as state_copy: tx_execution_info = await tx.apply_state_updates( @@ -122,36 +166,39 @@ async def declare( async def deploy( self, - contract_class: DeprecatedCompiledClass, + class_hash: CastableToFelt, constructor_calldata: List[int], + sender_address: CastableToAddress, + max_fee: int = 0, contract_address_salt: Optional[CastableToAddressSalt] = None, ) -> Tuple[int, TransactionExecutionInfo]: """ - Deploys a contract. Returns the contract address and the execution info. + Deploys a contract by invoking the account contract's `deploy_contract` function. + Returns the contract address and the execution info. Args: - contract_class - a compiled StarkNet contract returned by compile_starknet_files(). + class_hash - a declared class hash. contract_address_salt - If supplied, a hexadecimal string or an integer representing the salt to use for deploying. Otherwise, the salt is randomized. """ if contract_address_salt is None: contract_address_salt = fields.ContractAddressSalt.get_random_value() - if isinstance(contract_address_salt, str): - contract_address_salt = int(contract_address_salt, 16) - assert isinstance(contract_address_salt, int) - tx = InternalDeploy.create( - contract_address_salt=contract_address_salt, + sender_address = cast_to_int(sender_address) + nonce = await self.state.get_nonce_at(contract_address=sender_address) + contract_address, tx = create_internal_deploy_tx_for_testing( + sender_address=sender_address, + class_hash=cast_to_int(class_hash), constructor_calldata=constructor_calldata, - contract_class=contract_class, + salt=cast_to_int(contract_address_salt), + nonce=nonce, + max_fee=max_fee, chain_id=self.general_config.chain_id.value, - version=constants.TRANSACTION_VERSION, ) - self.state.contract_classes[from_bytes(tx.contract_hash)] = contract_class tx_execution_info = await self.execute_tx(tx=tx) - return tx.contract_address, tx_execution_info + return contract_address, tx_execution_info async def invoke_raw( self, @@ -270,10 +317,7 @@ async def create_invoke_function( chain_id: int, only_query: bool = False, ) -> InternalInvokeFunction: - if isinstance(contract_address, str): - contract_address = int(contract_address, 16) - assert isinstance(contract_address, int) - + contract_address = cast_to_int(contract_address) if isinstance(selector, str): selector = get_selector_from_name(selector) assert isinstance(selector, int) diff --git a/src/starkware/starknet/testing/test_cairo1.cairo b/src/starkware/starknet/testing/test_cairo1.cairo new file mode 100644 index 00000000..0da0fd70 --- /dev/null +++ b/src/starkware/starknet/testing/test_cairo1.cairo @@ -0,0 +1,25 @@ +#[contract] +mod TestContract { + use starknet::storage_read_syscall; + use starknet::storage_write_syscall; + use starknet::storage_access::storage_base_address_from_felt252; + use starknet::storage_access::storage_address_from_base_and_offset; + + #[external] + fn read(key: felt252) -> felt252 { + let domain_address = 0_u32; // Only address_domain 0 is currently supported. + let storage_address = storage_address_from_base_and_offset( + storage_base_address_from_felt252(key), 0_u8 + ); + storage_read_syscall(domain_address, storage_address).unwrap_syscall() + } + + #[external] + fn write(key: felt252, value: felt252) { + let domain_address = 0_u32; // Only address_domain 0 is currently supported. + let storage_address = storage_address_from_base_and_offset( + storage_base_address_from_felt252(key), 0_u8 + ); + storage_write_syscall(domain_address, storage_address, value).unwrap_syscall(); + } +} diff --git a/src/starkware/starknet/testing/test_utils.py b/src/starkware/starknet/testing/test_utils.py index f5181419..d15036d5 100644 --- a/src/starkware/starknet/testing/test_utils.py +++ b/src/starkware/starknet/testing/test_utils.py @@ -4,11 +4,7 @@ from starkware.starknet.core.os.contract_address.contract_address import ( calculate_contract_address_from_hash, ) -from starkware.starknet.core.os.contract_class.deprecated_class_hash import ( - compute_deprecated_class_hash, -) from starkware.starknet.public.abi import get_selector_from_name -from starkware.starknet.services.api.contract_class.contract_class import DeprecatedCompiledClass class NonceManager: @@ -56,24 +52,24 @@ def diff(self, other_address_to_nonce: Dict[int, int]) -> Dict[int, int]: def create_internal_deploy_tx_for_testing( - account_address: int, - contract_class: DeprecatedCompiledClass, + sender_address: int, + class_hash: int, constructor_calldata: List[int], salt: int, max_fee: int, nonce: int, signature: Optional[List[int]] = None, + chain_id: Optional[int] = None, ) -> Tuple[int, InternalInvokeFunction]: """ Returns an InternalInvokeFunction object that deploys a contract - by calling the account's `deploy_contract` function. + by calling the dummy_account's `deploy_contract` function. """ - class_hash = compute_deprecated_class_hash(contract_class=contract_class) contract_address = calculate_contract_address_from_hash( salt=salt, class_hash=class_hash, constructor_calldata=constructor_calldata, - deployer_address=account_address, + deployer_address=sender_address, ) deploy_contract_calldata = [ class_hash, @@ -82,13 +78,14 @@ def create_internal_deploy_tx_for_testing( *constructor_calldata, ] deploy_tx = InternalInvokeFunction.create_wrapped_with_account( - account_address=account_address, - contract_address=account_address, + account_address=sender_address, + contract_address=sender_address, calldata=deploy_contract_calldata, entry_point_selector=get_selector_from_name("deploy_contract"), max_fee=max_fee, nonce=nonce, signature=signature, + chain_id=chain_id, ) return contract_address, deploy_tx diff --git a/src/starkware/starknet/third_party/CMakeLists.txt b/src/starkware/starknet/third_party/CMakeLists.txt deleted file mode 100644 index c1a1cb6a..00000000 --- a/src/starkware/starknet/third_party/CMakeLists.txt +++ /dev/null @@ -1 +0,0 @@ -add_subdirectory(open_zeppelin) diff --git a/src/starkware/starknet/third_party/open_zeppelin/BUILD b/src/starkware/starknet/third_party/open_zeppelin/BUILD new file mode 100644 index 00000000..0371fd21 --- /dev/null +++ b/src/starkware/starknet/third_party/open_zeppelin/BUILD @@ -0,0 +1,30 @@ +load("//src/starkware/starknet:starknet_rules_v0.bzl", "starknet_contract_v0") + +package(default_visibility = ["//visibility:public"]) + +starknet_contract_v0( + name = "account", + srcs = [ + "Account.cairo", + ], + cairoopts = ["--account_contract"], + compiled_program_name = "account.json", + main = "Account.cairo", + deps = [ + "//src/starkware/starknet/third_party/open_zeppelin/utils:constants", + ], +) + +py_library( + name = "open_zeppelin_contracts_lib", + srcs = [ + "starknet_contracts.py", + ], + data = ["account.json"], + visibility = ["//visibility:public"], + deps = [ + "//src/starkware/cairo/common:cairo_common_lib", + "//src/starkware/starknet/common:starknet_common_lib", + "//src/starkware/starknet/services/api/contract_class:starknet_contract_class_lib", + ], +) diff --git a/src/starkware/starknet/third_party/open_zeppelin/CMakeLists.txt b/src/starkware/starknet/third_party/open_zeppelin/CMakeLists.txt deleted file mode 100644 index edbf4130..00000000 --- a/src/starkware/starknet/third_party/open_zeppelin/CMakeLists.txt +++ /dev/null @@ -1,19 +0,0 @@ -starknet_compile(compile_open_zeppelin_account account.json Account.cairo "--account_contract") - -python_lib(open_zeppelin_contracts_lib - PREFIX starkware/starknet/third_party/open_zeppelin - - FILES - starknet_contracts.py - - ARTIFACTS - "${CMAKE_CURRENT_BINARY_DIR}/account.json account.json" - - LIBS - cairo_common_lib - starknet_common_lib - starknet_contract_class_lib -) -add_dependencies(open_zeppelin_contracts_lib - compile_open_zeppelin_account -) diff --git a/src/starkware/starknet/third_party/open_zeppelin/utils/BUILD b/src/starkware/starknet/third_party/open_zeppelin/utils/BUILD new file mode 100644 index 00000000..220c427d --- /dev/null +++ b/src/starkware/starknet/third_party/open_zeppelin/utils/BUILD @@ -0,0 +1,10 @@ +load("//src/starkware/cairo/lang:cairo_rules.bzl", "cairo_library") + +package(default_visibility = ["//visibility:public"]) + +cairo_library( + name = "constants", + srcs = [ + "constants.cairo", + ], +) diff --git a/src/starkware/starknet/utils/BUILD b/src/starkware/starknet/utils/BUILD new file mode 100644 index 00000000..210e475d --- /dev/null +++ b/src/starkware/starknet/utils/BUILD @@ -0,0 +1,12 @@ +package(default_visibility = ["//visibility:public"]) + +py_library( + name = "starknet_api_utils_lib", + srcs = [ + "api_utils.py", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/starkware/cairo/lang:cairo_constants_lib", + ], +) diff --git a/src/starkware/starknet/utils/CMakeLists.txt b/src/starkware/starknet/utils/CMakeLists.txt deleted file mode 100644 index 8b8cf03f..00000000 --- a/src/starkware/starknet/utils/CMakeLists.txt +++ /dev/null @@ -1,9 +0,0 @@ -python_lib(starknet_api_utils_lib - PREFIX starkware/starknet/utils - - FILES - api_utils.py - - LIBS - cairo_constants_lib -) diff --git a/src/starkware/starknet/wallets/BUILD b/src/starkware/starknet/wallets/BUILD new file mode 100644 index 00000000..907b2bf6 --- /dev/null +++ b/src/starkware/starknet/wallets/BUILD @@ -0,0 +1,40 @@ +package(default_visibility = ["//visibility:public"]) + +py_library( + name = "starknet_wallets_lib", + srcs = [ + "account.py", + "starknet_context.py", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/starkware/crypto:starkware_crypto_lib", + "//src/starkware/starknet/definitions:starknet_definitions_lib", + "//src/starkware/starknet/services/api/contract_class:starknet_contract_class_lib", + "//src/starkware/starknet/services/api/gateway:starknet_transaction_lib", + ], +) + +py_library( + name = "starknet_standard_wallets_lib", + srcs = [ + "open_zeppelin.py", + ], + visibility = ["//visibility:public"], + deps = [ + "starknet_wallets_lib", + "//src/services/external_api:services_external_api_lib", + "//src/starkware/cairo/common:cairo_common_lib", + "//src/starkware/crypto:starkware_crypto_lib", + "//src/starkware/starknet/core/os/contract_address:starknet_contract_address_lib", + "//src/starkware/starknet/core/os/contract_class:starknet_os_abi_lib", + "//src/starkware/starknet/core/os/transaction_hash:starknet_transaction_hash_lib", + "//src/starkware/starknet/definitions:starknet_definitions_lib", + "//src/starkware/starknet/public:starknet_abi_lib", + "//src/starkware/starknet/services/api/contract_class:starknet_contract_class_lib", + "//src/starkware/starknet/services/api/feeder_gateway:starknet_feeder_gateway_response_objects_lib", + "//src/starkware/starknet/services/api/gateway:starknet_transaction_lib", + "//src/starkware/starknet/third_party/open_zeppelin:open_zeppelin_contracts_lib", + "//src/starkware/starknet/utils:starknet_api_utils_lib", + ], +) diff --git a/src/starkware/starknet/wallets/CMakeLists.txt b/src/starkware/starknet/wallets/CMakeLists.txt deleted file mode 100644 index b4543125..00000000 --- a/src/starkware/starknet/wallets/CMakeLists.txt +++ /dev/null @@ -1,36 +0,0 @@ -python_lib(starknet_wallets_lib - PREFIX starkware/starknet/wallets - - FILES - account.py - starknet_context.py - - LIBS - starknet_contract_class_lib - starknet_definitions_lib - starknet_transaction_lib - starkware_crypto_lib -) - -python_lib(starknet_standard_wallets_lib - PREFIX starkware/starknet/wallets - - FILES - open_zeppelin.py - - LIBS - cairo_common_lib - open_zeppelin_contracts_lib - services_external_api_lib - starknet_abi_lib - starknet_api_utils_lib - starknet_contract_address_lib - starknet_contract_class_lib - starknet_definitions_lib - starknet_feeder_gateway_response_objects_lib - starknet_os_abi_lib - starknet_transaction_hash_lib - starknet_transaction_lib - starknet_wallets_lib - starkware_crypto_lib -) diff --git a/src/starkware/starkware_utils/BUILD b/src/starkware/starkware_utils/BUILD new file mode 100644 index 00000000..dab0df65 --- /dev/null +++ b/src/starkware/starkware_utils/BUILD @@ -0,0 +1,162 @@ +load("//bazel_utils/python:defs.bzl", "requirement") +load( + "//src/starkware/starkware_utils:vars.bzl", + "STARKWARE_UTILS_LIBS_ADDITIONAL_FILES", + "STARKWARE_UTILS_LIBS_ADDITIONAL_LIBS", +) + +py_library( + name = "starkware_utils_lib", + srcs = [ + "//src/starkware/starkware_utils/commitment_tree:binary_fact_tree.py", + "//src/starkware/starkware_utils/commitment_tree:binary_fact_tree_da_utils.py", + "//src/starkware/starkware_utils/commitment_tree:binary_fact_tree_node.py", + "//src/starkware/starkware_utils/commitment_tree:calculation.py", + "//src/starkware/starkware_utils/commitment_tree/merkle_tree:traverse_tree.py", + "//src/starkware/starkware_utils/commitment_tree/patricia_tree:virtual_calculation_node.py", + "//src/starkware/starkware_utils/commitment_tree/patricia_tree:nodes.py", + "//src/starkware/starkware_utils/commitment_tree/patricia_tree:patricia_tree.py", + "//src/starkware/starkware_utils/commitment_tree/patricia_tree:virtual_patricia_node.py", + "//src/starkware/starkware_utils/commitment_tree:update_tree.py", + "executor.py", + "subsequence.py", + ] + STARKWARE_UTILS_LIBS_ADDITIONAL_FILES, + visibility = ["//visibility:public"], + deps = [ + "//src/starkware/crypto:starkware_crypto_lib", + "starkware_config_utils_lib", + "starkware_custom_dict_utils_lib", + "starkware_dataclasses_field_utils_lib", + "starkware_error_handling_lib", + "starkware_serializability_utils_lib", + "//src/starkware/python:starkware_python_utils_lib", + requirement("marshmallow_dataclass"), + ] + STARKWARE_UTILS_LIBS_ADDITIONAL_LIBS, +) + +package(default_visibility = ["//visibility:public"]) + +py_library( + name = "starkware_serializability_utils_lib", + srcs = [ + "serializable.py", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/starkware/python:starkware_python_utils_lib", + ], +) + +py_library( + name = "starkware_error_handling_lib", + srcs = [ + "error_handling.py", + ], + visibility = ["//visibility:public"], + deps = [ + requirement("marshmallow"), + ], +) + +py_library( + name = "starkware_custom_dict_utils_lib", + srcs = [ + "custom_raising_dict.py", + ], + visibility = ["//visibility:public"], + deps = [ + requirement("frozendict"), + ], +) + +py_library( + name = "starkware_dataclasses_utils_lib", + srcs = [ + "marshmallow_dataclass_fields.py", + "serializable_dataclass.py", + "validated_dataclass.py", + "validated_fields.py", + ], + visibility = ["//visibility:public"], + deps = [ + "starkware_custom_dict_utils_lib", + "starkware_error_handling_lib", + "starkware_serializability_utils_lib", + "//src/starkware/python:starkware_python_utils_lib", + requirement("frozendict"), + requirement("marshmallow"), + requirement("marshmallow_dataclass"), + requirement("mypy_extensions"), + requirement("typeguard"), + ], +) + +py_library( + name = "starkware_one_of_schema_utils_lib", + srcs = [ + "one_of_schema_tracker.py", + ], + visibility = ["//visibility:public"], + deps = [ + "starkware_dataclasses_utils_lib", + requirement("marshmallow"), + requirement("marshmallow_oneofschema"), + ], +) + +py_library( + name = "starkware_dataclasses_field_utils_lib", + srcs = [ + "field_validators.py", + "marshmallow_fields_metadata.py", + ], + visibility = ["//visibility:public"], + deps = [ + "starkware_dataclasses_utils_lib", + "//src/starkware/crypto:starkware_crypto_lib", + requirement("eth_utils"), + requirement("marshmallow"), + requirement("setuptools"), + ], +) + +py_library( + name = "starkware_config_utils_lib", + srcs = [ + "config_base.py", + ], + visibility = ["//visibility:public"], + deps = [ + "starkware_dataclasses_field_utils_lib", + requirement("marshmallow"), + requirement("pyyaml"), + ], +) + +py_library( + name = "starkware_commitment_tree_facts_lib", + srcs = [ + "//src/starkware/starkware_utils/commitment_tree:inner_node_fact.py", + "//src/starkware/starkware_utils/commitment_tree:leaf_fact.py", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/starkware/storage:starkware_abstract_storage_lib", + ], +) + +py_library( + name = "starkware_commitment_tree_leaf_fact_utils_lib", + srcs = [ + "//src/starkware/starkware_utils/commitment_tree:leaf_fact_utils.py", + ], + visibility = ["//visibility:public"], + deps = [ + "starkware_commitment_tree_facts_lib", + "starkware_dataclasses_utils_lib", + "starkware_utils_lib", + "//src/starkware/cairo/lang:cairo_constants_lib", + "//src/starkware/python:starkware_python_utils_lib", + "//src/starkware/storage:starkware_storage_lib", + ], +) diff --git a/src/starkware/starkware_utils/CMakeLists.txt b/src/starkware/starkware_utils/CMakeLists.txt deleted file mode 100644 index 49069f39..00000000 --- a/src/starkware/starkware_utils/CMakeLists.txt +++ /dev/null @@ -1,49 +0,0 @@ -include(CMakeLists_common.txt) - -python_lib(starkware_utils_lib - PREFIX starkware/starkware_utils - - FILES - commitment_tree/binary_fact_tree.py - commitment_tree/binary_fact_tree_da_utils.py - commitment_tree/binary_fact_tree_node.py - commitment_tree/calculation.py - commitment_tree/merkle_tree/traverse_tree.py - commitment_tree/patricia_tree/virtual_calculation_node.py - commitment_tree/patricia_tree/nodes.py - commitment_tree/patricia_tree/patricia_tree.py - commitment_tree/patricia_tree/virtual_patricia_node.py - commitment_tree/update_tree.py - executor.py - subsequence.py - ${STARKWARE_UTILS_LIBS_ADDITIONAL_FILES} - - LIBS - starkware_commitment_tree_facts_lib - starkware_config_utils_lib - starkware_custom_dict_utils_lib - starkware_dataclasses_field_utils_lib - starkware_error_handling_lib - starkware_python_utils_lib - starkware_serializability_utils_lib - starkware_storage_lib - pip_marshmallow_dataclass - ${STARKWARE_UTILS_LIBS_ADDITIONAL_LIBS} -) - -python_lib(starkware_commitment_tree_leaf_fact_utils_lib - PREFIX starkware/starkware_utils - - FILES - commitment_tree/leaf_fact_utils.py - - LIBS - cairo_constants_lib - starkware_commitment_tree_facts_lib - starkware_dataclasses_utils_lib - starkware_python_utils_lib - starkware_storage_lib - starkware_utils_lib -) - -add_subdirectory(commitment_tree/patricia_tree) diff --git a/src/starkware/starkware_utils/CMakeLists_common.txt b/src/starkware/starkware_utils/CMakeLists_common.txt deleted file mode 100644 index fe02e988..00000000 --- a/src/starkware/starkware_utils/CMakeLists_common.txt +++ /dev/null @@ -1,102 +0,0 @@ -add_subdirectory(time) - -python_lib(starkware_serializability_utils_lib - PREFIX starkware/starkware_utils - - FILES - serializable.py - - LIBS - starkware_python_utils_lib -) - -python_lib(starkware_error_handling_lib - PREFIX starkware/starkware_utils - - FILES - error_handling.py - - LIBS - pip_marshmallow -) - -python_lib(starkware_custom_dict_utils_lib - PREFIX starkware/starkware_utils - - FILES - custom_raising_dict.py - - LIBS - pip_frozendict -) - -python_lib(starkware_dataclasses_utils_lib - PREFIX starkware/starkware_utils - - FILES - marshmallow_dataclass_fields.py - serializable_dataclass.py - validated_dataclass.py - validated_fields.py - - LIBS - starkware_custom_dict_utils_lib - starkware_error_handling_lib - starkware_python_utils_lib - starkware_serializability_utils_lib - pip_frozendict - pip_marshmallow - pip_marshmallow_dataclass - pip_mypy_extensions - pip_typeguard -) - -python_lib(starkware_one_of_schema_utils_lib - PREFIX starkware/starkware_utils - - FILES - one_of_schema_tracker.py - - LIBS - starkware_dataclasses_utils_lib - pip_marshmallow - pip_marshmallow_oneofschema -) - -python_lib(starkware_dataclasses_field_utils_lib - PREFIX starkware/starkware_utils - - FILES - field_validators.py - marshmallow_fields_metadata.py - - LIBS - starkware_crypto_lib - starkware_dataclasses_utils_lib - pip_eth_utils - pip_marshmallow - pip_setuptools -) - -python_lib(starkware_config_utils_lib - PREFIX starkware/starkware_utils - - FILES - config_base.py - - LIBS - starkware_dataclasses_field_utils_lib - pip_marshmallow - pip_pyyaml -) - -python_lib(starkware_commitment_tree_facts_lib - PREFIX starkware/starkware_utils - - FILES - commitment_tree/inner_node_fact.py - commitment_tree/leaf_fact.py - - LIBS - starkware_abstract_storage_lib -) diff --git a/src/starkware/starkware_utils/commitment_tree/BUILD b/src/starkware/starkware_utils/commitment_tree/BUILD new file mode 100644 index 00000000..bc740cf4 --- /dev/null +++ b/src/starkware/starkware_utils/commitment_tree/BUILD @@ -0,0 +1,3 @@ +package(default_visibility = ["//visibility:public"]) + +exports_files(glob(["*.py"])) diff --git a/src/starkware/starkware_utils/commitment_tree/CMakeLists.txt b/src/starkware/starkware_utils/commitment_tree/CMakeLists.txt deleted file mode 100644 index bf5f3e72..00000000 --- a/src/starkware/starkware_utils/commitment_tree/CMakeLists.txt +++ /dev/null @@ -1 +0,0 @@ -add_subdirectory(merkle_tree) diff --git a/src/starkware/starkware_utils/commitment_tree/merkle_tree/BUILD b/src/starkware/starkware_utils/commitment_tree/merkle_tree/BUILD new file mode 100644 index 00000000..dda674ca --- /dev/null +++ b/src/starkware/starkware_utils/commitment_tree/merkle_tree/BUILD @@ -0,0 +1,8 @@ +package(default_visibility = ["//visibility:public"]) + +exports_files([ + "merkle_calculation_node.py", + "merkle_tree.py", + "merkle_tree_node.py", + "traverse_tree.py", +]) diff --git a/src/starkware/starkware_utils/commitment_tree/patricia_tree/BUILD b/src/starkware/starkware_utils/commitment_tree/patricia_tree/BUILD new file mode 100644 index 00000000..1f8f7355 --- /dev/null +++ b/src/starkware/starkware_utils/commitment_tree/patricia_tree/BUILD @@ -0,0 +1,34 @@ +load("//bazel_utils/python:defs.bzl", "requirement") +load("//bazel_utils:python.bzl", "pytest_test") + +package(default_visibility = ["//visibility:public"]) + +exports_files([ + "nodes.py", + "patricia_tree.py", + "test_utils.py", + "virtual_calculation_node.py", + "virtual_patricia_node.py", +]) + +pytest_test( + name = "patricia_tree_test", + srcs = [ + "nodes_test.py", + "patricia_tree_test.py", + "virtual_calculation_node_test.py", + "virtual_patricia_node_test.py", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/starkware/cairo/common:cairo_common_lib", + "//src/starkware/crypto:starkware_crypto_lib", + "//src/starkware/python:starkware_python_test_utils_lib", + "//src/starkware/python:starkware_python_utils_lib", + "//src/starkware/starkware_utils:starkware_utils_lib", + "//src/starkware/storage:starkware_storage_lib", + "//src/starkware/storage:starkware_storage_test_utils_lib", + "//src/starkware/storage:starkware_storage_utils_lib", + requirement("pytest_asyncio"), + ], +) diff --git a/src/starkware/starkware_utils/commitment_tree/patricia_tree/CMakeLists.txt b/src/starkware/starkware_utils/commitment_tree/patricia_tree/CMakeLists.txt deleted file mode 100644 index 740e7b93..00000000 --- a/src/starkware/starkware_utils/commitment_tree/patricia_tree/CMakeLists.txt +++ /dev/null @@ -1,23 +0,0 @@ -full_python_test(patricia_tree_test - PREFIX starkware/starkware_utils/commitment_tree/patricia_tree - PYTHON ${PYTHON_COMMAND} - TESTED_MODULES starkware/starkware_utils/commitment_tree/patricia_tree - - FILES - nodes_test.py - patricia_tree_test.py - virtual_calculation_node_test.py - virtual_patricia_node_test.py - - LIBS - cairo_common_lib - starkware_crypto_lib - starkware_python_test_utils_lib - starkware_python_utils_lib - starkware_storage_lib - starkware_storage_test_utils_lib - starkware_storage_utils_lib - starkware_utils_lib - pip_pytest - pip_pytest_asyncio -) diff --git a/src/starkware/starkware_utils/field_validators.py b/src/starkware/starkware_utils/field_validators.py index c0519d9b..bbc86b37 100644 --- a/src/starkware/starkware_utils/field_validators.py +++ b/src/starkware/starkware_utils/field_validators.py @@ -131,11 +131,11 @@ def validate_equal(field_name: str, *, allowed_value: T) -> ValidatorType: return marshmallow.validate.Equal(comparable=allowed_value, error=error_message) -def validate_length(field_name: str, *, length: int) -> ValidatorType: - error_message = "Invalid {field_name}: {{input}}; must be of length: {length}".format( - field_name=field_name, length=length +def validate_max_length(field_name: str, *, max_length: int) -> ValidatorType: + error_message = ( + f"Invalid {field_name}: {{input}}; must be of length less than or equal to: {max_length}." ) - return marshmallow.validate.Length(equal=length, error=error_message) + return marshmallow.validate.Length(max=max_length, error=error_message) def validate_in_range( diff --git a/src/starkware/starkware_utils/time/BUILD b/src/starkware/starkware_utils/time/BUILD new file mode 100644 index 00000000..afd4c8c9 --- /dev/null +++ b/src/starkware/starkware_utils/time/BUILD @@ -0,0 +1,11 @@ +exports_files(["__init__.py"]) + +py_library( + name = "starkware_utils_time_lib", + srcs = [ + "fastforward.py", + "synchronous_executor.py", + "time.py", + ], + visibility = ["//visibility:public"], +) diff --git a/src/starkware/starkware_utils/time/CMakeLists.txt b/src/starkware/starkware_utils/time/CMakeLists.txt deleted file mode 100644 index 103af95c..00000000 --- a/src/starkware/starkware_utils/time/CMakeLists.txt +++ /dev/null @@ -1,16 +0,0 @@ -python_lib(starkware_utils_time_lib - PREFIX starkware/starkware_utils/time - - FILES - __init__.py - fastforward.py - synchronous_executor.py - time.py -) - -python_lib(starkware_utils_time_test_lib - PREFIX starkware/starkware_utils/time - - FILES - time_test.py -) diff --git a/src/starkware/starkware_utils/vars.bzl b/src/starkware/starkware_utils/vars.bzl new file mode 100644 index 00000000..3d30ace3 --- /dev/null +++ b/src/starkware/starkware_utils/vars.bzl @@ -0,0 +1,6 @@ +STARKWARE_UTILS_LIBS_ADDITIONAL_FILES = [] +STARKWARE_UTILS_LIBS_ADDITIONAL_LIBS = [ + "starkware_commitment_tree_facts_lib", + "//src/starkware/starkware_utils:starkware_dataclasses_utils_lib", + "//src/starkware/storage:starkware_storage_lib", +] diff --git a/src/starkware/storage/BUILD b/src/starkware/storage/BUILD new file mode 100644 index 00000000..93cca65e --- /dev/null +++ b/src/starkware/storage/BUILD @@ -0,0 +1,120 @@ +load("//bazel_utils:python.bzl", "pytest_test") +load("//bazel_utils/python:defs.bzl", "requirement") + +py_library( + name = "starkware_storage_metric_lib", + srcs = [ + "metrics.py", + ], + visibility = ["//visibility:public"], + deps = [ + requirement("prometheus_client"), + ], +) + +py_library( + name = "starkware_storage_test_utils_lib", + srcs = [ + "test_utils.py", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/starkware/storage:starkware_storage_lib", + ], +) + +package(default_visibility = ["//visibility:public"]) + +py_library( + name = "starkware_abstract_storage_lib", + srcs = [ + "__init__.py", + "storage.py", + ], + visibility = ["//visibility:public"], + deps = [ + "//src/starkware/python:starkware_python_utils_lib", + "//src/starkware/starkware_utils:starkware_config_utils_lib", + "//src/starkware/starkware_utils:starkware_serializability_utils_lib", + ], +) + +py_library( + name = "starkware_dict_storage_lib", + srcs = [ + "dict_storage.py", + ], + visibility = ["//visibility:public"], + deps = [ + "starkware_abstract_storage_lib", + "starkware_storage_metric_lib", + requirement("cachetools"), + ], +) + +py_library( + name = "starkware_imm_storage_lib", + srcs = [ + "imm_storage.py", + ], + visibility = ["//visibility:public"], + deps = [ + "starkware_abstract_storage_lib", + ], +) + +pytest_test( + name = "starkware_abstract_storage_test", + srcs = [ + "storage_test.py", + ], + visibility = ["//visibility:public"], + deps = [ + "starkware_abstract_storage_lib", + "starkware_dict_storage_lib", + "starkware_storage_test_utils_lib", + requirement("pytest_asyncio"), + ], +) + +py_library( + name = "starkware_storage_lib", + srcs = [ + "gated_storage.py", + "names.py", + ], + visibility = ["//visibility:public"], + deps = [ + "starkware_abstract_storage_lib", + "starkware_imm_storage_lib", + "starkware_storage_metric_lib", + "//src/starkware/starkware_utils/time:starkware_utils_time_lib", + requirement("cachetools"), + ], +) + +py_library( + name = "starkware_storage_utils_lib", + srcs = [ + "storage_utils.py", + ], + visibility = ["//visibility:public"], + deps = [ + "starkware_storage_lib", + "//src/starkware/python:starkware_python_utils_lib", + "//src/starkware/starkware_utils:starkware_commitment_tree_facts_lib", + ], +) + +pytest_test( + name = "starkware_storage_test", + srcs = [ + "gated_storage_test.py", + ], + visibility = ["//visibility:public"], + deps = [ + "starkware_storage_lib", + "starkware_storage_test_utils_lib", + requirement("pytest_asyncio"), + ], +) diff --git a/src/starkware/storage/CMakeLists.txt b/src/starkware/storage/CMakeLists.txt deleted file mode 100644 index 326c63c6..00000000 --- a/src/starkware/storage/CMakeLists.txt +++ /dev/null @@ -1 +0,0 @@ -include(storage.cmake) diff --git a/src/starkware/storage/storage.cmake b/src/starkware/storage/storage.cmake deleted file mode 100644 index 3ad73fc0..00000000 --- a/src/starkware/storage/storage.cmake +++ /dev/null @@ -1,45 +0,0 @@ -include(storage_base.cmake) - - - -python_lib(starkware_storage_lib - PREFIX starkware/storage - - FILES - gated_storage.py - names.py - - LIBS - starkware_abstract_storage_lib - starkware_imm_storage_lib - starkware_storage_metric_lib - starkware_utils_time_lib - pip_cachetools -) - -python_lib(starkware_storage_utils_lib - PREFIX starkware/storage - - FILES - storage_utils.py - - LIBS - starkware_commitment_tree_facts_lib - starkware_python_utils_lib - starkware_storage_lib -) - -full_python_test(starkware_storage_test - PREFIX starkware/storage - PYTHON ${PYTHON_COMMAND} - TESTED_MODULES starkware/storage - - FILES - gated_storage_test.py - - LIBS - starkware_storage_lib - starkware_storage_test_utils_lib - pip_pytest - pip_pytest_asyncio -) diff --git a/src/starkware/storage/storage_base.cmake b/src/starkware/storage/storage_base.cmake deleted file mode 100644 index da82631a..00000000 --- a/src/starkware/storage/storage_base.cmake +++ /dev/null @@ -1,70 +0,0 @@ -python_lib(starkware_abstract_storage_lib - PREFIX starkware/storage - - FILES - __init__.py - storage.py - - LIBS - starkware_config_utils_lib - starkware_python_utils_lib - starkware_serializability_utils_lib -) - -python_lib(starkware_storage_metric_lib - PREFIX starkware/storage - - FILES - metrics.py - - LIBS - pip_prometheus_client -) - -python_lib(starkware_dict_storage_lib - PREFIX starkware/storage - - FILES - dict_storage.py - - LIBS - starkware_abstract_storage_lib - starkware_storage_metric_lib - pip_cachetools -) - -python_lib(starkware_imm_storage_lib - PREFIX starkware/storage - - FILES - imm_storage.py - - LIBS - starkware_abstract_storage_lib -) - -python_lib(starkware_storage_test_utils_lib - PREFIX starkware/storage - - FILES - test_utils.py - - LIBS - starkware_abstract_storage_lib -) - -full_python_test(starkware_abstract_storage_test - PREFIX starkware/storage - PYTHON ${PYTHON_COMMAND} - TESTED_MODULES starkware/storage - - FILES - storage_test.py - - LIBS - starkware_abstract_storage_lib - starkware_dict_storage_lib - starkware_storage_test_utils_lib - pip_pytest - pip_pytest_asyncio -) diff --git a/src/third_party/pip/BUILD b/src/third_party/pip/BUILD new file mode 100644 index 00000000..1c3d3137 --- /dev/null +++ b/src/third_party/pip/BUILD @@ -0,0 +1,19 @@ +load("@cpython_reqs//:requirements.bzl", "all_requirements") +load("@pypy_reqs//:requirements.bzl", pypy_all_requirements = "all_requirements") +load("//bazel_utils/python:defs.bzl", "unify_requirements") + +[ + alias( + name = requirement, + actual = select({ + "//bazel_utils/python:pypy": "@pypy_reqs_" + requirement + "//:pkg", + "//conditions:default": "@cpython_reqs_" + requirement + "//:pkg", + }), + visibility = ["//visibility:public"], + ) + for requirement in unify_requirements({ + "cpython_reqs": all_requirements, + "pypy_reqs": pypy_all_requirements, + }) + if requirement != "greenlet" +] diff --git a/vars.bzl b/vars.bzl new file mode 100644 index 00000000..0523e2ff --- /dev/null +++ b/vars.bzl @@ -0,0 +1 @@ +ADDITIONAL_IMPORTS = []