From c20348b0bed3883c77267eb72f933ac5e608b9f6 Mon Sep 17 00:00:00 2001 From: F Bojarski Date: Fri, 3 Oct 2025 17:38:06 +0530 Subject: [PATCH 1/4] chore: prepare for osaka HF Signed-off-by: F Bojarski --- Makefile | 42 +- constants/osaka/constants.zkasm | 1 + hub/osaka/columns/account.lisp | 63 +++ hub/osaka/columns/context.lisp | 45 ++ hub/osaka/columns/miscellaneous.lisp | 74 +++ hub/osaka/columns/scenario.lisp | 87 +++ hub/osaka/columns/shared.lisp | 110 ++++ hub/osaka/columns/stack.lisp | 81 +++ hub/osaka/columns/storage.lisp | 35 ++ hub/osaka/columns/transaction.lisp | 56 ++ hub/osaka/columns/transient.lisp | 19 + hub/osaka/constants.lisp | 9 + .../constraints/account-rows/specialized.lisp | 221 ++++++++ .../consistency/account/columns.lisp | 90 ++++ .../consistency/account/computed.lisp | 133 +++++ .../consistency/account/constraints.lisp | 270 ++++++++++ .../consistency/context/columns.lisp | 65 +++ .../consistency/context/computed.lisp | 33 ++ .../consistency/context/constraints.lisp | 53 ++ .../execution_environment/columns.lisp | 40 ++ .../execution_environment/constraints.lisp | 34 ++ .../consistency/stack/columns.lisp | 34 ++ .../consistency/stack/computed.lisp | 52 ++ .../consistency/stack/constraints.lisp | 48 ++ .../consistency/storage/columns.lisp | 64 +++ .../consistency/storage/computed.lisp | 232 ++++++++ .../consistency/storage/constraints.lisp | 137 +++++ .../consistency/transient/columns.lisp | 41 ++ .../consistency/transient/computed.lisp | 40 ++ .../consistency/transient/constraints.lisp | 76 +++ .../constraints/context-rows/specialized.lisp | 117 ++++ .../generalities/auxiliary_stamps.lisp | 80 +++ .../constraints/generalities/context.lisp | 105 ++++ .../constraints/generalities/exceptions.lisp | 88 +++ .../first_row_of_new_context.lisp | 19 + hub/osaka/constraints/generalities/gas.lisp | 59 +++ .../generalities/hub_stamp_tx_end.lisp | 15 + .../jump_destination_vetting.lisp | 17 + .../generalities/program_counter.lisp | 21 + .../constraints/generalities/refunds.lisp | 56 ++ .../generalities/revert_data_specific.lisp | 126 +++++ .../generalities/stack_height.lisp | 28 + .../constraints/instruction-handling/acc.lisp | 268 ++++++++++ .../add_bin_ext_mod_mul_shf_wcp.lisp | 118 +++++ .../constraints/instruction-handling/btc.lisp | 50 ++ .../instruction-handling/call/constants.lisp | 55 ++ .../call/finishing_touches/EOA.lisp | 25 + .../call/finishing_touches/SMC.lisp | 45 ++ .../call/finishing_touches/abort.lisp | 40 ++ .../call/finishing_touches/exception.lisp | 26 + ...ting_up_the_2nd_phase_for_precompiles.lisp | 27 + .../generalities/1st_set_of_account_rows.lisp | 85 +++ .../generalities/2nd_set_of_account_rows.lisp | 71 +++ .../generalities/3rd_set_of_account_rows.lisp | 36 ++ .../call/generalities/universal.lisp | 190 +++++++ .../non_stack_rows_for_non_precompiles.lisp | 50 ++ .../call/non_stack_rows_for_precompiles.lisp | 37 ++ ...peeking_flag_sums_for_non_precompiles.lisp | 80 +++ .../peeking_flag_sums_for_precompiles.lisp | 28 + .../precompiles/NSRs_and_flag_sums_I.lisp | 69 +++ .../precompiles/NSRs_and_flag_sums_II.lisp | 359 +++++++++++++ .../call/precompiles/blake/FKTH.lisp | 25 + .../call/precompiles/blake/FKTR.lisp | 25 + .../call/precompiles/blake/constants.lisp | 12 + .../call/precompiles/blake/generalities.lisp | 91 ++++ .../call/precompiles/blake/success.lisp | 97 ++++ .../precompiles/blake/surviving_the_hub.lisp | 78 +++ .../call/precompiles/common/FKTH.lisp | 24 + .../call/precompiles/common/constants.lisp | 18 + .../call/precompiles/common/generalities.lisp | 220 ++++++++ .../precompiles/common/success_ECRECOVER.lisp | 79 +++ .../precompiles/common/success_IDENTITY.lisp | 57 ++ .../common/success_SHA2-RIPEMD.lisp | 107 ++++ .../ec_add_mul_pairing_bls/FKTR.lisp | 35 ++ .../ec_add_mul_pairing_bls/constants.lisp | 17 + .../ec_add_mul_pairing_bls/success_case.lisp | 196 +++++++ .../call/precompiles/generalities.lisp | 46 ++ .../call/precompiles/modexp/common.lisp | 280 ++++++++++ .../call/precompiles/modexp/constants.lisp | 27 + .../call/precompiles/modexp/failure.lisp | 24 + .../call/precompiles/modexp/success.lisp | 259 +++++++++ .../call/precompiles/shorthands.lisp | 28 + .../instruction-handling/call/shorthands.lisp | 81 +++ .../first_row_of_callee_context.lisp | 27 + .../initialize_callee_context.lisp | 43 ++ .../justify_callee_revert_data.lisp | 23 + .../missing-context-parameters.lisp | 52 ++ ...-scenario-row-setting-for-precompiles.lisp | 37 ++ .../instruction-handling/call/standpoint.lisp | 49 ++ .../instruction-handling/call/triggers.lisp | 39 ++ .../constraints/instruction-handling/con.lisp | 92 ++++ .../copy/calldatacopy.lisp | 22 + .../instruction-handling/copy/codecopy.lisp | 51 ++ .../copy/extcodecopy.lisp | 84 +++ .../copy/generalities.lisp | 232 ++++++++ .../copy/returndatacopy.lisp | 22 + .../create/constants.lisp | 32 ++ .../constraints/deployment-failures.lisp | 51 ++ .../create/constraints/exceptional.lisp | 20 + .../create/constraints/final-context-row.lisp | 103 ++++ .../create/constraints/generalities.lisp | 206 ++++++++ .../constraints/reverting-one-step.lisp | 47 ++ .../constraints/reverting-two-step.lisp | 51 ++ .../create/constraints/unaborted.lisp | 83 +++ .../create/constraints/unexceptional.lisp | 81 +++ .../create/non_stack_rows.lisp | 50 ++ .../create/peeking_flags_shorthands.lisp | 97 ++++ .../create/shorthands.lisp | 58 ++ .../create/standpoint.lisp | 36 ++ .../instruction-handling/create/triggers.lisp | 52 ++ .../constraints/instruction-handling/dup.lisp | 19 + .../instruction-handling/halting/return.lisp | 499 ++++++++++++++++++ .../instruction-handling/halting/revert.lisp | 154 ++++++ .../halting/selfdestruct/constraints.lisp | 239 +++++++++ .../halting/selfdestruct/scenario.lisp | 33 ++ .../halting/selfdestruct/shorthands.lisp | 60 +++ .../halting/selfdestruct/will_revert.lisp | 47 ++ .../wont_revert_not_yet_marked.lisp | 73 +++ .../halting/shorthands.lisp | 19 + .../instruction-handling/halting/stop.lisp | 104 ++++ .../instruction-handling/invalid.lisp | 44 ++ .../instruction-handling/jump.lisp | 150 ++++++ .../instruction-handling/keccak.lisp | 112 ++++ .../constraints/instruction-handling/log.lisp | 134 +++++ .../instruction-handling/machine_state.lisp | 93 ++++ .../mcopy/constraints.lisp | 143 +++++ .../mcopy/shorthands.lisp | 38 ++ .../instruction-handling/push_pop.lisp | 54 ++ .../stack_exceptions.lisp | 21 + .../instruction-handling/stack_ram.lisp | 250 +++++++++ .../constraints/instruction-handling/sto.lisp | 252 +++++++++ .../instruction-handling/swap.lisp | 19 + .../trans/constraints.lisp | 113 ++++ .../trans/shorthands_and_constants.lisp | 25 + .../constraints/instruction-handling/txn.lisp | 54 ++ .../constraints/miscellaneous-rows/exp.lisp | 30 ++ .../constraints/miscellaneous-rows/mmu.lisp | 448 ++++++++++++++++ .../miscellaneous-rows/mxp/calls.lisp | 31 ++ .../miscellaneous-rows/mxp/mcopy.lisp | 27 + .../miscellaneous-rows/mxp/msize.lisp | 11 + .../miscellaneous-rows/mxp/mxp.lisp | 0 .../miscellaneous-rows/mxp/single_offset.lisp | 25 + .../oob/opcodes/oob_inst_call.lisp | 21 + .../oob/opcodes/oob_inst_cdl.lisp | 21 + .../oob/opcodes/oob_inst_create.lisp | 25 + .../oob/opcodes/oob_inst_deployment.lisp | 19 + .../oob/opcodes/oob_inst_jump.lisp | 20 + .../oob/opcodes/oob_inst_jumpi.lisp | 22 + .../oob/opcodes/oob_inst_rdc.lisp | 22 + .../oob/opcodes/oob_inst_sstore.lisp | 18 + .../oob/opcodes/oob_inst_xcall.lisp | 19 + .../oob/opcodes/oob_inst_xcreate.lisp | 19 + .../precompiles/blake/oob_inst_blake_cds.lisp | 19 + .../blake/oob_inst_blake_params.lisp | 20 + .../oob/precompiles/common/common.lisp | 22 + .../modexp/oob_inst_modexp_cds.lisp | 18 + .../modexp/oob_inst_modexp_extract.lisp | 21 + .../modexp/oob_inst_modexp_lead.lisp | 20 + .../modexp/oob_inst_modexp_pricing.lisp | 21 + .../modexp/oob_inst_modexp_xbs.lisp | 21 + .../miscellaneous-rows/oob/shorthands.lisp | 12 + .../constraints/miscellaneous-rows/stp.lisp | 38 ++ .../stp_mxp_connections.lisp | 13 + .../weighted_misc_flag_sum.lisp | 14 + .../scenario-rows/generalities.lisp | 67 +++ .../scenario-rows/shorthands/call.lisp | 348 ++++++++++++ .../scenario-rows/shorthands/create.lisp | 373 +++++++++++++ .../scenario-rows/shorthands/precompile.lisp | 193 +++++++ .../scenario-rows/shorthands/return.lisp | 77 +++ .../shorthands/selfdestruct.lisp | 19 + .../stack-patterns/0-0-stack-pattern.lisp | 22 + .../stack-patterns/0-1-stack-pattern.lisp | 32 ++ .../stack-patterns/1-0-stack-pattern.lisp | 32 ++ .../stack-patterns/1-1-stack-pattern.lisp | 34 ++ .../stack-patterns/2-0-stack-pattern.lisp | 34 ++ .../stack-patterns/2-1-stack-pattern.lisp | 36 ++ .../stack-patterns/3-0-stack-pattern.lisp | 35 ++ .../stack-patterns/3-1-stack-pattern.lisp | 38 ++ .../constraints/stack-patterns/_helpers.lisp | 39 ++ .../stack-patterns/call-stack-pattern.lisp | 57 ++ .../stack-patterns/copy-stack-pattern.lisp | 39 ++ .../stack-patterns/create-stack-pattern.lisp | 49 ++ .../stack-patterns/dup-stack-pattern.lisp | 40 ++ .../stack-patterns/empty-stack-pattern.lisp | 18 + .../load-store-stack-pattern.lisp | 34 ++ .../stack-patterns/log-stack-pattern.lisp | 54 ++ .../stack-patterns/request-hash.lisp | 22 + .../stack-patterns/swap-stack-pattern.lisp | 42 ++ .../constraints/storage-rows/specialized.lisp | 101 ++++ .../system/block_number/block_number.lisp | 21 + .../system/block_number/shorthands.lisp | 19 + hub/osaka/constraints/system/constancies.lisp | 22 + .../system/flags/generalities.lisp | 24 + .../constraints/system/flags/shorthands.lisp | 11 + .../system/flags/transaction_constancy.lisp | 11 + .../constraints/system/flags/transitions.lisp | 21 + .../system/hub_stamp/counters.lisp | 60 +++ .../constraints/system/hub_stamp/formal.lisp | 26 + .../system/hub_stamp/generalities.lisp | 22 + .../system/hub_stamp/increments.lisp | 25 + .../system/phase_flags/binarities.lisp | 11 + .../system/phase_flags/generalities.lisp | 18 + .../system/phase_flags/legality.lisp | 26 + .../system/phase_flags/shorthands.lisp | 14 + .../system/phase_flags/transition.lisp | 97 ++++ .../transaction_numbers/housekeeping.lisp | 33 ++ .../system/transaction_numbers/numbers.lisp | 44 ++ .../transaction_numbers/shorthands_end.lisp | 21 + .../transaction_numbers/shorthands_start.lisp | 21 + .../transient-rows/specialized.lisp | 40 ++ hub/osaka/constraints/tx_finl/peeking.lisp | 19 + .../tx_finl/rows/acc_coinbase_reward.lisp | 28 + .../tx_finl/rows/acc_sender_gas_refund.lisp | 25 + .../constraints/tx_finl/rows/transaction.lisp | 17 + hub/osaka/constraints/tx_finl/shorthands.lisp | 36 ++ hub/osaka/constraints/tx_init/peeking.lisp | 61 +++ .../tx_init/rows/acc_coinbase_warm.lisp | 26 + .../rows/acc_recipient_value_transfer.lisp | 76 +++ .../tx_init/rows/acc_sender_gas_payment.lisp | 34 ++ .../rows/acc_sender_value_transfer.lisp | 25 + .../acc_undo_recipient_value_reception.lisp | 25 + .../rows/acc_undo_sender_value_transfer.lisp | 26 + .../tx_init/rows/con_initialization.lisp | 50 ++ .../rows/first_execution_row_parameters.lisp | 31 ++ .../tx_init/rows/miscellaneous.lisp | 37 ++ .../constraints/tx_init/rows/transaction.lisp | 37 ++ hub/osaka/constraints/tx_init/shorthands.lisp | 49 ++ .../constraints/tx_prewarm/constraints.lisp | 52 ++ .../tx_skip/noop/peeking_flags.lisp | 28 + .../constraints/tx_skip/noop/shorthands.lisp | 26 + .../tx_skip/sysf/introduction.lisp | 19 + .../tx_skip/sysf/peeking_flags.lisp | 20 + .../constraints/tx_skip/sysf/shorthands.lisp | 22 + .../tx_skip/sysi/eip-2935/peeking_flags.lisp | 41 ++ ..._final_zero_context___nontrivial_case.lisp | 14 + ...ext_final_zero_context___trivial_case.lisp | 14 + .../sysi/eip-2935/rows/_transaction.lisp | 14 + ...nt_load_the_block_hash_smart_contract.lisp | 31 ++ .../storage_store_block_hash_in_state.lisp | 31 ++ .../tx_skip/sysi/eip-2935/shorthands.lisp | 48 ++ .../tx_skip/sysi/eip-4788/peeking_flags.lisp | 42 ++ ..._final_zero_context___nontrivial_case.lisp | 14 + ...ext_final_zero_context___trivial_case.lisp | 15 + .../sysi/eip-4788/rows/_transaction.lisp | 14 + ...t_load_the_beacon_root_smart_contract.lisp | 34 ++ .../rows/storage_store_beacon_root.lisp | 31 ++ .../rows/storage_store_timestamp.lisp | 31 ++ .../tx_skip/sysi/eip-4788/shorthands.lisp | 48 ++ .../tx_skip/user/peeking_flags.lisp | 23 + .../rows/_context_final_zero_context.lisp | 13 + .../tx_skip/user/rows/account_coinbase.lisp | 30 ++ .../tx_skip/user/rows/account_recipient.lisp | 83 +++ .../tx_skip/user/rows/account_sender.lisp | 45 ++ .../tx_skip/user/rows/transaction.lisp | 53 ++ .../constraints/tx_skip/user/shorthands.lisp | 31 ++ hub/osaka/lookups/helpers.lisp | 3 + hub/osaka/lookups/hub_into_add.lisp | 23 + hub/osaka/lookups/hub_into_bin.lisp | 28 + hub/osaka/lookups/hub_into_block_data.lisp | 24 + hub/osaka/lookups/hub_into_block_hash.lisp | 25 + hub/osaka/lookups/hub_into_exp.lisp | 32 ++ hub/osaka/lookups/hub_into_ext.lisp | 32 ++ hub/osaka/lookups/hub_into_gas.lisp | 20 + hub/osaka/lookups/hub_into_hub.lisp | 30 ++ .../lookups/hub_into_instruction_decoder.lisp | 90 ++++ hub/osaka/lookups/hub_into_log_info.lisp | 43 ++ hub/osaka/lookups/hub_into_mmu.lisp | 49 ++ hub/osaka/lookups/hub_into_mod.lisp | 28 + hub/osaka/lookups/hub_into_mul.lisp | 28 + hub/osaka/lookups/hub_into_mxp.lisp | 49 ++ hub/osaka/lookups/hub_into_oob.lisp | 36 ++ hub/osaka/lookups/hub_into_rlp_addr.lisp | 35 ++ hub/osaka/lookups/hub_into_rlp_txn.lisp | 37 ++ .../hub_into_rom_instruction_fetching.lisp | 22 + ...hub_into_rom_jump_destination_vetting.lisp | 21 + hub/osaka/lookups/hub_into_rom_lex.lisp | 32 ++ hub/osaka/lookups/hub_into_shakira.lisp | 26 + hub/osaka/lookups/hub_into_shf.lisp | 22 + hub/osaka/lookups/hub_into_stp.lisp | 38 ++ hub/osaka/lookups/hub_into_trm.lisp | 20 + hub/osaka/lookups/hub_into_txn_data.lisp | 94 ++++ hub/osaka/lookups/hub_into_wcp.lisp | 27 + .../hub_into_wcp_for_stack_overflow.lisp | 29 + .../hub_into_wcp_for_stack_underflow.lisp | 24 + hub/osaka/lookups/template | 13 + mmu/{ => london}/columns.lisp | 0 mmu/{ => london}/constants.lisp | 0 mmu/{ => london}/constraints.lisp | 0 .../any_to_ram_with_padding/common.lisp | 0 .../any_to_ram_with_padding/pure_padding.lisp | 0 .../any_to_ram_with_padding/some_data.lisp | 0 mmu/{ => london}/instructions/blake.lisp | 0 .../instructions/exo_to_ram_transplant.lisp | 0 .../instructions/invalid_code_prefix.lisp | 0 mmu/{ => london}/instructions/mload.lisp | 0 .../instructions/modexp_data.lisp | 0 .../instructions/modexp_zero.lisp | 0 mmu/{ => london}/instructions/mstore.lisp | 0 mmu/{ => london}/instructions/mstore8.lisp | 0 .../instructions/ram_to_exo_with_padding.lisp | 0 .../instructions/ram_to_ram_sans_padding.lisp | 0 .../right_padded_word_extraction.lisp | 0 mmu/{ => london}/lookups/mmu_into_euc.lisp | 0 mmu/{ => london}/lookups/mmu_into_mmio.lisp | 0 mmu/{ => london}/lookups/mmu_into_wcp.lisp | 0 mmu/osaka/columns.lisp | 101 ++++ mmu/osaka/constants.lisp | 60 +++ mmu/osaka/constraints.lisp | 280 ++++++++++ .../any_to_ram_with_padding/common.lisp | 62 +++ .../any_to_ram_with_padding/pure_padding.lisp | 96 ++++ .../any_to_ram_with_padding/some_data.lisp | 234 ++++++++ mmu/osaka/instructions/blake.lisp | 81 +++ .../instructions/exo_to_ram_transplant.lisp | 40 ++ .../instructions/invalid_code_prefix.lisp | 51 ++ mmu/osaka/instructions/mload.lisp | 60 +++ mmu/osaka/instructions/modexp_data.lisp | 164 ++++++ mmu/osaka/instructions/modexp_zero.lisp | 32 ++ mmu/osaka/instructions/mstore.lisp | 57 ++ mmu/osaka/instructions/mstore8.lisp | 38 ++ .../instructions/ram_to_exo_with_padding.lisp | 138 +++++ .../instructions/ram_to_ram_sans_padding.lisp | 176 ++++++ .../right_padded_word_extraction.lisp | 120 +++++ mmu/osaka/lookups/mmu_into_euc.lisp | 27 + mmu/osaka/lookups/mmu_into_mmio.lisp | 12 + mmu/osaka/lookups/mmu_into_wcp.lisp | 27 + oob/osaka/binarities.lisp | 13 + oob/osaka/columns.lisp | 49 ++ oob/osaka/constancies.lisp | 14 + oob/osaka/constants.lisp | 38 ++ oob/osaka/decoding.lisp | 19 + oob/osaka/heartbeat.lisp | 34 ++ oob/osaka/lookups/oob-into-add.lisp | 23 + oob/osaka/lookups/oob-into-blsreftable.lisp | 20 + oob/osaka/lookups/oob-into-mod.lisp | 29 + oob/osaka/lookups/oob-into-wcp.lisp | 27 + oob/osaka/opcodes/call.lisp | 35 ++ oob/osaka/opcodes/cdl.lisp | 23 + oob/osaka/opcodes/create.lisp | 95 ++++ oob/osaka/opcodes/deployment.lisp | 22 + oob/osaka/opcodes/jump.lisp | 26 + oob/osaka/opcodes/jumpi.lisp | 40 ++ oob/osaka/opcodes/rdc.lisp | 44 ++ oob/osaka/opcodes/sstore.lisp | 19 + oob/osaka/opcodes/xcall.lisp | 23 + oob/osaka/opcodes/xcreate.lisp | 26 + oob/osaka/precompiles/blake2f/cds.lisp | 22 + oob/osaka/precompiles/blake2f/params.lisp | 32 ++ oob/osaka/precompiles/common/bls/bls_msm.lisp | 89 ++++ .../common/bls/bls_pairing_check.lisp | 44 ++ .../point_evaluation_bls_adds_bls_maps.lisp | 43 ++ .../common/common_constraints.lisp | 34 ++ oob/osaka/precompiles/common/ecpairing.lisp | 43 ++ .../common/ecrecover_ecadd_ecmul.lisp | 22 + .../common/sha2_ripemd_identity.lisp | 31 ++ oob/osaka/precompiles/modexp/cds.lisp | 28 + oob/osaka/precompiles/modexp/extract.lisp | 41 ++ oob/osaka/precompiles/modexp/lead.lisp | 54 ++ oob/osaka/precompiles/modexp/pricing.lisp | 53 ++ oob/osaka/precompiles/modexp/xbs.lisp | 41 ++ oob/osaka/shorthands.lisp | 162 ++++++ oob/osaka/specialized.lisp | 64 +++ rlptxrcpt/{ => london}/columns.lisp | 0 rlptxrcpt/{ => london}/constants.lisp | 0 rlptxrcpt/{ => london}/constraints.lisp | 0 rlptxrcpt/osaka/columns.lisp | 42 ++ rlptxrcpt/osaka/constants.lisp | 10 + rlptxrcpt/osaka/constraints.lisp | 446 ++++++++++++++++ txndata/osaka/columns/cmptn_view.lisp | 26 + txndata/osaka/columns/common.lisp | 29 + txndata/osaka/columns/hub_view.lisp | 54 ++ txndata/osaka/columns/rlp_view.lisp | 41 ++ txndata/osaka/fork/prague.lisp | 37 ++ txndata/osaka/generalities/binary.lisp | 43 ++ txndata/osaka/generalities/constancies.lisp | 10 + .../generalities/constraint_systems.lisp | 48 ++ txndata/osaka/generalities/ct_max_and_ct.lisp | 24 + txndata/osaka/generalities/cumulative.lisp | 23 + txndata/osaka/generalities/finalization.lisp | 12 + .../generalities/flags_perspectives.lisp | 19 + .../generalities/flags_transactions.lisp | 20 + txndata/osaka/generalities/number_blocks.lisp | 20 + .../generalities/number_transactions.lisp | 23 + .../number_user_transactions.lisp | 13 + txndata/osaka/generalities/transitions.lisp | 20 + .../lookups/txndata_into_block_data.lisp | 36 ++ txndata/osaka/lookups/txndata_into_euc.lisp | 24 + txndata/osaka/lookups/txndata_into_hub.lisp | 27 + .../osaka/lookups/txndata_into_rlp_addr.lisp | 28 + .../osaka/lookups/txndata_into_rlp_txn.lisp | 12 + .../lookups/txndata_into_rlp_txnrcpt.lisp | 37 ++ .../osaka/lookups/txndata_into_rom_lex.lisp | 34 ++ txndata/osaka/lookups/txndata_into_wcp.lisp | 26 + .../osaka/processing/sysf/noop/constants.lisp | 16 + .../processing/sysf/noop/generalities.lisp | 30 ++ .../osaka/processing/sysf/noop/rows/noop.lisp | 17 + .../sysi/eip-2935/computations.lisp | 37 ++ .../processing/sysi/eip-2935/shorthands.lisp | 25 + .../sysi/eip-4788/computations.lisp | 52 ++ .../processing/sysi/eip-4788/shorthands.lisp | 22 + .../processing/sysi/noop/computations.lisp | 19 + txndata/osaka/processing/sysi/prelude.lisp | 41 ++ txndata/osaka/processing/user/constants.lisp | 32 ++ txndata/osaka/processing/user/decoding.lisp | 108 ++++ txndata/osaka/processing/user/prelude.lisp | 35 ++ .../rows/_02_eip-2681_max_nonce_check.lisp | 21 + ...tial_balance_must_cover_value_and_gas.lisp | 30 ++ ...60_init_code_does_not_exceed_max_size.lisp | 20 + .../rows/_05_eip-3860_init_code_pricing.lisp | 22 + ...gas_limit_must_cover_upfront_gas_cost.lisp | 35 ++ ...mit_must_cover_transaction_floor_cost.lisp | 25 + .../user/rows/_08_refunds_upper_limit.lisp | 24 + .../user/rows/_09_refunds_effective.lisp | 25 + .../_10_eip-7623_refunds_vs_floor_cost.lisp | 35 ++ .../rows/_11_call_data_emptyness_check.lisp | 42 ++ .../rows/_12_max_gas_price_vs_basefee.lisp | 22 + ...e_gas_must_not_exceed_block_gas_limit.lisp | 21 + ..._eip-1559_max_fee_vs_max_priority_fee.lisp | 21 + .../_15_eip-1559_effective_gas_price.lisp | 30 ++ .../osaka/processing/user/shorthands_hub.lisp | 28 + .../osaka/processing/user/shorthands_rlp.lisp | 35 ++ .../osaka/processing/user/specialized.lisp | 0 .../user/transfer_to_hub_from_rlptxn.lisp | 49 ++ .../user/transfer_to_rlptxn_from_hub.lisp | 23 + zkevm_osaka.bin | Bin 0 -> 978660 bytes 424 files changed, 22279 insertions(+), 3 deletions(-) create mode 100644 constants/osaka/constants.zkasm create mode 100644 hub/osaka/columns/account.lisp create mode 100644 hub/osaka/columns/context.lisp create mode 100644 hub/osaka/columns/miscellaneous.lisp create mode 100644 hub/osaka/columns/scenario.lisp create mode 100644 hub/osaka/columns/shared.lisp create mode 100644 hub/osaka/columns/stack.lisp create mode 100644 hub/osaka/columns/storage.lisp create mode 100644 hub/osaka/columns/transaction.lisp create mode 100644 hub/osaka/columns/transient.lisp create mode 100644 hub/osaka/constants.lisp create mode 100644 hub/osaka/constraints/account-rows/specialized.lisp create mode 100644 hub/osaka/constraints/consistency/account/columns.lisp create mode 100644 hub/osaka/constraints/consistency/account/computed.lisp create mode 100644 hub/osaka/constraints/consistency/account/constraints.lisp create mode 100644 hub/osaka/constraints/consistency/context/columns.lisp create mode 100644 hub/osaka/constraints/consistency/context/computed.lisp create mode 100644 hub/osaka/constraints/consistency/context/constraints.lisp create mode 100644 hub/osaka/constraints/consistency/execution_environment/columns.lisp create mode 100644 hub/osaka/constraints/consistency/execution_environment/constraints.lisp create mode 100644 hub/osaka/constraints/consistency/stack/columns.lisp create mode 100644 hub/osaka/constraints/consistency/stack/computed.lisp create mode 100644 hub/osaka/constraints/consistency/stack/constraints.lisp create mode 100644 hub/osaka/constraints/consistency/storage/columns.lisp create mode 100644 hub/osaka/constraints/consistency/storage/computed.lisp create mode 100644 hub/osaka/constraints/consistency/storage/constraints.lisp create mode 100644 hub/osaka/constraints/consistency/transient/columns.lisp create mode 100644 hub/osaka/constraints/consistency/transient/computed.lisp create mode 100644 hub/osaka/constraints/consistency/transient/constraints.lisp create mode 100644 hub/osaka/constraints/context-rows/specialized.lisp create mode 100644 hub/osaka/constraints/generalities/auxiliary_stamps.lisp create mode 100644 hub/osaka/constraints/generalities/context.lisp create mode 100644 hub/osaka/constraints/generalities/exceptions.lisp create mode 100644 hub/osaka/constraints/generalities/first_row_of_new_context.lisp create mode 100644 hub/osaka/constraints/generalities/gas.lisp create mode 100644 hub/osaka/constraints/generalities/hub_stamp_tx_end.lisp create mode 100644 hub/osaka/constraints/generalities/jump_destination_vetting.lisp create mode 100644 hub/osaka/constraints/generalities/program_counter.lisp create mode 100644 hub/osaka/constraints/generalities/refunds.lisp create mode 100644 hub/osaka/constraints/generalities/revert_data_specific.lisp create mode 100644 hub/osaka/constraints/generalities/stack_height.lisp create mode 100644 hub/osaka/constraints/instruction-handling/acc.lisp create mode 100644 hub/osaka/constraints/instruction-handling/add_bin_ext_mod_mul_shf_wcp.lisp create mode 100644 hub/osaka/constraints/instruction-handling/btc.lisp create mode 100644 hub/osaka/constraints/instruction-handling/call/constants.lisp create mode 100644 hub/osaka/constraints/instruction-handling/call/finishing_touches/EOA.lisp create mode 100644 hub/osaka/constraints/instruction-handling/call/finishing_touches/SMC.lisp create mode 100644 hub/osaka/constraints/instruction-handling/call/finishing_touches/abort.lisp create mode 100644 hub/osaka/constraints/instruction-handling/call/finishing_touches/exception.lisp create mode 100644 hub/osaka/constraints/instruction-handling/call/finishing_touches/setting_up_the_2nd_phase_for_precompiles.lisp create mode 100644 hub/osaka/constraints/instruction-handling/call/generalities/1st_set_of_account_rows.lisp create mode 100644 hub/osaka/constraints/instruction-handling/call/generalities/2nd_set_of_account_rows.lisp create mode 100644 hub/osaka/constraints/instruction-handling/call/generalities/3rd_set_of_account_rows.lisp create mode 100644 hub/osaka/constraints/instruction-handling/call/generalities/universal.lisp create mode 100644 hub/osaka/constraints/instruction-handling/call/non_stack_rows_for_non_precompiles.lisp create mode 100644 hub/osaka/constraints/instruction-handling/call/non_stack_rows_for_precompiles.lisp create mode 100644 hub/osaka/constraints/instruction-handling/call/peeking_flag_sums_for_non_precompiles.lisp create mode 100644 hub/osaka/constraints/instruction-handling/call/peeking_flag_sums_for_precompiles.lisp create mode 100644 hub/osaka/constraints/instruction-handling/call/precompiles/NSRs_and_flag_sums_I.lisp create mode 100644 hub/osaka/constraints/instruction-handling/call/precompiles/NSRs_and_flag_sums_II.lisp create mode 100644 hub/osaka/constraints/instruction-handling/call/precompiles/blake/FKTH.lisp create mode 100644 hub/osaka/constraints/instruction-handling/call/precompiles/blake/FKTR.lisp create mode 100644 hub/osaka/constraints/instruction-handling/call/precompiles/blake/constants.lisp create mode 100644 hub/osaka/constraints/instruction-handling/call/precompiles/blake/generalities.lisp create mode 100644 hub/osaka/constraints/instruction-handling/call/precompiles/blake/success.lisp create mode 100644 hub/osaka/constraints/instruction-handling/call/precompiles/blake/surviving_the_hub.lisp create mode 100644 hub/osaka/constraints/instruction-handling/call/precompiles/common/FKTH.lisp create mode 100644 hub/osaka/constraints/instruction-handling/call/precompiles/common/constants.lisp create mode 100644 hub/osaka/constraints/instruction-handling/call/precompiles/common/generalities.lisp create mode 100644 hub/osaka/constraints/instruction-handling/call/precompiles/common/success_ECRECOVER.lisp create mode 100644 hub/osaka/constraints/instruction-handling/call/precompiles/common/success_IDENTITY.lisp create mode 100644 hub/osaka/constraints/instruction-handling/call/precompiles/common/success_SHA2-RIPEMD.lisp create mode 100644 hub/osaka/constraints/instruction-handling/call/precompiles/ec_add_mul_pairing_bls/FKTR.lisp create mode 100644 hub/osaka/constraints/instruction-handling/call/precompiles/ec_add_mul_pairing_bls/constants.lisp create mode 100644 hub/osaka/constraints/instruction-handling/call/precompiles/ec_add_mul_pairing_bls/success_case.lisp create mode 100644 hub/osaka/constraints/instruction-handling/call/precompiles/generalities.lisp create mode 100644 hub/osaka/constraints/instruction-handling/call/precompiles/modexp/common.lisp create mode 100644 hub/osaka/constraints/instruction-handling/call/precompiles/modexp/constants.lisp create mode 100644 hub/osaka/constraints/instruction-handling/call/precompiles/modexp/failure.lisp create mode 100644 hub/osaka/constraints/instruction-handling/call/precompiles/modexp/success.lisp create mode 100644 hub/osaka/constraints/instruction-handling/call/precompiles/shorthands.lisp create mode 100644 hub/osaka/constraints/instruction-handling/call/shorthands.lisp create mode 100644 hub/osaka/constraints/instruction-handling/call/specialized/first_row_of_callee_context.lisp create mode 100644 hub/osaka/constraints/instruction-handling/call/specialized/initialize_callee_context.lisp create mode 100644 hub/osaka/constraints/instruction-handling/call/specialized/justify_callee_revert_data.lisp create mode 100644 hub/osaka/constraints/instruction-handling/call/specialized/missing-context-parameters.lisp create mode 100644 hub/osaka/constraints/instruction-handling/call/specialized/precompile-scenario-row-setting-for-precompiles.lisp create mode 100644 hub/osaka/constraints/instruction-handling/call/standpoint.lisp create mode 100644 hub/osaka/constraints/instruction-handling/call/triggers.lisp create mode 100644 hub/osaka/constraints/instruction-handling/con.lisp create mode 100644 hub/osaka/constraints/instruction-handling/copy/calldatacopy.lisp create mode 100644 hub/osaka/constraints/instruction-handling/copy/codecopy.lisp create mode 100644 hub/osaka/constraints/instruction-handling/copy/extcodecopy.lisp create mode 100644 hub/osaka/constraints/instruction-handling/copy/generalities.lisp create mode 100644 hub/osaka/constraints/instruction-handling/copy/returndatacopy.lisp create mode 100644 hub/osaka/constraints/instruction-handling/create/constants.lisp create mode 100644 hub/osaka/constraints/instruction-handling/create/constraints/deployment-failures.lisp create mode 100644 hub/osaka/constraints/instruction-handling/create/constraints/exceptional.lisp create mode 100644 hub/osaka/constraints/instruction-handling/create/constraints/final-context-row.lisp create mode 100644 hub/osaka/constraints/instruction-handling/create/constraints/generalities.lisp create mode 100644 hub/osaka/constraints/instruction-handling/create/constraints/reverting-one-step.lisp create mode 100644 hub/osaka/constraints/instruction-handling/create/constraints/reverting-two-step.lisp create mode 100644 hub/osaka/constraints/instruction-handling/create/constraints/unaborted.lisp create mode 100644 hub/osaka/constraints/instruction-handling/create/constraints/unexceptional.lisp create mode 100644 hub/osaka/constraints/instruction-handling/create/non_stack_rows.lisp create mode 100644 hub/osaka/constraints/instruction-handling/create/peeking_flags_shorthands.lisp create mode 100644 hub/osaka/constraints/instruction-handling/create/shorthands.lisp create mode 100644 hub/osaka/constraints/instruction-handling/create/standpoint.lisp create mode 100644 hub/osaka/constraints/instruction-handling/create/triggers.lisp create mode 100644 hub/osaka/constraints/instruction-handling/dup.lisp create mode 100644 hub/osaka/constraints/instruction-handling/halting/return.lisp create mode 100644 hub/osaka/constraints/instruction-handling/halting/revert.lisp create mode 100644 hub/osaka/constraints/instruction-handling/halting/selfdestruct/constraints.lisp create mode 100644 hub/osaka/constraints/instruction-handling/halting/selfdestruct/scenario.lisp create mode 100644 hub/osaka/constraints/instruction-handling/halting/selfdestruct/shorthands.lisp create mode 100644 hub/osaka/constraints/instruction-handling/halting/selfdestruct/will_revert.lisp create mode 100644 hub/osaka/constraints/instruction-handling/halting/selfdestruct/wont_revert_not_yet_marked.lisp create mode 100644 hub/osaka/constraints/instruction-handling/halting/shorthands.lisp create mode 100644 hub/osaka/constraints/instruction-handling/halting/stop.lisp create mode 100644 hub/osaka/constraints/instruction-handling/invalid.lisp create mode 100644 hub/osaka/constraints/instruction-handling/jump.lisp create mode 100644 hub/osaka/constraints/instruction-handling/keccak.lisp create mode 100644 hub/osaka/constraints/instruction-handling/log.lisp create mode 100644 hub/osaka/constraints/instruction-handling/machine_state.lisp create mode 100644 hub/osaka/constraints/instruction-handling/mcopy/constraints.lisp create mode 100644 hub/osaka/constraints/instruction-handling/mcopy/shorthands.lisp create mode 100644 hub/osaka/constraints/instruction-handling/push_pop.lisp create mode 100644 hub/osaka/constraints/instruction-handling/stack_exceptions.lisp create mode 100644 hub/osaka/constraints/instruction-handling/stack_ram.lisp create mode 100644 hub/osaka/constraints/instruction-handling/sto.lisp create mode 100644 hub/osaka/constraints/instruction-handling/swap.lisp create mode 100644 hub/osaka/constraints/instruction-handling/trans/constraints.lisp create mode 100644 hub/osaka/constraints/instruction-handling/trans/shorthands_and_constants.lisp create mode 100644 hub/osaka/constraints/instruction-handling/txn.lisp create mode 100644 hub/osaka/constraints/miscellaneous-rows/exp.lisp create mode 100644 hub/osaka/constraints/miscellaneous-rows/mmu.lisp create mode 100644 hub/osaka/constraints/miscellaneous-rows/mxp/calls.lisp create mode 100644 hub/osaka/constraints/miscellaneous-rows/mxp/mcopy.lisp create mode 100644 hub/osaka/constraints/miscellaneous-rows/mxp/msize.lisp create mode 100644 hub/osaka/constraints/miscellaneous-rows/mxp/mxp.lisp create mode 100644 hub/osaka/constraints/miscellaneous-rows/mxp/single_offset.lisp create mode 100644 hub/osaka/constraints/miscellaneous-rows/oob/opcodes/oob_inst_call.lisp create mode 100644 hub/osaka/constraints/miscellaneous-rows/oob/opcodes/oob_inst_cdl.lisp create mode 100644 hub/osaka/constraints/miscellaneous-rows/oob/opcodes/oob_inst_create.lisp create mode 100644 hub/osaka/constraints/miscellaneous-rows/oob/opcodes/oob_inst_deployment.lisp create mode 100644 hub/osaka/constraints/miscellaneous-rows/oob/opcodes/oob_inst_jump.lisp create mode 100644 hub/osaka/constraints/miscellaneous-rows/oob/opcodes/oob_inst_jumpi.lisp create mode 100644 hub/osaka/constraints/miscellaneous-rows/oob/opcodes/oob_inst_rdc.lisp create mode 100644 hub/osaka/constraints/miscellaneous-rows/oob/opcodes/oob_inst_sstore.lisp create mode 100644 hub/osaka/constraints/miscellaneous-rows/oob/opcodes/oob_inst_xcall.lisp create mode 100644 hub/osaka/constraints/miscellaneous-rows/oob/opcodes/oob_inst_xcreate.lisp create mode 100644 hub/osaka/constraints/miscellaneous-rows/oob/precompiles/blake/oob_inst_blake_cds.lisp create mode 100644 hub/osaka/constraints/miscellaneous-rows/oob/precompiles/blake/oob_inst_blake_params.lisp create mode 100644 hub/osaka/constraints/miscellaneous-rows/oob/precompiles/common/common.lisp create mode 100644 hub/osaka/constraints/miscellaneous-rows/oob/precompiles/modexp/oob_inst_modexp_cds.lisp create mode 100644 hub/osaka/constraints/miscellaneous-rows/oob/precompiles/modexp/oob_inst_modexp_extract.lisp create mode 100644 hub/osaka/constraints/miscellaneous-rows/oob/precompiles/modexp/oob_inst_modexp_lead.lisp create mode 100644 hub/osaka/constraints/miscellaneous-rows/oob/precompiles/modexp/oob_inst_modexp_pricing.lisp create mode 100644 hub/osaka/constraints/miscellaneous-rows/oob/precompiles/modexp/oob_inst_modexp_xbs.lisp create mode 100644 hub/osaka/constraints/miscellaneous-rows/oob/shorthands.lisp create mode 100644 hub/osaka/constraints/miscellaneous-rows/stp.lisp create mode 100644 hub/osaka/constraints/miscellaneous-rows/stp_mxp_connections.lisp create mode 100644 hub/osaka/constraints/miscellaneous-rows/weighted_misc_flag_sum.lisp create mode 100644 hub/osaka/constraints/scenario-rows/generalities.lisp create mode 100644 hub/osaka/constraints/scenario-rows/shorthands/call.lisp create mode 100644 hub/osaka/constraints/scenario-rows/shorthands/create.lisp create mode 100644 hub/osaka/constraints/scenario-rows/shorthands/precompile.lisp create mode 100644 hub/osaka/constraints/scenario-rows/shorthands/return.lisp create mode 100644 hub/osaka/constraints/scenario-rows/shorthands/selfdestruct.lisp create mode 100644 hub/osaka/constraints/stack-patterns/0-0-stack-pattern.lisp create mode 100644 hub/osaka/constraints/stack-patterns/0-1-stack-pattern.lisp create mode 100644 hub/osaka/constraints/stack-patterns/1-0-stack-pattern.lisp create mode 100644 hub/osaka/constraints/stack-patterns/1-1-stack-pattern.lisp create mode 100644 hub/osaka/constraints/stack-patterns/2-0-stack-pattern.lisp create mode 100644 hub/osaka/constraints/stack-patterns/2-1-stack-pattern.lisp create mode 100644 hub/osaka/constraints/stack-patterns/3-0-stack-pattern.lisp create mode 100644 hub/osaka/constraints/stack-patterns/3-1-stack-pattern.lisp create mode 100644 hub/osaka/constraints/stack-patterns/_helpers.lisp create mode 100644 hub/osaka/constraints/stack-patterns/call-stack-pattern.lisp create mode 100644 hub/osaka/constraints/stack-patterns/copy-stack-pattern.lisp create mode 100644 hub/osaka/constraints/stack-patterns/create-stack-pattern.lisp create mode 100644 hub/osaka/constraints/stack-patterns/dup-stack-pattern.lisp create mode 100644 hub/osaka/constraints/stack-patterns/empty-stack-pattern.lisp create mode 100644 hub/osaka/constraints/stack-patterns/load-store-stack-pattern.lisp create mode 100644 hub/osaka/constraints/stack-patterns/log-stack-pattern.lisp create mode 100644 hub/osaka/constraints/stack-patterns/request-hash.lisp create mode 100644 hub/osaka/constraints/stack-patterns/swap-stack-pattern.lisp create mode 100644 hub/osaka/constraints/storage-rows/specialized.lisp create mode 100644 hub/osaka/constraints/system/block_number/block_number.lisp create mode 100644 hub/osaka/constraints/system/block_number/shorthands.lisp create mode 100644 hub/osaka/constraints/system/constancies.lisp create mode 100644 hub/osaka/constraints/system/flags/generalities.lisp create mode 100644 hub/osaka/constraints/system/flags/shorthands.lisp create mode 100644 hub/osaka/constraints/system/flags/transaction_constancy.lisp create mode 100644 hub/osaka/constraints/system/flags/transitions.lisp create mode 100644 hub/osaka/constraints/system/hub_stamp/counters.lisp create mode 100644 hub/osaka/constraints/system/hub_stamp/formal.lisp create mode 100644 hub/osaka/constraints/system/hub_stamp/generalities.lisp create mode 100644 hub/osaka/constraints/system/hub_stamp/increments.lisp create mode 100644 hub/osaka/constraints/system/phase_flags/binarities.lisp create mode 100644 hub/osaka/constraints/system/phase_flags/generalities.lisp create mode 100644 hub/osaka/constraints/system/phase_flags/legality.lisp create mode 100644 hub/osaka/constraints/system/phase_flags/shorthands.lisp create mode 100644 hub/osaka/constraints/system/phase_flags/transition.lisp create mode 100644 hub/osaka/constraints/system/transaction_numbers/housekeeping.lisp create mode 100644 hub/osaka/constraints/system/transaction_numbers/numbers.lisp create mode 100644 hub/osaka/constraints/system/transaction_numbers/shorthands_end.lisp create mode 100644 hub/osaka/constraints/system/transaction_numbers/shorthands_start.lisp create mode 100644 hub/osaka/constraints/transient-rows/specialized.lisp create mode 100644 hub/osaka/constraints/tx_finl/peeking.lisp create mode 100644 hub/osaka/constraints/tx_finl/rows/acc_coinbase_reward.lisp create mode 100644 hub/osaka/constraints/tx_finl/rows/acc_sender_gas_refund.lisp create mode 100644 hub/osaka/constraints/tx_finl/rows/transaction.lisp create mode 100644 hub/osaka/constraints/tx_finl/shorthands.lisp create mode 100644 hub/osaka/constraints/tx_init/peeking.lisp create mode 100644 hub/osaka/constraints/tx_init/rows/acc_coinbase_warm.lisp create mode 100644 hub/osaka/constraints/tx_init/rows/acc_recipient_value_transfer.lisp create mode 100644 hub/osaka/constraints/tx_init/rows/acc_sender_gas_payment.lisp create mode 100644 hub/osaka/constraints/tx_init/rows/acc_sender_value_transfer.lisp create mode 100644 hub/osaka/constraints/tx_init/rows/acc_undo_recipient_value_reception.lisp create mode 100644 hub/osaka/constraints/tx_init/rows/acc_undo_sender_value_transfer.lisp create mode 100644 hub/osaka/constraints/tx_init/rows/con_initialization.lisp create mode 100644 hub/osaka/constraints/tx_init/rows/first_execution_row_parameters.lisp create mode 100644 hub/osaka/constraints/tx_init/rows/miscellaneous.lisp create mode 100644 hub/osaka/constraints/tx_init/rows/transaction.lisp create mode 100644 hub/osaka/constraints/tx_init/shorthands.lisp create mode 100644 hub/osaka/constraints/tx_prewarm/constraints.lisp create mode 100644 hub/osaka/constraints/tx_skip/noop/peeking_flags.lisp create mode 100644 hub/osaka/constraints/tx_skip/noop/shorthands.lisp create mode 100644 hub/osaka/constraints/tx_skip/sysf/introduction.lisp create mode 100644 hub/osaka/constraints/tx_skip/sysf/peeking_flags.lisp create mode 100644 hub/osaka/constraints/tx_skip/sysf/shorthands.lisp create mode 100644 hub/osaka/constraints/tx_skip/sysi/eip-2935/peeking_flags.lisp create mode 100644 hub/osaka/constraints/tx_skip/sysi/eip-2935/rows/_context_final_zero_context___nontrivial_case.lisp create mode 100644 hub/osaka/constraints/tx_skip/sysi/eip-2935/rows/_context_final_zero_context___trivial_case.lisp create mode 100644 hub/osaka/constraints/tx_skip/sysi/eip-2935/rows/_transaction.lisp create mode 100644 hub/osaka/constraints/tx_skip/sysi/eip-2935/rows/account_load_the_block_hash_smart_contract.lisp create mode 100644 hub/osaka/constraints/tx_skip/sysi/eip-2935/rows/storage_store_block_hash_in_state.lisp create mode 100644 hub/osaka/constraints/tx_skip/sysi/eip-2935/shorthands.lisp create mode 100644 hub/osaka/constraints/tx_skip/sysi/eip-4788/peeking_flags.lisp create mode 100644 hub/osaka/constraints/tx_skip/sysi/eip-4788/rows/_context_final_zero_context___nontrivial_case.lisp create mode 100644 hub/osaka/constraints/tx_skip/sysi/eip-4788/rows/_context_final_zero_context___trivial_case.lisp create mode 100644 hub/osaka/constraints/tx_skip/sysi/eip-4788/rows/_transaction.lisp create mode 100644 hub/osaka/constraints/tx_skip/sysi/eip-4788/rows/account_load_the_beacon_root_smart_contract.lisp create mode 100644 hub/osaka/constraints/tx_skip/sysi/eip-4788/rows/storage_store_beacon_root.lisp create mode 100644 hub/osaka/constraints/tx_skip/sysi/eip-4788/rows/storage_store_timestamp.lisp create mode 100644 hub/osaka/constraints/tx_skip/sysi/eip-4788/shorthands.lisp create mode 100644 hub/osaka/constraints/tx_skip/user/peeking_flags.lisp create mode 100644 hub/osaka/constraints/tx_skip/user/rows/_context_final_zero_context.lisp create mode 100644 hub/osaka/constraints/tx_skip/user/rows/account_coinbase.lisp create mode 100644 hub/osaka/constraints/tx_skip/user/rows/account_recipient.lisp create mode 100644 hub/osaka/constraints/tx_skip/user/rows/account_sender.lisp create mode 100644 hub/osaka/constraints/tx_skip/user/rows/transaction.lisp create mode 100644 hub/osaka/constraints/tx_skip/user/shorthands.lisp create mode 100644 hub/osaka/lookups/helpers.lisp create mode 100644 hub/osaka/lookups/hub_into_add.lisp create mode 100644 hub/osaka/lookups/hub_into_bin.lisp create mode 100644 hub/osaka/lookups/hub_into_block_data.lisp create mode 100644 hub/osaka/lookups/hub_into_block_hash.lisp create mode 100644 hub/osaka/lookups/hub_into_exp.lisp create mode 100644 hub/osaka/lookups/hub_into_ext.lisp create mode 100644 hub/osaka/lookups/hub_into_gas.lisp create mode 100644 hub/osaka/lookups/hub_into_hub.lisp create mode 100644 hub/osaka/lookups/hub_into_instruction_decoder.lisp create mode 100644 hub/osaka/lookups/hub_into_log_info.lisp create mode 100644 hub/osaka/lookups/hub_into_mmu.lisp create mode 100644 hub/osaka/lookups/hub_into_mod.lisp create mode 100644 hub/osaka/lookups/hub_into_mul.lisp create mode 100644 hub/osaka/lookups/hub_into_mxp.lisp create mode 100644 hub/osaka/lookups/hub_into_oob.lisp create mode 100644 hub/osaka/lookups/hub_into_rlp_addr.lisp create mode 100644 hub/osaka/lookups/hub_into_rlp_txn.lisp create mode 100644 hub/osaka/lookups/hub_into_rom_instruction_fetching.lisp create mode 100644 hub/osaka/lookups/hub_into_rom_jump_destination_vetting.lisp create mode 100644 hub/osaka/lookups/hub_into_rom_lex.lisp create mode 100644 hub/osaka/lookups/hub_into_shakira.lisp create mode 100644 hub/osaka/lookups/hub_into_shf.lisp create mode 100644 hub/osaka/lookups/hub_into_stp.lisp create mode 100644 hub/osaka/lookups/hub_into_trm.lisp create mode 100644 hub/osaka/lookups/hub_into_txn_data.lisp create mode 100644 hub/osaka/lookups/hub_into_wcp.lisp create mode 100644 hub/osaka/lookups/hub_into_wcp_for_stack_overflow.lisp create mode 100644 hub/osaka/lookups/hub_into_wcp_for_stack_underflow.lisp create mode 100644 hub/osaka/lookups/template rename mmu/{ => london}/columns.lisp (100%) rename mmu/{ => london}/constants.lisp (100%) rename mmu/{ => london}/constraints.lisp (100%) rename mmu/{ => london}/instructions/any_to_ram_with_padding/common.lisp (100%) rename mmu/{ => london}/instructions/any_to_ram_with_padding/pure_padding.lisp (100%) rename mmu/{ => london}/instructions/any_to_ram_with_padding/some_data.lisp (100%) rename mmu/{ => london}/instructions/blake.lisp (100%) rename mmu/{ => london}/instructions/exo_to_ram_transplant.lisp (100%) rename mmu/{ => london}/instructions/invalid_code_prefix.lisp (100%) rename mmu/{ => london}/instructions/mload.lisp (100%) rename mmu/{ => london}/instructions/modexp_data.lisp (100%) rename mmu/{ => london}/instructions/modexp_zero.lisp (100%) rename mmu/{ => london}/instructions/mstore.lisp (100%) rename mmu/{ => london}/instructions/mstore8.lisp (100%) rename mmu/{ => london}/instructions/ram_to_exo_with_padding.lisp (100%) rename mmu/{ => london}/instructions/ram_to_ram_sans_padding.lisp (100%) rename mmu/{ => london}/instructions/right_padded_word_extraction.lisp (100%) rename mmu/{ => london}/lookups/mmu_into_euc.lisp (100%) rename mmu/{ => london}/lookups/mmu_into_mmio.lisp (100%) rename mmu/{ => london}/lookups/mmu_into_wcp.lisp (100%) create mode 100644 mmu/osaka/columns.lisp create mode 100644 mmu/osaka/constants.lisp create mode 100644 mmu/osaka/constraints.lisp create mode 100644 mmu/osaka/instructions/any_to_ram_with_padding/common.lisp create mode 100644 mmu/osaka/instructions/any_to_ram_with_padding/pure_padding.lisp create mode 100644 mmu/osaka/instructions/any_to_ram_with_padding/some_data.lisp create mode 100644 mmu/osaka/instructions/blake.lisp create mode 100644 mmu/osaka/instructions/exo_to_ram_transplant.lisp create mode 100644 mmu/osaka/instructions/invalid_code_prefix.lisp create mode 100644 mmu/osaka/instructions/mload.lisp create mode 100644 mmu/osaka/instructions/modexp_data.lisp create mode 100644 mmu/osaka/instructions/modexp_zero.lisp create mode 100644 mmu/osaka/instructions/mstore.lisp create mode 100644 mmu/osaka/instructions/mstore8.lisp create mode 100644 mmu/osaka/instructions/ram_to_exo_with_padding.lisp create mode 100644 mmu/osaka/instructions/ram_to_ram_sans_padding.lisp create mode 100644 mmu/osaka/instructions/right_padded_word_extraction.lisp create mode 100644 mmu/osaka/lookups/mmu_into_euc.lisp create mode 100644 mmu/osaka/lookups/mmu_into_mmio.lisp create mode 100644 mmu/osaka/lookups/mmu_into_wcp.lisp create mode 100644 oob/osaka/binarities.lisp create mode 100644 oob/osaka/columns.lisp create mode 100644 oob/osaka/constancies.lisp create mode 100644 oob/osaka/constants.lisp create mode 100644 oob/osaka/decoding.lisp create mode 100644 oob/osaka/heartbeat.lisp create mode 100644 oob/osaka/lookups/oob-into-add.lisp create mode 100644 oob/osaka/lookups/oob-into-blsreftable.lisp create mode 100644 oob/osaka/lookups/oob-into-mod.lisp create mode 100644 oob/osaka/lookups/oob-into-wcp.lisp create mode 100644 oob/osaka/opcodes/call.lisp create mode 100644 oob/osaka/opcodes/cdl.lisp create mode 100644 oob/osaka/opcodes/create.lisp create mode 100644 oob/osaka/opcodes/deployment.lisp create mode 100644 oob/osaka/opcodes/jump.lisp create mode 100644 oob/osaka/opcodes/jumpi.lisp create mode 100644 oob/osaka/opcodes/rdc.lisp create mode 100644 oob/osaka/opcodes/sstore.lisp create mode 100644 oob/osaka/opcodes/xcall.lisp create mode 100644 oob/osaka/opcodes/xcreate.lisp create mode 100644 oob/osaka/precompiles/blake2f/cds.lisp create mode 100644 oob/osaka/precompiles/blake2f/params.lisp create mode 100644 oob/osaka/precompiles/common/bls/bls_msm.lisp create mode 100644 oob/osaka/precompiles/common/bls/bls_pairing_check.lisp create mode 100644 oob/osaka/precompiles/common/bls/point_evaluation_bls_adds_bls_maps.lisp create mode 100644 oob/osaka/precompiles/common/common_constraints.lisp create mode 100644 oob/osaka/precompiles/common/ecpairing.lisp create mode 100644 oob/osaka/precompiles/common/ecrecover_ecadd_ecmul.lisp create mode 100644 oob/osaka/precompiles/common/sha2_ripemd_identity.lisp create mode 100644 oob/osaka/precompiles/modexp/cds.lisp create mode 100644 oob/osaka/precompiles/modexp/extract.lisp create mode 100644 oob/osaka/precompiles/modexp/lead.lisp create mode 100644 oob/osaka/precompiles/modexp/pricing.lisp create mode 100644 oob/osaka/precompiles/modexp/xbs.lisp create mode 100644 oob/osaka/shorthands.lisp create mode 100644 oob/osaka/specialized.lisp rename rlptxrcpt/{ => london}/columns.lisp (100%) rename rlptxrcpt/{ => london}/constants.lisp (100%) rename rlptxrcpt/{ => london}/constraints.lisp (100%) create mode 100644 rlptxrcpt/osaka/columns.lisp create mode 100644 rlptxrcpt/osaka/constants.lisp create mode 100644 rlptxrcpt/osaka/constraints.lisp create mode 100644 txndata/osaka/columns/cmptn_view.lisp create mode 100644 txndata/osaka/columns/common.lisp create mode 100644 txndata/osaka/columns/hub_view.lisp create mode 100644 txndata/osaka/columns/rlp_view.lisp create mode 100644 txndata/osaka/fork/prague.lisp create mode 100644 txndata/osaka/generalities/binary.lisp create mode 100644 txndata/osaka/generalities/constancies.lisp create mode 100644 txndata/osaka/generalities/constraint_systems.lisp create mode 100644 txndata/osaka/generalities/ct_max_and_ct.lisp create mode 100644 txndata/osaka/generalities/cumulative.lisp create mode 100644 txndata/osaka/generalities/finalization.lisp create mode 100644 txndata/osaka/generalities/flags_perspectives.lisp create mode 100644 txndata/osaka/generalities/flags_transactions.lisp create mode 100644 txndata/osaka/generalities/number_blocks.lisp create mode 100644 txndata/osaka/generalities/number_transactions.lisp create mode 100644 txndata/osaka/generalities/number_user_transactions.lisp create mode 100644 txndata/osaka/generalities/transitions.lisp create mode 100644 txndata/osaka/lookups/txndata_into_block_data.lisp create mode 100644 txndata/osaka/lookups/txndata_into_euc.lisp create mode 100644 txndata/osaka/lookups/txndata_into_hub.lisp create mode 100644 txndata/osaka/lookups/txndata_into_rlp_addr.lisp create mode 100644 txndata/osaka/lookups/txndata_into_rlp_txn.lisp create mode 100644 txndata/osaka/lookups/txndata_into_rlp_txnrcpt.lisp create mode 100644 txndata/osaka/lookups/txndata_into_rom_lex.lisp create mode 100644 txndata/osaka/lookups/txndata_into_wcp.lisp create mode 100644 txndata/osaka/processing/sysf/noop/constants.lisp create mode 100644 txndata/osaka/processing/sysf/noop/generalities.lisp create mode 100644 txndata/osaka/processing/sysf/noop/rows/noop.lisp create mode 100644 txndata/osaka/processing/sysi/eip-2935/computations.lisp create mode 100644 txndata/osaka/processing/sysi/eip-2935/shorthands.lisp create mode 100644 txndata/osaka/processing/sysi/eip-4788/computations.lisp create mode 100644 txndata/osaka/processing/sysi/eip-4788/shorthands.lisp create mode 100644 txndata/osaka/processing/sysi/noop/computations.lisp create mode 100644 txndata/osaka/processing/sysi/prelude.lisp create mode 100644 txndata/osaka/processing/user/constants.lisp create mode 100644 txndata/osaka/processing/user/decoding.lisp create mode 100644 txndata/osaka/processing/user/prelude.lisp create mode 100644 txndata/osaka/processing/user/rows/_02_eip-2681_max_nonce_check.lisp create mode 100644 txndata/osaka/processing/user/rows/_03_initial_balance_must_cover_value_and_gas.lisp create mode 100644 txndata/osaka/processing/user/rows/_04_eip-3860_init_code_does_not_exceed_max_size.lisp create mode 100644 txndata/osaka/processing/user/rows/_05_eip-3860_init_code_pricing.lisp create mode 100644 txndata/osaka/processing/user/rows/_06_gas_limit_must_cover_upfront_gas_cost.lisp create mode 100644 txndata/osaka/processing/user/rows/_07_eip-7623_gas_limit_must_cover_transaction_floor_cost.lisp create mode 100644 txndata/osaka/processing/user/rows/_08_refunds_upper_limit.lisp create mode 100644 txndata/osaka/processing/user/rows/_09_refunds_effective.lisp create mode 100644 txndata/osaka/processing/user/rows/_10_eip-7623_refunds_vs_floor_cost.lisp create mode 100644 txndata/osaka/processing/user/rows/_11_call_data_emptyness_check.lisp create mode 100644 txndata/osaka/processing/user/rows/_12_max_gas_price_vs_basefee.lisp create mode 100644 txndata/osaka/processing/user/rows/_13_cumulative_gas_must_not_exceed_block_gas_limit.lisp create mode 100644 txndata/osaka/processing/user/rows/_14_eip-1559_max_fee_vs_max_priority_fee.lisp create mode 100644 txndata/osaka/processing/user/rows/_15_eip-1559_effective_gas_price.lisp create mode 100644 txndata/osaka/processing/user/shorthands_hub.lisp create mode 100644 txndata/osaka/processing/user/shorthands_rlp.lisp create mode 100644 txndata/osaka/processing/user/specialized.lisp create mode 100644 txndata/osaka/processing/user/transfer_to_hub_from_rlptxn.lisp create mode 100644 txndata/osaka/processing/user/transfer_to_rlptxn_from_hub.lisp create mode 100644 zkevm_osaka.bin diff --git a/Makefile b/Makefile index 779629c93..812ba268b 100644 --- a/Makefile +++ b/Makefile @@ -28,6 +28,7 @@ CONSTANTS := constants/constants.lisp CONSTANTS_LONDON := constants/london/constants.zkasm CONSTANTS_CANCUN := constants/cancun/constants.zkasm CONSTANTS_PRAGUE := constants/prague/constants.zkasm +CONSTANTS_OSAKA := constants/osaka/constants.zkasm EC_DATA := ecdata @@ -41,6 +42,7 @@ HUB_LONDON := hub/london HUB_SHANGHAI := hub/shanghai HUB_CANCUN := hub/cancun HUB_PRAGUE := hub/prague +HUB_OSAKA := hub/osaka LIBRARY := library @@ -54,6 +56,9 @@ MMU := mmu MMIO_LONDON := mmio/london MMIO_CANCUN := mmio/cancun +MMU_LONDON := mmu/london +MMU_OSAKA := mmu/osaka + MXP_LONDON := mxp/london MXP_CANCUN := mxp/cancun @@ -61,6 +66,7 @@ OOB_LONDON := oob/london OOB_SHANGHAI := oob/shanghai OOB_CANCUN := oob/cancun OOB_PRAGUE := oob/prague +OOB_OSAKA := oob/osaka RLP_ADDR := rlpaddr @@ -69,6 +75,9 @@ RLP_TXN_CANCUN := rlptxn/cancun RLP_TXN_PRAGUE := rlptxn/cancun # TODO: update for Prague v2 + add RLP_AUTH +RLP_TXN_RCPT_LONDON := rlptxrcpt/london +RLP_TXN_RCPT_OSAKA := rlptxrcpt/osaka + RLP_TXRCPT := rlptxrcpt RLP_UTILS_CANCUN := rlputils/cancun @@ -93,6 +102,7 @@ TXN_DATA_LONDON := txndata/london TXN_DATA_SHANGHAI := txndata/shanghai TXN_DATA_CANCUN := txndata/cancun TXN_DATA_PRAGUE := txndata/prague +TXN_DATA_OSAKA := txndata/osaka WCP := wcp @@ -113,9 +123,7 @@ ZKEVM_MODULES_COMMON := ${CONSTANTS} \ ${GAS} \ ${LIBRARY} \ ${LOG_DATA} \ - ${MMU} \ ${RLP_ADDR} \ - ${RLP_TXRCPT} \ ${ROM} \ ${ROM_LEX} \ ${SHAKIRA_DATA} \ @@ -131,9 +139,11 @@ ZKEVM_MODULES_LONDON := ${ZKEVM_MODULES_COMMON} \ ${HUB_LONDON} \ ${LOG_INFO_LONDON} \ ${MMIO_LONDON} \ + ${MMU_LONDON} \ ${MXP_LONDON} \ ${OOB_LONDON} \ ${RLP_TXN_LONDON} \ + ${RLP_TXN_RCPT_LONDON} \ ${TXN_DATA_LONDON} @@ -146,9 +156,11 @@ ZKEVM_MODULES_SHANGHAI := ${ZKEVM_MODULES_COMMON} \ ${HUB_SHANGHAI} \ ${LOG_INFO_LONDON} \ ${MMIO_LONDON} \ + ${MMU_LONDON} \ ${MXP_LONDON} \ ${OOB_SHANGHAI} \ ${RLP_TXN_LONDON} \ + ${RLP_TXN_RCPT_LONDON} \ ${TXN_DATA_SHANGHAI} ZKEVM_MODULES_CANCUN := ${ZKEVM_MODULES_COMMON} \ @@ -159,9 +171,11 @@ ZKEVM_MODULES_CANCUN := ${ZKEVM_MODULES_COMMON} \ ${HUB_CANCUN} \ ${LOG_INFO_CANCUN} \ ${MMIO_CANCUN} \ + ${MMU_LONDON} \ ${MXP_CANCUN} \ ${OOB_CANCUN} \ ${RLP_TXN_CANCUN} \ + ${RLP_TXN_RCPT_LONDON} \ ${RLP_UTILS_CANCUN} \ ${TXN_DATA_CANCUN} @@ -173,13 +187,31 @@ ZKEVM_MODULES_PRAGUE := ${ZKEVM_MODULES_COMMON} \ ${HUB_PRAGUE} \ ${LOG_INFO_CANCUN} \ ${MMIO_CANCUN} \ + ${MMU_LONDON} \ ${MXP_CANCUN} \ ${OOB_PRAGUE} \ ${RLP_TXN_PRAGUE} \ + ${RLP_TXN_RCPT_LONDON} \ ${RLP_UTILS_CANCUN} \ ${TXN_DATA_PRAGUE} -all: zkevm_london.bin zkevm_paris.bin zkevm_shanghai.bin zkevm_cancun.bin zkevm_prague.bin +ZKEVM_MODULES_OSAKA := ${ZKEVM_MODULES_COMMON} \ + ${CONSTANTS_OSAKA} \ + ${TABLES_PRAGUE} \ + ${BLOCKDATA_CANCUN} \ + ${BLS_PRAGUE} \ + ${HUB_OSAKA} \ + ${LOG_INFO_CANCUN} \ + ${MMIO_CANCUN} \ + ${MMU_OSAKA} \ + ${MXP_CANCUN} \ + ${OOB_OSAKA} \ + ${RLP_TXN_PRAGUE} \ + ${RLP_TXN_RCPT_OSAKA} \ + ${RLP_UTILS_CANCUN} \ + ${TXN_DATA_OSAKA} + +all: zkevm_london.bin zkevm_paris.bin zkevm_shanghai.bin zkevm_cancun.bin zkevm_prague.bin zkevm_osaka.bin zkevm_london.bin: ${ZKEVM_MODULES_LONDON} ${GO_CORSET_COMPILE} -o $@ ${ZKEVM_MODULES_LONDON} @@ -201,3 +233,7 @@ zkevm_cancun.bin: ${ZKEVM_MODULES_CANCUN} zkevm_prague.bin: ${ZKEVM_MODULES_PRAGUE} ${GO_CORSET_COMPILE} -o $@ ${ZKEVM_MODULES_PRAGUE} @$(call warn_lispX) + +zkevm_osaka.bin: ${ZKEVM_MODULES_OSAKA} + ${GO_CORSET_COMPILE} -o $@ ${ZKEVM_MODULES_OSAKA} + @$(call warn_lispX) diff --git a/constants/osaka/constants.zkasm b/constants/osaka/constants.zkasm new file mode 100644 index 000000000..a71365a32 --- /dev/null +++ b/constants/osaka/constants.zkasm @@ -0,0 +1 @@ +const MAX_PRC_ADDRESS = 0x11 diff --git a/hub/osaka/columns/account.lisp b/hub/osaka/columns/account.lisp new file mode 100644 index 000000000..885c1a24b --- /dev/null +++ b/hub/osaka/columns/account.lisp @@ -0,0 +1,63 @@ +(module hub) + +(defperspective account + + ;; selector + PEEK_AT_ACCOUNT + + ;; account-row columns + ((ADDRESS_HI :i32) + (ADDRESS_LO :i128) + (NONCE :i64 :display :dec) + (NONCE_NEW :i64 :display :dec) + (BALANCE :i128 :display :dec) + (BALANCE_NEW :i128 :display :dec) + (CODE_SIZE :i32 :display :dec) + (CODE_SIZE_NEW :i32 :display :dec) + (CODE_HASH_HI :i128) + (CODE_HASH_LO :i128) + (CODE_HASH_HI_NEW :i128) + (CODE_HASH_LO_NEW :i128) + (HAS_CODE :binary) ;; rmk1: explicitly set on every account row, de facto binary + (HAS_CODE_NEW :binary) ;; rmk1 + (HAD_CODE_INITIALLY :binary) + (CODE_FRAGMENT_INDEX :i32 :display :dec) + (ROMLEX_FLAG :binary@prove) + (EXISTS :binary) ;; rmk1 + (EXISTS_NEW :binary) ;; rmk1 + (WARMTH :binary@prove) ;; rmk2: should be binary even without the explicit constraint; we keep it as a safety; + (WARMTH_NEW :binary@prove) ;; rmk2 + (MARKED_FOR_DELETION :binary@prove) ;; rmk2 + (MARKED_FOR_DELETION_NEW :binary@prove) ;; rmk2 + (DEPLOYMENT_NUMBER :i32 :display :dec) + (DEPLOYMENT_NUMBER_NEW :i32 :display :dec) + (DEPLOYMENT_STATUS :binary@prove) ;; rmk2 + (DEPLOYMENT_STATUS_NEW :binary@prove) ;; rmk2 + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; ;; + ;; TRM module lookup columns ;; + ;; ;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + (TRM_FLAG :binary@prove) + (IS_PRECOMPILE :binary@prove) ;; rmk: this flag is set from the TRM module the very first time an address is encountered in a conflation, and is conflation-constant; the @prove is redundant; we keep it for safety; + (TRM_RAW_ADDRESS_HI :i128) + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; ;; + ;; RLPADDR module lookup columns ;; + ;; ;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + (RLPADDR_FLAG :binary@prove) + (RLPADDR_RECIPE :i8) + (RLPADDR_DEP_ADDR_HI :i32) + (RLPADDR_DEP_ADDR_LO :i128) + (RLPADDR_SALT_HI :i128) + (RLPADDR_SALT_LO :i128) + (RLPADDR_KEC_HI :i128) + (RLPADDR_KEC_LO :i128) + )) + + diff --git a/hub/osaka/columns/context.lisp b/hub/osaka/columns/context.lisp new file mode 100644 index 000000000..c1d4c657a --- /dev/null +++ b/hub/osaka/columns/context.lisp @@ -0,0 +1,45 @@ +(module hub) + +(defperspective context + + ;; selector + PEEK_AT_CONTEXT + + ;; context-row columns + ( + ;; (immutable) context data + ( CONTEXT_NUMBER :i32 ) ;; rmk: deduced from the HUB_STAMP; could likely be reduced to :i24 (i.e. ~ 16M); though: limitless prover ... + ( CALL_STACK_DEPTH :i11 ) ;; in the range [0 .. 1024] (inclusive) + ( IS_ROOT :binary@prove ) ;; rmk: set at the creation of the context explicitly to 0 or 1; imposed to be context-constant; the @prove is therefore redundant; we keep it for now as a safet; + ( IS_STATIC :binary@prove ) ;; rmk: same remark + + ;; (immutable) account + ( ACCOUNT_ADDRESS_HI :i32 ) + ( ACCOUNT_ADDRESS_LO :i128 ) + ( ACCOUNT_DEPLOYMENT_NUMBER :i32 ) + + ;; (immutable) account whose bytecode is being executed + ( BYTE_CODE_ADDRESS_HI :i32 ) + ( BYTE_CODE_ADDRESS_LO :i128 ) + ( BYTE_CODE_DEPLOYMENT_NUMBER :i32 ) + ( BYTE_CODE_DEPLOYMENT_STATUS :i32 ) + ( BYTE_CODE_CODE_FRAGMENT_INDEX :i32 ) + + ;; (immutable) caller account + ( CALL_DATA_CONTEXT_NUMBER :i32 ) + ( CALLER_ADDRESS_HI :i32 ) + ( CALLER_ADDRESS_LO :i128 ) + ( CALL_VALUE :i128 ) + + ;; (immutable) parameters set at CALL + ( CALL_DATA_OFFSET :i32 ) + ( CALL_DATA_SIZE :i32 ) + ( RETURN_AT_OFFSET :i32 ) + ( RETURN_AT_CAPACITY :i32 ) + + ;; (mutable) parameters set when execution resumes after a CALL / CREATE + ( UPDATE :binary@prove ) + ( RETURN_DATA_OFFSET :i32 ) + ( RETURN_DATA_SIZE :i32 ) + ( RETURN_DATA_CONTEXT_NUMBER :i32 ) + )) diff --git a/hub/osaka/columns/miscellaneous.lisp b/hub/osaka/columns/miscellaneous.lisp new file mode 100644 index 000000000..4203edb63 --- /dev/null +++ b/hub/osaka/columns/miscellaneous.lisp @@ -0,0 +1,74 @@ +(module hub) + +(defperspective misc + ;; selector + PEEK_AT_MISCELLANEOUS + + ;; miscellaneous-row columns + ( + ( EXP_FLAG :binary@prove ) + ( MMU_FLAG :binary@prove ) + ( MXP_FLAG :binary@prove ) + ( OOB_FLAG :binary@prove ) + ( STP_FLAG :binary@prove ) + + ;; EXP columns (DONE) + ( EXP_INST :i16 ) + ( EXP_DATA :array [5] :i128 ) + + ;; MMU columns (DONE) + ( MMU_INST :i16 :display :hex) + ( MMU_SRC_ID :i32 ) + ( MMU_TGT_ID :i32 ) + ( MMU_AUX_ID :i32 ) + ( MMU_SRC_OFFSET_LO :i128 ) + ( MMU_SRC_OFFSET_HI :i128 ) + ( MMU_TGT_OFFSET_LO :i128 ) + ( MMU_SIZE :i32 ) + ( MMU_REF_OFFSET :i32 ) + ( MMU_REF_SIZE :i32 ) + ( MMU_SUCCESS_BIT :binary@prove ) + ( MMU_LIMB_1 :i128 ) + ( MMU_LIMB_2 :i128 ) + ( MMU_PHASE :i32 ) + ( MMU_EXO_SUM :i32 ) + + ;; MXP colummns + ( MXP_INST :byte ) + ( MXP_MXPX :binary ) + ( MXP_DEPLOYS :binary ) + ( MXP_OFFSET_1_HI :i128 ) + ( MXP_OFFSET_1_LO :i128 ) + ( MXP_OFFSET_2_HI :i128 ) + ( MXP_OFFSET_2_LO :i128 ) + ( MXP_SIZE_1_HI :i128 ) + ( MXP_SIZE_1_LO :i128 ) + ( MXP_SIZE_2_HI :i128 ) + ( MXP_SIZE_2_LO :i128 ) + ( MXP_WORDS :i128 ) + ( MXP_GAS_MXP :i128 ) + ( MXP_SIZE_1_NONZERO_NO_MXPX :binary@prove ) + ( MXP_SIZE_2_NONZERO_NO_MXPX :binary@prove ) + + ;; OOB columns + (OOB_INST :i16 ) + (OOB_DATA :array[1:10] :i128 ) + + ;; STP columns + ( STP_INSTRUCTION :byte ) + ( STP_GAS_HI :i128 ) + ( STP_GAS_LO :i128 ) + ( STP_VALUE_HI :i128 ) + ( STP_VALUE_LO :i128 ) + ( STP_EXISTS :binary) + ( STP_WARMTH :binary) + ( STP_OOGX :binary) + ( STP_GAS_MXP :i64 ) + ( STP_GAS_UPFRONT_GAS_COST :i64 ) + ( STP_GAS_PAID_OUT_OF_POCKET :i64 ) + ( STP_GAS_STIPEND :i12 ) + + ;; ``truly'' miscellaneous columns + ( CCSR_FLAG :binary) ;; Child Context Self Reverts Flag; + ( CCRS_STAMP :i32 ) ;; Child Context Revert Stamp + )) diff --git a/hub/osaka/columns/scenario.lisp b/hub/osaka/columns/scenario.lisp new file mode 100644 index 000000000..5fd92ff47 --- /dev/null +++ b/hub/osaka/columns/scenario.lisp @@ -0,0 +1,87 @@ +(module hub) + +(defperspective scenario + + ;; selector + PEEK_AT_SCENARIO + + ;; scenario columns + (;; CALL related scenario columns + (CALL_EXCEPTION :binary@prove) + (CALL_ABORT_WILL_REVERT :binary@prove) + (CALL_ABORT_WONT_REVERT :binary@prove) + ;; call to precompiles related + (CALL_PRC_FAILURE :binary@prove) + (CALL_PRC_SUCCESS_CALLER_WILL_REVERT :binary@prove) + (CALL_PRC_SUCCESS_CALLER_WONT_REVERT :binary@prove) + ;; call to smart contract related + (CALL_SMC_FAILURE_CALLER_WILL_REVERT :binary@prove) + (CALL_SMC_FAILURE_CALLER_WONT_REVERT :binary@prove) + (CALL_SMC_SUCCESS_CALLER_WILL_REVERT :binary@prove) + (CALL_SMC_SUCCESS_CALLER_WONT_REVERT :binary@prove) + ;; call to externally owned accounts related + (CALL_EOA_SUCCESS_CALLER_WILL_REVERT :binary@prove) + (CALL_EOA_SUCCESS_CALLER_WONT_REVERT :binary@prove) + + ;; Create related + (CREATE_EXCEPTION :binary@prove) + (CREATE_ABORT :binary@prove) + (CREATE_FAILURE_CONDITION_WILL_REVERT :binary@prove) + (CREATE_FAILURE_CONDITION_WONT_REVERT :binary@prove) + (CREATE_EMPTY_INIT_CODE_WILL_REVERT :binary@prove) + (CREATE_EMPTY_INIT_CODE_WONT_REVERT :binary@prove) + (CREATE_NONEMPTY_INIT_CODE_FAILURE_WILL_REVERT :binary@prove) + (CREATE_NONEMPTY_INIT_CODE_FAILURE_WONT_REVERT :binary@prove) + (CREATE_NONEMPTY_INIT_CODE_SUCCESS_WILL_REVERT :binary@prove) + (CREATE_NONEMPTY_INIT_CODE_SUCCESS_WONT_REVERT :binary@prove) + + ;; Return related + (RETURN_EXCEPTION :binary@prove) + (RETURN_FROM_MESSAGE_CALL_WILL_TOUCH_RAM :binary@prove) + (RETURN_FROM_MESSAGE_CALL_WONT_TOUCH_RAM :binary@prove) + (RETURN_FROM_DEPLOYMENT_EMPTY_CODE_WILL_REVERT :binary@prove) + (RETURN_FROM_DEPLOYMENT_EMPTY_CODE_WONT_REVERT :binary@prove) + (RETURN_FROM_DEPLOYMENT_NONEMPTY_CODE_WILL_REVERT :binary@prove) + (RETURN_FROM_DEPLOYMENT_NONEMPTY_CODE_WONT_REVERT :binary@prove) + + ;; precompile related + ;; precompile flags + (PRC_ECRECOVER :binary@prove) + (PRC_SHA2-256 :binary@prove) + (PRC_RIPEMD-160 :binary@prove) + (PRC_IDENTITY :binary@prove) + (PRC_MODEXP :binary@prove) + (PRC_ECADD :binary@prove) + (PRC_ECMUL :binary@prove) + (PRC_ECPAIRING :binary@prove) + (PRC_BLAKE2f :binary@prove) + ;; Cancun precompiles + (PRC_POINT_EVALUATION :binary@prove) + ;; Prague precompiles + (PRC_BLS_G1_ADD :binary@prove) + (PRC_BLS_G1_MSM :binary@prove) + (PRC_BLS_G2_ADD :binary@prove) + (PRC_BLS_G2_MSM :binary@prove) + (PRC_BLS_PAIRING_CHECK :binary@prove) + (PRC_BLS_MAP_FP_TO_G1 :binary@prove) + (PRC_BLS_MAP_FP2_TO_G2 :binary@prove) + ;; execution paths + (PRC_SUCCESS_CALLER_WILL_REVERT :binary@prove) + (PRC_SUCCESS_CALLER_WONT_REVERT :binary@prove) + (PRC_FAILURE_KNOWN_TO_HUB :binary@prove) + (PRC_FAILURE_KNOWN_TO_RAM :binary@prove) + ;; gas parameters (RETURN_GAS is a prediction) + (PRC_CALLER_GAS :i64) + (PRC_CALLEE_GAS :i64) + (PRC_RETURN_GAS :i64) + ;; duplicate values for precompile calls + (PRC_CDO :i32) + (PRC_CDS :i32) + (PRC_RAO :i32) + (PRC_RAC :i32) + + ;; SELFDESTRUCT related + (SELFDESTRUCT_EXCEPTION :binary@prove) + (SELFDESTRUCT_WILL_REVERT :binary@prove) + (SELFDESTRUCT_WONT_REVERT_ALREADY_MARKED :binary@prove) + (SELFDESTRUCT_WONT_REVERT_NOT_YET_MARKED :binary@prove))) diff --git a/hub/osaka/columns/shared.lisp b/hub/osaka/columns/shared.lisp new file mode 100644 index 000000000..b661ecf5c --- /dev/null +++ b/hub/osaka/columns/shared.lisp @@ -0,0 +1,110 @@ +(module hub) + +(defcolumns + + ;; system transactions vs user transaction flags + ( SYSI :binary@prove ) + ( USER :binary@prove ) + ( SYSF :binary@prove ) + + ;; block and transaction accounting + ( BLK_NUMBER :i24 ) + ;; ( TOTL_TXN_NUMBER :i24 ) + ( SYSI_TXN_NUMBER :i24 ) + ( USER_TXN_NUMBER :i24 ) + ( SYSF_TXN_NUMBER :i24 ) + + ;; transaction processing phases + ( TX_SKIP :binary@prove ) + ( TX_WARM :binary@prove ) + ( TX_INIT :binary@prove ) + ( TX_EXEC :binary@prove ) + ( TX_FINL :binary@prove ) + ( HUB_STAMP :i32 ) + ( HUB_STAMP_TRANSACTION_END :i32 ) + ( CONTEXT_MAY_CHANGE :binary@prove ) + ( EXCEPTION_AHOY :binary@prove ) + + ;; extra stamps + ( LOG_INFO_STAMP :i32 ) + ( MMU_STAMP :i32 ) + ( MXP_STAMP :i32 ) + + ;; stamps for undoing operations + ( DOM_STAMP :i32 ) + ( SUB_STAMP :i32 ) + + ;; context data + ( CONTEXT_NUMBER :i32 ) + ( CONTEXT_NUMBER_NEW :i32 ) + ( CALLER_CONTEXT_NUMBER :i32 ) + + ;; + ( CONTEXT_WILL_REVERT :binary ) + ( CONTEXT_GETS_REVERTED :binary@prove ) + ( CONTEXT_SELF_REVERTS :binary@prove ) + ( CONTEXT_REVERT_STAMP :i32 ) + + ;; + ( CODE_FRAGMENT_INDEX :i16 ) + ( PROGRAM_COUNTER :i24 ) + ( PROGRAM_COUNTER_NEW :i24 ) + ( HEIGHT :i11 ) ;; values in the range [0 .. 1024] (inclusive) + ( HEIGHT_NEW :i11 ) + + ;; peeking flags + ( PEEK_AT_ACCOUNT :binary@prove ) + ( PEEK_AT_CONTEXT :binary@prove ) + ( PEEK_AT_MISCELLANEOUS :binary@prove ) + ( PEEK_AT_SCENARIO :binary@prove ) + ( PEEK_AT_STACK :binary@prove ) + ( PEEK_AT_STORAGE :binary@prove ) + ( PEEK_AT_TRANSACTION :binary@prove ) + ( PEEK_AT_TRANSIENT :binary@prove ) + + ;; gas columns + ( GAS_EXPECTED :i64 ) + ( GAS_ACTUAL :i64 ) + ( GAS_COST :i64 ) + ( GAS_NEXT :i64 ) + ( REFUND_COUNTER :i32 ) + ( REFUND_COUNTER_NEW :i32 ) + + ;; instruction related + ( TWO_LINE_INSTRUCTION :binary ) ;; is set by instruction decoding + ( COUNTER_TLI :binary@prove ) + ( NON_STACK_ROWS :i8 ) ;; maximum value is ~ 20 + ( COUNTER_NSR :i8 ) ;; counts from 0, 1 (first "actual" actual value) to NON_STACK_ROWS + +) + + +(defalias + ;; + CMC CONTEXT_MAY_CHANGE + XAHOY EXCEPTION_AHOY + TX_END_STAMP HUB_STAMP_TRANSACTION_END + GAS_XPCT GAS_EXPECTED + GAS_ACTL GAS_ACTUAL + TLI TWO_LINE_INSTRUCTION + NSR NON_STACK_ROWS + CT_TLI COUNTER_TLI + CT_NSR COUNTER_NSR + CN CONTEXT_NUMBER + CN_NEW CONTEXT_NUMBER_NEW + CALLER_CN CALLER_CONTEXT_NUMBER + CN_WILL_REV CONTEXT_WILL_REVERT + CN_GETS_REV CONTEXT_GETS_REVERTED + CN_SELF_REV CONTEXT_SELF_REVERTS + CN_REV_STAMP CONTEXT_REVERT_STAMP + CFI CODE_FRAGMENT_INDEX + PC PROGRAM_COUNTER + PC_NEW PROGRAM_COUNTER_NEW + ACC PEEK_AT_ACCOUNT + CON PEEK_AT_CONTEXT + SCN PEEK_AT_SCENARIO + STK PEEK_AT_STACK + STO PEEK_AT_STORAGE + TXN PEEK_AT_TRANSACTION + MISC PEEK_AT_MISCELLANEOUS + ) diff --git a/hub/osaka/columns/stack.lisp b/hub/osaka/columns/stack.lisp new file mode 100644 index 000000000..e05b93973 --- /dev/null +++ b/hub/osaka/columns/stack.lisp @@ -0,0 +1,81 @@ +(module hub) + +(defperspective stack + + ;; selector + PEEK_AT_STACK + ( + ;; stack items + ( STACK_ITEM_HEIGHT :array [4] :i11) ;; stack items have heights 0 ≤ h ≤ 1024 + ( STACK_ITEM_VALUE_HI :array [4] :i128) + ( STACK_ITEM_VALUE_LO :array [4] :i128) + ( STACK_ITEM_POP :array [4] :binary@prove) + ( STACK_ITEM_STAMP :array [4] :i36) ;; STAMP is :i32 and we consider 8 * STAMP + bla with 0 ≤ bla < 8 + + ;; instruction and instruction decoded flags + ( INSTRUCTION :byte :display :opcode) + ( STATIC_GAS :i16 ) + ( ACC_FLAG :binary ) + ( ADD_FLAG :binary ) + ( BIN_FLAG :binary ) + ( BTC_FLAG :binary ) + ( CALL_FLAG :binary ) + ( CON_FLAG :binary ) + ( COPY_FLAG :binary ) + ( MCOPY_FLAG :binary ) + ( CREATE_FLAG :binary ) + ( DUP_FLAG :binary ) + ( EXT_FLAG :binary ) + ( HALT_FLAG :binary ) + ( INVALID_FLAG :binary ) + ( JUMP_FLAG :binary ) + ( KEC_FLAG :binary ) + ( LOG_FLAG :binary ) + ( MACHINE_STATE_FLAG :binary ) + ( MOD_FLAG :binary ) + ( MUL_FLAG :binary ) + ( PUSHPOP_FLAG :binary ) + ( SHF_FLAG :binary ) + ( STACKRAM_FLAG :binary ) + ( STO_FLAG :binary ) + ( TRANS_FLAG :binary ) + ( SWAP_FLAG :binary ) + ( TXN_FLAG :binary ) + ( WCP_FLAG :binary ) + + ;; auxiliary flags to simplify constraints on exceptions + ;; likely to disappear + ( MXP_FLAG :binary ) + ( STATIC_FLAG :binary ) + ( DEC_FLAG :array[4] :binary ) + + ;; stack popping / pushing parameters + ( ALPHA :byte ) + ( DELTA :byte ) + + ;; jump and push related + ( PUSH_VALUE_HI :i128 ) + ( PUSH_VALUE_LO :i128 ) + ( JUMP_DESTINATION_VETTING_REQUIRED :binary@prove ) + + ;; exception flags + ( SUX :binary@prove ) + ( SOX :binary@prove ) + ( MXPX :binary@prove ) + ( OOGX :binary@prove ) + ( RDCX :binary@prove ) + ( JUMPX :binary@prove ) + ( STATICX :binary@prove ) + ( SSTOREX :binary@prove ) + ( ICPX :binary@prove ) + ( MAXCSX :binary@prove ) + ( OPCX :binary@prove ) + + ;; hash info related + ( HASH_INFO_FLAG :binary@prove ) + ( HASH_INFO_KECCAK_HI :i128 ) + ( HASH_INFO_KECCAK_LO :i128 ) + + ;; log info related + (LOG_INFO_FLAG :binary@prove))) + diff --git a/hub/osaka/columns/storage.lisp b/hub/osaka/columns/storage.lisp new file mode 100644 index 000000000..60fb5356c --- /dev/null +++ b/hub/osaka/columns/storage.lisp @@ -0,0 +1,35 @@ +(module hub) + +(defperspective storage + + ;; selector + PEEK_AT_STORAGE + + ;; storage-row columns + ( + ( ADDRESS_HI :i32 ) + ( ADDRESS_LO :i128 ) + ( DEPLOYMENT_NUMBER :i16 ) + ( STORAGE_KEY_HI :i128 ) + ( STORAGE_KEY_LO :i128 ) + ( VALUE_ORIG_HI :i128 ) + ( VALUE_ORIG_LO :i128 ) + ( VALUE_CURR_HI :i128 ) + ( VALUE_CURR_LO :i128 ) + ( VALUE_NEXT_HI :i128 ) + ( VALUE_NEXT_LO :i128 ) + + ( WARMTH :binary@prove ) + ( WARMTH_NEW :binary@prove ) + + ( VALUE_ORIG_IS_ZERO :binary ) ;; @prove not required, they are set manually + ( VALUE_CURR_IS_ORIG :binary ) + ( VALUE_CURR_IS_ZERO :binary ) + ( VALUE_NEXT_IS_CURR :binary ) + ( VALUE_NEXT_IS_ZERO :binary ) + ( VALUE_NEXT_IS_ORIG :binary ) + ( VALUE_CURR_CHANGES :binary ) + + ( SLOAD_OPERATION :binary@prove ) + ( SSTORE_OPERATION :binary@prove ) + )) diff --git a/hub/osaka/columns/transaction.lisp b/hub/osaka/columns/transaction.lisp new file mode 100644 index 000000000..26ad7c997 --- /dev/null +++ b/hub/osaka/columns/transaction.lisp @@ -0,0 +1,56 @@ +(module hub) + +(defperspective transaction + + ;; selector + PEEK_AT_TRANSACTION + + ;; transaction-row columns + ( + ;; from account related + ( FROM_ADDRESS_HI :i32 ) + ( FROM_ADDRESS_LO :i128 ) + ( NONCE :i64 ) + ( INITIAL_BALANCE :i128 ) + ( VALUE :i128 ) + + ;; to account related + ( TO_ADDRESS_HI :i32 ) + ( TO_ADDRESS_LO :i128 ) + ( REQUIRES_EVM_EXECUTION :binary ) + ( COPY_TXCD :binary ) + ( IS_DEPLOYMENT :binary ) + ( IS_TYPE2 :binary ) + + ;; gas related + ( GAS_LIMIT :i64 ) + ( GAS_INITIALLY_AVAILABLE :i64 ) + ( GAS_PRICE :i64 ) + ( PRIORITY_FEE_PER_GAS :i64 ) + ( BASEFEE :i64 ) ;; in Linea London this is hard-coded to 7 ... but in the reference tests this may be much larger + + ;; call data or init code + ( CALL_DATA_SIZE :i32 ) + ( INIT_CODE_SIZE :i32 ) + + ;; end of transaction predictions + ( STATUS_CODE :binary ) + ( GAS_LEFTOVER :i64 ) + ( REFUND_COUNTER_INFINITY :i64 ) + ( REFUND_EFFECTIVE :i64 ) + + ;; coinbase related + ( COINBASE_ADDRESS_HI :i32 ) + ( COINBASE_ADDRESS_LO :i128 ) + + ;; related to system transaction + ( NOOP :binary@prove ) + ( EIP_4788 :binary@prove ) + ( EIP_2935 :binary@prove ) ;; should be Pectra only + ( SYST_TXN_DATA_1 :i64 ) + ( SYST_TXN_DATA_2 :i16 ) + ( SYST_TXN_DATA_3 :i128 ) + ( SYST_TXN_DATA_4 :i128 ) + ( SYST_TXN_DATA_5 :binary ) + ) +) diff --git a/hub/osaka/columns/transient.lisp b/hub/osaka/columns/transient.lisp new file mode 100644 index 000000000..f7646586f --- /dev/null +++ b/hub/osaka/columns/transient.lisp @@ -0,0 +1,19 @@ +(module hub) + +(defperspective transient + + ;; selector + PEEK_AT_TRANSIENT + + ;; storage-row columns + ( + ( ADDRESS_HI :i32 ) + ( ADDRESS_LO :i128 ) + ( STORAGE_KEY_HI :i128 ) + ( STORAGE_KEY_LO :i128 ) + ( VALUE_CURR_HI :i128 ) + ( VALUE_CURR_LO :i128 ) + ( VALUE_NEXT_HI :i128 ) + ( VALUE_NEXT_LO :i128 ) + )) + diff --git a/hub/osaka/constants.lisp b/hub/osaka/constants.lisp new file mode 100644 index 000000000..8e9322a3c --- /dev/null +++ b/hub/osaka/constants.lisp @@ -0,0 +1,9 @@ +(module hub) + +(defconst + MULTIPLIER___STACK_STAMP 8 ;; \hubTau + MULTIPLIER___DOM_SUB_STAMPS 16 ;; \hubLambda + DOM_SUB_STAMP_OFFSET___REVERT 8 ;; \revertEpsilon + DOM_SUB_STAMP_OFFSET___FINALIZATION 9 ;; \finalizationEpsilon + DOM_SUB_STAMP_OFFSET___SELFDESTRUCT 10 ;; \selfdestructEpsilon + ) diff --git a/hub/osaka/constraints/account-rows/specialized.lisp b/hub/osaka/constraints/account-rows/specialized.lisp new file mode 100644 index 000000000..6ed874d45 --- /dev/null +++ b/hub/osaka/constraints/account-rows/specialized.lisp @@ -0,0 +1,221 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.1.1 Introduction ;; +;; X.1.2 Conventions ;; +;; X.1.3 Account nonce constraints ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (account-same-nonce relOffset) (shift (eq! account/NONCE_NEW account/NONCE) relOffset)) +(defun (account-increment-nonce relOffset) (shift (eq! account/NONCE_NEW (+ account/NONCE 1)) relOffset)) +(defun (account-undo-nonce-update undoAt doneAt) (begin (eq! (shift account/NONCE_NEW undoAt) (shift account/NONCE doneAt)) + (eq! (shift account/NONCE undoAt) (shift account/NONCE_NEW doneAt)))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.1.4 Account balance constraints ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (account-same-balance relOffset) (eq! (shift account/BALANCE_NEW relOffset) (shift account/BALANCE relOffset) )) ;; relOffset rows into the future +(defun (account-increment-balance-by relOffset value) (eq! (shift account/BALANCE_NEW relOffset) (+ (shift account/BALANCE relOffset) value))) ;; relOffset rows into the future +(defun (account-decrement-balance-by relOffset value) (eq! (shift account/BALANCE_NEW relOffset) (- (shift account/BALANCE relOffset) value))) ;; relOffset rows into the future +(defun (account-undo-balance-update undoAt doneAt) (begin + (eq! (shift account/BALANCE_NEW undoAt) (shift account/BALANCE doneAt)) ;; same as relOffset rows into the past + (eq! (shift account/BALANCE undoAt) (shift account/BALANCE_NEW doneAt)) ;; same as relOffset rows into the past + )) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.1.5 Account byte code constraints ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (account-same-code-size relOffset) (shift (eq! account/CODE_SIZE_NEW account/CODE_SIZE) relOffset)) +(defun (account-same-code-hash relOffset) (begin (shift (eq! account/CODE_HASH_HI_NEW account/CODE_HASH_HI) relOffset) + (shift (eq! account/CODE_HASH_LO_NEW account/CODE_HASH_LO) relOffset))) +(defun (account-same-code relOffset) (begin (account-same-code-size relOffset) + (account-same-code-hash relOffset))) + +(defun (account-undo-code-size-update undoAt doneAt) (begin (eq! (shift account/CODE_SIZE_NEW undoAt) (shift account/CODE_SIZE doneAt)) + (eq! (shift account/CODE_SIZE undoAt) (shift account/CODE_SIZE_NEW doneAt)))) +(defun (account-undo-code-hash-update undoAt doneAt) (begin (eq! (shift account/CODE_HASH_HI_NEW undoAt) (shift account/CODE_HASH_HI doneAt)) + (eq! (shift account/CODE_HASH_HI undoAt) (shift account/CODE_HASH_HI_NEW doneAt)) + (eq! (shift account/CODE_HASH_LO_NEW undoAt) (shift account/CODE_HASH_LO doneAt)) + (eq! (shift account/CODE_HASH_LO undoAt) (shift account/CODE_HASH_LO_NEW doneAt)))) +(defun (account-undo-code-update undoAt doneAt) (begin (account-undo-code-size-update undoAt doneAt) + (account-undo-code-hash-update undoAt doneAt))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.1.6 Account warmth constraints ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (account-same-warmth kappa) (shift (eq! account/WARMTH_NEW account/WARMTH) kappa)) +(defun (account-turn-on-warmth kappa) (shift (eq! account/WARMTH_NEW 1 ) kappa)) +(defun (account-undo-warmth-update undoAt doneAt) (begin (eq! (shift account/WARMTH_NEW undoAt) (shift account/WARMTH doneAt)) + (eq! (shift account/WARMTH undoAt) (shift account/WARMTH_NEW doneAt)))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.1.7 Account deployment status constraints ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (account-same-deployment-number kappa) (shift (eq! account/DEPLOYMENT_NUMBER_NEW account/DEPLOYMENT_NUMBER) kappa)) +(defun (account-same-deployment-status kappa) (shift (eq! account/DEPLOYMENT_STATUS_NEW account/DEPLOYMENT_STATUS) kappa)) +(defun (account-same-deployment-number-and-status kappa) (begin (account-same-deployment-number kappa) + (account-same-deployment-status kappa))) +(defun (account-increment-deployment-number kappa) (shift (eq! account/DEPLOYMENT_NUMBER_NEW (+ 1 account/DEPLOYMENT_NUMBER)) kappa)) +(defun (account-turn-on-deployment-status kappa) (shift (eq! account/DEPLOYMENT_STATUS_NEW (+ 1 account/DEPLOYMENT_STATUS)) kappa)) +(defun (account-undo-deployment-status-update undoAt doneAt) (begin (account-same-deployment-number undoAt) + (eq! (shift account/DEPLOYMENT_STATUS_NEW undoAt) (shift account/DEPLOYMENT_STATUS doneAt)) + (eq! (shift account/DEPLOYMENT_STATUS undoAt) (shift account/DEPLOYMENT_STATUS_NEW doneAt)))) + +;; not used in practice +(defun (account-initiate-for-deployment relOffset init_code_size value) + (begin + (debug (eq! (shift account/NONCE relOffset) 0 ) ) + (eq! (shift account/NONCE_NEW relOffset) 1 ) + (account-increment-balance-by relOffset value) + (debug (eq! (shift account/CODE_SIZE relOffset) 0 ) ) + (eq! (shift account/CODE_SIZE_NEW relOffset) init_code_size ) + (debug (eq! (shift account/HAS_CODE relOffset) 0 ) ) + (debug (eq! (shift account/CODE_HASH_HI relOffset) EMPTY_KECCAK_HI)) + (debug (eq! (shift account/CODE_HASH_LO relOffset) EMPTY_KECCAK_LO)) + (eq! (shift account/HAS_CODE_NEW relOffset) 0 ) + (debug (eq! (shift account/CODE_HASH_HI_NEW relOffset) EMPTY_KECCAK_HI)) + (debug (eq! (shift account/CODE_HASH_LO_NEW relOffset) EMPTY_KECCAK_LO)) + (account-increment-deployment-number relOffset) + (account-turn-on-deployment-status relOffset) + (account-turn-on-warmth relOffset))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.1.8 Account MARKED_FOR_SELFDESTRUCT constraints ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (account-same-marked-for-deletion kappa) (shift (eq! account/MARKED_FOR_DELETION_NEW account/MARKED_FOR_DELETION) kappa)) +(defun (account-mark-account-for-deletion kappa) (shift (eq! account/MARKED_FOR_DELETION_NEW 1 ) kappa)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.1.9 Account inspection constraints ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (account-opening kappa) (begin (account-same-nonce kappa) + (account-same-code kappa) + (account-same-deployment-number-and-status kappa))) + +(defun (account-viewing kappa) (begin (account-opening kappa) + (account-same-balance kappa))) + +;; never used in practice +(defun (account-deletion kappa) (begin (vanishes! (shift account/NONCE_NEW kappa)) + (vanishes! (shift account/BALANCE_NEW kappa)) + (vanishes! (shift account/CODE_SIZE_NEW kappa)) + (vanishes! (shift account/HAS_CODE_NEW kappa)) + (debug (eq! (shift account/CODE_HASH_HI_NEW kappa) EMPTY_KECCAK_HI)) + (debug (eq! (shift account/CODE_HASH_LO_NEW kappa) EMPTY_KECCAK_LO)) + (account-fresh-new-deployment-number-and-status kappa))) + +(defun (account-fresh-new-deployment-number-and-status kappa) (begin (account-increment-deployment-number kappa) + (vanishes! (shift account/DEPLOYMENT_STATUS_NEW kappa)) + (debug (vanishes! (shift account/DEPLOYMENT_STATUS kappa))))) + + +(defun (account-same-address-as undoAt + doneAt) + (begin (eq! (shift account/ADDRESS_HI undoAt) (shift account/ADDRESS_HI doneAt)) ;; action performed doneAt many rows from here + (eq! (shift account/ADDRESS_LO undoAt) (shift account/ADDRESS_LO doneAt)))) ;; action undone undoAt many rows from here + +(defun (account-same-address-and-deployment-number-as undoAt doneAt) (begin (account-same-address-as undoAt doneAt) + (eq! (shift account/DEPLOYMENT_NUMBER undoAt) (shift account/DEPLOYMENT_NUMBER_NEW doneAt)))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.1.10 Code fragment index and trimming ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (account-retrieve-code-fragment-index kappa) (eq! (shift account/ROMLEX_FLAG kappa) 1)) + +(defun (account-trim-address kappa ;; row offset + raw-address-hi ;; high part of raw, potentially untrimmed address + raw-address-lo ;; low part of raw, potentially untrimmed address + ) (begin + (eq! (shift account/TRM_FLAG kappa) 1) + (eq! (shift account/TRM_RAW_ADDRESS_HI kappa) raw-address-hi) + (eq! (shift account/ADDRESS_LO kappa) raw-address-lo))) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.1.11 Precompile flag related ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defun (account-isnt-precompile kappa) (vanishes! (shift account/IS_PRECOMPILE kappa))) +(defun (account-is-precompile kappa) (eq! (shift account/IS_PRECOMPILE kappa) 1)) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.2 Code ownership constraints ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defconstraint account---code-ownership-curr (:perspective account) + (if-eq-else account/CODE_HASH_HI EMPTY_KECCAK_HI + (if-eq-else account/CODE_HASH_LO EMPTY_KECCAK_LO + (eq! account/HAS_CODE 0) + (eq! account/HAS_CODE 1)) + (eq! account/HAS_CODE 1))) + +(defconstraint account---code-ownership-next (:perspective account) + (if-eq-else account/CODE_HASH_HI_NEW EMPTY_KECCAK_HI + (if-eq-else account/CODE_HASH_LO_NEW EMPTY_KECCAK_LO + (eq! account/HAS_CODE_NEW 0) + (eq! account/HAS_CODE_NEW 1)) + (eq! account/HAS_CODE_NEW 1))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.3 Account existence constraints ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defconstraint account---existence-curr (:perspective account) + (begin (debug (is-binary account/EXISTS)) + (if-not-zero account/NONCE (eq! account/EXISTS 1)) + (if-not-zero account/BALANCE (eq! account/EXISTS 1)) + (if-not-zero account/HAS_CODE (eq! account/EXISTS 1)) + (if-zero account/NONCE + (if-zero account/BALANCE + (if-zero account/HAS_CODE (eq! account/EXISTS 0)))))) + +(defconstraint account---existence-next (:perspective account) + (begin (debug (is-binary account/EXISTS_NEW)) + (if-not-zero account/NONCE_NEW (eq! account/EXISTS_NEW 1)) + (if-not-zero account/BALANCE_NEW (eq! account/EXISTS_NEW 1)) + (if-not-zero account/HAS_CODE_NEW (eq! account/EXISTS_NEW 1)) + (if-zero account/NONCE_NEW + (if-zero account/BALANCE_NEW + (if-zero account/HAS_CODE_NEW (eq! account/EXISTS_NEW 0)))))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.4 Generalities on ROMLEX_FLAG ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstraint account---the-ROMLEX-lookup-requires-nonzero-code-size (:perspective account) + (if-zero account/CODE_SIZE_NEW + (vanishes! account/ROMLEX_FLAG))) diff --git a/hub/osaka/constraints/consistency/account/columns.lisp b/hub/osaka/constraints/consistency/account/columns.lisp new file mode 100644 index 000000000..d9fe85087 --- /dev/null +++ b/hub/osaka/constraints/consistency/account/columns.lisp @@ -0,0 +1,90 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; ACCOUNT consistency temporal columns ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;; acp_ ⇔ account consistency permutation +(defpermutation + ;; permuted columns + ;; replace acp with account_consistency_permutation + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ( + acp_PEEK_AT_ACCOUNT + acp_ADDRESS_HI + acp_ADDRESS_LO + acp_DOM_STAMP + acp_SUB_STAMP + ;; + acp_BLK_NUMBER + acp_TOTL_TXN_NUMBER + acp_CODE_FRAGMENT_INDEX + acp_BALANCE + acp_BALANCE_NEW + acp_NONCE + acp_NONCE_NEW + acp_CODE_HASH_HI + acp_CODE_HASH_LO + acp_CODE_HASH_HI_NEW + acp_CODE_HASH_LO_NEW + acp_CODE_SIZE + acp_CODE_SIZE_NEW + acp_EXISTS + acp_EXISTS_NEW + acp_HAS_CODE + acp_HAD_CODE_INITIALLY + acp_WARMTH + acp_WARMTH_NEW + acp_DEPLOYMENT_NUMBER + acp_DEPLOYMENT_NUMBER_NEW + acp_DEPLOYMENT_STATUS + acp_DEPLOYMENT_STATUS_NEW + acp_MARKED_FOR_DELETION + acp_MARKED_FOR_DELETION_NEW + acp_TRM_FLAG + acp_IS_PRECOMPILE + ) + ;; original columns + ;;;;;;;;;;;;;;;;;;; + ( + (↓ PEEK_AT_ACCOUNT ) + (↓ account/ADDRESS_HI ) + (↓ account/ADDRESS_LO ) + (↓ DOM_STAMP ) + (↑ SUB_STAMP ) + ;; + BLK_NUMBER + TOTL_TXN_NUMBER + account/CODE_FRAGMENT_INDEX + account/BALANCE + account/BALANCE_NEW + account/NONCE + account/NONCE_NEW + account/CODE_HASH_HI + account/CODE_HASH_LO + account/CODE_HASH_HI_NEW + account/CODE_HASH_LO_NEW + account/CODE_SIZE + account/CODE_SIZE_NEW + account/EXISTS + account/EXISTS_NEW + account/HAS_CODE + account/HAD_CODE_INITIALLY + account/WARMTH + account/WARMTH_NEW + account/DEPLOYMENT_NUMBER + account/DEPLOYMENT_NUMBER_NEW + account/DEPLOYMENT_STATUS + account/DEPLOYMENT_STATUS_NEW + account/MARKED_FOR_DELETION + account/MARKED_FOR_DELETION_NEW + account/TRM_FLAG + account/IS_PRECOMPILE + ) + ) + + + + diff --git a/hub/osaka/constraints/consistency/account/computed.lisp b/hub/osaka/constraints/consistency/account/computed.lisp new file mode 100644 index 000000000..2d42381bf --- /dev/null +++ b/hub/osaka/constraints/consistency/account/computed.lisp @@ -0,0 +1,133 @@ +(module hub) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; FIRST/AGAIN/FINAL in conflation ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defcomputed + (acp_FIRST_IN_CNF) + (fwd-changes-within acp_PEEK_AT_ACCOUNT ;; perspective + acp_ADDRESS_HI ;; columns + acp_ADDRESS_LO + )) +(defcomputed + (acp_AGAIN_IN_CNF) + (fwd-unchanged-within acp_PEEK_AT_ACCOUNT ;; perspective + acp_ADDRESS_HI ;; columns + acp_ADDRESS_LO + )) +(defcomputed + (acp_FINAL_IN_CNF) + (bwd-changes-within acp_PEEK_AT_ACCOUNT ;; perspective + acp_ADDRESS_HI ;; columns + acp_ADDRESS_LO + )) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; FIRST/AGAIN/FINAL in block ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defcomputed + (acp_FIRST_IN_BLK) + (fwd-changes-within acp_PEEK_AT_ACCOUNT ;; perspective + acp_ADDRESS_HI ;; columns + acp_ADDRESS_LO + acp_BLK_NUMBER + )) +(defcomputed + (acp_AGAIN_IN_BLK) + (fwd-unchanged-within acp_PEEK_AT_ACCOUNT ;; perspective + acp_ADDRESS_HI ;; columns + acp_ADDRESS_LO + acp_BLK_NUMBER + )) +(defcomputed + (acp_FINAL_IN_BLK) + (bwd-changes-within acp_PEEK_AT_ACCOUNT ;; perspective + acp_ADDRESS_HI ;; columns + acp_ADDRESS_LO + acp_BLK_NUMBER + )) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; FIRST/AGAIN/FINAL in transaction ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defcomputed + (acp_FIRST_IN_TXN) + (fwd-changes-within acp_PEEK_AT_ACCOUNT ;; perspective + acp_ADDRESS_HI ;; columns + acp_ADDRESS_LO + acp_TOTL_TXN_NUMBER + )) +(defcomputed + (acp_AGAIN_IN_TXN) + (fwd-unchanged-within acp_PEEK_AT_ACCOUNT ;; perspective + acp_ADDRESS_HI ;; columns + acp_ADDRESS_LO + acp_TOTL_TXN_NUMBER + )) +(defcomputed + (acp_FINAL_IN_TXN) + (bwd-changes-within acp_PEEK_AT_ACCOUNT ;; perspective + acp_ADDRESS_HI ;; columns + acp_ADDRESS_LO + acp_TOTL_TXN_NUMBER + )) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; FRIRST/FINAL deployment number and existence in block ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defcomputed + (acp_DEPLOYMENT_NUMBER_FIRST_IN_BLOCK) + (fwd-fill-within acp_PEEK_AT_ACCOUNT + acp_FIRST_IN_BLK + acp_DEPLOYMENT_NUMBER + )) + +(defcomputed + (acp_DEPLOYMENT_NUMBER_FINAL_IN_BLOCK) + (bwd-fill-within acp_PEEK_AT_ACCOUNT + acp_FINAL_IN_BLK + acp_DEPLOYMENT_NUMBER_NEW + )) + +(defcomputed + (acp_EXISTS_FIRST_IN_BLOCK) + (fwd-fill-within acp_PEEK_AT_ACCOUNT + acp_FIRST_IN_BLK + acp_EXISTS + )) + +(defcomputed + (acp_EXISTS_FINAL_IN_BLOCK) + (bwd-fill-within acp_PEEK_AT_ACCOUNT + acp_FINAL_IN_BLK + acp_EXISTS_NEW + )) + + +;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; Binary constraints ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;; + +(defconstraint account-consistency---binarities () + (begin + ( is-binary acp_FIRST_IN_CNF ) ( is-binary acp_FIRST_IN_BLK ) ( is-binary acp_FIRST_IN_TXN ) + ( is-binary acp_AGAIN_IN_CNF ) ( is-binary acp_AGAIN_IN_BLK ) ( is-binary acp_AGAIN_IN_TXN ) + ( is-binary acp_FINAL_IN_CNF ) ( is-binary acp_FINAL_IN_BLK ) ( is-binary acp_FINAL_IN_TXN ) + )) diff --git a/hub/osaka/constraints/consistency/account/constraints.lisp b/hub/osaka/constraints/consistency/account/constraints.lisp new file mode 100644 index 000000000..fd215a6df --- /dev/null +++ b/hub/osaka/constraints/consistency/account/constraints.lisp @@ -0,0 +1,270 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.5 Account consistency constraints ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.5.1 Properties of the permutation ;; +;; X.5.2 Permuted columns ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +;; we are guaranteed that this is a 20B integer +(defun (acp_full_address) (+ (* (^ 256 16) acp_ADDRESS_HI) + acp_ADDRESS_LO)) ;; "" + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.5.3 Constraints for acp_FIRST, acp_AGAIN and acp_FINAL ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defconstraint account-consistency---FIRST-AGAIN-FINAL---automatic-vanishing () + (begin + (if-zero (force-bin acp_PEEK_AT_ACCOUNT) + (vanishes! (+ + acp_FIRST_IN_TXN acp_FIRST_IN_BLK acp_FIRST_IN_CNF + acp_AGAIN_IN_TXN acp_AGAIN_IN_BLK acp_AGAIN_IN_CNF + acp_FINAL_IN_TXN acp_FINAL_IN_BLK acp_FINAL_IN_CNF))))) + +(defun (account-consistency---transition-conflation) (+ (prev acp_FINAL_IN_CNF) acp_FIRST_IN_CNF)) +(defun (account-consistency---transition-block) (+ (prev acp_FINAL_IN_BLK) acp_FIRST_IN_BLK)) +(defun (account-consistency---transition-transaction) (+ (prev acp_FINAL_IN_TXN) acp_FIRST_IN_TXN)) +(defun (account-consistency---transition-sum) (+ (account-consistency---transition-conflation) + (account-consistency---transition-block) + (account-consistency---transition-transaction))) + + +(defconstraint account-consistency---FIRST-AGAIN-FINAL---first-account-row () + (if-zero (force-bin (prev acp_PEEK_AT_ACCOUNT)) + (if-not-zero (force-bin acp_PEEK_AT_ACCOUNT) + (if-not-zero acp_PEEK_AT_ACCOUNT + (eq! (account-consistency---transition-sum) + 3))))) + +(defun (account-consistency---repeat-account-row) (* (prev acp_PEEK_AT_ACCOUNT) acp_PEEK_AT_ACCOUNT)) + +(defconstraint account-consistency---FIRST-AGAIN-FINAL---repeat-encounter---conflation-level + (:guard (account-consistency---repeat-account-row)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-not (remained-constant! (acp_full_address)) + (eq! (account-consistency---transition-conflation) 2) + (eq! (account-consistency---transition-conflation) 0))) + +(defconstraint account-consistency---FIRST-AGAIN-FINAL---repeat-encounter---block-level + (:guard (account-consistency---repeat-account-row)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (begin + (if-not (remained-constant! (acp_full_address)) (eq! (account-consistency---transition-block) 2)) + (if-not (remained-constant! acp_BLK_NUMBER) (eq! (account-consistency---transition-block) 2)) + (if (remained-constant! (acp_full_address)) + (if (remained-constant! acp_BLK_NUMBER) (eq! (account-consistency---transition-block) 0))))) + +(defconstraint account-consistency---FIRST-AGAIN-FINAL---repeat-encounter---transaction-level + (:guard (account-consistency---repeat-account-row)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (begin + (if-not (remained-constant! (acp_full_address)) (eq! (account-consistency---transition-transaction) 2)) + (if-not (remained-constant! acp_TOTL_TXN_NUMBER) (eq! (account-consistency---transition-transaction) 2)) + (if (remained-constant! (acp_full_address)) + (if (remained-constant! acp_TOTL_TXN_NUMBER) (eq! (account-consistency---transition-transaction) 0))))) + +(defconstraint account-consistency---FIRST-AGAIN-FINAL---final-row-with-room-to-spare () + (if-not-zero (prev acp_PEEK_AT_ACCOUNT) + (if-zero (force-bin acp_PEEK_AT_ACCOUNT) + (eq! 3 + (account-consistency---transition-sum))))) + +(defconstraint account-consistency---FIRST-AGAIN-FINAL---final-row-of-the-trace (:domain {-1}) + (if-not-zero acp_PEEK_AT_ACCOUNT + (eq! 3 + (+ acp_FINAL_IN_CNF + acp_FINAL_IN_BLK + acp_FINAL_IN_TXN)))) + +(defconstraint account-consistency---FIRST-AGAIN-FINAL---unconditionally-constraining-AGAIN () + (begin + (eq! (+ acp_FIRST_IN_CNF acp_AGAIN_IN_CNF) acp_PEEK_AT_ACCOUNT) + (eq! (+ acp_FIRST_IN_BLK acp_AGAIN_IN_BLK) acp_PEEK_AT_ACCOUNT) + (eq! (+ acp_FIRST_IN_TXN acp_AGAIN_IN_TXN) acp_PEEK_AT_ACCOUNT))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.5.4 Initialization Constraints ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defconstraint account-consistency---initialization---conflation-level (:guard acp_FIRST_IN_CNF) + (begin + (eq! acp_TRM_FLAG 1) + (vanishes! acp_DEPLOYMENT_NUMBER))) + +(defconstraint account-consistency---initialization---block-level (:guard acp_FIRST_IN_BLK) + (begin + (eq! acp_DEPLOYMENT_NUMBER_FIRST_IN_BLOCK acp_DEPLOYMENT_NUMBER) + (eq! acp_EXISTS_FIRST_IN_BLOCK acp_EXISTS ) + )) + +(defconstraint account-consistency---initialization---transaction-level (:guard acp_FIRST_IN_TXN) + (begin + (eq! acp_WARMTH acp_IS_PRECOMPILE) + (vanishes! acp_DEPLOYMENT_STATUS) + (vanishes! acp_MARKED_FOR_DELETION) + (eq! acp_HAD_CODE_INITIALLY acp_HAS_CODE))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.5.5 Linking Constraints ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +;-----------------------------; +; X.5.5 Conflation level ; +;-----------------------------; + +(defconstraint account-consistency---linking---conflation-level---nonce + (:guard acp_AGAIN_IN_CNF) + ;;;;;;;;;;;;;;;;;;;;;;;;;;; + (eq! acp_NONCE (prev acp_NONCE_NEW) )) + +(defconstraint account-consistency---linking---conflation-level---balance + (:guard acp_AGAIN_IN_CNF) + ;;;;;;;;;;;;;;;;;;;;;;;;;;; + (eq! acp_BALANCE (prev acp_BALANCE_NEW) )) + +(defconstraint account-consistency---linking---conflation-level---code + (:guard acp_AGAIN_IN_CNF) + ;;;;;;;;;;;;;;;;;;;;;;;;;;; + (begin + (eq! acp_CODE_SIZE (prev acp_CODE_SIZE_NEW) ) + (eq! acp_CODE_HASH_HI (prev acp_CODE_HASH_HI_NEW) ) + (eq! acp_CODE_HASH_LO (prev acp_CODE_HASH_LO_NEW) ) + (debug (eq! acp_EXISTS (prev acp_EXISTS_NEW) )))) + +(defconstraint account-consistency---linking---conflation-level---precompile-status + (:guard acp_AGAIN_IN_CNF) + ;;;;;;;;;;;;;;;;;;;;;;;;;;; + (eq! acp_IS_PRECOMPILE (prev acp_IS_PRECOMPILE) )) + +(defconstraint account-consistency---linking---conflation-level---deployment-number-and-status + (:guard acp_AGAIN_IN_CNF) + ;;;;;;;;;;;;;;;;;;;;;;;;;;; + (begin + (eq! acp_DEPLOYMENT_NUMBER (prev acp_DEPLOYMENT_NUMBER_NEW)) + (eq! acp_DEPLOYMENT_STATUS (prev acp_DEPLOYMENT_STATUS_NEW)) + )) + + +;------------------------; +; X.5.5 Block level ; +;------------------------; + +(defconstraint account-consistency---linking---block-level + (:guard acp_AGAIN_IN_BLK) + ;;;;;;;;;;;;;;;;;;;;;;;;;;; + (begin + (remained-constant! acp_DEPLOYMENT_NUMBER_FIRST_IN_BLOCK) + (remained-constant! acp_DEPLOYMENT_NUMBER_FINAL_IN_BLOCK) + (remained-constant! acp_EXISTS_FIRST_IN_BLOCK) + (remained-constant! acp_EXISTS_FINAL_IN_BLOCK) + )) + + +;------------------------------; +; X.5.5 Transaction level ; +;------------------------------; + +(defconstraint account-consistency---linking---transaction-level + (:guard acp_AGAIN_IN_TXN) + ;;;;;;;;;;;;;;;;;;;;;;;;;;; + (begin + (eq! acp_HAD_CODE_INITIALLY (prev acp_HAD_CODE_INITIALLY)) + (eq! acp_WARMTH (prev acp_WARMTH_NEW)) + (eq! acp_MARKED_FOR_DELETION (prev acp_MARKED_FOR_DELETION_NEW)) + (if-not-zero acp_MARKED_FOR_DELETION (eq! acp_MARKED_FOR_DELETION_NEW 1)))) + +(defconstraint account-consistency---linking---for-CFI + (:guard acp_AGAIN_IN_CNF) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-eq acp_DEPLOYMENT_NUMBER_NEW acp_DEPLOYMENT_NUMBER + (if-eq acp_DEPLOYMENT_STATUS_NEW acp_DEPLOYMENT_STATUS + (remained-constant! acp_CODE_FRAGMENT_INDEX)))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.5.6 Finalization Constraints ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defconstraint account-consistency---finalization---block-level + (:guard acp_FINAL_IN_BLK) + ;;;;;;;;;;;;;;;;;;;;;;;;;;; + (begin + (eq! acp_DEPLOYMENT_NUMBER_FINAL_IN_BLOCK acp_DEPLOYMENT_NUMBER_NEW) + (eq! acp_EXISTS_FINAL_IN_BLOCK acp_EXISTS_NEW ) + )) + +(defconstraint account-consistency---finalization---transaction-level + (:guard acp_FINAL_IN_TXN) + ;;;;;;;;;;;;;;;;;;;;;;;;;;; + (vanishes! acp_DEPLOYMENT_STATUS_NEW)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.5.7 Other Constraints ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defconstraint account-consistency---other---monotony-of-deployment-number + (:guard acp_PEEK_AT_ACCOUNT) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (or! (eq! acp_DEPLOYMENT_NUMBER_NEW acp_DEPLOYMENT_NUMBER) + (eq! acp_DEPLOYMENT_NUMBER_NEW (+ 1 acp_DEPLOYMENT_NUMBER)))) + + +(defconstraint account-consistency---other---vanishing-constraints-upon-trivial-deployments + (:guard acp_PEEK_AT_ACCOUNT) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-not-zero (- acp_DEPLOYMENT_NUMBER_NEW acp_DEPLOYMENT_NUMBER) + (if-zero acp_DEPLOYMENT_STATUS_NEW + (begin + ;; current account state + (vanishes! acp_DEPLOYMENT_STATUS) + ;; updated account state + (vanishes! acp_CODE_SIZE_NEW) + (eq! acp_CODE_HASH_HI_NEW EMPTY_KECCAK_HI) + (eq! acp_CODE_HASH_LO_NEW EMPTY_KECCAK_LO))))) + +(defconstraint account-consistency---other---vanishing-constraints-upon-nontrivial-deployments + (:guard acp_PEEK_AT_ACCOUNT) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-not-zero (- acp_DEPLOYMENT_NUMBER_NEW acp_DEPLOYMENT_NUMBER) + (if-not-zero acp_DEPLOYMENT_STATUS_NEW + (begin + ;; current account state + (vanishes! acp_NONCE) + (vanishes! acp_CODE_SIZE) + (eq! acp_CODE_HASH_HI EMPTY_KECCAK_HI) + (eq! acp_CODE_HASH_LO EMPTY_KECCAK_LO) + (vanishes! acp_DEPLOYMENT_STATUS) + ;; updated account state + (eq! acp_NONCE_NEW 1) + (eq! acp_CODE_HASH_HI_NEW EMPTY_KECCAK_HI) + (eq! acp_CODE_HASH_LO_NEW EMPTY_KECCAK_LO))))) + +(defconstraint account-consistency---other---vanishing-deletion-for-account-already-having-code + (:guard acp_PEEK_AT_ACCOUNT) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-not-zero acp_HAD_CODE_INITIALLY + (begin + (vanishes! acp_MARKED_FOR_DELETION) + (vanishes! acp_MARKED_FOR_DELETION_NEW))) +) diff --git a/hub/osaka/constraints/consistency/context/columns.lisp b/hub/osaka/constraints/consistency/context/columns.lisp new file mode 100644 index 000000000..5117532ad --- /dev/null +++ b/hub/osaka/constraints/consistency/context/columns.lisp @@ -0,0 +1,65 @@ +(module hub) + +;; ccp_ ⇔ context consistency permutation +(defpermutation + ;; permuted columns + ;;;;;;;;;;;;;;;;;;; + ( + ccp_PEEK_AT_CONTEXT + ccp_CONTEXT_NUMBER + ccp_HUB_STAMP + ccp_UPDATE + ccp_CALL_STACK_DEPTH + ccp_IS_ROOT + ccp_IS_STATIC + ccp_ACCOUNT_ADDRESS_HI + ccp_ACCOUNT_ADDRESS_LO + ccp_ACCOUNT_DEPLOYMENT_NUMBER + ccp_BYTE_CODE_ADDRESS_HI + ccp_BYTE_CODE_ADDRESS_LO + ccp_BYTE_CODE_DEPLOYMENT_NUMBER + ccp_BYTE_CODE_DEPLOYMENT_STATUS + ccp_BYTE_CODE_CODE_FRAGMENT_INDEX + ccp_CALL_DATA_CONTEXT_NUMBER + ccp_CALLER_ADDRESS_HI + ccp_CALLER_ADDRESS_LO + ccp_CALL_VALUE + ccp_CALL_DATA_OFFSET + ccp_CALL_DATA_SIZE + ccp_RETURN_AT_OFFSET + ccp_RETURN_AT_CAPACITY + ccp_RETURN_DATA_OFFSET + ccp_RETURN_DATA_SIZE + ccp_RETURN_DATA_CONTEXT_NUMBER + ) + ;; original columns + ;;;;;;;;;;;;;;;;;;; + ( + (+ PEEK_AT_CONTEXT) + (+ context/CONTEXT_NUMBER) + (+ HUB_STAMP) + (+ context/UPDATE) + context/CALL_STACK_DEPTH + context/IS_ROOT + context/IS_STATIC + context/ACCOUNT_ADDRESS_HI + context/ACCOUNT_ADDRESS_LO + context/ACCOUNT_DEPLOYMENT_NUMBER + context/BYTE_CODE_ADDRESS_HI + context/BYTE_CODE_ADDRESS_LO + context/BYTE_CODE_DEPLOYMENT_NUMBER + context/BYTE_CODE_DEPLOYMENT_STATUS + context/BYTE_CODE_CODE_FRAGMENT_INDEX + context/CALL_DATA_CONTEXT_NUMBER + context/CALLER_ADDRESS_HI + context/CALLER_ADDRESS_LO + context/CALL_VALUE + context/CALL_DATA_OFFSET + context/CALL_DATA_SIZE + context/RETURN_AT_OFFSET + context/RETURN_AT_CAPACITY + context/RETURN_DATA_OFFSET + context/RETURN_DATA_SIZE + context/RETURN_DATA_CONTEXT_NUMBER + ) +) diff --git a/hub/osaka/constraints/consistency/context/computed.lisp b/hub/osaka/constraints/consistency/context/computed.lisp new file mode 100644 index 000000000..a63248c73 --- /dev/null +++ b/hub/osaka/constraints/consistency/context/computed.lisp @@ -0,0 +1,33 @@ +(module hub) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; FIRST/AGAIN for contexts ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defcomputed + (con_FIRST) + (fwd-changes-within ccp_PEEK_AT_CONTEXT ;; perspective + ccp_CONTEXT_NUMBER ;; columns + )) + +(defcomputed + (con_AGAIN) + (fwd-unchanged-within ccp_PEEK_AT_CONTEXT ;; perspective + ccp_CONTEXT_NUMBER ;; columns + )) + + +;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; Binary constraints ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;; + +(defconstraint context-consistency---binarities () + (begin + ( is-binary con_FIRST ) + ( is-binary con_AGAIN ) + )) diff --git a/hub/osaka/constraints/consistency/context/constraints.lisp b/hub/osaka/constraints/consistency/context/constraints.lisp new file mode 100644 index 000000000..8865bc08e --- /dev/null +++ b/hub/osaka/constraints/consistency/context/constraints.lisp @@ -0,0 +1,53 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.3 Context consistency constraints ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstraint context-consistency---perm-cn-first-and-cn-again-constraints () + (begin + (eq! (+ con_AGAIN con_FIRST) + ccp_PEEK_AT_CONTEXT) + (if-zero (force-bin ccp_PEEK_AT_CONTEXT) + (eq! (next con_FIRST) (next ccp_PEEK_AT_CONTEXT))) + (if-not-zero ccp_PEEK_AT_CONTEXT + (if-not-zero (next ccp_PEEK_AT_CONTEXT) + (if-not (will-remain-constant! ccp_CONTEXT_NUMBER) + (will-eq! con_FIRST 1) + (will-eq! con_AGAIN 1)))))) + +(defconstraint context-consistency---context-data-immutability () + (if-not-zero (next con_AGAIN) + (if-not-zero (next ccp_CONTEXT_NUMBER) + (begin + ( will-remain-constant! ccp_CALL_STACK_DEPTH ) + ( will-remain-constant! ccp_IS_ROOT ) + ( will-remain-constant! ccp_IS_STATIC ) + ( will-remain-constant! ccp_ACCOUNT_ADDRESS_HI ) + ( will-remain-constant! ccp_ACCOUNT_ADDRESS_LO ) + ( will-remain-constant! ccp_ACCOUNT_DEPLOYMENT_NUMBER ) + ( will-remain-constant! ccp_BYTE_CODE_ADDRESS_HI ) + ( will-remain-constant! ccp_BYTE_CODE_ADDRESS_LO ) + ( will-remain-constant! ccp_BYTE_CODE_DEPLOYMENT_NUMBER ) + ( will-remain-constant! ccp_BYTE_CODE_DEPLOYMENT_STATUS ) + ( will-remain-constant! ccp_BYTE_CODE_CODE_FRAGMENT_INDEX ) + ( will-remain-constant! ccp_CALLER_ADDRESS_HI ) + ( will-remain-constant! ccp_CALLER_ADDRESS_LO ) + ( will-remain-constant! ccp_CALL_VALUE ) + ( will-remain-constant! ccp_CALL_DATA_CONTEXT_NUMBER ) + ( will-remain-constant! ccp_CALL_DATA_OFFSET ) + ( will-remain-constant! ccp_CALL_DATA_SIZE ) + ( will-remain-constant! ccp_RETURN_AT_OFFSET ) + ( will-remain-constant! ccp_RETURN_AT_CAPACITY ))))) + +(defconstraint context-consistency---context-data-return-data-constancy () + (if-not-zero (next con_AGAIN) + (if-not-zero (next ccp_CONTEXT_NUMBER) + (if-zero (force-bin (next ccp_UPDATE)) + (begin + ( will-remain-constant! ccp_RETURN_DATA_CONTEXT_NUMBER ) + ( will-remain-constant! ccp_RETURN_DATA_OFFSET ) + ( will-remain-constant! ccp_RETURN_DATA_SIZE )))))) diff --git a/hub/osaka/constraints/consistency/execution_environment/columns.lisp b/hub/osaka/constraints/consistency/execution_environment/columns.lisp new file mode 100644 index 000000000..4720510b9 --- /dev/null +++ b/hub/osaka/constraints/consistency/execution_environment/columns.lisp @@ -0,0 +1,40 @@ +(module hub) + + +;; envcp_ ⇔ execution environment consistency permutation +(defpermutation + ;; permuted columns + ( + envcp_CN + envcp_HUB_STAMP + envcp_CFI + envcp_CALLER_CN + envcp_CN_WILL_REV + envcp_CN_GETS_REV + envcp_CN_SELF_REV + envcp_CN_REV_STAMP + envcp_PC + envcp_PC_NEW + envcp_HEIGHT + envcp_HEIGHT_NEW + envcp_GAS_EXPECTED + envcp_GAS_NEXT + ) + ;; original columns + ( + (↓ CN ) + (↓ HUB_STAMP ) + CFI + CALLER_CN + CN_WILL_REV + CN_GETS_REV + CN_SELF_REV + CN_REV_STAMP + PC + PC_NEW + HEIGHT + HEIGHT_NEW + GAS_EXPECTED + GAS_NEXT + ) + ) diff --git a/hub/osaka/constraints/consistency/execution_environment/constraints.lisp b/hub/osaka/constraints/consistency/execution_environment/constraints.lisp new file mode 100644 index 000000000..fe691b89b --- /dev/null +++ b/hub/osaka/constraints/consistency/execution_environment/constraints.lisp @@ -0,0 +1,34 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.2 Execution environment consistency constraints ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstraint execution-environment-consistency---constancies () + (if-not-zero envcp_CN + (if-eq (next envcp_CN) envcp_CN + (begin + (will-remain-constant! envcp_CFI ) + (will-remain-constant! envcp_CALLER_CN ) + (will-remain-constant! envcp_CN_WILL_REV ) + (will-remain-constant! envcp_CN_GETS_REV ) + (will-remain-constant! envcp_CN_SELF_REV ) + (will-remain-constant! envcp_CN_REV_STAMP ))))) + +(defconstraint execution-environment-consistency---linking () + (if-not-zero envcp_CN + (if-eq (next envcp_CN) envcp_CN + (if-not (will-remain-constant! envcp_HUB_STAMP) + (begin + (eq! (next envcp_PC) envcp_PC_NEW) + (eq! (next envcp_HEIGHT) envcp_HEIGHT_NEW) + (eq! (next envcp_GAS_EXPECTED) envcp_GAS_NEXT)))))) + +(defconstraint execution-environment-consistency---initialization () + (if-not (will-remain-constant! envcp_CN) + (begin + (vanishes! (next envcp_PC)) + (vanishes! (next envcp_HEIGHT))))) diff --git a/hub/osaka/constraints/consistency/stack/columns.lisp b/hub/osaka/constraints/consistency/stack/columns.lisp new file mode 100644 index 000000000..62865e110 --- /dev/null +++ b/hub/osaka/constraints/consistency/stack/columns.lisp @@ -0,0 +1,34 @@ +(module hub) + + +(definterleaved PEEK_AT_STACK_POW_4 (PEEK_AT_STACK PEEK_AT_STACK PEEK_AT_STACK PEEK_AT_STACK )) +(definterleaved CN_POW_4 (CONTEXT_NUMBER CONTEXT_NUMBER CONTEXT_NUMBER CONTEXT_NUMBER )) +(definterleaved STACK_STAMP_1234 ([stack/STACK_ITEM_STAMP 1] [stack/STACK_ITEM_STAMP 2] [stack/STACK_ITEM_STAMP 3] [stack/STACK_ITEM_STAMP 4] )) ;; "" +(definterleaved HEIGHT_1234 ([stack/STACK_ITEM_HEIGHT 1] [stack/STACK_ITEM_HEIGHT 2] [stack/STACK_ITEM_HEIGHT 3] [stack/STACK_ITEM_HEIGHT 4] )) ;; "" +(definterleaved POP_1234 ([stack/STACK_ITEM_POP 1] [stack/STACK_ITEM_POP 2] [stack/STACK_ITEM_POP 3] [stack/STACK_ITEM_POP 4] )) ;; "" +(definterleaved VALUE_HI_1234 ([stack/STACK_ITEM_VALUE_HI 1] [stack/STACK_ITEM_VALUE_HI 2] [stack/STACK_ITEM_VALUE_HI 3] [stack/STACK_ITEM_VALUE_HI 4] )) ;; "" +(definterleaved VALUE_LO_1234 ([stack/STACK_ITEM_VALUE_LO 1] [stack/STACK_ITEM_VALUE_LO 2] [stack/STACK_ITEM_VALUE_LO 3] [stack/STACK_ITEM_VALUE_LO 4] )) ;; "" + +;; stkcp_ ⇔ stack consistency permutation +(defpermutation + ;; row-permuted columns + ( + stkcp_PEEK_AT_STACK_POW_4 + stkcp_CN_POW_4 + stkcp_HEIGHT_1234 + stkcp_STACK_STAMP_1234 + stkcp_POP_1234 + stkcp_VALUE_HI_1234 + stkcp_VALUE_LO_1234 + ) + ;; underlying columns + ( + (↓ PEEK_AT_STACK_POW_4) + (↓ CN_POW_4) + (↓ HEIGHT_1234) + (↓ STACK_STAMP_1234) + POP_1234 + VALUE_HI_1234 + VALUE_LO_1234 + ) + ) diff --git a/hub/osaka/constraints/consistency/stack/computed.lisp b/hub/osaka/constraints/consistency/stack/computed.lisp new file mode 100644 index 000000000..259075659 --- /dev/null +++ b/hub/osaka/constraints/consistency/stack/computed.lisp @@ -0,0 +1,52 @@ +(module hub) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; FIRST/AGAIN in context ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defcomputed + (stkcp_FIRST_CTXT) + (fwd-changes-within stkcp_PEEK_AT_STACK_POW_4 ;; perspective + stkcp_CN_POW_4 ;; columns + )) +(defcomputed + (stkcp_AGAIN_CTXT) + (fwd-unchanged-within stkcp_PEEK_AT_STACK_POW_4 ;; perspective + stkcp_CN_POW_4 ;; columns + )) + + +;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; FIRST/AGAIN in spot ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;; + +(defcomputed + (stkcp_FIRST_SPOT) + (fwd-changes-within stkcp_PEEK_AT_STACK_POW_4 ;; perspective + stkcp_CN_POW_4 ;; columns + stkcp_HEIGHT_1234 + )) +(defcomputed + (stkcp_AGAIN_SPOT) + (fwd-unchanged-within stkcp_PEEK_AT_STACK_POW_4 ;; perspective + stkcp_CN_POW_4 ;; columns + stkcp_HEIGHT_1234 + )) + + +;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; Binary constraints ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;; + +(defconstraint stack-consistency---binarities () + (begin + ( is-binary stkcp_FIRST_CTXT ) ( is-binary stkcp_AGAIN_CTXT ) + ( is-binary stkcp_FIRST_SPOT ) ( is-binary stkcp_AGAIN_SPOT ) + )) diff --git a/hub/osaka/constraints/consistency/stack/constraints.lisp b/hub/osaka/constraints/consistency/stack/constraints.lisp new file mode 100644 index 000000000..d9e1a5784 --- /dev/null +++ b/hub/osaka/constraints/consistency/stack/constraints.lisp @@ -0,0 +1,48 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.4 Stack consistency constraints ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstraint stack-consistency---only-nontrivial-contexts (:guard stkcp_PEEK_AT_STACK_POW_4) + (is-not-zero! stkcp_CN_POW_4)) + +(defconstraint stack-consistency---setting-FIRST-AGAIN () + (begin + (eq! (+ stkcp_FIRST_CTXT stkcp_AGAIN_CTXT) stkcp_PEEK_AT_STACK_POW_4) + (eq! (+ stkcp_FIRST_SPOT stkcp_AGAIN_SPOT) stkcp_PEEK_AT_STACK_POW_4) + (if-zero (force-bin stkcp_PEEK_AT_STACK_POW_4) + (eq! (next (+ stkcp_FIRST_CTXT stkcp_FIRST_SPOT)) + (next (* stkcp_PEEK_AT_STACK_POW_4 2)))) + (if-not-zero stkcp_PEEK_AT_STACK_POW_4 + (if-not-zero (next stkcp_PEEK_AT_STACK_POW_4) + (if-not (will-remain-constant! stkcp_CN_POW_4) + (eq! (next (+ stkcp_FIRST_CTXT stkcp_FIRST_SPOT)) 2) + (eq! (next stkcp_AGAIN_CTXT) 1)))) + (if-not-zero (next stkcp_AGAIN_CTXT) + (if-not (will-remain-constant! stkcp_HEIGHT_1234) + (eq! (next stkcp_FIRST_SPOT) 1) + (eq! (next stkcp_AGAIN_SPOT) 1))))) + + +(defconstraint stack-consistency---first-and-repeat-encounter-of-context () + (begin + (if-not-zero stkcp_FIRST_CTXT (vanishes! stkcp_HEIGHT_1234)) + (if-not-zero stkcp_AGAIN_CTXT (or! (remained-constant! stkcp_HEIGHT_1234) + (did-inc! stkcp_HEIGHT_1234 1))))) + + +(defconstraint stack-consistency---first-and-repeat-encounter-of-spot () + (begin + (if-not-zero stkcp_FIRST_SPOT (vanishes! stkcp_POP_1234)) + (if-not-zero stkcp_AGAIN_SPOT + (if-not-zero stkcp_HEIGHT_1234 + (begin + (eq! (+ stkcp_POP_1234 (prev stkcp_POP_1234)) 1) + (if-not-zero stkcp_POP_1234 + (begin + (remained-constant! stkcp_VALUE_HI_1234) + (remained-constant! stkcp_VALUE_LO_1234)))))))) diff --git a/hub/osaka/constraints/consistency/storage/columns.lisp b/hub/osaka/constraints/consistency/storage/columns.lisp new file mode 100644 index 000000000..0131879a3 --- /dev/null +++ b/hub/osaka/constraints/consistency/storage/columns.lisp @@ -0,0 +1,64 @@ +(module hub) + +;; scp_ ⇔ storage consistency permutation +(defpermutation + ;; permuted columns + ;; replace scp with storage_consistency_permutation + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ( + scp_PEEK_AT_STORAGE + scp_ADDRESS_HI + scp_ADDRESS_LO + scp_STORAGE_KEY_HI + scp_STORAGE_KEY_LO + scp_DOM_STAMP + scp_SUB_STAMP + ;; + scp_TOTL_TXN_NUMBER + scp_BLK_NUMBER + scp_VALUE_ORIG_HI + scp_VALUE_ORIG_LO + scp_VALUE_CURR_HI + scp_VALUE_CURR_LO + scp_VALUE_NEXT_HI + scp_VALUE_NEXT_LO + ;; + scp_WARMTH + scp_WARMTH_NEW + scp_DEPLOYMENT_NUMBER + ;; + scp_PREWARMING_OPERATION + scp_SLOAD_OPERATION + scp_SSTORE_OPERATION + scp_EXCEPTIONAL_OPERATION + ) + ;; original columns + ;;;;;;;;;;;;;;;;;;; + ( + (↓ PEEK_AT_STORAGE ) + (↓ storage/ADDRESS_HI ) + (↓ storage/ADDRESS_LO ) + (↓ storage/STORAGE_KEY_HI ) + (↓ storage/STORAGE_KEY_LO ) + (↓ DOM_STAMP ) + (↑ SUB_STAMP ) + ;; + TOTL_TXN_NUMBER + BLK_NUMBER + storage/VALUE_ORIG_HI + storage/VALUE_ORIG_LO + storage/VALUE_CURR_HI + storage/VALUE_CURR_LO + storage/VALUE_NEXT_HI + storage/VALUE_NEXT_LO + ;; + storage/WARMTH + storage/WARMTH_NEW + storage/DEPLOYMENT_NUMBER + ;; + TX_WARM + storage/SLOAD_OPERATION + storage/SSTORE_OPERATION + XAHOY + ) + ) diff --git a/hub/osaka/constraints/consistency/storage/computed.lisp b/hub/osaka/constraints/consistency/storage/computed.lisp new file mode 100644 index 000000000..82e5d046e --- /dev/null +++ b/hub/osaka/constraints/consistency/storage/computed.lisp @@ -0,0 +1,232 @@ +(module hub) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; FIRST/AGAIN/FINAL in conflation ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defcomputed + (scp_FIRST_IN_CNF) + (fwd-changes-within scp_PEEK_AT_STORAGE ;; perspective + scp_ADDRESS_HI ;; columns + scp_ADDRESS_LO + scp_STORAGE_KEY_HI + scp_STORAGE_KEY_LO + )) +(defcomputed + (scp_AGAIN_IN_CNF) + (fwd-unchanged-within scp_PEEK_AT_STORAGE ;; perspective + scp_ADDRESS_HI ;; columns + scp_ADDRESS_LO + scp_STORAGE_KEY_HI + scp_STORAGE_KEY_LO + )) +(defcomputed + (scp_FINAL_IN_CNF) + (bwd-changes-within scp_PEEK_AT_STORAGE ;; perspective + scp_ADDRESS_HI ;; columns + scp_ADDRESS_LO + scp_STORAGE_KEY_HI + scp_STORAGE_KEY_LO + )) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; FIRST/AGAIN/FINAL in block ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defcomputed + (scp_FIRST_IN_BLK) + (fwd-changes-within scp_PEEK_AT_STORAGE ;; perspective + scp_ADDRESS_HI ;; columns + scp_ADDRESS_LO + scp_STORAGE_KEY_HI + scp_STORAGE_KEY_LO + scp_BLK_NUMBER + )) +(defcomputed + (scp_AGAIN_IN_BLK) + (fwd-unchanged-within scp_PEEK_AT_STORAGE ;; perspective + scp_ADDRESS_HI ;; columns + scp_ADDRESS_LO + scp_STORAGE_KEY_HI + scp_STORAGE_KEY_LO + scp_BLK_NUMBER + )) +(defcomputed + (scp_FINAL_IN_BLK) + (bwd-changes-within scp_PEEK_AT_STORAGE ;; perspective + scp_ADDRESS_HI ;; columns + scp_ADDRESS_LO + scp_STORAGE_KEY_HI + scp_STORAGE_KEY_LO + scp_BLK_NUMBER + )) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; FIRST/AGAIN/FINAL in transaction ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defcomputed + (scp_FIRST_IN_TXN) + (fwd-changes-within scp_PEEK_AT_STORAGE ;; perspective + scp_ADDRESS_HI ;; columns + scp_ADDRESS_LO + scp_STORAGE_KEY_HI + scp_STORAGE_KEY_LO + scp_TOTL_TXN_NUMBER + )) +(defcomputed + (scp_AGAIN_IN_TXN) + (fwd-unchanged-within scp_PEEK_AT_STORAGE ;; perspective + scp_ADDRESS_HI ;; columns + scp_ADDRESS_LO + scp_STORAGE_KEY_HI + scp_STORAGE_KEY_LO + scp_TOTL_TXN_NUMBER + )) +(defcomputed + (scp_FINAL_IN_TXN) + (bwd-changes-within scp_PEEK_AT_STORAGE ;; perspective + scp_ADDRESS_HI ;; columns + scp_ADDRESS_LO + scp_STORAGE_KEY_HI + scp_STORAGE_KEY_LO + scp_TOTL_TXN_NUMBER + )) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; FRIRST/FINAL deployment number in block ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defcomputed + (scp_DEPLOYMENT_NUMBER_FIRST_IN_BLOCK) + (map-if + + ;; target perspective and key columns + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + ;; target selector + scp_PEEK_AT_STORAGE + ;; target key columns + scp_ADDRESS_HI + scp_ADDRESS_LO + scp_BLK_NUMBER + + ;; source perspective and key/value columns + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + ;; source selector + acp_PEEK_AT_ACCOUNT + ;; source key columns + acp_ADDRESS_HI + acp_ADDRESS_LO + acp_BLK_NUMBER + ;; source value column + acp_DEPLOYMENT_NUMBER_FIRST_IN_BLOCK + ) + ) + +(defcomputed + (scp_DEPLOYMENT_NUMBER_FINAL_IN_BLOCK) + (map-if + ;; target perspective and key columns + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + ;; perspective column + scp_PEEK_AT_STORAGE + ;; target key columns + scp_ADDRESS_HI + scp_ADDRESS_LO + scp_BLK_NUMBER + + ;; source perspective and key/value columns + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + ;; perspective column + acp_PEEK_AT_ACCOUNT + ;; source key columns + acp_ADDRESS_HI + acp_ADDRESS_LO + acp_BLK_NUMBER + ;; source value column + acp_DEPLOYMENT_NUMBER_FINAL_IN_BLOCK + ) + ) + +(defcomputed + (scp_EXISTS_FIRST_IN_BLOCK) + (map-if + + ;; target perspective and key columns + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + ;; target selector + scp_PEEK_AT_STORAGE + ;; target key columns + scp_ADDRESS_HI + scp_ADDRESS_LO + scp_BLK_NUMBER + + ;; source perspective and key/value columns + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + ;; source selector + acp_PEEK_AT_ACCOUNT + ;; source key columns + acp_ADDRESS_HI + acp_ADDRESS_LO + acp_BLK_NUMBER + ;; source value column + acp_EXISTS_FIRST_IN_BLOCK + ) + ) + +(defcomputed + (scp_EXISTS_FINAL_IN_BLOCK) + (map-if + ;; target perspective and key columns + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + ;; perspective column + scp_PEEK_AT_STORAGE + ;; target key columns + scp_ADDRESS_HI + scp_ADDRESS_LO + scp_BLK_NUMBER + + ;; source perspective and key/value columns + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + ;; perspective column + acp_PEEK_AT_ACCOUNT + ;; source key columns + acp_ADDRESS_HI + acp_ADDRESS_LO + acp_BLK_NUMBER + ;; source value column + acp_EXISTS_FINAL_IN_BLOCK + ) + ) + + +;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; Binary constraints ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;; + +(defconstraint storage-consistency---binarities () + (begin + (is-binary scp_FIRST_IN_CNF ) (is-binary scp_FIRST_IN_BLK ) (is-binary scp_FIRST_IN_TXN ) + (is-binary scp_AGAIN_IN_CNF ) (is-binary scp_AGAIN_IN_BLK ) (is-binary scp_AGAIN_IN_TXN ) + (is-binary scp_FINAL_IN_CNF ) (is-binary scp_FINAL_IN_BLK ) (is-binary scp_FINAL_IN_TXN ) + )) diff --git a/hub/osaka/constraints/consistency/storage/constraints.lisp b/hub/osaka/constraints/consistency/storage/constraints.lisp new file mode 100644 index 000000000..22d3376d0 --- /dev/null +++ b/hub/osaka/constraints/consistency/storage/constraints.lisp @@ -0,0 +1,137 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.6 Storage consistency constraints ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +;; we should be guaranteed that this is a 20B integer given how it is filled: +;; - during pre-warming addresses are checked for smallness in the RLP_TXN +;; - or during SSTORE / SSLOAD operations addresses are obtained from context data +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defun (scp_full_address) (+ (* (^ 256 16) scp_ADDRESS_HI) + scp_ADDRESS_LO)) ;; "" + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.6.3 Constraints for scp_FIRST, scp_AGAIN and scp_FINAL ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +;; TODO: remove when we migrate to the unified permutation argument +(defconstraint storage-consistency---FIRST-AGAIN-FINAL---automatic-vanishing () + (begin + (if-zero (force-bin scp_PEEK_AT_STORAGE) + (vanishes! (+ + scp_FIRST_IN_TXN scp_FIRST_IN_BLK scp_FIRST_IN_CNF + scp_AGAIN_IN_TXN scp_AGAIN_IN_BLK scp_AGAIN_IN_CNF + scp_FINAL_IN_TXN scp_FINAL_IN_BLK scp_FINAL_IN_CNF))))) + +(defun (storage-consistency---transtion-conflation) (+ (prev scp_FINAL_IN_CNF) scp_FIRST_IN_CNF)) +(defun (storage-consistency---transtion-block) (+ (prev scp_FINAL_IN_BLK) scp_FIRST_IN_BLK)) +(defun (storage-consistency---transtion-transaction) (+ (prev scp_FINAL_IN_TXN) scp_FIRST_IN_TXN)) +(defun (storage-consistency---transtion-sum) (+ (storage-consistency---transtion-conflation) + (storage-consistency---transtion-block) + (storage-consistency---transtion-transaction))) + +(defconstraint storage-consistency---FIRST-AGAIN-FINAL---first-storage-row () + (if-zero (force-bin (prev scp_PEEK_AT_STORAGE)) + (if-not-zero (force-bin scp_PEEK_AT_STORAGE) + (if-not-zero scp_PEEK_AT_STORAGE + (eq! (storage-consistency---transtion-sum) + 3))))) + +(defun (storage-consistency---repeat-storage-row) (* (prev scp_PEEK_AT_STORAGE) scp_PEEK_AT_STORAGE)) + +(defconstraint storage-consistency---FIRST-AGAIN-FINAL---repeat-storage-row---change-in-storage-slot (:guard (storage-consistency---repeat-storage-row)) + (begin + (if-not (remained-constant! (scp_full_address)) (eq! (storage-consistency---transtion-sum) 6)) + (if-not (remained-constant! scp_STORAGE_KEY_HI) (eq! (storage-consistency---transtion-sum) 6)) + (if-not (remained-constant! scp_STORAGE_KEY_LO) (eq! (storage-consistency---transtion-sum) 6)))) + +(defconstraint storage-consistency---FIRST-AGAIN-FINAL---repeat-storage-row---no-change-in-storage-slot (:guard (storage-consistency---repeat-storage-row)) + (if (remained-constant! (scp_full_address)) + (if (remained-constant! scp_STORAGE_KEY_HI) + (if (remained-constant! scp_STORAGE_KEY_LO) + (eq! (storage-consistency---transtion-conflation) 0))))) + +(defconstraint storage-consistency---FIRST-AGAIN-FINAL---repeat-encounter-of-storage-slot (:guard (* scp_PEEK_AT_STORAGE (- 1 scp_FIRST_IN_CNF))) + (begin + (if-not (remained-constant! scp_BLK_NUMBER) + (eq! (storage-consistency---transtion-block) 2) + (eq! (storage-consistency---transtion-block) 0)) + (if-not (remained-constant! scp_TOTL_TXN_NUMBER) + (eq! (storage-consistency---transtion-transaction) 2) + (eq! (storage-consistency---transtion-transaction) 0)))) + +(defconstraint storage-consistency---FIRST-AGAIN-FINAL---final-row-with-room-to-spare () + (if-not-zero (prev scp_PEEK_AT_STORAGE) + (if-zero (force-bin scp_PEEK_AT_STORAGE) + (eq! 3 + (storage-consistency---transtion-sum))))) + +(defconstraint storage-consistency---FIRST-AGAIN-FINAL---final-row-of-the-trace (:domain {-1}) + (if-not-zero scp_PEEK_AT_STORAGE + (eq! 3 + (+ scp_FINAL_IN_CNF + scp_FINAL_IN_BLK + scp_FINAL_IN_TXN)))) + +(defconstraint storage-consistency---FIRST-AGAIN-FINAL---unconditionally-constraining-AGAIN () + (begin + (eq! (+ scp_FIRST_IN_CNF scp_AGAIN_IN_CNF) scp_PEEK_AT_STORAGE) + (eq! (+ scp_FIRST_IN_BLK scp_AGAIN_IN_BLK) scp_PEEK_AT_STORAGE) + (eq! (+ scp_FIRST_IN_TXN scp_AGAIN_IN_TXN) scp_PEEK_AT_STORAGE))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.6.7 Constraints ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defconstraint storage-consistency---setting-original-storage-value (:guard scp_FIRST_IN_TXN) + (begin + (eq! scp_VALUE_ORIG_HI scp_VALUE_CURR_HI) + (eq! scp_VALUE_ORIG_LO scp_VALUE_CURR_LO))) + +(defconstraint storage-consistency---persisting-original-storage-values (:guard scp_AGAIN_IN_TXN) + (begin + (remained-constant! scp_VALUE_ORIG_HI) + (remained-constant! scp_VALUE_ORIG_LO))) + +(defconstraint storage-consistency---resetting-of-storage-values-after-deployments---first (:guard scp_FIRST_IN_CNF) + (if-not-zero scp_DEPLOYMENT_NUMBER + (begin + (vanishes! scp_VALUE_CURR_HI) + (vanishes! scp_VALUE_CURR_LO)))) + +(defconstraint storage-consistency---resetting-of-storage-values-after-deployments---again (:guard scp_AGAIN_IN_CNF) + (if-not (remained-constant! scp_DEPLOYMENT_NUMBER) + (begin + (vanishes! scp_VALUE_CURR_HI) + (vanishes! scp_VALUE_CURR_LO)))) + +(defconstraint storage-consistency---persisting-of-storage-values (:guard scp_AGAIN_IN_CNF) + (if (remained-constant! scp_DEPLOYMENT_NUMBER) + (begin + (eq! scp_VALUE_CURR_HI (prev scp_VALUE_NEXT_HI)) + (eq! scp_VALUE_CURR_LO (prev scp_VALUE_NEXT_LO))))) + +(defconstraint setting-and-resetting-storage-key-warmth () + (begin + (if-not-zero scp_FIRST_IN_TXN (vanishes! scp_WARMTH)) + (if-not-zero scp_AGAIN_IN_TXN (eq! scp_WARMTH (prev scp_WARMTH_NEW))))) + +(defconstraint exclusivity-and-sanity-checks-for-_OPERATION-columns () + (if-not-zero scp_PEEK_AT_STORAGE + (begin + (eq! 1 + (+ scp_PREWARMING_OPERATION + scp_SLOAD_OPERATION + scp_SSTORE_OPERATION)) + (vanishes! (* scp_PREWARMING_OPERATION scp_EXCEPTIONAL_OPERATION))))) diff --git a/hub/osaka/constraints/consistency/transient/columns.lisp b/hub/osaka/constraints/consistency/transient/columns.lisp new file mode 100644 index 000000000..4b533e539 --- /dev/null +++ b/hub/osaka/constraints/consistency/transient/columns.lisp @@ -0,0 +1,41 @@ +(module hub) + +;; tcp_ ⇔ transient (storage) consistency permutation +(defpermutation + ;; permuted columns + ;; replace tcp with transient_storage_consistency_permutation + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ( + tcp_PEEK_AT_TRANSIENT + tcp_ADDRESS_HI + tcp_ADDRESS_LO + tcp_STORAGE_KEY_HI + tcp_STORAGE_KEY_LO + tcp_TOTL_TXN_NUMBER + tcp_DOM_STAMP + tcp_SUB_STAMP + ;; + ;; + tcp_VALUE_CURR_HI + tcp_VALUE_CURR_LO + tcp_VALUE_NEXT_HI + tcp_VALUE_NEXT_LO + ) + ;; original columns + ;;;;;;;;;;;;;;;;;;; + ( + (+ PEEK_AT_TRANSIENT ) + (+ transient/ADDRESS_HI ) + (+ transient/ADDRESS_LO ) + (+ transient/STORAGE_KEY_HI ) + (+ transient/STORAGE_KEY_LO ) + (+ TOTL_TXN_NUMBER ) + (+ DOM_STAMP ) + (- SUB_STAMP ) + ;; + transient/VALUE_CURR_HI + transient/VALUE_CURR_LO + transient/VALUE_NEXT_HI + transient/VALUE_NEXT_LO + ) + ) diff --git a/hub/osaka/constraints/consistency/transient/computed.lisp b/hub/osaka/constraints/consistency/transient/computed.lisp new file mode 100644 index 000000000..edac7daa0 --- /dev/null +++ b/hub/osaka/constraints/consistency/transient/computed.lisp @@ -0,0 +1,40 @@ +(module hub) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; FIRST/AGAIN in transaction ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defcomputed + (tcp_FIRST_IN_TXN) + (fwd-changes-within tcp_PEEK_AT_TRANSIENT ;; perspective + tcp_ADDRESS_HI ;; columns + tcp_ADDRESS_LO + tcp_STORAGE_KEY_HI + tcp_STORAGE_KEY_LO + tcp_TOTL_TXN_NUMBER + )) +(defcomputed + (tcp_AGAIN_IN_TXN) + (fwd-unchanged-within tcp_PEEK_AT_TRANSIENT ;; perspective + tcp_ADDRESS_HI ;; columns + tcp_ADDRESS_LO + tcp_STORAGE_KEY_HI + tcp_STORAGE_KEY_LO + tcp_TOTL_TXN_NUMBER + )) + + +;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; Binary constraints ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;; + +(defconstraint transient-consistency---binarities () + (begin + (is-binary tcp_FIRST_IN_TXN ) + (is-binary tcp_AGAIN_IN_TXN ) + )) diff --git a/hub/osaka/constraints/consistency/transient/constraints.lisp b/hub/osaka/constraints/consistency/transient/constraints.lisp new file mode 100644 index 000000000..57b28b7d4 --- /dev/null +++ b/hub/osaka/constraints/consistency/transient/constraints.lisp @@ -0,0 +1,76 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.Y Transient consistency constraints ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defun (tcp_full_address) (+ (* (^ 256 16) tcp_ADDRESS_HI) + tcp_ADDRESS_LO)) ;; "" + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.Z Constraints for tcp_FIRST and tcp_AGAIN ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +;; TODO: remove when we migrate to the unified permutation argument +(defconstraint transient-consistency---FIRST-AGAIN---precisely-one-is-active-on-every-transient-row-and-both-vanish-otherwise () + (eq! tcp_PEEK_AT_TRANSIENT + (+ tcp_FIRST_IN_TXN + tcp_AGAIN_IN_TXN + ))) + +(defconstraint transient-consistency---FIRST-AGAIN---first-transient-row () + (if-zero (force-bin (prev tcp_PEEK_AT_TRANSIENT)) + (eq! tcp_PEEK_AT_TRANSIENT + tcp_FIRST_IN_TXN))) + +(defun (transient-consistency---repeat-transient-row) (* (prev tcp_PEEK_AT_TRANSIENT) tcp_PEEK_AT_TRANSIENT)) + +(defconstraint transient-consistency---FIRST-AGAIN---repeat-transient-row---change-in-address-transient-storage-key-or-transaction + (:guard (transient-consistency---repeat-transient-row)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (begin + (if-not (remained-constant! (tcp_full_address) ) (eq! tcp_FIRST_IN_TXN 1)) + (if-not (remained-constant! tcp_STORAGE_KEY_HI ) (eq! tcp_FIRST_IN_TXN 1)) + (if-not (remained-constant! tcp_STORAGE_KEY_LO ) (eq! tcp_FIRST_IN_TXN 1)) + (if-not (remained-constant! tcp_TOTL_TXN_NUMBER ) (eq! tcp_FIRST_IN_TXN 1)) + )) + +(defconstraint transient-consistency---FIRST-AGAIN---repeat-transient-row---no-change-in-address-transient-storage-key-or-transaction + (:guard (transient-consistency---repeat-transient-row)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if (remained-constant! (tcp_full_address)) + (if (remained-constant! tcp_STORAGE_KEY_HI) + (if (remained-constant! tcp_STORAGE_KEY_LO) + (if (remained-constant! tcp_TOTL_TXN_NUMBER) + (eq! tcp_AGAIN_IN_TXN 1)))))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.Z Consistency constraints ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstraint transient-consistency---first-encounter-with-transient-slot---initial-value-is-zero + (:guard tcp_FIRST_IN_TXN) + ;;;;;;;;;;;;;;;;;;;;;;;;;;; + (begin + (vanishes! tcp_VALUE_CURR_HI) + (vanishes! tcp_VALUE_CURR_LO) + )) + +(defconstraint transient-consistency---repeat-encounter-with-transient-slot---linking-constraints + (:guard tcp_AGAIN_IN_TXN) + ;;;;;;;;;;;;;;;;;;;;;;;;;;; + (begin + (eq! tcp_VALUE_CURR_HI (prev tcp_VALUE_NEXT_HI)) + (eq! tcp_VALUE_CURR_LO (prev tcp_VALUE_NEXT_LO)) + )) diff --git a/hub/osaka/constraints/context-rows/specialized.lisp b/hub/osaka/constraints/context-rows/specialized.lisp new file mode 100644 index 000000000..2fbc47363 --- /dev/null +++ b/hub/osaka/constraints/context-rows/specialized.lisp @@ -0,0 +1,117 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; 6.1 Setting the next context number ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (next-context-is-new) + (eq! CONTEXT_NUMBER_NEW + (+ 1 HUB_STAMP))) + +(defun (next-context-is-current) + (eq! CONTEXT_NUMBER_NEW + CONTEXT_NUMBER)) + +(defun (next-context-is-caller) + (eq! CONTEXT_NUMBER_NEW + CALLER_CONTEXT_NUMBER)) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; 6.1 Setting the next context number ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (initialize-context + relative_row_offset ;; row offset + cn ;; context number + csd ;; call stack depth + is_root ;; is root + is_static ;; is static + account_address_hi ;; account address high + account_address_lo ;; account address low + account_deployment_number ;; account deployment number + byte_code_address_hi ;; byte code address high + byte_code_address_lo ;; byte code address low + byte_code_deployment_number ;; byte code deployment number + byte_code_deployment_status ;; byte code deployment status + byte_code_cfi ;; byte code code fragment index + caller_address_hi ;; caller address high + caller_address_lo ;; caller address low + call_value ;; call value + call_data_context_number ;; caller context + call_data_offset ;; call data offset + call_data_size ;; call data size + return_at_offset ;; return at offset + return_at_capacity ;; return at capacity + ) + (begin + (eq! (shift context/CONTEXT_NUMBER relative_row_offset) cn ) + (eq! (shift context/CALL_DATA_CONTEXT_NUMBER relative_row_offset) call_data_context_number ) + (eq! (shift context/CALL_STACK_DEPTH relative_row_offset) csd ) + (eq! (shift context/IS_ROOT relative_row_offset) is_root ) + (eq! (shift context/IS_STATIC relative_row_offset) is_static ) + (eq! (shift context/ACCOUNT_ADDRESS_HI relative_row_offset) account_address_hi ) + (eq! (shift context/ACCOUNT_ADDRESS_LO relative_row_offset) account_address_lo ) + (eq! (shift context/ACCOUNT_DEPLOYMENT_NUMBER relative_row_offset) account_deployment_number ) + (eq! (shift context/BYTE_CODE_ADDRESS_HI relative_row_offset) byte_code_address_hi ) + (eq! (shift context/BYTE_CODE_ADDRESS_LO relative_row_offset) byte_code_address_lo ) + (eq! (shift context/BYTE_CODE_DEPLOYMENT_NUMBER relative_row_offset) byte_code_deployment_number ) + (eq! (shift context/BYTE_CODE_DEPLOYMENT_STATUS relative_row_offset) byte_code_deployment_status ) + (eq! (shift context/BYTE_CODE_CODE_FRAGMENT_INDEX relative_row_offset) byte_code_cfi ) + (eq! (shift context/CALLER_ADDRESS_HI relative_row_offset) caller_address_hi ) + (eq! (shift context/CALLER_ADDRESS_LO relative_row_offset) caller_address_lo ) + (eq! (shift context/CALL_VALUE relative_row_offset) call_value ) + (eq! (shift context/CALL_DATA_OFFSET relative_row_offset) call_data_offset ) + (eq! (shift context/CALL_DATA_SIZE relative_row_offset) call_data_size ) + (eq! (shift context/RETURN_AT_OFFSET relative_row_offset) return_at_offset ) + (eq! (shift context/RETURN_AT_CAPACITY relative_row_offset) return_at_capacity ) + (vanishes! (shift context/UPDATE relative_row_offset)) + (vanishes! (shift context/RETURN_DATA_CONTEXT_NUMBER relative_row_offset)) + (vanishes! (shift context/RETURN_DATA_OFFSET relative_row_offset)) + (vanishes! (shift context/RETURN_DATA_SIZE relative_row_offset)) + ) + ) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; 6.3 Specialized constraints ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (read-context-data relative_row_offset ;; row offset + context_number ;; context to read + ) + (begin + (eq! (shift context/CONTEXT_NUMBER relative_row_offset) context_number) + (vanishes! (shift context/UPDATE relative_row_offset) ))) + +(defun (provide-return-data relative_row_offset ;; row offset + return_data_receiver_context ;; receiver context + return_data_provider_context ;; provider context + return_data_offset ;; rdo + return_data_size ;; rds + ) + (begin + (eq! (shift context/UPDATE relative_row_offset) 1 ) + (eq! (shift context/CONTEXT_NUMBER relative_row_offset) return_data_receiver_context ) + (eq! (shift context/RETURN_DATA_CONTEXT_NUMBER relative_row_offset) return_data_provider_context ) + (eq! (shift context/RETURN_DATA_OFFSET relative_row_offset) return_data_offset ) + (eq! (shift context/RETURN_DATA_SIZE relative_row_offset) return_data_size ))) + +(defun (execution-provides-empty-return-data relative_row_offset) + (provide-return-data relative_row_offset + CALLER_CONTEXT_NUMBER + CONTEXT_NUMBER + 0 + 0)) + +(defun (nonexecution-provides-empty-return-data relative_row_offset) + (provide-return-data relative_row_offset + CONTEXT_NUMBER + (+ 1 HUB_STAMP) + 0 + 0)) diff --git a/hub/osaka/constraints/generalities/auxiliary_stamps.lisp b/hub/osaka/constraints/generalities/auxiliary_stamps.lisp new file mode 100644 index 000000000..1e8b21d88 --- /dev/null +++ b/hub/osaka/constraints/generalities/auxiliary_stamps.lisp @@ -0,0 +1,80 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; 4.7 Auxiliary stamps ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defconstraint generalities---auxiliary-stamps---initial-vanishing-constraints (:domain {0}) ;; "" + (begin + (vanishes! LOG_INFO_STAMP) + (vanishes! MXP_STAMP) + (vanishes! MMU_STAMP))) + +;; Note: the MMU stamp isn't hubStamp constant: you can have multiple MMU instructions being set off by a single instruction +;; e.g. +;; * RETURN in a deployment context (invalidCodePrefixException check + byte code deployment) +;; * generally precompiles (except for the IDENTITY) will require 3 MMU instructions (parameter extraction, full result transfer, partial result copy) +;; * BLAKE: you grab r, f and then potentially transfer inputs, potentially transfer the full results to RAM, potentially partially copy results to current RAM +;; * MODEXP: you grab the bbs, ebs, mbs, rawLeadingExponentWord, potentially transfer inputs to data module, potentially transfer the full results to RAM, potentially copy partial results to RAM +(defconstraint generalities---auxiliary-stamps---hub-stamp-constancies () + (hub-stamp-constancy LOG_INFO_STAMP)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; 4.7.1 HASH_INFO_STAMP constraints ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defconstraint generalities---auxiliary-stamps---necessary-conditions-for-HASH_INFO_FLAG-to-be-on (:perspective stack) + (begin (debug (is-binary HASH_INFO_FLAG)) + (if-not-zero HASH_INFO_FLAG + (eq! 1 + (* (- 1 XAHOY) + (+ stack/KEC_FLAG ;; selects for SHA3 + (* stack/CREATE_FLAG [stack/DEC_FLAG 2]) ;; selects for CREATE2 + (* stack/HALT_FLAG [stack/DEC_FLAG 1]))))))) ;; selects for RETURN ;; "" + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; 4.7.2 LOG_INFO_STAMP constraints ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defconstraint generalities---auxiliary-stamps---LOG_INFO_STAMP-increments () + (begin + (debug (or! (remained-constant! LOG_INFO_STAMP) (did-inc! LOG_INFO_STAMP 1))) + (if-not (remained-constant! HUB_STAMP) + (did-inc! LOG_INFO_STAMP (* PEEK_AT_STACK stack/LOG_INFO_FLAG))))) + +(defconstraint generalities---auxiliary-stamps---necessary-conditions-for-LOG_INFO_FLAG-to-be-on (:perspective stack) + (begin (debug (is-binary LOG_INFO_FLAG)) + (debug (if-not-zero XAHOY + (vanishes! LOG_INFO_FLAG))) + (debug (if-not-zero CONTEXT_WILL_REVERT + (vanishes! LOG_INFO_FLAG))) + (debug (if-not-zero LOG_FLAG + (vanishes! LOG_INFO_FLAG))) + (eq! LOG_INFO_FLAG + (* LOG_FLAG (- 1 CONTEXT_WILL_REVERT))))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; 4.7.3 MXP_STAMP constraints ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defconstraint generalities---auxiliary-stamps---MXP_STAMP-increments () + (did-inc! MXP_STAMP (* PEEK_AT_MISCELLANEOUS misc/MXP_FLAG))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; 4.7.4 MMU_STAMP constraints ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defconstraint generalities---auxiliary-stamps---MMU_STAMP-increments () + (did-inc! MMU_STAMP (* PEEK_AT_MISCELLANEOUS misc/MMU_FLAG))) + + diff --git a/hub/osaka/constraints/generalities/context.lisp b/hub/osaka/constraints/generalities/context.lisp new file mode 100644 index 000000000..8ede18760 --- /dev/null +++ b/hub/osaka/constraints/generalities/context.lisp @@ -0,0 +1,105 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; 4.2 Context numbers and context changes ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; 4.1.3 The XAHOY flag ;; +;; 4.2.2 Setting the CONTEXT_MAY_CHANGE flag ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +;; (defconstraint generalities---setting-the-CONTEXT_MAY_CHANGE-flag () +;; (begin +;; (is-binary CMC) ;; column already declared :binary@prove +;; (hub-stamp-constancy CMC) +;; (if-zero TX_EXEC (vanishes! CMC)) +;; (if-not-zero PEEK_AT_STACK +;; (eq! (exception_flag_sum) XAHOY)))) + + +;; we subsume parts of XAHOY and CMC under as follows: +;; (cmc_and_xahoy_weighted_sum) = CMC + 2 * XAHOY + +(defun (cmc_and_xahoy_weighted_sum) (+ CMC (* 2 XAHOY))) +(defun (cmc_sum) (+ XAHOY + stack/CALL_FLAG + stack/CREATE_FLAG + stack/HALT_FLAG)) + +(defconstraint generalities---setting-CMC-and-XAHOY---stamp-constancies () + ;; this settles hub-stamp-constancy for CMC and XAHOY simultaneously + (hub-stamp-constancy (cmc_and_xahoy_weighted_sum))) + +(defconstraint generalities---setting-CMC-and-XAHOY---automatic-vanishing () + ;; this forces the vanishing of CMC and XAHOY outside of execution rows + (if-zero TX_EXEC + (vanishes! (cmc_and_xahoy_weighted_sum)))) + +(defconstraint generalities---setting-CMC-and-XAHOY---nontrivial-values () + ;; nontrivial values for CMC and XAHOY + (if-not-zero PEEK_AT_STACK + (begin (eq! (exception_flag_sum) XAHOY) + (if-zero (cmc_sum) + (eq! CMC 0) + (eq! CMC 1))))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; 4.2.3 Context numbers ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstraint generalities---context-numbers---constancies () + (begin + (hub-stamp-constancy CN) + (hub-stamp-constancy CN_NEW))) + +(defconstraint generalities---context-numbers---TX_EXEC-phase---CN-vanishes-precisely-when-TX_EXEC-does () + (if-not-zero CN + (eq! TX_EXEC 1) + (eq! TX_EXEC 0) + )) + +(defconstraint generalities---context-numbers---TX_INIT-phase () + (if-not-zero TX_INIT + (eq! CN_NEW (+ 1 HUB_STAMP)))) + +(defconstraint generalities---context-numbers---TX_EXEC-phase---CN_NEW-value-options () + (if-not-zero TX_EXEC + (or! (eq! CN_NEW CN) + (eq! CN_NEW CALLER_CN) + (eq! CN_NEW (+ 1 HUB_STAMP))))) + +(defconstraint generalities---context-numbers---TX_EXEC-phase---linking-constraint-for-CN-and-CN_NEW () + (if-not-zero TX_EXEC + (if-not (remained-constant! HUB_STAMP) + (eq! CN (prev CN_NEW))))) + +(defconstraint generalities---context-numbers---TX_EXEC-phase---CN-may-only-change-if-CMC () + (if-not-zero TX_EXEC + (if-zero CMC (eq! CN_NEW CN)))) + +(defconstraint generalities---context-numbers---at-HUB_STAMP-transitions () + (if-not (will-remain-constant! HUB_STAMP) + (begin + (if-not-zero CMC (eq! PEEK_AT_CONTEXT 1)) + (if-not-zero XAHOY (execution-provides-empty-return-data 0)) + (if-not-zero TX_EXEC + (if-not-zero CN_NEW + (eq! (next TX_EXEC) 1) + (eq! (next TX_FINL) 1)))))) + +(defconstraint generalities---context-numbers---imposing-CN_NEW-is-CALLER_CN---for-exceptions () + (if-not-zero XAHOY (eq! CN_NEW CALLER_CN))) + +(defconstraint generalities---context-numbers---imposing-CN_NEW-is-CALLER_CN---for-halting-instructions () + (if-not-zero PEEK_AT_STACK + (if-not-zero stack/HALT_FLAG + (eq! CN_NEW CALLER_CN)))) diff --git a/hub/osaka/constraints/generalities/exceptions.lisp b/hub/osaka/constraints/generalities/exceptions.lisp new file mode 100644 index 000000000..eded64c1d --- /dev/null +++ b/hub/osaka/constraints/generalities/exceptions.lisp @@ -0,0 +1,88 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; 4.1 Exception flags and EXCEPTION_AHOY ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defun (exception_flag_sum) (+ stack/SUX + stack/SOX + stack/MXPX + stack/OOGX + stack/RDCX + stack/JUMPX + stack/STATICX + stack/SSTOREX + stack/ICPX + stack/MAXCSX + stack/OPCX + )) + +(defun (weighted_exception_flag_sum) (+ (* (^ 2 0) stack/SUX) + (* (^ 2 1) stack/SOX) + (* (^ 2 2) stack/MXPX) + (* (^ 2 3) stack/OOGX) + (* (^ 2 4) stack/RDCX) + (* (^ 2 5) stack/JUMPX) + (* (^ 2 6) stack/STATICX) + (* (^ 2 7) stack/SSTOREX) + (* (^ 2 8) stack/ICPX) + (* (^ 2 9) stack/MAXCSX) + (* (^ 2 10) stack/OPCX) + )) ;; "" + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; 4.1.1 Binarity and constancy conditions ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + + +(defconstraint generalities---exceptions---stack-exception-flags-are-exclusive (:perspective stack) + (is-binary (exception_flag_sum))) + + +(defconstraint generalities---exceptions---exception-flags-are-stack-constant (:perspective stack) + (stack-row-constancy (weighted_exception_flag_sum))) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; 4.1.2 Automatic vanishing constraints ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstraint generalities---exceptions---automatic-stack-exception-flag-vanishing (:perspective stack) + (begin + (eq! INVALID_FLAG OPCX) + (if-zero MXP_FLAG (vanishes! MXPX)) + (if-zero JUMP_FLAG (vanishes! JUMPX)) + (if-zero STATIC_FLAG (vanishes! STATICX)) + (if-not-zero (- INSTRUCTION EVM_INST_RETURNDATACOPY) (vanishes! RDCX)) + (if-not-zero (- INSTRUCTION EVM_INST_SSTORE) (vanishes! SSTOREX)) + (if-not-zero (- INSTRUCTION EVM_INST_RETURN) (vanishes! ICPX)) + (if-not-zero (* (- INSTRUCTION EVM_INST_RETURN) + (- 1 CREATE_FLAG)) + (vanishes! MAXCSX)) + ) + ) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; 4.1.3 The XAHOY flag ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;; we deal with those constraints in context.lisp along side CMC +;; (defconstraint generalities---exceptions---setting-the-EXCEPTIONS_AHOY-flag () +;; (begin +;; (is-binary XAHOY) ;; column already declared :binary@prove +;; (hub-stamp-constancy XAHOY) +;; (if-zero TX_EXEC (eq! XAHOY 0)) +;; (if-not-zero PEEK_AT_STACK (eq! XAHOY (exception_flag_sum))))) diff --git a/hub/osaka/constraints/generalities/first_row_of_new_context.lisp b/hub/osaka/constraints/generalities/first_row_of_new_context.lisp new file mode 100644 index 000000000..e119ee997 --- /dev/null +++ b/hub/osaka/constraints/generalities/first_row_of_new_context.lisp @@ -0,0 +1,19 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; 4.10 Setting initial parameters of new context firstRowOfNewContext ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defun (first-row-of-new-context kappa ;; row offset + next-caller-context-number ;; next caller context number + next-code-fragment-index ;; next CFI + next-initial-gas ) ;; available gas in new context + (begin + (eq! (shift CALLER_CONTEXT_NUMBER kappa) next-caller-context-number) + (eq! (shift CODE_FRAGMENT_INDEX kappa) next-code-fragment-index ) + (eq! (shift GAS_EXPECTED kappa) next-initial-gas ) + (debug (eq! (shift CONTEXT_NUMBER kappa) CONTEXT_NUMBER_NEW )) + (debug (eq! (shift CONTEXT_NUMBER kappa) (+ 1 HUB_STAMP) )))) diff --git a/hub/osaka/constraints/generalities/gas.lisp b/hub/osaka/constraints/generalities/gas.lisp new file mode 100644 index 000000000..6bb39f428 --- /dev/null +++ b/hub/osaka/constraints/generalities/gas.lisp @@ -0,0 +1,59 @@ +(module hub) + +;;;;;;;;;;;;;;;;; +;; ;; +;; 4.4 Gas ;; +;; ;; +;;;;;;;;;;;;;;;;; + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; 4.4.1 Gas column generalities ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defconstraint gas-columns---stamp-constancies () + (begin (hub-stamp-constancy GAS_EXPECTED) + (hub-stamp-constancy GAS_ACTUAL) + (hub-stamp-constancy GAS_COST) + (hub-stamp-constancy GAS_NEXT))) + + +;; TODO: should be debug --- rmk: careful analysis should prove that they are indeed redundant; kepping them for now for safety; +(defconstraint gas-columns---automatic-vanishing () + (if-zero TX_EXEC + (begin + (vanishes! GAS_EXPECTED) + (vanishes! GAS_ACTUAL) + (vanishes! GAS_COST) + (vanishes! GAS_NEXT)))) + +;; we drop the stack perspective preconditions +(defconstraint gas-columns---GAS_NEXT-vanishes-in-case-of-an-exception () + (if-not-zero XAHOY + (vanishes! GAS_NEXT))) + +(defconstraint gas-columns---setting-GAS_NEXT-outside-of-CALLs-and-CREATEs (:perspective stack) + (if-zero XAHOY + (if-zero (force-bin (+ stack/CREATE_FLAG stack/CALL_FLAG)) + (eq! GAS_NEXT (- GAS_ACTUAL GAS_COST))))) + +(defun (hub-stamp-transition-within-TX_EXEC) (or! (will-remain-constant! HUB_STAMP) + (eq! TX_EXEC 0) + (eq! (next TX_EXEC) 0))) + +(defconstraint gas-columns---hub-stamp-transition-constraints---no-context-change () + (if-not (hub-stamp-transition-within-TX_EXEC) + (if-eq CN_NEW CN + (eq! (next GAS_ACTUAL) (next GAS_EXPECTED))))) + +(defconstraint gas-columns---hub-stamp-transition-constraints---re-entering-parent-context () + (if-not (hub-stamp-transition-within-TX_EXEC) + (if-eq CN_NEW CALLER_CN + (eq! (next GAS_ACTUAL) (+ (next GAS_EXPECTED) GAS_NEXT))))) + +(defconstraint gas-columns---hub-stamp-transition-constraints---entering-child-context () + (if-not (hub-stamp-transition-within-TX_EXEC) + (if-eq CN_NEW (+ 1 HUB_STAMP) + (eq! (next GAS_ACTUAL) (next GAS_EXPECTED))))) +;; can't define GAS_EXPECTED at this level of generality diff --git a/hub/osaka/constraints/generalities/hub_stamp_tx_end.lisp b/hub/osaka/constraints/generalities/hub_stamp_tx_end.lisp new file mode 100644 index 000000000..4a949a2e4 --- /dev/null +++ b/hub/osaka/constraints/generalities/hub_stamp_tx_end.lisp @@ -0,0 +1,15 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; 4.8 Setting HUB_STAMP_TX_END ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defconstraint setting-HUB_STAMP_TX_END () + (begin + (transaction-constancy HUB_STAMP_TRANSACTION_END) + (if-not-zero TX_EXEC + (if-not-zero (next TX_FINL) + (eq! HUB_STAMP_TRANSACTION_END + (+ 1 HUB_STAMP)))))) diff --git a/hub/osaka/constraints/generalities/jump_destination_vetting.lisp b/hub/osaka/constraints/generalities/jump_destination_vetting.lisp new file mode 100644 index 000000000..793e691bc --- /dev/null +++ b/hub/osaka/constraints/generalities/jump_destination_vetting.lisp @@ -0,0 +1,17 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; 4.6 Setting JUMP_DESTINATION_VETTING ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defconstraint jump-destination-vetting + (:guard PEEK_AT_STACK) + ;;;;;;;;;;;;;;;;;;;;;; + (begin + (debug (is-binary stack/JUMP_DESTINATION_VETTING_REQUIRED)) + (if-zero (force-bin stack/JUMP_FLAG) + (vanishes! stack/JUMP_DESTINATION_VETTING_REQUIRED)) + (if-not-zero (+ stack/SUX stack/SOX stack/OOGX) + (vanishes! stack/JUMP_DESTINATION_VETTING_REQUIRED)))) diff --git a/hub/osaka/constraints/generalities/program_counter.lisp b/hub/osaka/constraints/generalities/program_counter.lisp new file mode 100644 index 000000000..f5d497b92 --- /dev/null +++ b/hub/osaka/constraints/generalities/program_counter.lisp @@ -0,0 +1,21 @@ +(module hub) + +(defconstraint generalities---program-counter---stamp-constancy () + (begin + (hub-stamp-constancy PC) + (hub-stamp-constancy PC_NEW))) + +(defconstraint generalities---program-counter---automatic-vanishing-outside-of-EXEC-phase () + (if-zero TX_EXEC + (begin + (vanishes! PC) + (vanishes! PC_NEW)))) + +(defconstraint generalities---program-counter---PC_NEW-vanishes-upon-stack-exception (:guard PEEK_AT_STACK) + (if-not-zero (force-bin (+ stack/SUX stack/SOX)) + (vanishes! PC_NEW))) + +(defconstraint generalities---program-counter---automatic-update (:guard PEEK_AT_STACK) + (if-zero (force-bin (+ stack/SUX stack/SOX)) + (if-zero (force-bin (+ stack/PUSHPOP_FLAG stack/JUMP_FLAG)) + (eq! PC_NEW (+ 1 PC))))) diff --git a/hub/osaka/constraints/generalities/refunds.lisp b/hub/osaka/constraints/generalities/refunds.lisp new file mode 100644 index 000000000..a9c061543 --- /dev/null +++ b/hub/osaka/constraints/generalities/refunds.lisp @@ -0,0 +1,56 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; 4.5 Refunds ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;; + +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; 4.5.1 Introduction ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; 4.5.2 Gas column generalities ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;; hubStamp constancies already enforced + +;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; 4.5.3 Constraints ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defconstraint generalities---gas---refund-column-constancies () + (begin + (hub-stamp-constancy REFUND_COUNTER) + (hub-stamp-constancy REFUND_COUNTER_NEW))) + +(defconstraint generalities---gas---refunds-vanish-outside-of-execution-rows () + (if-zero TX_EXEC + (begin + (vanishes! REFUND_COUNTER) + (vanishes! REFUND_COUNTER_NEW)))) + +(defconstraint generalities---gas---refunds-transition-constraints () + (if-not-zero TX_EXEC + (if-not (remained-constant! HUB_STAMP) + (eq! REFUND_COUNTER (prev REFUND_COUNTER_NEW))))) + +(defconstraint generalities---gas---discard-refunds-if-context-will-revert () + (if-not-zero CN_WILL_REV + (eq! REFUND_COUNTER_NEW REFUND_COUNTER))) + +(defun (bit-identifying-SSTORE) (* stack/STO_FLAG [stack/DEC_FLAG 2])) ;; "" + +(defconstraint generalities---gas---only-SSTORE-may-grant-refunds (:perspective stack) + (if-zero (force-bin (bit-identifying-SSTORE)) + (eq! REFUND_COUNTER_NEW REFUND_COUNTER))) + +;; the actual REFUND mechanics for SSTORE will be explained in the storage instruction family section diff --git a/hub/osaka/constraints/generalities/revert_data_specific.lisp b/hub/osaka/constraints/generalities/revert_data_specific.lisp new file mode 100644 index 000000000..ed13d5f76 --- /dev/null +++ b/hub/osaka/constraints/generalities/revert_data_specific.lisp @@ -0,0 +1,126 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; 4.3 Revert data specific constraints ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; 4.3.2 Generalities and setting CN_WILL_REV ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;; ;; should be redundant +;; (defconstraint binary-constraints-for-cn-revert-flags () +;; (begin +;; (debug (is-binary CN_WILL_REV)) +;; (is-binary CN_GETS_REV) +;; (is-binary CN_SELF_REV))) + +(defconstraint revert-flag-vanishing () + (if-zero TX_EXEC + (vanishes! (+ CN_GETS_REV CN_SELF_REV)))) + +(defconstraint computing-CN_WILL_REV-as-a-disjunction () + (eq! CN_WILL_REV + (- (+ CN_GETS_REV CN_SELF_REV) + (* CN_GETS_REV CN_SELF_REV)))) + +(defconstraint rev-stamp-vanishes-if-the-context-doenst-get-reverted () + (if-zero CN_WILL_REV + (vanishes! CN_REV_STAMP))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; 4.3.3 Setting CN_SELF_REV ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (self_revert_trigger) (- (+ XAHOY (* stack/HALT_FLAG [stack/DEC_FLAG 2])) + (* XAHOY stack/HALT_FLAG [stack/DEC_FLAG 2]))) ;; "" + +(defconstraint recording-self-induced-revert (:perspective stack) + (if-not-zero (force-bin (self_revert_trigger)) + (begin + (eq! CN_SELF_REV 1) + (eq! CN_REV_STAMP HUB_STAMP)))) + +(defconstraint recording-unexceptional-halting-instruction (:perspective stack) + (if-not-zero HALT_FLAG + (if-zero (force-bin (self_revert_trigger)) + (vanishes! CN_SELF_REV)))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; 4.3.4 Setting CN_GETS_REV ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstraint root-context-does-not-get-reverted () + (if-not-zero (prev TX_INIT) + (if-not-zero TX_EXEC + (vanishes! CN_GETS_REV)))) + +(defconstraint child-context-inherits-parent-rollback () + (if-not (remained-constant! HUB_STAMP) + (if-not-zero (prev TX_EXEC) + (if-not-zero TX_EXEC + (if-eq (prev CONTEXT_NUMBER_NEW) HUB_STAMP + (begin + (eq! CN_GETS_REV (prev CN_WILL_REV)) + (if-zero CN_SELF_REV (remained-constant! CN_REV_STAMP)))))))) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; 4.3.5 Special purpose constants ;; +;; 4.3.6 Special DOM / SUB constraints ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defun (zero-dom-sub-stamps relOffset) + (begin + (vanishes! (shift DOM_STAMP relOffset)) + (vanishes! (shift SUB_STAMP relOffset)))) + +(defun (DOM-SUB-stamps---standard relOffset d) + (begin + (eq! (shift DOM_STAMP relOffset) (+ (* MULTIPLIER___DOM_SUB_STAMPS HUB_STAMP) d)) + (vanishes! (shift SUB_STAMP relOffset) ))) + +(defun (undoing-dom-sub-stamps relOffset rho epsilon s) (begin + (eq! (shift DOM_STAMP relOffset) (+ (* MULTIPLIER___DOM_SUB_STAMPS rho ) epsilon)) + (eq! (shift SUB_STAMP relOffset) (+ (* MULTIPLIER___DOM_SUB_STAMPS HUB_STAMP) s )))) + +(defun (DOM-SUB-stamps---revert-with-current relOffset + sub_offset) + (undoing-dom-sub-stamps relOffset + CN_REV_STAMP + DOM_SUB_STAMP_OFFSET___REVERT + sub_offset)) + +(defun (DOM-SUB-stamps---revert-with-child relOffset + sub_stamp_offset + child_rev_stamp) + (undoing-dom-sub-stamps relOffset + child_rev_stamp + DOM_SUB_STAMP_OFFSET___REVERT + sub_stamp_offset + )) + +;; (defun (DOM-SUB-stamps---finalization rel_offset +;; sub_offset) +;; (undoing-dom-sub-stamps rel_offset +;; TX_END_STAMP +;; DOM_SUB_STAMP_OFFSET___FINALIZATION +;; sub_offset)) + +(defun (selfdestruct-dom-sub-stamps relOffset) (undoing-dom-sub-stamps + relOffset + TX_END_STAMP + DOM_SUB_STAMP_OFFSET___SELFDESTRUCT + 0)) diff --git a/hub/osaka/constraints/generalities/stack_height.lisp b/hub/osaka/constraints/generalities/stack_height.lisp new file mode 100644 index 000000000..1e66ea3a1 --- /dev/null +++ b/hub/osaka/constraints/generalities/stack_height.lisp @@ -0,0 +1,28 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; 4.X Stack height columns HEIGHT and HEIGHT_NEW ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (stack-exceptions) (force-bin (+ stack/SUX stack/SOX))) + +(defconstraint generalities---stack-height---hub-stamp-constancies () + (begin + (hub-stamp-constancy HEIGHT) + (hub-stamp-constancy HEIGHT_NEW))) + +;; ;; This is debug! +;; (defconstraint generalities---stack-height---automatic-vanishing () +;; (if-zero TX_EXEC +;; (begin +;; (vanishes! HEIGHT) +;; (vanishes! HEIGHT_NEW)))) + +(defconstraint generalities---stack-height---update (:perspective stack) + (if-not-zero (stack-exceptions) + ;; stack exception ≡ true + (vanishes! HEIGHT_NEW) + ;; stack exception ≡ false + (eq! HEIGHT_NEW (+ (- HEIGHT stack/DELTA) stack/ALPHA)))) diff --git a/hub/osaka/constraints/instruction-handling/acc.lisp b/hub/osaka/constraints/instruction-handling/acc.lisp new file mode 100644 index 000000000..7d10763f8 --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/acc.lisp @@ -0,0 +1,268 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.5 Instruction handling ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.5 Instructions raising the ACC_FLAG ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.5.1 Supported instructions and flags ;; +;; X.5.2 Shorthands ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +;; ROFF ≡ ROW_OFFSET +;; ACC ≡ ACCOUNT_FAMILY +(defconst + ROFF_ACC___CONTEXT_ROW 1 + ROFF_ACC___ACCOUNT_READING_ROW 2 + + ROFF_ACC___ACCOUNT_DOING_ROW 1 + ROFF_ACC___ACCOUNT_UNDOING_ROW 2 + ) + + +(defun (account-instruction---raw-address-hi) [ stack/STACK_ITEM_VALUE_HI 1 ]) +(defun (account-instruction---raw-address-lo) [ stack/STACK_ITEM_VALUE_LO 1 ]) + +(defun (account-instruction---result-hi) [ stack/STACK_ITEM_VALUE_HI 4 ]) +(defun (account-instruction---result-lo) [ stack/STACK_ITEM_VALUE_LO 4 ]) + +(defun (account-instruction---is-BALANCE) [ stack/DEC_FLAG 1 ] ) +(defun (account-instruction---is-EXTCODESIZE) [ stack/DEC_FLAG 2 ] ) +(defun (account-instruction---is-EXTCODEHASH) [ stack/DEC_FLAG 3 ] ) +(defun (account-instruction---is-CODESIZE) [ stack/DEC_FLAG 4 ] ) ;; "" +(defun (account-instruction---is-SELFBALANCE) (- 1 + (account-instruction---is-BALANCE) + (account-instruction---is-EXTCODESIZE) + (account-instruction---is-EXTCODEHASH) + (account-instruction---is-CODESIZE))) + +(defun (account-instruction---touches-foreign-account) (+ (account-instruction---is-BALANCE) + (account-instruction---is-EXTCODESIZE) + (account-instruction---is-EXTCODEHASH))) + +(defun (account-instruction---touches-current-account) (+ (account-instruction---is-CODESIZE) + (account-instruction---is-SELFBALANCE))) + +(defun (account-instruction---account-address-hi) (shift context/ACCOUNT_ADDRESS_HI ROFF_ACC___CONTEXT_ROW)) +(defun (account-instruction---account-address-lo) (shift context/ACCOUNT_ADDRESS_LO ROFF_ACC___CONTEXT_ROW)) +(defun (account-instruction---byte-code-address-hi) (shift context/BYTE_CODE_ADDRESS_HI ROFF_ACC___CONTEXT_ROW)) +(defun (account-instruction---byte-code-address-lo) (shift context/BYTE_CODE_ADDRESS_LO ROFF_ACC___CONTEXT_ROW)) +(defun (account-instruction---foreign-address-warmth) (shift account/WARMTH ROFF_ACC___ACCOUNT_DOING_ROW)) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.5.3 Constraints ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defun (account-instruction---standard-hypothesis) (* PEEK_AT_STACK + stack/ACC_FLAG + (- 1 stack/SUX stack/SOX))) + +(defun (account-instruction---unexceptional) (* (account-instruction---standard-hypothesis) + (- 1 XAHOY))) + +(defconstraint account-instruction---setting-the-stack-pattern + (:guard (account-instruction---standard-hypothesis)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (begin + (if-not-zero (account-instruction---touches-foreign-account) (stack-pattern-1-1)) + (if-not-zero (account-instruction---touches-current-account) (stack-pattern-0-1)))) + +(defconstraint account-instruction---setting-allowable-exceptions + (:guard (account-instruction---standard-hypothesis)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (begin + (eq! XAHOY stack/OOGX) + (debug (eq! XAHOY CMC)))) + +(defconstraint account-instruction---foreign-address-opcode---setting-NSR + (:guard (account-instruction---standard-hypothesis)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-not-zero (account-instruction---touches-foreign-account) + (eq! NSR + (+ 1 (* CONTEXT_WILL_REVERT (+ 1 CMC)))))) + +(defconstraint account-instruction---current-address-opcode---setting-NSR + (:guard (account-instruction---standard-hypothesis)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-not-zero (account-instruction---touches-current-account) + (eq! NSR + (- 2 CMC)))) + +(defconstraint account-instruction---foreign-address-opcode---setting-peeking-flags + (:guard (account-instruction---standard-hypothesis)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-not-zero (account-instruction---touches-foreign-account) + (if-zero CONTEXT_WILL_REVERT + (eq! NSR + (shift PEEK_AT_ACCOUNT ROFF_ACC___ACCOUNT_DOING_ROW)) + (eq! NSR + (+ (shift PEEK_AT_ACCOUNT ROFF_ACC___ACCOUNT_DOING_ROW) + (shift PEEK_AT_ACCOUNT ROFF_ACC___ACCOUNT_UNDOING_ROW) + (* CMC (shift PEEK_AT_CONTEXT 3))))))) + +(defconstraint account-instruction---current-address-opcode---setting-peeking-flags + (:guard (account-instruction---standard-hypothesis)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-not-zero (account-instruction---touches-current-account) + (if-zero XAHOY + (eq! NSR + (+ (shift PEEK_AT_CONTEXT ROFF_ACC___CONTEXT_ROW) + (shift PEEK_AT_ACCOUNT ROFF_ACC___ACCOUNT_READING_ROW))) + (eq! NSR + (shift PEEK_AT_CONTEXT ROFF_ACC___CONTEXT_ROW))))) + +(defconstraint account-instruction---setting-gas-cost + (:guard (account-instruction---standard-hypothesis)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (begin + (if-not-zero (account-instruction---touches-foreign-account) + (eq! GAS_COST + (+ (* (account-instruction---foreign-address-warmth) GAS_CONST_G_WARM_ACCESS) + (* (- 1 (account-instruction---foreign-address-warmth)) GAS_CONST_G_COLD_ACCOUNT_ACCESS)))) + (if-not-zero (account-instruction---touches-current-account) + (eq! GAS_COST + stack/STATIC_GAS)))) + +(defconstraint account-instruction---foreign-address-opcode---doing-account-row + (:guard (account-instruction---standard-hypothesis)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (begin + (if-not-zero (account-instruction---touches-foreign-account) + (begin + (eq! (shift account/ROMLEX_FLAG ROFF_ACC___ACCOUNT_DOING_ROW) 0) + (account-trim-address ROFF_ACC___ACCOUNT_DOING_ROW ;; row offset + (account-instruction---raw-address-hi) ;; high part of raw, potentially untrimmed address + (account-instruction---raw-address-lo)) ;; low part of raw, potentially untrimmed address + (account-same-balance ROFF_ACC___ACCOUNT_DOING_ROW) + (account-same-nonce ROFF_ACC___ACCOUNT_DOING_ROW) + (account-same-code ROFF_ACC___ACCOUNT_DOING_ROW) + (account-same-deployment-number-and-status ROFF_ACC___ACCOUNT_DOING_ROW) + ;; (account-turn-on-warmth ROFF_ACC___ACCOUNT_DOING_ROW) + (account-same-marked-for-deletion ROFF_ACC___ACCOUNT_DOING_ROW) + (DOM-SUB-stamps---standard ROFF_ACC___ACCOUNT_DOING_ROW 0))))) + +(defconstraint account-instruction---foreign-address-opcode---doing-account-row---warmth-update + (:guard (account-instruction---standard-hypothesis)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-not-zero (account-instruction---touches-foreign-account) + (if-not-zero XAHOY + (account-same-warmth ROFF_ACC___ACCOUNT_DOING_ROW) ;; XAHOY ≡ 1 + (account-turn-on-warmth ROFF_ACC___ACCOUNT_DOING_ROW) ;; XAHOY ≡ 0 + ))) + + +(defconstraint account-instruction---foreign-address-opcode---undoing-account-row + (:guard (account-instruction---standard-hypothesis)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (begin + (if-not-zero (account-instruction---touches-foreign-account) + (if-not-zero CONTEXT_WILL_REVERT + (begin + (eq! (shift account/ROMLEX_FLAG ROFF_ACC___ACCOUNT_UNDOING_ROW) 0) + (account-same-address-as ROFF_ACC___ACCOUNT_UNDOING_ROW ROFF_ACC___ACCOUNT_DOING_ROW) + (account-undo-balance-update ROFF_ACC___ACCOUNT_UNDOING_ROW ROFF_ACC___ACCOUNT_DOING_ROW) + (account-undo-nonce-update ROFF_ACC___ACCOUNT_UNDOING_ROW ROFF_ACC___ACCOUNT_DOING_ROW) + (account-undo-code-update ROFF_ACC___ACCOUNT_UNDOING_ROW ROFF_ACC___ACCOUNT_DOING_ROW) + (account-undo-deployment-status-update ROFF_ACC___ACCOUNT_UNDOING_ROW ROFF_ACC___ACCOUNT_DOING_ROW) + (account-undo-warmth-update ROFF_ACC___ACCOUNT_UNDOING_ROW ROFF_ACC___ACCOUNT_DOING_ROW) + (account-same-marked-for-deletion ROFF_ACC___ACCOUNT_UNDOING_ROW) + (DOM-SUB-stamps---revert-with-current ROFF_ACC___ACCOUNT_UNDOING_ROW 1)))))) + +(defconstraint account-instruction---current-address-opcode---unexceptional-case---setting-context-row + (:guard (account-instruction---standard-hypothesis)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-not-zero (account-instruction---touches-current-account) + (if-zero XAHOY + (read-context-data ROFF_ACC___CONTEXT_ROW CONTEXT_NUMBER)))) + +(defconstraint account-instruction---current-address-opcode---unexceptional-case---setting-account-row + (:guard (account-instruction---standard-hypothesis)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (begin + (if-not-zero (account-instruction---touches-current-account) + (if-zero XAHOY + (begin + (eq! (shift account/ROMLEX_FLAG ROFF_ACC___ACCOUNT_READING_ROW) 0) + (account-same-balance ROFF_ACC___ACCOUNT_READING_ROW) + (account-same-nonce ROFF_ACC___ACCOUNT_READING_ROW) + (account-same-code ROFF_ACC___ACCOUNT_READING_ROW) + (account-same-deployment-number-and-status ROFF_ACC___ACCOUNT_READING_ROW) + (account-turn-on-warmth ROFF_ACC___ACCOUNT_READING_ROW) + (account-same-marked-for-deletion ROFF_ACC___ACCOUNT_READING_ROW) + (DOM-SUB-stamps---standard ROFF_ACC___ACCOUNT_READING_ROW 0) + (if-not-zero (account-instruction---is-CODESIZE) + (begin + (eq! (shift account/ADDRESS_HI ROFF_ACC___ACCOUNT_READING_ROW) (account-instruction---byte-code-address-hi)) + (eq! (shift account/ADDRESS_LO ROFF_ACC___ACCOUNT_READING_ROW) (account-instruction---byte-code-address-lo)))) + (if-not-zero (account-instruction---is-SELFBALANCE) + (begin + (eq! (shift account/ADDRESS_HI ROFF_ACC___ACCOUNT_READING_ROW) (account-instruction---account-address-hi)) + (eq! (shift account/ADDRESS_LO ROFF_ACC___ACCOUNT_READING_ROW) (account-instruction---account-address-lo))) + )))))) + + +(defun (account-instruction---foreign-balance) (shift account/BALANCE ROFF_ACC___ACCOUNT_DOING_ROW )) +(defun (account-instruction---foreign-code-size) (shift (* account/CODE_SIZE account/HAS_CODE) ROFF_ACC___ACCOUNT_DOING_ROW )) +(defun (account-instruction---foreign-code-hash-hi) (shift (* account/CODE_HASH_HI account/EXISTS) ROFF_ACC___ACCOUNT_DOING_ROW )) +(defun (account-instruction---foreign-code-hash-lo) (shift (* account/CODE_HASH_LO account/EXISTS) ROFF_ACC___ACCOUNT_DOING_ROW )) +(defun (account-instruction---current-code-size) (shift account/CODE_SIZE ROFF_ACC___ACCOUNT_READING_ROW)) +(defun (account-instruction---current-balance) (shift account/BALANCE ROFF_ACC___ACCOUNT_READING_ROW)) + + +(defconstraint account-instruction---value-constraints---the-BALANCE-case + (:guard (account-instruction---unexceptional)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-not-zero (account-instruction---is-BALANCE) + (begin + (eq! (account-instruction---result-hi) 0) + (eq! (account-instruction---result-lo) (account-instruction---foreign-balance))))) + +(defconstraint account-instruction---value-constraints---the-EXTCODESIZE-case + (:guard (account-instruction---unexceptional)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-not-zero (account-instruction---is-EXTCODESIZE) + (begin + (eq! (account-instruction---result-hi) 0) + (eq! (account-instruction---result-lo) (account-instruction---foreign-code-size))))) + +(defconstraint account-instruction---value-constraints---the-EXTCODEHASH-case + (:guard (account-instruction---unexceptional)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-not-zero (account-instruction---is-EXTCODEHASH) + (begin + (eq! (account-instruction---result-hi) (account-instruction---foreign-code-hash-hi)) + (eq! (account-instruction---result-lo) (account-instruction---foreign-code-hash-lo))))) + +(defconstraint account-instruction---value-constraints---the-CODESIZE-case + (:guard (account-instruction---unexceptional)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-not-zero (account-instruction---is-CODESIZE) + (begin + (eq! (account-instruction---result-hi) 0) + (eq! (account-instruction---result-lo) (account-instruction---current-code-size))))) + +(defconstraint account-instruction---value-constraints---the-SELFBALANCE-case + (:guard (account-instruction---unexceptional)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-not-zero (account-instruction---is-SELFBALANCE) + (begin + (eq! (account-instruction---result-hi) 0) + (eq! (account-instruction---result-lo) (account-instruction---current-balance))))) diff --git a/hub/osaka/constraints/instruction-handling/add_bin_ext_mod_mul_shf_wcp.lisp b/hub/osaka/constraints/instruction-handling/add_bin_ext_mod_mul_shf_wcp.lisp new file mode 100644 index 000000000..da26b0393 --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/add_bin_ext_mod_mul_shf_wcp.lisp @@ -0,0 +1,118 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.5 Instruction handling ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.5.1 Introduction ;; +;; X.5.2 Instructions raising the ADD_FLAG ;; +;; X.5.3 Instructions raising the BIN_FLAG ;; +;; X.5.4 Instructions raising the EXT_FLAG ;; +;; X.5.5 Instructions raising the MOD_FLAG ;; +;; X.5.6 Instructions raising the MUL_FLAG ;; +;; X.5.7 Instructions raising the SHF_FLAG ;; +;; X.5.8 Instructions raising the WCP_FLAG ;; +;; X.5.9 Constraints for the preceding insruction families ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;; Shorthands ;; +;;;;;;;;;;;;;;;;;; + + +(defun (stateless-instructions---classifier) (+ stack/ADD_FLAG + stack/BIN_FLAG + stack/EXT_FLAG + stack/MOD_FLAG + stack/MUL_FLAG + stack/SHF_FLAG + stack/WCP_FLAG )) +(defun (stateless-instruction---is-EXP) (* stack/MUL_FLAG + [ stack/DEC_FLAG 2 ])) +(defun (stateless-instruction---isnt-EXP) (+ stack/ADD_FLAG + stack/BIN_FLAG + stack/EXT_FLAG + stack/MOD_FLAG + stack/SHF_FLAG + stack/WCP_FLAG + (* stack/MUL_FLAG [ stack/DEC_FLAG 1 ]))) +(defun (stateless-instruction---1-argument-instruction) (* (+ stack/BIN_FLAG stack/WCP_FLAG) + [ stack/DEC_FLAG 1 ])) +(defun (stateless-instruction---2-argument-instruction) (+ stack/ADD_FLAG + (* stack/BIN_FLAG (- 1 [ stack/DEC_FLAG 1 ])) + stack/MOD_FLAG + stack/MUL_FLAG + stack/SHF_FLAG + (* stack/WCP_FLAG (- 1 [ stack/DEC_FLAG 1 ])))) +(defun (stateless-instruction---3-argument-instruction) stack/EXT_FLAG) + +;; Constraints ;; +;;;;;;;;;;;;;;;;;;; + +(defun (stateless-instruction---precondition) (* PEEK_AT_STACK (- 1 stack/SUX stack/SOX))) + +;; ;; stupid sanity checks +;; (defconstraint add-bin-ext-mod-mul-shf-wcp-safeguard (:guard PEEK_AT_STACK) +;; (begin +;; (eq! (stateless-instructions---classifier) +;; (+ (stateless-instruction---is-EXP) +;; (stateless-instruction---isnt-EXP))) +;; (eq! (stateless-instructions---classifier) +;; (+ (stateless-instruction---1-argument-instruction) +;; (stateless-instruction---2-argument-instruction) +;; (stateless-instruction---3-argument-instruction))))) + +(defconstraint stateless-instruction---stack-pattern (:guard (stateless-instruction---precondition)) + (begin + (if-not-zero (stateless-instruction---1-argument-instruction) (stack-pattern-1-1)) + (if-not-zero (stateless-instruction---2-argument-instruction) (stack-pattern-2-1)) + (if-not-zero (stateless-instruction---3-argument-instruction) (stack-pattern-3-1)))) + +(defconstraint wcp-result-is-binary (:guard (stateless-instruction---precondition)) + (if-not-zero stack/WCP_FLAG + (begin + (vanishes! [ stack/STACK_ITEM_VALUE_HI 4 ]) + (debug (is-binary [ stack/STACK_ITEM_VALUE_LO 4 ]))))) + +(defconstraint stateless-instruction---setting-nsr (:guard (stateless-instruction---precondition)) + (if-not-zero (stateless-instructions---classifier) + (eq! NON_STACK_ROWS + (+ (stateless-instruction---is-EXP) CONTEXT_MAY_CHANGE)))) + +(defconstraint stateless-instruction---setting-peeking-flags (:guard (stateless-instruction---precondition)) + (begin + (if-not-zero (stateless-instruction---isnt-EXP) + (eq! NON_STACK_ROWS + (* CMC (next PEEK_AT_CONTEXT)))) + (if-not-zero (stateless-instruction---is-EXP) + (eq! NON_STACK_ROWS + (+ (next PEEK_AT_MISCELLANEOUS) + (* CMC (shift PEEK_AT_CONTEXT 2))))))) + +(defconstraint stateless-instruction---setting-miscellaneous-flags (:guard (stateless-instruction---precondition)) + (if-not-zero (stateless-instruction---is-EXP) + (eq! (weighted-MISC-flag-sum 1) + MISC_WEIGHT_EXP))) + +(defconstraint stateless-instruction---setting-EXP-arguments (:guard (stateless-instruction---precondition)) + (if-not-zero (stateless-instruction---is-EXP) + (set-EXP-instruction-exp-log + 1 ;; row offset + [ stack/STACK_ITEM_VALUE_HI 2 ] ;; exponent high + [ stack/STACK_ITEM_VALUE_LO 2 ] ;; exponent low + ))) + +(defconstraint stateless-instruction---gas-cost (:guard (stateless-instruction---precondition)) + (begin + (if-not-zero (stateless-instruction---isnt-EXP) + (eq! GAS_COST stack/STATIC_GAS)) + (if-not-zero (stateless-instruction---is-EXP) + (eq! GAS_COST + (+ stack/STATIC_GAS + (next [ misc/EXP_DATA 5 ])))))) diff --git a/hub/osaka/constraints/instruction-handling/btc.lisp b/hub/osaka/constraints/instruction-handling/btc.lisp new file mode 100644 index 000000000..b87ec3944 --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/btc.lisp @@ -0,0 +1,50 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.16 Instruction handling ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.16 Instructions raising the BTC_FLAG ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.16.1 Supported instructions and flags ;; +;; X.16.2 Constraints ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (block-data-standard-hypothesis) (* PEEK_AT_STACK + stack/BTC_FLAG + (- 1 stack/SUX stack/SOX))) + +;; ;; should be redundant +;; (defconstraint block-data-instruction-setting-acceptable-exceptions (:guard (block-data-standard-hypothesis)) +;; (eq! XAHOY +;; stack/OOGX)) + +(defconstraint block-data-instruction-setting-the-stack-pattern (:guard (block-data-standard-hypothesis)) + (begin + (if-eq [stack/DEC_FLAG 1] 1 (stack-pattern-1-1)) + (if-eq [stack/DEC_FLAG 2] 1 (stack-pattern-0-1)))) + +(defconstraint block-data-instruction-setting-NSR (:guard (block-data-standard-hypothesis)) + (eq! NON_STACK_ROWS + CMC)) + +;; ;; should be redundant +;; (defconstraint block-data-instruction-setting-the-peeking-flags (:guard (block-data-standard-hypothesis)) +;; (if-not-zero CMC +;; (eq! (next PEEK_AT_CONTEXT) +;; 1))) + +(defconstraint block-data-instruction-setting-the-gas-cost (:guard (block-data-standard-hypothesis)) + (eq! GAS_COST + stack/STATIC_GAS)) diff --git a/hub/osaka/constraints/instruction-handling/call/constants.lisp b/hub/osaka/constraints/instruction-handling/call/constants.lisp new file mode 100644 index 000000000..34b061073 --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/call/constants.lisp @@ -0,0 +1,55 @@ +(module hub) + +(defconst + + ;; CALL specific row offset constants + CALL_1st_stack_row___row_offset -2 + CALL_2nd_stack_row___row_offset -1 + CALL_1st_scenario_row___row_offset 0 + CALL_1st_context_row___row_offset 1 + CALL_misc_row___row_offset 2 + CALL_1st_caller_account_row___row_offset 3 + CALL_1st_callee_account_row___row_offset 4 + CALL_2nd_callee_account_row___abort_will_revert___row_offset 5 + CALL_2nd_caller_account_row___row_offset 5 + CALL_2nd_callee_account_row___row_offset 6 + CALL_3rd_callee_account_row___row_offset 7 + ;; + CALL_staticx_update_parent_context_row___row_offset 3 + CALL_mxpx_update_parent_context_row___row_offset 3 + CALL_oogx_update_parent_context_row___row_offset 5 + CALL_ABORT_WILL_REVERT---current-context-update---row-offset 6 + CALL_ABORT_WONT_REVERT---current-context-update---row-offset 5 + CALL_EOA_will_revert_caller_context_row___row_offset 7 + CALL_EOA_wont_revert_caller_context_row___row_offset 5 + CALL_SMC_failure_will_revert_initialize_callee_context_row___row_offset 8 + CALL_SMC_failure_wont_revert_initialize_callee_context_row___row_offset 7 + CALL_SMC_success_will_revert_initialize_callee_context_row___row_offset 7 + CALL_SMC_success_wont_revert_initialize_callee_context_row___row_offset 5 + ;; + CALL_2nd_scenario_row_PRC_failure___row_offset 5 + CALL_2nd_scenario_row_PRC_success_will_revert_2nd_scenario___row_offset 7 + CALL_2nd_scenario_row_PRC_success_wont_revert_2nd_scenario___row_offset 5 + + ;; NSR's for exceptional calls + CALL_nsr___staticx 3 + CALL_nsr___mxpx 3 + CALL_nsr___oogx 5 + + ;; NSR's for unexceptional, aborted calls + CALL_nsr___abort_will_revert 6 + CALL_nsr___abort_wont_revert 5 + + ;; NSR's for entry (no precompiles) + CALL_nsr___eoa_success_will_revert 7 + CALL_nsr___eoa_success_wont_revert 5 + CALL_nsr___smc_failure_will_revert 8 + CALL_nsr___smc_failure_wont_revert 7 + CALL_nsr___smc_success_will_revert 7 + CALL_nsr___smc_success_wont_revert 5 + + ;; partial NSR's for entry into precompiles + CALL___first_half_nsr___prc_failure 5 + CALL___first_half_nsr___prc_success_will_revert 7 + CALL___first_half_nsr___prc_success_wont_revert 5 + ) diff --git a/hub/osaka/constraints/instruction-handling/call/finishing_touches/EOA.lisp b/hub/osaka/constraints/instruction-handling/call/finishing_touches/EOA.lisp new file mode 100644 index 000000000..bf0fc25e2 --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/call/finishing_touches/EOA.lisp @@ -0,0 +1,25 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.Y CALL ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.Z.4 Final context row for CALL's to externally owned accounts ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstraint call-instruction---final-context-row-for-unexceptional-unaborted-EOA-CALLs (:guard PEEK_AT_SCENARIO) + (begin + (if-not-zero scenario/CALL_EOA_SUCCESS_CALLER_WILL_REVERT + (nonexecution-provides-empty-return-data CALL_EOA_will_revert_caller_context_row___row_offset)) + (if-not-zero scenario/CALL_EOA_SUCCESS_CALLER_WONT_REVERT + (nonexecution-provides-empty-return-data CALL_EOA_wont_revert_caller_context_row___row_offset)) + )) diff --git a/hub/osaka/constraints/instruction-handling/call/finishing_touches/SMC.lisp b/hub/osaka/constraints/instruction-handling/call/finishing_touches/SMC.lisp new file mode 100644 index 000000000..8d6d3bb93 --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/call/finishing_touches/SMC.lisp @@ -0,0 +1,45 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.Y CALL ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.Z.5 Final context row for CALL's to smart contracts ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstraint call-instruction---unexceptional---unaborted---SMC-call---setting-final-context-row---failure-will-revert (:guard PEEK_AT_SCENARIO) + (if-not-zero scenario/CALL_SMC_FAILURE_CALLER_WILL_REVERT + (begin + (justify-callee-revert-data CALL_SMC_failure_will_revert_initialize_callee_context_row___row_offset) + (initialize-callee-context CALL_SMC_failure_will_revert_initialize_callee_context_row___row_offset) + (first-row-of-callee-context CALL_SMC_failure_will_revert_initialize_callee_context_row___row_offset)))) + +(defconstraint call-instruction---unexceptional---unaborted---SMC-call---setting-final-context-row---failure-wont-revert (:guard PEEK_AT_SCENARIO) + (if-not-zero scenario/CALL_SMC_FAILURE_CALLER_WONT_REVERT + (begin + (justify-callee-revert-data CALL_SMC_failure_wont_revert_initialize_callee_context_row___row_offset) + (initialize-callee-context CALL_SMC_failure_wont_revert_initialize_callee_context_row___row_offset) + (first-row-of-callee-context CALL_SMC_failure_wont_revert_initialize_callee_context_row___row_offset)))) + +(defconstraint call-instruction---unexceptional---unaborted---SMC-call---setting-final-context-row---success-will-revert (:guard PEEK_AT_SCENARIO) + (if-not-zero scenario/CALL_SMC_SUCCESS_CALLER_WILL_REVERT + (begin + (justify-callee-revert-data CALL_SMC_success_will_revert_initialize_callee_context_row___row_offset) + (initialize-callee-context CALL_SMC_success_will_revert_initialize_callee_context_row___row_offset) + (first-row-of-callee-context CALL_SMC_success_will_revert_initialize_callee_context_row___row_offset)))) + +(defconstraint call-instruction---unexceptional---unaborted---SMC-call---setting-final-context-row---success-wont-revert (:guard PEEK_AT_SCENARIO) + (if-not-zero scenario/CALL_SMC_SUCCESS_CALLER_WONT_REVERT + (begin + (justify-callee-revert-data CALL_SMC_success_wont_revert_initialize_callee_context_row___row_offset) + (initialize-callee-context CALL_SMC_success_wont_revert_initialize_callee_context_row___row_offset) + (first-row-of-callee-context CALL_SMC_success_wont_revert_initialize_callee_context_row___row_offset)))) diff --git a/hub/osaka/constraints/instruction-handling/call/finishing_touches/abort.lisp b/hub/osaka/constraints/instruction-handling/call/finishing_touches/abort.lisp new file mode 100644 index 000000000..385062b81 --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/call/finishing_touches/abort.lisp @@ -0,0 +1,40 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.Y CALL ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.Z.3 Final context row for (unexceptional) aborted CALL's ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstraint call-instruction---unexceptional---aborted---WILL-revert---undoing-callee-warmth-update (:guard (* PEEK_AT_SCENARIO scenario/CALL_ABORT_WILL_REVERT)) + (begin + (account-same-address-as CALL_2nd_callee_account_row___abort_will_revert___row_offset CALL_1st_callee_account_row___row_offset) ;; we could use 1st instead of 2nd, too. + (account-same-balance CALL_2nd_callee_account_row___abort_will_revert___row_offset) + (account-same-nonce CALL_2nd_callee_account_row___abort_will_revert___row_offset) + (account-same-code CALL_2nd_callee_account_row___abort_will_revert___row_offset) + (account-undo-warmth-update CALL_2nd_callee_account_row___abort_will_revert___row_offset CALL_1st_callee_account_row___row_offset) + (account-same-deployment-number-and-status CALL_2nd_callee_account_row___abort_will_revert___row_offset) + (account-same-marked-for-deletion CALL_2nd_callee_account_row___abort_will_revert___row_offset) + (vanishes! (shift account/ROMLEX_FLAG CALL_2nd_callee_account_row___abort_will_revert___row_offset)) + (vanishes! (shift account/TRM_FLAG CALL_2nd_callee_account_row___abort_will_revert___row_offset)) + (vanishes! (shift account/RLPADDR_FLAG CALL_2nd_callee_account_row___abort_will_revert___row_offset)) + (DOM-SUB-stamps---revert-with-current CALL_2nd_callee_account_row___abort_will_revert___row_offset + 2) + )) + +(defconstraint call-instruction---unexceptional---aborted---WILL-revert---final-context-row (:guard (* PEEK_AT_SCENARIO scenario/CALL_ABORT_WILL_REVERT)) + (nonexecution-provides-empty-return-data CALL_ABORT_WILL_REVERT---current-context-update---row-offset)) + + +(defconstraint call-instruction---unexceptional---aborted---WONT-revert---final-context-row (:guard (* PEEK_AT_SCENARIO scenario/CALL_ABORT_WONT_REVERT)) + (nonexecution-provides-empty-return-data CALL_ABORT_WONT_REVERT---current-context-update---row-offset)) diff --git a/hub/osaka/constraints/instruction-handling/call/finishing_touches/exception.lisp b/hub/osaka/constraints/instruction-handling/call/finishing_touches/exception.lisp new file mode 100644 index 000000000..bf45411ab --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/call/finishing_touches/exception.lisp @@ -0,0 +1,26 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.Y CALL ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.Z.2 Final context row for exceptional CALL's ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defconstraint call-instruction---final-context-row-for-exceptional-CALLs (:guard (* PEEK_AT_SCENARIO scenario/CALL_EXCEPTION)) + (begin + (if-not-zero (call-instruction---STACK-staticx) + (execution-provides-empty-return-data CALL_staticx_update_parent_context_row___row_offset)) + (if-not-zero (call-instruction---STACK-mxpx) + (execution-provides-empty-return-data CALL_mxpx_update_parent_context_row___row_offset)) + (if-not-zero (call-instruction---STACK-oogx) + (execution-provides-empty-return-data CALL_oogx_update_parent_context_row___row_offset)) + )) diff --git a/hub/osaka/constraints/instruction-handling/call/finishing_touches/setting_up_the_2nd_phase_for_precompiles.lisp b/hub/osaka/constraints/instruction-handling/call/finishing_touches/setting_up_the_2nd_phase_for_precompiles.lisp new file mode 100644 index 000000000..5711ec7c6 --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/call/finishing_touches/setting_up_the_2nd_phase_for_precompiles.lisp @@ -0,0 +1,27 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.Y CALL ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.Z.5 Final context row for CALL's to smart contracts ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstraint call-instruction---setting-up-the-second-phase-of-CALLs-to-precompiles (:guard PEEK_AT_SCENARIO) + (begin + (if-not-zero scenario/CALL_PRC_FAILURE + (precompile-scenario-row-setting CALL_2nd_scenario_row_PRC_failure___row_offset)) + (if-not-zero scenario/CALL_PRC_SUCCESS_CALLER_WILL_REVERT + (precompile-scenario-row-setting CALL_2nd_scenario_row_PRC_success_will_revert_2nd_scenario___row_offset)) + (if-not-zero scenario/CALL_PRC_SUCCESS_CALLER_WONT_REVERT + (precompile-scenario-row-setting CALL_2nd_scenario_row_PRC_success_wont_revert_2nd_scenario___row_offset)) + )) diff --git a/hub/osaka/constraints/instruction-handling/call/generalities/1st_set_of_account_rows.lisp b/hub/osaka/constraints/instruction-handling/call/generalities/1st_set_of_account_rows.lisp new file mode 100644 index 000000000..54949ff5d --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/call/generalities/1st_set_of_account_rows.lisp @@ -0,0 +1,85 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.Y CALL ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.Z.3 First set of account rows ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (call-instruction---summon-both-account-rows-once-or-more) (* PEEK_AT_SCENARIO + (scenario-shorthand---CALL---sum) + (+ (call-instruction---STACK-oogx) (scenario-shorthand---CALL---unexceptional)))) + +;; CALLER account +(defconstraint call-instruction---1st-caller-account-operation (:guard (call-instruction---summon-both-account-rows-once-or-more)) + (begin + (eq! (shift account/ADDRESS_HI CALL_1st_caller_account_row___row_offset) (call-instruction---current-address-hi)) + (eq! (shift account/ADDRESS_LO CALL_1st_caller_account_row___row_offset) (call-instruction---current-address-lo)) + ;; balance done below + (account-same-nonce CALL_1st_caller_account_row___row_offset) + (account-same-code CALL_1st_caller_account_row___row_offset) + (account-same-warmth CALL_1st_caller_account_row___row_offset) + (account-same-deployment-number-and-status CALL_1st_caller_account_row___row_offset) + (account-same-marked-for-deletion CALL_1st_caller_account_row___row_offset) + (vanishes! (shift account/ROMLEX_FLAG CALL_1st_caller_account_row___row_offset)) + (vanishes! (shift account/TRM_FLAG CALL_1st_caller_account_row___row_offset)) + (vanishes! (shift account/RLPADDR_FLAG CALL_1st_caller_account_row___row_offset)) + (DOM-SUB-stamps---standard CALL_1st_caller_account_row___row_offset + 0) + )) + +(defconstraint call-instruction---1st-caller-account-operation---balance-update (:guard (call-instruction---summon-both-account-rows-once-or-more)) + (begin + (if-not-zero (scenario-shorthand---CALL---balance-update-not-required) + (account-same-balance CALL_1st_caller_account_row___row_offset)) + (if-not-zero (scenario-shorthand---CALL---balance-update-required) + (account-decrement-balance-by CALL_1st_caller_account_row___row_offset + (* (call-instruction---is-CALL) (call-instruction---STACK-value-lo)))))) + + +;; CALLEE account +(defconstraint call-instruction---1st-callee-account-operation (:guard (call-instruction---summon-both-account-rows-once-or-more)) + (begin + ;; account/ADDRESS_HI set implicitly by account-trim-address + (debug (eq! (shift account/TRM_RAW_ADDRESS_HI CALL_1st_callee_account_row___row_offset) (call-instruction---STACK-raw-callee-address-hi))) ;; set implicitly by account-trim-address + (debug (eq! (shift account/ADDRESS_LO CALL_1st_callee_account_row___row_offset) (call-instruction---STACK-raw-callee-address-lo))) ;; set implicitly by account-trim-address + ;; balance done below + (account-same-nonce CALL_1st_callee_account_row___row_offset) + (account-same-code CALL_1st_callee_account_row___row_offset) + ;; warmth done below + (account-same-deployment-number-and-status CALL_1st_callee_account_row___row_offset) + (account-same-marked-for-deletion CALL_1st_callee_account_row___row_offset) + (eq! (shift account/ROMLEX_FLAG CALL_1st_callee_account_row___row_offset) (scenario-shorthand---CALL---smart-contract)) + (account-trim-address CALL_1st_callee_account_row___row_offset ;; row offset + (call-instruction---STACK-raw-callee-address-hi) ;; high part of raw, potentially untrimmed address + (call-instruction---STACK-raw-callee-address-lo) ;; low part of raw, potentially untrimmed address + ) + (debug (eq! (shift account/TRM_FLAG CALL_1st_callee_account_row___row_offset) 1)) ;; set implicitly by account-trim-address + (vanishes! (shift account/RLPADDR_FLAG CALL_1st_callee_account_row___row_offset)) + (DOM-SUB-stamps---standard CALL_1st_callee_account_row___row_offset + 1) + )) + +(defconstraint call-instruction---1st-callee-account-operation---balance-update (:guard (call-instruction---summon-both-account-rows-once-or-more)) + (begin + (if-not-zero (scenario-shorthand---CALL---balance-update-not-required) + (account-same-balance CALL_1st_callee_account_row___row_offset)) + (if-not-zero (scenario-shorthand---CALL---balance-update-required) + (account-increment-balance-by CALL_1st_callee_account_row___row_offset + (* (call-instruction---is-CALL) (call-instruction---STACK-value-lo)))))) + +(defconstraint call-instruction---1st-callee-account-operation---warmth-update (:guard (call-instruction---summon-both-account-rows-once-or-more)) + (begin + (if-not-zero (scenario-shorthand---CALL---callee-warmth-update-not-required) + (account-same-warmth CALL_1st_callee_account_row___row_offset)) + (if-not-zero (scenario-shorthand---CALL---callee-warmth-update-required) + (account-turn-on-warmth CALL_1st_callee_account_row___row_offset)))) diff --git a/hub/osaka/constraints/instruction-handling/call/generalities/2nd_set_of_account_rows.lisp b/hub/osaka/constraints/instruction-handling/call/generalities/2nd_set_of_account_rows.lisp new file mode 100644 index 000000000..01fc8ca7d --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/call/generalities/2nd_set_of_account_rows.lisp @@ -0,0 +1,71 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.Y CALL ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.Z.3 First set of account rows ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (call-instruction---summon-both-account-rows-twice-or-more) (* PEEK_AT_SCENARIO + (scenario-shorthand---CALL---requires-both-accounts-twice))) + +(defconstraint call-instruction---2nd-caller-account-operation (:guard (call-instruction---summon-both-account-rows-twice-or-more)) + (begin + (account-same-address-as CALL_2nd_caller_account_row___row_offset CALL_1st_caller_account_row___row_offset) + (account-undo-balance-update CALL_2nd_caller_account_row___row_offset CALL_1st_caller_account_row___row_offset) + (account-same-nonce CALL_2nd_caller_account_row___row_offset) + (account-same-code CALL_2nd_caller_account_row___row_offset) + (account-same-warmth CALL_2nd_caller_account_row___row_offset) + (account-same-deployment-number-and-status CALL_2nd_caller_account_row___row_offset) + (account-same-marked-for-deletion CALL_2nd_caller_account_row___row_offset) + (vanishes! (shift account/ROMLEX_FLAG CALL_2nd_caller_account_row___row_offset)) + (vanishes! (shift account/TRM_FLAG CALL_2nd_caller_account_row___row_offset)) + (vanishes! (shift account/RLPADDR_FLAG CALL_2nd_caller_account_row___row_offset)) + ;; DOM / SUB stamps set below + )) + +(defconstraint call-instruction---2nd-caller-account-operation---missing-fields (:guard (call-instruction---summon-both-account-rows-twice-or-more)) + (begin + (if-not-zero (scenario-shorthand---CALL---balance-update-undone-with-callee-failure) + (DOM-SUB-stamps---revert-with-child CALL_2nd_caller_account_row___row_offset + 2 + (call-instruction---callee-revert-stamp))) + (if-not-zero (scenario-shorthand---CALL---balance-update-undone-with-caller-revert) + (DOM-SUB-stamps---revert-with-current CALL_2nd_caller_account_row___row_offset + 2)) + )) + +;; second callee account encounter +(defconstraint call-instruction---2nd-callee-account-operation (:guard (call-instruction---summon-both-account-rows-twice-or-more)) + (begin + (account-same-address-as CALL_2nd_callee_account_row___row_offset CALL_1st_callee_account_row___row_offset) + (account-undo-balance-update CALL_2nd_callee_account_row___row_offset CALL_1st_callee_account_row___row_offset) + (account-same-nonce CALL_2nd_callee_account_row___row_offset) + (account-same-code CALL_2nd_callee_account_row___row_offset) + ;; warmth operation done below + (account-same-deployment-number-and-status CALL_2nd_callee_account_row___row_offset) + (account-same-marked-for-deletion CALL_2nd_callee_account_row___row_offset) + (vanishes! (shift account/ROMLEX_FLAG CALL_2nd_callee_account_row___row_offset)) + (vanishes! (shift account/TRM_FLAG CALL_2nd_callee_account_row___row_offset)) + (vanishes! (shift account/RLPADDR_FLAG CALL_2nd_callee_account_row___row_offset)) + ;; DOM / SUB stamps set below + )) + +(defconstraint call-instruction---2nd-callee-account-operation---missing-fields (:guard (call-instruction---summon-both-account-rows-twice-or-more)) + (begin + (if-not-zero (scenario-shorthand---CALL---balance-update-undone-with-callee-failure) + (begin (DOM-SUB-stamps---revert-with-child CALL_2nd_callee_account_row___row_offset 3 (call-instruction---callee-revert-stamp)) + (account-same-warmth CALL_2nd_callee_account_row___row_offset))) + (if-not-zero (scenario-shorthand---CALL---balance-update-undone-with-caller-revert) + (begin (DOM-SUB-stamps---revert-with-current CALL_2nd_callee_account_row___row_offset 3) + (account-undo-warmth-update CALL_2nd_callee_account_row___row_offset CALL_1st_callee_account_row___row_offset))) + )) diff --git a/hub/osaka/constraints/instruction-handling/call/generalities/3rd_set_of_account_rows.lisp b/hub/osaka/constraints/instruction-handling/call/generalities/3rd_set_of_account_rows.lisp new file mode 100644 index 000000000..f5540e52b --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/call/generalities/3rd_set_of_account_rows.lisp @@ -0,0 +1,36 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.Y CALL ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.Z.5 Third set of account rows ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (call-instruction---summon-callee-account-thrice) (* PEEK_AT_SCENARIO + scenario/CALL_SMC_FAILURE_CALLER_WILL_REVERT)) + +(defconstraint call-instruction---3rd-callee-account-operation + (:guard (call-instruction---summon-callee-account-thrice)) + (begin + (account-same-address-as CALL_3rd_callee_account_row___row_offset CALL_2nd_callee_account_row___row_offset) ;; we could use 1st instead of 2nd, too. + (account-same-balance CALL_3rd_callee_account_row___row_offset) + (account-same-nonce CALL_3rd_callee_account_row___row_offset) + (account-same-code CALL_3rd_callee_account_row___row_offset) + (account-undo-warmth-update CALL_3rd_callee_account_row___row_offset CALL_1st_callee_account_row___row_offset) + (account-same-deployment-number-and-status CALL_3rd_callee_account_row___row_offset) + (account-same-marked-for-deletion CALL_3rd_callee_account_row___row_offset) + (vanishes! (shift account/ROMLEX_FLAG CALL_3rd_callee_account_row___row_offset)) + (vanishes! (shift account/TRM_FLAG CALL_3rd_callee_account_row___row_offset)) + (vanishes! (shift account/RLPADDR_FLAG CALL_3rd_callee_account_row___row_offset)) + (DOM-SUB-stamps---revert-with-current CALL_3rd_callee_account_row___row_offset + 4) + )) diff --git a/hub/osaka/constraints/instruction-handling/call/generalities/universal.lisp b/hub/osaka/constraints/instruction-handling/call/generalities/universal.lisp new file mode 100644 index 000000000..4f90dac55 --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/call/generalities/universal.lisp @@ -0,0 +1,190 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.Y CALL ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.Z.1 Graphical representation ;; +;; X.Y.Z.2 Universal constraints for CALLs ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (call-instruction---standard-precondition) (* PEEK_AT_SCENARIO (scenario-shorthand---CALL---sum))) + + +(defconstraint call-instruction---setting-the-stack-pattern (:guard (call-instruction---standard-precondition)) + (shift (call-stack-pattern (force-bin (+ (call-instruction---is-CALL---unshifted) + (call-instruction---is-CALLCODE---unshifted)))) + CALL_1st_stack_row___row_offset)) + +(defconstraint call-instruction---setting-the-success-bit (:guard (call-instruction---standard-precondition)) + (begin + (vanishes! (call-instruction---STACK-success-bit-hi)) + (eq! (call-instruction---STACK-success-bit-lo) + (scenario-shorthand---CALL---success)) + )) + +(defconstraint call-instruction---setting-allowable-exceptions (:guard (call-instruction---standard-precondition)) + (begin + (if-not-zero (call-instruction---is-CALL) + (eq! XAHOY + (+ (call-instruction---STACK-staticx) + (call-instruction---STACK-mxpx) + (call-instruction---STACK-oogx)))) + (if-not-zero (+ (call-instruction---is-CALLCODE) + (call-instruction---is-DELEGATECALL) + (call-instruction---is-STATICCALL)) + (eq! XAHOY + (+ (call-instruction---STACK-mxpx) + (call-instruction---STACK-oogx)))) + )) + +(defconstraint call-instruction---the-first-context-row (:guard (call-instruction---standard-precondition)) + (read-context-data CALL_1st_context_row___row_offset + CONTEXT_NUMBER)) + +(defconstraint call-instruction---setting-miscellaneous-flags (:guard (call-instruction---standard-precondition)) + (eq! (weighted-MISC-flag-sum CALL_misc_row___row_offset) + (+ (* MISC_WEIGHT_MXP (call-instruction---trigger_MXP)) + (* MISC_WEIGHT_OOB (call-instruction---trigger_OOB)) + (* MISC_WEIGHT_STP (call-instruction---trigger_STP))) + )) + +(defconstraint call-instruction---setting-OOB-instruction-parameters (:guard (call-instruction---standard-precondition)) + (if-not-zero (shift misc/OOB_FLAG CALL_misc_row___row_offset) + (if-not-zero scenario/CALL_EXCEPTION + (set-OOB-instruction---xcall CALL_misc_row___row_offset ;; offset + (call-instruction---STACK-value-hi) ;; value (high part) + (call-instruction---STACK-value-lo) ;; value (low part, stack argument of CALL-type instruction) + )) + (if-not-zero (scenario-shorthand---CALL---unexceptional) + (set-OOB-instruction---call CALL_misc_row___row_offset ;; offset + (call-instruction---STACK-value-hi) ;; value (high part) + (call-instruction---STACK-value-lo) ;; value (low part, stack argument of CALL-type instruction) + (call-instruction---caller-balance) ;; balance (from caller account) + (call-instruction---current-call-stack-depth) ;; call stack depth + )) + )) + +(defconstraint call-instruction---justifying-staticx (:guard (call-instruction---standard-precondition)) + (eq! (call-instruction---STACK-staticx) + (* (call-instruction---is-CALL) + (call-instruction---OOB-nonzero-value) + (call-instruction---current-context-is-static)) + )) + +(defconstraint call-instruction---setting-MXP-instruction-parameters (:guard (call-instruction---standard-precondition)) + (if-not-zero (shift misc/MXP_FLAG CALL_misc_row___row_offset) + (set-MXP-instruction---for-CALL-type CALL_misc_row___row_offset ;; row offset kappa + (call-instruction---STACK-instruction) ;; instruction + (call-instruction---STACK-cdo-hi) ;; call data offset high + (call-instruction---STACK-cdo-lo) ;; call data offset low + (call-instruction---STACK-cds-hi) ;; call data size high + (call-instruction---STACK-cds-lo) ;; call data size low + (call-instruction---STACK-r@o-hi) ;; return at offset high + (call-instruction---STACK-r@o-lo) ;; return at offset low + (call-instruction---STACK-r@c-hi) ;; return at capacity high + (call-instruction---STACK-r@c-lo) ;; return at capacity low + ) + )) + +(defconstraint call-instruction---justifying-mxpx (:guard (call-instruction---standard-precondition)) + (if-not-zero (shift misc/MXP_FLAG CALL_misc_row___row_offset) + (eq! (call-instruction---STACK-mxpx) + (call-instruction---MXP-memory-expansion-exception)) + )) + +(defconstraint call-instruction---setting-STP-instruction-parameters (:guard (call-instruction---standard-precondition)) + (if-not-zero (shift misc/STP_FLAG CALL_misc_row___row_offset) + (set-STP-instruction-call CALL_misc_row___row_offset ;; relative row offset + (call-instruction---STACK-instruction) ;; instruction + (call-instruction---STACK-gas-hi) ;; max gas allowance argument, high part + (call-instruction---STACK-gas-lo) ;; max gas allowance argument, low part + (call-instruction---STACK-value-hi) ;; value to transfer, high part + (call-instruction---STACK-value-lo) ;; value to transfer, low part + (* (call-instruction---callee-exists) (call-instruction---is-CALL)) ;; bit indicating target account existence + (call-instruction---callee-warmth) ;; bit indicating target account warmth + (call-instruction---MXP-memory-expansion-gas) ;; memory expansion gas + ) + )) + +(defconstraint call-instruction---justifying-oogx (:guard (call-instruction---standard-precondition)) + (if-not-zero (shift misc/STP_FLAG CALL_misc_row___row_offset) + (eq! (call-instruction---STACK-oogx) (call-instruction---STP-out-of-gas-exception)) + )) + +(defconstraint call-instruction---setting-the-CALL-scenario-flag (:guard (call-instruction---standard-precondition)) + (begin + (eq! scenario/CALL_EXCEPTION XAHOY) + (if-not-zero (scenario-shorthand---CALL---unexceptional) + (eq! (scenario-shorthand---CALL---abort) + (call-instruction---OOB-aborting-condition))) + (if-not-zero (scenario-shorthand---CALL---abort) + (begin + (eq! scenario/CALL_ABORT_WILL_REVERT (call-instruction---caller-will-revert)) + (debug (eq! scenario/CALL_ABORT_WONT_REVERT (- 1 (call-instruction---caller-will-revert)))))) + (if-not-zero (scenario-shorthand---CALL---entry) + (begin + (eq! (scenario-shorthand---CALL---precompile) (call-instruction---callee-is-precompile)) + (eq! (scenario-shorthand---CALL---externally-owned-account) (* (- 1 (call-instruction---callee-is-precompile)) + (- 1 (call-instruction---callee-has-code)))) + (eq! (scenario-shorthand---CALL---smart-contract) (call-instruction---callee-has-code)))) + (if-not-zero (+ scenario/CALL_PRC_SUCCESS_CALLER_WILL_REVERT scenario/CALL_PRC_SUCCESS_CALLER_WONT_REVERT) + (begin + (eq! scenario/CALL_PRC_SUCCESS_CALLER_WILL_REVERT (call-instruction---caller-will-revert)) + (debug (eq! scenario/CALL_PRC_SUCCESS_CALLER_WONT_REVERT (- 1 (call-instruction---caller-will-revert)))))) + (if-not-zero (scenario-shorthand---CALL---externally-owned-account) + (begin + (eq! scenario/CALL_EOA_SUCCESS_CALLER_WILL_REVERT (call-instruction---caller-will-revert)) + (debug (eq! scenario/CALL_EOA_SUCCESS_CALLER_WONT_REVERT (- 1 (call-instruction---caller-will-revert)))))) + (if-not-zero (scenario-shorthand---CALL---smart-contract) + (begin + (eq! (+ scenario/CALL_SMC_FAILURE_CALLER_WILL_REVERT scenario/CALL_SMC_SUCCESS_CALLER_WILL_REVERT) + (call-instruction---caller-will-revert)) + (debug (eq! (+ scenario/CALL_SMC_FAILURE_CALLER_WONT_REVERT scenario/CALL_SMC_SUCCESS_CALLER_WONT_REVERT) + (- 1 (call-instruction---caller-will-revert)))) + (eq! (scenario-shorthand---CALL---smc-failure) (call-instruction---callee-self-reverts)) + (eq! (scenario-shorthand---CALL---smc-success) (- 1 (call-instruction---callee-self-reverts))))))) + +(defconstraint call-instruction---setting-the-next-context-number (:guard (call-instruction---standard-precondition)) + (begin + (if-not-zero scenario/CALL_EXCEPTION (shift (next-context-is-caller) CALL_1st_stack_row___row_offset)) + (if-not-zero (scenario-shorthand---CALL---no-context-change) (shift (next-context-is-current) CALL_1st_stack_row___row_offset)) + (if-not-zero (scenario-shorthand---CALL---smart-contract) (shift (next-context-is-new) CALL_1st_stack_row___row_offset)))) + +(defconstraint call-instruction---setting-GAS_COST (:guard (call-instruction---standard-precondition)) + (begin + (if-not-zero (+ (call-instruction---STACK-staticx) + (call-instruction---STACK-mxpx)) (vanishes! GAS_COST)) + (if-not-zero (+ (call-instruction---STACK-oogx) + (scenario-shorthand---CALL---abort) + (scenario-shorthand---CALL---smart-contract) + (scenario-shorthand---CALL---externally-owned-account) + (scenario-shorthand---CALL---precompile)) + (eq! GAS_COST (call-instruction---STP-gas-upfront))))) + +(defconstraint call-instruction---setting-GAS_NEXT (:guard (call-instruction---standard-precondition)) + (begin + (if-not-zero (+ (call-instruction---STACK-staticx) + (call-instruction---STACK-mxpx) + (call-instruction---STACK-oogx)) + (vanishes! GAS_NEXT)) + (if-not-zero (+ (scenario-shorthand---CALL---abort) + (scenario-shorthand---CALL---externally-owned-account)) + (eq! GAS_NEXT + (+ (- GAS_ACTUAL (call-instruction---STP-gas-upfront)) + (call-instruction---STP-call-stipend)))) + (if-not-zero (scenario-shorthand---CALL---smart-contract) + (eq! GAS_NEXT + (- GAS_ACTUAL + (call-instruction---STP-gas-upfront) + (call-instruction---STP-gas-paid-out-of-pocket)))) + ;; (if-not-zero (scenario-shorthand---CALL---precompile) ( ... )) ;; can't be done here !!! + )) diff --git a/hub/osaka/constraints/instruction-handling/call/non_stack_rows_for_non_precompiles.lisp b/hub/osaka/constraints/instruction-handling/call/non_stack_rows_for_non_precompiles.lisp new file mode 100644 index 000000000..d658a3a38 --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/call/non_stack_rows_for_non_precompiles.lisp @@ -0,0 +1,50 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.Y CALL ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.9 Non stack rows for non precompiles ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defun (call-instruction---anything-but-precompile-entry) (* PEEK_AT_SCENARIO (scenario-shorthand---CALL---no-precompile))) + +(defconstraint call-instruction---setting-NSR-for-non-precompiles (:guard (call-instruction---anything-but-precompile-entry)) + (eq! (shift NON_STACK_ROWS CALL_1st_stack_row___row_offset) + (+ (* (+ CALL_nsr___staticx 1) (call-instruction---STACK-staticx)) + (* (+ CALL_nsr___mxpx 1) (call-instruction---STACK-mxpx)) + (* (+ CALL_nsr___oogx 1) (call-instruction---STACK-oogx)) + (* (+ CALL_nsr___abort_will_revert 1) scenario/CALL_ABORT_WILL_REVERT) + (* (+ CALL_nsr___abort_wont_revert 1) scenario/CALL_ABORT_WONT_REVERT) + (* (+ CALL_nsr___eoa_success_will_revert 1) scenario/CALL_EOA_SUCCESS_CALLER_WILL_REVERT) + (* (+ CALL_nsr___eoa_success_wont_revert 1) scenario/CALL_EOA_SUCCESS_CALLER_WONT_REVERT) + (* (+ CALL_nsr___smc_failure_will_revert 1) scenario/CALL_SMC_FAILURE_CALLER_WILL_REVERT) + (* (+ CALL_nsr___smc_failure_wont_revert 1) scenario/CALL_SMC_FAILURE_CALLER_WONT_REVERT) + (* (+ CALL_nsr___smc_success_will_revert 1) scenario/CALL_SMC_SUCCESS_CALLER_WILL_REVERT) + (* (+ CALL_nsr___smc_success_wont_revert 1) scenario/CALL_SMC_SUCCESS_CALLER_WONT_REVERT) + ))) + + +(defconstraint call-instruction---setting-flag-sums-for-non-precompiles (:guard (call-instruction---anything-but-precompile-entry)) + (eq! (shift NON_STACK_ROWS CALL_1st_stack_row___row_offset) + (+ (* (call-instruction---flag-sum-staticx) (call-instruction---STACK-staticx)) + (* (call-instruction---flag-sum-mxpx) (call-instruction---STACK-mxpx)) + (* (call-instruction---flag-sum-oogx) (call-instruction---STACK-oogx)) + (* (call-instruction---flag-sum-abort-will-revert) scenario/CALL_ABORT_WILL_REVERT) + (* (call-instruction---flag-sum-abort-wont-revert) scenario/CALL_ABORT_WONT_REVERT) + (* (call-instruction---flag-sum-eoa-will-revert) scenario/CALL_EOA_SUCCESS_CALLER_WILL_REVERT) + (* (call-instruction---flag-sum-eoa-wont-revert) scenario/CALL_EOA_SUCCESS_CALLER_WONT_REVERT) + (* (call-instruction---flag-sum-smc-failure-will-revert) scenario/CALL_SMC_FAILURE_CALLER_WILL_REVERT) + (* (call-instruction---flag-sum-smc-failure-wont-revert) scenario/CALL_SMC_FAILURE_CALLER_WONT_REVERT) + (* (call-instruction---flag-sum-smc-success-will-revert) scenario/CALL_SMC_SUCCESS_CALLER_WILL_REVERT) + (* (call-instruction---flag-sum-smc-success-wont-revert) scenario/CALL_SMC_SUCCESS_CALLER_WONT_REVERT) + ))) diff --git a/hub/osaka/constraints/instruction-handling/call/non_stack_rows_for_precompiles.lisp b/hub/osaka/constraints/instruction-handling/call/non_stack_rows_for_precompiles.lisp new file mode 100644 index 000000000..1efd60cd8 --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/call/non_stack_rows_for_precompiles.lisp @@ -0,0 +1,37 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.Y CALL ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.10 Partial non stack rows for precompile scenarios ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defun (call-instruction---precompile-entry) (* PEEK_AT_SCENARIO (scenario-shorthand---CALL---precompile))) + +(defun (call-instruction---NSR-first-half) (+ (* (+ CALL___first_half_nsr___prc_failure 1) scenario/CALL_PRC_FAILURE ) + (* (+ CALL___first_half_nsr___prc_success_will_revert 1) scenario/CALL_PRC_SUCCESS_CALLER_WILL_REVERT) + (* (+ CALL___first_half_nsr___prc_success_wont_revert 1) scenario/CALL_PRC_SUCCESS_CALLER_WONT_REVERT))) + +(defconstraint call-instruction---setting-partial-non-stack-rows-for-precompiles (:guard (call-instruction---precompile-entry)) + (eq! (call-instruction---NSR-first-half) + (+ (* (call-instruction---flag-sum-prc-failure-first-half) scenario/CALL_PRC_FAILURE ) + (* (call-instruction---flag-sum-prc-success-will-revert-first-half) scenario/CALL_PRC_SUCCESS_CALLER_WILL_REVERT) + (* (call-instruction---flag-sum-prc-success-wont-revert-first-half) scenario/CALL_PRC_SUCCESS_CALLER_WONT_REVERT)) + )) + +(defconstraint call-instruction---propagating-the-current-HUB_STAMP (:guard (call-instruction---precompile-entry)) + (vanishes! + (+ (* (- (shift HUB_STAMP CALL___first_half_nsr___prc_failure) (shift HUB_STAMP CALL_1st_stack_row___row_offset)) scenario/CALL_PRC_FAILURE ) + (* (- (shift HUB_STAMP CALL___first_half_nsr___prc_success_will_revert) (shift HUB_STAMP CALL_1st_stack_row___row_offset)) scenario/CALL_PRC_SUCCESS_CALLER_WILL_REVERT) + (* (- (shift HUB_STAMP CALL___first_half_nsr___prc_success_wont_revert) (shift HUB_STAMP CALL_1st_stack_row___row_offset)) scenario/CALL_PRC_SUCCESS_CALLER_WONT_REVERT)) + )) diff --git a/hub/osaka/constraints/instruction-handling/call/peeking_flag_sums_for_non_precompiles.lisp b/hub/osaka/constraints/instruction-handling/call/peeking_flag_sums_for_non_precompiles.lisp new file mode 100644 index 000000000..488d9a0a2 --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/call/peeking_flag_sums_for_non_precompiles.lisp @@ -0,0 +1,80 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.Y CALL ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.8 Peeking flag sums for non precompile scenarios ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +;; prefixes +(defun (call-instruction---standard-call-prefix) (+ (shift PEEK_AT_SCENARIO CALL_1st_scenario_row___row_offset) + (shift PEEK_AT_CONTEXT CALL_1st_context_row___row_offset) + (shift PEEK_AT_MISCELLANEOUS CALL_misc_row___row_offset))) + +(defun (call-instruction---extended-call-prefix) (+ (call-instruction---standard-call-prefix) + (shift PEEK_AT_ACCOUNT CALL_1st_caller_account_row___row_offset) + (shift PEEK_AT_ACCOUNT CALL_1st_callee_account_row___row_offset))) + + + +;; exceptional CALLs +(defun (call-instruction---flag-sum-staticx) (+ (call-instruction---standard-call-prefix) + (shift PEEK_AT_CONTEXT CALL_staticx_update_parent_context_row___row_offset))) + +(defun (call-instruction---flag-sum-mxpx) (+ (call-instruction---standard-call-prefix) + (shift PEEK_AT_CONTEXT CALL_mxpx_update_parent_context_row___row_offset))) + +(defun (call-instruction---flag-sum-oogx) (+ (call-instruction---extended-call-prefix) + (shift PEEK_AT_CONTEXT CALL_oogx_update_parent_context_row___row_offset))) + + + +;; unexceptional yet aborted CALLs +(defun (call-instruction---flag-sum-abort-will-revert) (+ (call-instruction---extended-call-prefix) + (shift PEEK_AT_ACCOUNT CALL_2nd_callee_account_row___abort_will_revert___row_offset) + (shift PEEK_AT_CONTEXT CALL_ABORT_WILL_REVERT---current-context-update---row-offset))) + +(defun (call-instruction---flag-sum-abort-wont-revert) (+ (call-instruction---extended-call-prefix) + (shift PEEK_AT_CONTEXT CALL_ABORT_WONT_REVERT---current-context-update---row-offset))) + + +;; entering EOA +(defun (call-instruction---flag-sum-eoa-will-revert) (+ (call-instruction---extended-call-prefix) + (shift PEEK_AT_ACCOUNT CALL_2nd_caller_account_row___row_offset) + (shift PEEK_AT_ACCOUNT CALL_2nd_callee_account_row___row_offset) + (shift PEEK_AT_CONTEXT CALL_EOA_will_revert_caller_context_row___row_offset))) + +(defun (call-instruction---flag-sum-eoa-wont-revert) (+ (call-instruction---extended-call-prefix) + (shift PEEK_AT_CONTEXT CALL_EOA_wont_revert_caller_context_row___row_offset))) + + + +;; entering SMC +(defun (call-instruction---flag-sum-smc-failure-will-revert) (+ (call-instruction---extended-call-prefix) + (shift PEEK_AT_ACCOUNT CALL_2nd_caller_account_row___row_offset) + (shift PEEK_AT_ACCOUNT CALL_2nd_callee_account_row___row_offset) + (shift PEEK_AT_ACCOUNT CALL_3rd_callee_account_row___row_offset) + (shift PEEK_AT_CONTEXT CALL_SMC_failure_will_revert_initialize_callee_context_row___row_offset))) + +(defun (call-instruction---flag-sum-smc-failure-wont-revert) (+ (call-instruction---extended-call-prefix) + (shift PEEK_AT_ACCOUNT CALL_2nd_caller_account_row___row_offset) + (shift PEEK_AT_ACCOUNT CALL_2nd_callee_account_row___row_offset) + (shift PEEK_AT_CONTEXT CALL_SMC_failure_wont_revert_initialize_callee_context_row___row_offset))) + +(defun (call-instruction---flag-sum-smc-success-will-revert) (+ (call-instruction---extended-call-prefix) + (shift PEEK_AT_ACCOUNT CALL_2nd_caller_account_row___row_offset) + (shift PEEK_AT_ACCOUNT CALL_2nd_callee_account_row___row_offset) + (shift PEEK_AT_CONTEXT CALL_SMC_success_will_revert_initialize_callee_context_row___row_offset))) + +(defun (call-instruction---flag-sum-smc-success-wont-revert) (+ (call-instruction---extended-call-prefix) + (shift PEEK_AT_CONTEXT CALL_SMC_success_wont_revert_initialize_callee_context_row___row_offset))) diff --git a/hub/osaka/constraints/instruction-handling/call/peeking_flag_sums_for_precompiles.lisp b/hub/osaka/constraints/instruction-handling/call/peeking_flag_sums_for_precompiles.lisp new file mode 100644 index 000000000..08f551e52 --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/call/peeking_flag_sums_for_precompiles.lisp @@ -0,0 +1,28 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.Y CALL ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.10 Partial peeking flag sums for precompile scenarios ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defun (call-instruction---flag-sum-prc-failure-first-half) (+ (call-instruction---extended-call-prefix) + (shift PEEK_AT_SCENARIO CALL_2nd_scenario_row_PRC_failure___row_offset))) + +(defun (call-instruction---flag-sum-prc-success-will-revert-first-half) (+ (call-instruction---extended-call-prefix) + (shift PEEK_AT_ACCOUNT CALL_2nd_caller_account_row___row_offset) + (shift PEEK_AT_ACCOUNT CALL_2nd_callee_account_row___row_offset) + (shift PEEK_AT_SCENARIO CALL_2nd_scenario_row_PRC_success_will_revert_2nd_scenario___row_offset))) + +(defun (call-instruction---flag-sum-prc-success-wont-revert-first-half) (+ (call-instruction---extended-call-prefix) + (shift PEEK_AT_SCENARIO CALL_2nd_scenario_row_PRC_success_wont_revert_2nd_scenario___row_offset))) diff --git a/hub/osaka/constraints/instruction-handling/call/precompiles/NSRs_and_flag_sums_I.lisp b/hub/osaka/constraints/instruction-handling/call/precompiles/NSRs_and_flag_sums_I.lisp new file mode 100644 index 000000000..c5f79d2d9 --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/call/precompiles/NSRs_and_flag_sums_I.lisp @@ -0,0 +1,69 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.Y CALL ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.Z.7 Flag sums and NSR's (I) ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (precompile-processing---1st-half-NSR) + (+ (* CALL___first_half_nsr___prc_failure (scenario-shorthand---PRC---failure)) + (* CALL___first_half_nsr___prc_success_will_revert scenario/PRC_SUCCESS_CALLER_WILL_REVERT) + (* CALL___first_half_nsr___prc_success_wont_revert scenario/PRC_SUCCESS_CALLER_WONT_REVERT) + )) + + +(defun (precompile-processing---2nd-half-NSR) + (+ + (* (precompile-processing---2nd-half-NSR-for-ECRECOVER) scenario/PRC_ECRECOVER) + (* (precompile-processing---2nd-half-NSR-for-SHA2-256) scenario/PRC_SHA2-256) + (* (precompile-processing---2nd-half-NSR-for-RIPEMD-160) scenario/PRC_RIPEMD-160) + (* (precompile-processing---2nd-half-NSR-for-IDENTITY) scenario/PRC_IDENTITY) + (* (precompile-processing---2nd-half-NSR-for-MODEXP) scenario/PRC_MODEXP) + (* (precompile-processing---2nd-half-NSR-for-ECADD) scenario/PRC_ECADD) + (* (precompile-processing---2nd-half-NSR-for-ECMUL) scenario/PRC_ECMUL) + (* (precompile-processing---2nd-half-NSR-for-ECPAIRING) scenario/PRC_ECPAIRING) + (* (precompile-processing---2nd-half-NSR-for-BLAKE2f) scenario/PRC_BLAKE2f) + (* (precompile-processing---2nd-half-NSR-for-all-BLS-precompiles) (scenario-shorthand---PRC---common-BLS-address-bit-sum)) + )) + +(defun (precompile-processing---2nd-half-flag-sum) + (+ + (* (precompile-processing---2nd-half-flag-sum-for-ECRECOVER) scenario/PRC_ECRECOVER) + (* (precompile-processing---2nd-half-flag-sum-for-SHA2-256) scenario/PRC_SHA2-256) + (* (precompile-processing---2nd-half-flag-sum-for-RIPEMD-160) scenario/PRC_RIPEMD-160) + (* (precompile-processing---2nd-half-flag-sum-for-IDENTITY) scenario/PRC_IDENTITY) + (* (precompile-processing---2nd-half-flag-sum-for-MODEXP) scenario/PRC_MODEXP) + (* (precompile-processing---2nd-half-flag-sum-for-ECADD) scenario/PRC_ECADD) + (* (precompile-processing---2nd-half-flag-sum-for-ECMUL) scenario/PRC_ECMUL) + (* (precompile-processing---2nd-half-flag-sum-for-ECPAIRING) scenario/PRC_ECPAIRING) + (* (precompile-processing---2nd-half-flag-sum-for-BLAKE2f) scenario/PRC_BLAKE2f) + (* (precompile-processing---2nd-half-flag-sum-for-all-BLS-precompiles) (scenario-shorthand---PRC---common-BLS-address-bit-sum)) + )) + +;; Stand failure / success shorthands +(defun (precompile-processing---flag-sum-standard-success) + (+ (shift PEEK_AT_SCENARIO 0) + (shift PEEK_AT_MISCELLANEOUS 1) + (shift PEEK_AT_MISCELLANEOUS 2) + (shift PEEK_AT_MISCELLANEOUS 3) + (shift PEEK_AT_CONTEXT 4) + )) +(defconst precompile-processing---nsr-standard-success 5) + +(defun (precompile-processing---flag-sum-standard-failure) + (+ (shift PEEK_AT_SCENARIO 0) + (shift PEEK_AT_MISCELLANEOUS 1) + (shift PEEK_AT_CONTEXT 2) + )) +(defconst precompile-processing---nsr-standard-failure 3) + diff --git a/hub/osaka/constraints/instruction-handling/call/precompiles/NSRs_and_flag_sums_II.lisp b/hub/osaka/constraints/instruction-handling/call/precompiles/NSRs_and_flag_sums_II.lisp new file mode 100644 index 000000000..01fa79a78 --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/call/precompiles/NSRs_and_flag_sums_II.lisp @@ -0,0 +1,359 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.Y CALL ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.Z.7 Flag sums and NSR's (II) ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +;; precompile individualized shorthands + + +;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; ECRECOVER ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;; + + +;; flag sum +(defun (precompile-processing---2nd-half-flag-sum-for-ECRECOVER) + (+ (* (precompile-processing---flag-sum-ECRECOVER-FKTH) scenario/PRC_FAILURE_KNOWN_TO_HUB) + (* (precompile-processing---flag-sum-ECRECOVER-success) (scenario-shorthand---PRC---success)) + )) +;; non stack rows +(defun (precompile-processing---2nd-half-NSR-for-ECRECOVER) + (+ (* (precompile-processing---nsr-ECRECOVER-FKTH) scenario/PRC_FAILURE_KNOWN_TO_HUB) + (* (precompile-processing---nsr-ECRECOVER-success) (scenario-shorthand---PRC---success)) + )) +;; flag sum shorthands +(defun (precompile-processing---flag-sum-ECRECOVER-FKTH) (precompile-processing---flag-sum-standard-failure)) +(defun (precompile-processing---flag-sum-ECRECOVER-success) (precompile-processing---flag-sum-standard-success)) +;; non stack rows shorthands +(defun (precompile-processing---nsr-ECRECOVER-FKTH) precompile-processing---nsr-standard-failure) +(defun (precompile-processing---nsr-ECRECOVER-success) precompile-processing---nsr-standard-success) ;; "" +;; NB: the failure scenario FAILURE_KNOWN_TO_RAM is impossible + + +;;;;;;;;;;;;;;;;;;;; +;; ;; +;; SHA2-256 ;; +;; ;; +;;;;;;;;;;;;;;;;;;;; + + +;; flag sum +(defun (precompile-processing---2nd-half-flag-sum-for-SHA2-256) + (+ (* (precompile-processing---flag-sum-SHA2-256-FKTH) scenario/PRC_FAILURE_KNOWN_TO_HUB) + (* (precompile-processing---flag-sum-SHA2-256-success) (scenario-shorthand---PRC---success)) + )) +;; non stack rows +(defun (precompile-processing---2nd-half-NSR-for-SHA2-256) + (+ (* (precompile-processing---nsr-SHA2-256-FKTH) scenario/PRC_FAILURE_KNOWN_TO_HUB) + (* (precompile-processing---nsr-SHA2-256-success) (scenario-shorthand---PRC---success)) + )) +;; non stack rows shorthands +(defun (precompile-processing---nsr-SHA2-256-FKTH) precompile-processing---nsr-standard-failure) +(defun (precompile-processing---nsr-SHA2-256-success) precompile-processing---nsr-standard-success) ;; "" +;; flag sum shorthands +(defun (precompile-processing---flag-sum-SHA2-256-FKTH) (precompile-processing---flag-sum-standard-failure)) +(defun (precompile-processing---flag-sum-SHA2-256-success) (precompile-processing---flag-sum-standard-success)) +;; NB: the failure scenario FAILURE_KNOWN_TO_RAM is impossible + + +;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; RIPEMD-160 ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;; + + +;; RIPEMD-160 flag sum +(defun (precompile-processing---2nd-half-flag-sum-for-RIPEMD-160) + (+ (* (precompile-processing---flag-sum-RIPEMD-160-FKTH) scenario/PRC_FAILURE_KNOWN_TO_HUB) + (* (precompile-processing---flag-sum-RIPEMD-160-success) (scenario-shorthand---PRC---success)) + )) +;; non stack rows +(defun (precompile-processing---2nd-half-NSR-for-RIPEMD-160) + (+ (* (precompile-processing---nsr-RIPEMD-160-FKTH) scenario/PRC_FAILURE_KNOWN_TO_HUB) + (* (precompile-processing---nsr-RIPEMD-160-success) (scenario-shorthand---PRC---success)) + )) +;; non stack rows shorthands +(defun (precompile-processing---nsr-RIPEMD-160-FKTH) precompile-processing---nsr-standard-failure) +(defun (precompile-processing---nsr-RIPEMD-160-success) precompile-processing---nsr-standard-success) ;; "" +;; flag sum shorthands +(defun (precompile-processing---flag-sum-RIPEMD-160-FKTH) (precompile-processing---flag-sum-standard-failure)) +(defun (precompile-processing---flag-sum-RIPEMD-160-success) (precompile-processing---flag-sum-standard-success)) +;; NB: the failure scenario FAILURE_KNOWN_TO_RAM is impossible + + +;;;;;;;;;;;;;;;;;;;; +;; ;; +;; IDENTITY ;; +;; ;; +;;;;;;;;;;;;;;;;;;;; + + +;; flag sum +(defun (precompile-processing---2nd-half-flag-sum-for-IDENTITY) + (+ (* (precompile-processing---flag-sum-IDENTITY-FKTH) scenario/PRC_FAILURE_KNOWN_TO_HUB) + (* (precompile-processing---flag-sum-IDENTITY-success) (scenario-shorthand---PRC---success)) + )) +;; non stack rows +(defun (precompile-processing---2nd-half-NSR-for-IDENTITY) + (+ (* precompile-processing---nsr-IDENTITY-FKTH scenario/PRC_FAILURE_KNOWN_TO_HUB) + (* precompile-processing---nsr-IDENTITY-success (scenario-shorthand---PRC---success)) + )) +;; non stack rows shorthands +(defconst precompile-processing---nsr-IDENTITY-FKTH precompile-processing---nsr-standard-failure) +(defconst precompile-processing---nsr-IDENTITY-success 4) +;; flag sum shorthands +(defun (precompile-processing---flag-sum-IDENTITY-FKTH) (precompile-processing---flag-sum-standard-failure)) +(defun (precompile-processing---flag-sum-IDENTITY-success) + (+ (shift PEEK_AT_SCENARIO 0) + (shift PEEK_AT_MISCELLANEOUS 1) + (shift PEEK_AT_MISCELLANEOUS 2) + (shift PEEK_AT_CONTEXT 3) + )) +;; NB: the failure scenario FAILURE_KNOWN_TO_RAM is impossible + + +;;;;;;;;;;;;;;;;;; +;; ;; +;; MODEXP ;; +;; ;; +;;;;;;;;;;;;;;;;;; + + +;; MODEXP flag sum +(defun (precompile-processing---2nd-half-flag-sum-for-MODEXP) + (+ (* (precompile-processing---flag-sum-MODEXP-FKTR) scenario/PRC_FAILURE_KNOWN_TO_RAM) + (* (precompile-processing---flag-sum-MODEXP-success) (scenario-shorthand---PRC---success)) + )) +;; MODEXP non stack rows +(defconst precompile-processing---MODEXP-nsr-FKTR 8) +(defconst precompile-processing---MODEXP-nsr-success 13) +(defun (precompile-processing---2nd-half-NSR-for-MODEXP) + (+ (* precompile-processing---MODEXP-nsr-FKTR scenario/PRC_FAILURE_KNOWN_TO_RAM) + (* precompile-processing---MODEXP-nsr-success (scenario-shorthand---PRC---success)) + )) +;; MODEXP non stack rows shorthands +(defun (precompile-processing---flag-sum-MODEXP-FKTR) (+ + (shift PEEK_AT_SCENARIO 0 ) + (shift PEEK_AT_MISCELLANEOUS precompile-processing---MODEXP-misc-row---cds---row-offset ) + (shift PEEK_AT_MISCELLANEOUS precompile-processing---MODEXP-misc-row---extract-bbs---offset ) + (shift PEEK_AT_MISCELLANEOUS precompile-processing---MODEXP-misc-row---extract-ebs---row-offset ) + (shift PEEK_AT_MISCELLANEOUS precompile-processing---MODEXP-misc-row---extract-mbs---row-offset ) + (shift PEEK_AT_MISCELLANEOUS precompile-processing---MODEXP-misc-row---extract-raw-lead---row-offset ) + (shift PEEK_AT_MISCELLANEOUS precompile-processing---MODEXP-misc-row---pricing---row-offset ) + (shift PEEK_AT_CONTEXT precompile-processing---MODEXP-context-row---FKTR---row-offset ) + )) +(defun (precompile-processing---flag-sum-MODEXP-success) (+ + (shift PEEK_AT_SCENARIO 0 ) + (shift PEEK_AT_MISCELLANEOUS precompile-processing---MODEXP-misc-row---cds---row-offset ) + (shift PEEK_AT_MISCELLANEOUS precompile-processing---MODEXP-misc-row---extract-bbs---offset ) + (shift PEEK_AT_MISCELLANEOUS precompile-processing---MODEXP-misc-row---extract-ebs---row-offset ) + (shift PEEK_AT_MISCELLANEOUS precompile-processing---MODEXP-misc-row---extract-mbs---row-offset ) + (shift PEEK_AT_MISCELLANEOUS precompile-processing---MODEXP-misc-row---extract-raw-lead---row-offset ) + (shift PEEK_AT_MISCELLANEOUS precompile-processing---MODEXP-misc-row---pricing---row-offset ) + (shift PEEK_AT_MISCELLANEOUS precompile-processing---MODEXP-misc-row---copy-inputs-base---row-offset ) + (shift PEEK_AT_MISCELLANEOUS precompile-processing---MODEXP-misc-row---copy-inputs-exponent---row-offset ) + (shift PEEK_AT_MISCELLANEOUS precompile-processing---MODEXP-misc-row---copy-inputs-modulus---row-offset ) + (shift PEEK_AT_MISCELLANEOUS precompile-processing---MODEXP-misc-row---full-result-transfer---row-offset ) + (shift PEEK_AT_MISCELLANEOUS precompile-processing---MODEXP-misc-row---partial-result-copy---row-offset ) + (shift PEEK_AT_CONTEXT precompile-processing---MODEXP-context-row---success---row-offset ) + )) +;; NB: the failure scenario FAILURE_KNOWN_TO_HUB is impossible +(defconst + precompile-processing---MODEXP-misc-row---cds---row-offset 1 + precompile-processing---MODEXP-misc-row---extract-bbs---offset 2 + precompile-processing---MODEXP-misc-row---extract-ebs---row-offset 3 + precompile-processing---MODEXP-misc-row---extract-mbs---row-offset 4 + precompile-processing---MODEXP-misc-row---extract-raw-lead---row-offset 5 + precompile-processing---MODEXP-misc-row---pricing---row-offset 6 + precompile-processing---MODEXP-misc-row---copy-inputs-base---row-offset 7 + precompile-processing---MODEXP-misc-row---copy-inputs-exponent---row-offset 8 + precompile-processing---MODEXP-misc-row---copy-inputs-modulus---row-offset 9 + precompile-processing---MODEXP-misc-row---full-result-transfer---row-offset 10 + precompile-processing---MODEXP-misc-row---partial-result-copy---row-offset 11 + + precompile-processing---MODEXP-context-row---FKTR---row-offset 7 + precompile-processing---MODEXP-context-row---success---row-offset 12 + ) + + +;;;;;;;;;;;;;;;;; +;; ;; +;; ECADD ;; +;; ;; +;;;;;;;;;;;;;;;;; + + +;; ECADD flag sum +(defun (precompile-processing---2nd-half-flag-sum-for-ECADD) + (+ (* (precompile-processing---flag-sum-ECADD-FKTH) scenario/PRC_FAILURE_KNOWN_TO_HUB) + (* (precompile-processing---flag-sum-ECADD-FKTR) scenario/PRC_FAILURE_KNOWN_TO_RAM) + (* (precompile-processing---flag-sum-ECADD-success) (scenario-shorthand---PRC---success)) + )) +;; ECADD non stack rows +(defun (precompile-processing---2nd-half-NSR-for-ECADD) + (+ (* (precompile-processing---nsr-ECADD-FKTH) scenario/PRC_FAILURE_KNOWN_TO_HUB) + (* (precompile-processing---nsr-ECADD-FKTR) scenario/PRC_FAILURE_KNOWN_TO_RAM) + (* (precompile-processing---nsr-ECADD-success) (scenario-shorthand---PRC---success)) + )) +;; ECADD non stack rows shorthands +(defun (precompile-processing---nsr-ECADD-FKTH) precompile-processing---nsr-standard-failure) +(defun (precompile-processing---nsr-ECADD-FKTR) precompile-processing---nsr-standard-failure) +(defun (precompile-processing---nsr-ECADD-success) precompile-processing---nsr-standard-success) ;; "" +;; ECADD flag sum shorthands +(defun (precompile-processing---flag-sum-ECADD-FKTH) (precompile-processing---flag-sum-standard-failure)) +(defun (precompile-processing---flag-sum-ECADD-FKTR) (precompile-processing---flag-sum-standard-failure)) +(defun (precompile-processing---flag-sum-ECADD-success) (precompile-processing---flag-sum-standard-success)) + + +;;;;;;;;;;;;;;;;; +;; ;; +;; ECMUL ;; +;; ;; +;;;;;;;;;;;;;;;;; + + +;; ECMUL flag sum +(defun (precompile-processing---2nd-half-flag-sum-for-ECMUL) + (+ (* (precompile-processing---flag-sum-ECMUL-FKTH) scenario/PRC_FAILURE_KNOWN_TO_HUB) + (* (precompile-processing---flag-sum-ECMUL-FKTR) scenario/PRC_FAILURE_KNOWN_TO_RAM) + (* (precompile-processing---flag-sum-ECMUL-success) (scenario-shorthand---PRC---success)) + )) +;; ECMUL non stack rows +(defun (precompile-processing---2nd-half-NSR-for-ECMUL) + (+ (* (precompile-processing---nsr-ECMUL-FKTH) scenario/PRC_FAILURE_KNOWN_TO_HUB) + (* (precompile-processing---nsr-ECMUL-FKTR) scenario/PRC_FAILURE_KNOWN_TO_RAM) + (* (precompile-processing---nsr-ECMUL-success) (scenario-shorthand---PRC---success)) + )) +;; ECMUL non stack rows shorthands +(defun (precompile-processing---nsr-ECMUL-FKTH) precompile-processing---nsr-standard-failure) +(defun (precompile-processing---nsr-ECMUL-FKTR) precompile-processing---nsr-standard-failure) +(defun (precompile-processing---nsr-ECMUL-success) precompile-processing---nsr-standard-success) ;; "" +;; ECMUL flag sum shorthands +(defun (precompile-processing---flag-sum-ECMUL-FKTH) (precompile-processing---flag-sum-standard-failure)) +(defun (precompile-processing---flag-sum-ECMUL-FKTR) (precompile-processing---flag-sum-standard-failure)) +(defun (precompile-processing---flag-sum-ECMUL-success) (precompile-processing---flag-sum-standard-success)) + + +;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; ECPAIRING ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;; + + +;; ECPAIRING flag sum +(defun (precompile-processing---2nd-half-flag-sum-for-ECPAIRING) + (+ (* (precompile-processing---flag-sum-ECPAIRING-FKTH) scenario/PRC_FAILURE_KNOWN_TO_HUB) + (* (precompile-processing---flag-sum-ECPAIRING-FKTR) scenario/PRC_FAILURE_KNOWN_TO_RAM) + (* (precompile-processing---flag-sum-ECPAIRING-success) (scenario-shorthand---PRC---success)) + )) +;; ECPAIRING non stack rows +(defun (precompile-processing---2nd-half-NSR-for-ECPAIRING) + (+ (* (precompile-processing---nsr-ECPAIRING-FKTH) scenario/PRC_FAILURE_KNOWN_TO_HUB) + (* (precompile-processing---nsr-ECPAIRING-FKTR) scenario/PRC_FAILURE_KNOWN_TO_RAM) + (* (precompile-processing---nsr-ECPAIRING-success) (scenario-shorthand---PRC---success)) + )) +;; ECPAIRING non stack rows shorthands +(defun (precompile-processing---nsr-ECPAIRING-FKTH) precompile-processing---nsr-standard-failure) +(defun (precompile-processing---nsr-ECPAIRING-FKTR) precompile-processing---nsr-standard-failure) +(defun (precompile-processing---nsr-ECPAIRING-success) precompile-processing---nsr-standard-success) ;; "" +;; ECPAIRING flag sum shorthands +(defun (precompile-processing---flag-sum-ECPAIRING-FKTH) (precompile-processing---flag-sum-standard-failure)) +(defun (precompile-processing---flag-sum-ECPAIRING-FKTR) (precompile-processing---flag-sum-standard-failure)) +(defun (precompile-processing---flag-sum-ECPAIRING-success) (precompile-processing---flag-sum-standard-success)) + + +;;;;;;;;;;;;;;;;;;; +;; ;; +;; BLAKE2f ;; +;; ;; +;;;;;;;;;;;;;;;;;;; + + +;; BLAKE2f flag sum +(defun (precompile-processing---2nd-half-flag-sum-for-BLAKE2f) + (+ (* (precompile-processing---flag-sum-BLAKE2f-FKTH) scenario/PRC_FAILURE_KNOWN_TO_HUB) + (* (precompile-processing---flag-sum-BLAKE2f-FKTR) scenario/PRC_FAILURE_KNOWN_TO_RAM) + (* (precompile-processing---flag-sum-BLAKE2f-success) (scenario-shorthand---PRC---success)) + )) +;; BLAKE2f non stack rows +(defun (precompile-processing---2nd-half-NSR-for-BLAKE2f) + (+ (* precompile-processing---nsr-standard-failure scenario/PRC_FAILURE_KNOWN_TO_HUB) + (* precompile-processing---nsr-BLAKE2f-FKTR scenario/PRC_FAILURE_KNOWN_TO_RAM) + (* precompile-processing---nsr-BLAKE2f-success (scenario-shorthand---PRC---success)) + )) +;; BLAKE2f non stack rows shorthands +(defconst + precompile-processing---nsr-BLAKE2f-FKTR 4 + precompile-processing---nsr-BLAKE2f-success 6 + ) +;; BLAKE2f flag sum shorthands +(defun (precompile-processing---flag-sum-BLAKE2f-FKTH) (precompile-processing---flag-sum-standard-failure)) +(defun (precompile-processing---flag-sum-BLAKE2f-FKTR) (+ (shift PEEK_AT_SCENARIO 0) + (shift PEEK_AT_MISCELLANEOUS 1) + (shift PEEK_AT_MISCELLANEOUS 2) + (shift PEEK_AT_CONTEXT 3) + )) +(defun (precompile-processing---flag-sum-BLAKE2f-success) (+ (shift PEEK_AT_SCENARIO 0) + (shift PEEK_AT_MISCELLANEOUS 1) + (shift PEEK_AT_MISCELLANEOUS 2) + (shift PEEK_AT_MISCELLANEOUS 3) + (shift PEEK_AT_MISCELLANEOUS 4) + (shift PEEK_AT_CONTEXT 5) + )) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; All BLS precompiles ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;; the full list of applicable precompiles is: +;; +;; - POINT_EVALUATION +;; - BLS_G1_ADD +;; - BLS_G1_MSM +;; - BLS_G2_ADD +;; - BLS_G2_MSM +;; - BLS_PAIRING_CHECK +;; - BLS_MAP_FP_TO_G1 +;; - BLS_MAP_FP2_TO_G2 + + +;; "all BLS" flag sum +(defun (precompile-processing---2nd-half-flag-sum-for-all-BLS-precompiles) + (+ (* (precompile-processing---flag-sum-all-BLS-FKTH) scenario/PRC_FAILURE_KNOWN_TO_HUB) + (* (precompile-processing---flag-sum-all-BLS-FKTR) scenario/PRC_FAILURE_KNOWN_TO_RAM) + (* (precompile-processing---flag-sum-all-BLS-success) (scenario-shorthand---PRC---success)) + )) +;; "all BLS" non stack rows +(defun (precompile-processing---2nd-half-NSR-for-all-BLS-precompiles) + (+ (* (precompile-processing---nsr-all-BLS-FKTH) scenario/PRC_FAILURE_KNOWN_TO_HUB) + (* (precompile-processing---nsr-all-BLS-FKTR) scenario/PRC_FAILURE_KNOWN_TO_RAM) + (* (precompile-processing---nsr-all-BLS-success) (scenario-shorthand---PRC---success)) + )) +;; "all BLS" non stack rows shorthands +(defun (precompile-processing---nsr-all-BLS-FKTH) precompile-processing---nsr-standard-failure) +(defun (precompile-processing---nsr-all-BLS-FKTR) precompile-processing---nsr-standard-failure) +(defun (precompile-processing---nsr-all-BLS-success) precompile-processing---nsr-standard-success) ;; "" +;; "all BLS" flag sum shorthands +(defun (precompile-processing---flag-sum-all-BLS-FKTH) (precompile-processing---flag-sum-standard-failure)) +(defun (precompile-processing---flag-sum-all-BLS-FKTR) (precompile-processing---flag-sum-standard-failure)) +(defun (precompile-processing---flag-sum-all-BLS-success) (precompile-processing---flag-sum-standard-success)) diff --git a/hub/osaka/constraints/instruction-handling/call/precompiles/blake/FKTH.lisp b/hub/osaka/constraints/instruction-handling/call/precompiles/blake/FKTH.lisp new file mode 100644 index 000000000..0fbc32fa7 --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/call/precompiles/blake/FKTH.lisp @@ -0,0 +1,25 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.Y CALL ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.22.5 The FAILURE_KNOWN_TO_HUB case ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defun (precompile-processing---BLAKE2f---FAILURE_KNOWN_TO_HUB) (* PEEK_AT_SCENARIO + scenario/PRC_BLAKE2f + scenario/PRC_FAILURE_KNOWN_TO_HUB)) + +(defconstraint precompile-processing---BLAKE2f---final-context-row-for-failure-known-to-HUB + (:guard (precompile-processing---BLAKE2f---FAILURE_KNOWN_TO_HUB)) + (nonexecution-provides-empty-return-data precompile-processing---BLAKE2f---context-row-offset---squashing-caller-return-data-for-FKTH)) diff --git a/hub/osaka/constraints/instruction-handling/call/precompiles/blake/FKTR.lisp b/hub/osaka/constraints/instruction-handling/call/precompiles/blake/FKTR.lisp new file mode 100644 index 000000000..88be5c288 --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/call/precompiles/blake/FKTR.lisp @@ -0,0 +1,25 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.Y CALL ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.22.5 The FAILURE_KNOWN_TO_RAM case ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defun (precompile-processing---BLAKE2f---FAILURE_KNOWN_TO_RAM) (* PEEK_AT_SCENARIO + scenario/PRC_BLAKE2f + scenario/PRC_FAILURE_KNOWN_TO_RAM)) + +(defconstraint precompile-processing---BLAKE2f---final-context-row-for-failure-known-to-RAM + (:guard (precompile-processing---BLAKE2f---FAILURE_KNOWN_TO_RAM)) + (nonexecution-provides-empty-return-data precompile-processing---BLAKE2f---context-row-offset---squashing-caller-return-data-for-FKTR)) diff --git a/hub/osaka/constraints/instruction-handling/call/precompiles/blake/constants.lisp b/hub/osaka/constraints/instruction-handling/call/precompiles/blake/constants.lisp new file mode 100644 index 000000000..41ceb9a2f --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/call/precompiles/blake/constants.lisp @@ -0,0 +1,12 @@ +(module hub) + +(defconst + precompile-processing---BLAKE2f---misc-row-offset---BLAKE-parameter-extraction 1 + precompile-processing---BLAKE2f---misc-row-offset---BLAKE-call-data-extraction 2 + precompile-processing---BLAKE2f---misc-row-offset---BLAKE-return-data-full-transfer 3 + precompile-processing---BLAKE2f---misc-row-offset---BLAKE-partial-return-data-copy 4 + ;; + precompile-processing---BLAKE2f---context-row-offset---squashing-caller-return-data-for-FKTH 2 + precompile-processing---BLAKE2f---context-row-offset---squashing-caller-return-data-for-FKTR 3 + precompile-processing---BLAKE2f---context-row-offset---updating-caller-return-data 5 + ) diff --git a/hub/osaka/constraints/instruction-handling/call/precompiles/blake/generalities.lisp b/hub/osaka/constraints/instruction-handling/call/precompiles/blake/generalities.lisp new file mode 100644 index 000000000..d058fcf13 --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/call/precompiles/blake/generalities.lisp @@ -0,0 +1,91 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.Y CALL ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.22 BLAKE2fCMUL ;; +;; X.Y.22.1 Introduction ;; +;; X.Y.22.2 Representation ;; +;; X.Y.22.3 Generalities ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;; +;; Shorthands ;; +;;;;;;;;;;;;;;;; + + +(defun (precompile-processing---BLAKE2f---standard-precondition) (* PEEK_AT_SCENARIO scenario/PRC_BLAKE2f)) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Miscellaneous-row i + 1 ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstraint precompile-processing---BLAKE2f---setting-MISC-flags + (:guard (precompile-processing---BLAKE2f---standard-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (begin + (eq! (weighted-MISC-flag-sum-sans-MMU precompile-processing---BLAKE2f---misc-row-offset---BLAKE-parameter-extraction) MISC_WEIGHT_OOB) + (eq! (shift misc/MMU_FLAG precompile-processing---BLAKE2f---misc-row-offset---BLAKE-parameter-extraction) (precompile-processing---BLAKE2f---OOB-hub-success)) + )) + +(defconstraint precompile-processing---BLAKE2f---setting-first-OOB-instruction + (:guard (precompile-processing---BLAKE2f---standard-precondition)) + (set-OOB-instruction---blake-cds precompile-processing---BLAKE2f---misc-row-offset---BLAKE-parameter-extraction ;; offset + (precompile-processing---dup-cds) ;; call data size + (precompile-processing---dup-r@c) ;; return at capacity + )) + + +(defconstraint precompile-processing---BLAKE2f---setting-FAILURE_KNOWN_TO_HUB + (:guard (precompile-processing---BLAKE2f---standard-precondition)) + (eq! scenario/PRC_FAILURE_KNOWN_TO_HUB + (- 1 (precompile-processing---BLAKE2f---OOB-hub-success)))) + +(defconstraint precompile-processing---BLAKE2f---setting-the-MMU-instruction---parameter-instruction + (:guard (precompile-processing---BLAKE2f---standard-precondition)) + (if-not-zero (shift misc/MMU_FLAG precompile-processing---BLAKE2f---misc-row-offset---BLAKE-parameter-extraction) + (set-MMU-instruction---blake precompile-processing---BLAKE2f---misc-row-offset---BLAKE-parameter-extraction ;; offset + CONTEXT_NUMBER ;; source ID + (+ 1 HUB_STAMP) ;; target ID + ;; aux_id ;; auxiliary ID + ;; src_offset_hi ;; source offset high + (precompile-processing---dup-cdo) ;; source offset low + ;; tgt_offset_lo ;; target offset low + ;; size ;; size + ;; ref_offset ;; reference offset + ;; ref_size ;; reference size + ;; (scenario-shorthand---PRC---success) ;; success bit + ;; limb_1 ;; limb 1 + ;; limb_2 ;; limb 2 + ;; exo_sum ;; weighted exogenous module flag sum + ;; phase ;; phase + ))) + +(defconstraint precompile-processing---BLAKE2f---constraining-the-call-success + (:guard (precompile-processing---BLAKE2f---standard-precondition)) + (if-not-zero (shift misc/MMU_FLAG precompile-processing---BLAKE2f---misc-row-offset---BLAKE-parameter-extraction) + (eq! (shift misc/MMU_SUCCESS_BIT precompile-processing---BLAKE2f---misc-row-offset---BLAKE-parameter-extraction) + (scenario-shorthand---PRC---success)))) + + +;;;;;;;;;;;;;;;;;;;;; +;; More shorthands ;; +;;;;;;;;;;;;;;;;;;;;; + + +(defun (precompile-processing---BLAKE2f---r-parameter) (shift misc/MMU_LIMB_1 precompile-processing---BLAKE2f---misc-row-offset---BLAKE-parameter-extraction)) +(defun (precompile-processing---BLAKE2f---f-parameter) (shift misc/MMU_LIMB_2 precompile-processing---BLAKE2f---misc-row-offset---BLAKE-parameter-extraction)) +(defun (precompile-processing---BLAKE2f---OOB-hub-success) (shift [misc/OOB_DATA 4] precompile-processing---BLAKE2f---misc-row-offset---BLAKE-parameter-extraction)) +(defun (precompile-processing---BLAKE2f---OOB-r@c-nonzero) (shift [misc/OOB_DATA 8] precompile-processing---BLAKE2f---misc-row-offset---BLAKE-parameter-extraction)) diff --git a/hub/osaka/constraints/instruction-handling/call/precompiles/blake/success.lisp b/hub/osaka/constraints/instruction-handling/call/precompiles/blake/success.lisp new file mode 100644 index 000000000..421663aca --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/call/precompiles/blake/success.lisp @@ -0,0 +1,97 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.Y CALL ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.22.5 The SUCCESS case ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defun (precompile-processing---BLAKE2f---success) (* PEEK_AT_SCENARIO + scenario/PRC_BLAKE2f + (scenario-shorthand---PRC---success))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Miscellaneous-row i + 3 ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstraint precompile-processing---BLAKE2f---setting-MISC-flags---full-return-data-transfer + (:guard (precompile-processing---BLAKE2f---success)) + (eq! (weighted-MISC-flag-sum precompile-processing---BLAKE2f---misc-row-offset---BLAKE-return-data-full-transfer) + MISC_WEIGHT_MMU)) + + +(defconstraint precompile-processing---BLAKE2f---setting-MMU-instruction---full-return-data-transfer + (:guard (precompile-processing---BLAKE2f---success)) + (set-MMU-instruction---exo-to-ram-transplants precompile-processing---BLAKE2f---misc-row-offset---BLAKE-return-data-full-transfer ;; offset + (+ 1 HUB_STAMP) ;; source ID + (+ 1 HUB_STAMP) ;; target ID + ;; aux_id ;; auxiliary ID + ;; src_offset_hi ;; source offset high + ;; src_offset_lo ;; source offset low + ;; tgt_offset_lo ;; target offset low + 64 ;; size + ;; ref_offset ;; reference offset + ;; ref_size ;; reference size + ;; success_bit ;; success bit + ;; limb_1 ;; limb 1 + ;; limb_2 ;; limb 2 + EXO_SUM_WEIGHT_BLAKEMODEXP ;; weighted exogenous module flag sum + PHASE_BLAKE_RESULT ;; phase + )) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Miscellaneous-row i + 4 ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstraint precompile-processing---BLAKE2f---setting-MISC-flags---partial-return-data-copy + (:guard (precompile-processing---BLAKE2f---success)) + (eq! (weighted-MISC-flag-sum precompile-processing---BLAKE2f---misc-row-offset---BLAKE-partial-return-data-copy) + (* MISC_WEIGHT_MMU (precompile-processing---BLAKE2f---OOB-r@c-nonzero)))) + +(defconstraint precompile-processing---BLAKE2f---setting-MMU-instruction---partial-return-data-copy + (:guard (precompile-processing---BLAKE2f---success)) + (if-not-zero (shift misc/MMU_FLAG precompile-processing---BLAKE2f---misc-row-offset---BLAKE-partial-return-data-copy) + (set-MMU-instruction---ram-to-ram-sans-padding precompile-processing---BLAKE2f---misc-row-offset---BLAKE-partial-return-data-copy ;; offset + (+ 1 HUB_STAMP) ;; source ID + CONTEXT_NUMBER ;; target ID + ;; aux_id ;; auxiliary ID + ;; src_offset_hi ;; source offset high + 0 ;; source offset low + ;; tgt_offset_lo ;; target offset low + 64 ;; size + (precompile-processing---dup-r@o) ;; reference offset + (precompile-processing---dup-r@c) ;; reference size + ;; success_bit ;; success bit + ;; limb_1 ;; limb 1 + ;; limb_2 ;; limb 2 + ;; exo_sum ;; weighted exogenous module flag sum + ;; phase ;; phase + ))) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Miscellaneous-row i + 5 ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstraint precompile-processing---BLAKE2f---success---squashing-caller-return-data + (:guard (precompile-processing---BLAKE2f---success)) + (provide-return-data precompile-processing---BLAKE2f---context-row-offset---updating-caller-return-data ;; row offset + CONTEXT_NUMBER ;; receiver context + (+ 1 HUB_STAMP) ;; source IDr context + 0 ;; rdo + 64 ;; rds + )) diff --git a/hub/osaka/constraints/instruction-handling/call/precompiles/blake/surviving_the_hub.lisp b/hub/osaka/constraints/instruction-handling/call/precompiles/blake/surviving_the_hub.lisp new file mode 100644 index 000000000..a2bb47ab5 --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/call/precompiles/blake/surviving_the_hub.lisp @@ -0,0 +1,78 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.Y CALL ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.22.5 Surviving the HUB ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Miscellaneous-row i + 2 ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defun (precompile-processing---BLAKE2f---surviving-the-HUB) (* PEEK_AT_SCENARIO + scenario/PRC_BLAKE2f + (- 1 scenario/PRC_FAILURE_KNOWN_TO_HUB))) + + +(defconstraint precompile-processing---BLAKE2f---setting-second-MISC-flags + (:guard (precompile-processing---BLAKE2f---surviving-the-HUB)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (begin + (eq! (weighted-MISC-flag-sum-sans-MMU precompile-processing---BLAKE2f---misc-row-offset---BLAKE-call-data-extraction) MISC_WEIGHT_OOB) + (eq! (shift misc/MMU_FLAG precompile-processing---BLAKE2f---misc-row-offset---BLAKE-call-data-extraction) (precompile-processing---BLAKE2f---OOB-ram-success)) + )) + + +(defconstraint precompile-processing---BLAKE2f---setting-the-second-OOB-instruction + (:guard (precompile-processing---BLAKE2f---surviving-the-HUB)) + (set-OOB-instruction---blake-params precompile-processing---BLAKE2f---misc-row-offset---BLAKE-call-data-extraction ;; offset + (precompile-processing---dup-call-gas) ;; call gas i.e. gas provided to the precompile + (precompile-processing---BLAKE2f---r-parameter) ;; rounds parameter of the call data of BLAKE2f + (precompile-processing---BLAKE2f---f-parameter) ;; f parameter of the call data of BLAKE2f ("final block indicator") + )) + +(defconstraint precompile-processing---BLAKE2f---setting-the-second-MMU-instruction + (:guard (precompile-processing---BLAKE2f---surviving-the-HUB)) + (if-not-zero (shift misc/MMU_FLAG precompile-processing---BLAKE2f---misc-row-offset---BLAKE-call-data-extraction) + (set-MMU-instruction---ram-to-exo-with-padding precompile-processing---BLAKE2f---misc-row-offset---BLAKE-call-data-extraction ;; offset + CONTEXT_NUMBER + (+ 1 HUB_STAMP) ;; target ID + 0 ;; auxiliary ID + ;; src_offset_hi ;; source offset high + (+ (precompile-processing---dup-cdo) 4) ;; source offset low + ;; tgt_offset_lo ;; target offset low + 208 ;; size + ;; ref_offset ;; reference offset + 208 ;; reference size + 0 ;; success bit + ;; limb_1 ;; limb 1 + ;; limb_2 ;; limb 2 + EXO_SUM_WEIGHT_BLAKEMODEXP ;; weighted exogenous module flag sum + PHASE_BLAKE_DATA ;; phase + ))) + +(defconstraint precompile-processing---BLAKE2f---setting-FAILURE_KNOWN_TO_RAM + (:guard (precompile-processing---BLAKE2f---surviving-the-HUB)) + (begin + (eq! (scenario-shorthand---PRC---success) (precompile-processing---BLAKE2f---OOB-ram-success)) + (eq! scenario/PRC_FAILURE_KNOWN_TO_RAM (- 1 (precompile-processing---BLAKE2f---OOB-ram-success))))) + +(defconstraint precompile-processing---BLAKE2f---justifying-the-return-gas-prediction + (:guard (precompile-processing---BLAKE2f---surviving-the-HUB)) + (eq! (precompile-processing---prd-return-gas) + (* (scenario-shorthand---PRC---success) (precompile-processing---BLAKE2f---OOB-return-gas)))) + +(defun (precompile-processing---BLAKE2f---OOB-ram-success) (shift [misc/OOB_DATA 4] precompile-processing---BLAKE2f---misc-row-offset---BLAKE-call-data-extraction)) +(defun (precompile-processing---BLAKE2f---OOB-return-gas) (shift [misc/OOB_DATA 5] precompile-processing---BLAKE2f---misc-row-offset---BLAKE-call-data-extraction)) diff --git a/hub/osaka/constraints/instruction-handling/call/precompiles/common/FKTH.lisp b/hub/osaka/constraints/instruction-handling/call/precompiles/common/FKTH.lisp new file mode 100644 index 000000000..d21f6765c --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/call/precompiles/common/FKTH.lisp @@ -0,0 +1,24 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.Y CALL ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.Z.4 The  PRC/FAILURE_KNOWN_TO_HUB case ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defun (precompile-processing---common---FKTH-precondition) (* PEEK_AT_SCENARIO + (scenario-shorthand---PRC---common-address-bit-sum) + scenario/PRC_FAILURE_KNOWN_TO_HUB)) + +(defconstraint precompile-processing---common---setting-the-context-row-FKTH-case (:guard (precompile-processing---common---FKTH-precondition)) + (nonexecution-provides-empty-return-data precompile-processing---common---context-row-FKTH---row-offset)) diff --git a/hub/osaka/constraints/instruction-handling/call/precompiles/common/constants.lisp b/hub/osaka/constraints/instruction-handling/call/precompiles/common/constants.lisp new file mode 100644 index 000000000..7ae6683ae --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/call/precompiles/common/constants.lisp @@ -0,0 +1,18 @@ +(module hub) + + +(defconst + ;; common precompile constants + precompile-processing---common---1st-misc-row---row-offset 1 + precompile-processing---common---2nd-misc-row---row-offset 2 + precompile-processing---common---3rd-misc-row---row-offset 3 + + precompile-processing---common---context-row-FKTH---row-offset 2 + precompile-processing---common---context-row-success---row-offset 4 + + ;; IDENTITY specific constants + precompile-processing---IDENTITY---2nd-misc-row---row-offset 2 + + precompile-processing---IDENTITY---context-row-success---row-offset 3 + + ) diff --git a/hub/osaka/constraints/instruction-handling/call/precompiles/common/generalities.lisp b/hub/osaka/constraints/instruction-handling/call/precompiles/common/generalities.lisp new file mode 100644 index 000000000..f9652effc --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/call/precompiles/common/generalities.lisp @@ -0,0 +1,220 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.Y CALL ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.Z.1 Introduction ;; +;; X.Y.Z.2 Representation ;; +;; X.Y.Z.3 Generalities ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defun (precompile-processing---common---precondition) (force-bin (* PEEK_AT_SCENARIO + (scenario-shorthand---PRC---common-address-bit-sum)))) + + +(defconstraint precompile-processing---common---setting-MISC-module-flags + (:guard (precompile-processing---common---precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (begin + (eq! (weighted-MISC-flag-sum-sans-MMU 1) MISC_WEIGHT_OOB) + (eq! (shift misc/MMU_FLAG 1) (precompile-processing---common---OOB-extract-call-data)) + )) + +(defconstraint precompile-processing---common---setting-OOB-instruction (:guard (precompile-processing---common---precondition)) + (set-OOB-instruction---common precompile-processing---common---1st-misc-row---row-offset ;; offset + (precompile-processing---common---OOB-instruction) ;; relevant OOB instruction + (precompile-processing---dup-call-gas) ;; call gas i.e. gas provided to the precompile + (precompile-processing---dup-cds) ;; call data size + (precompile-processing---dup-r@c) ;; return at capacity + ) + ) + +(defun (precompile-processing---common---OOB-instruction) + (+ (* OOB_INST_ECRECOVER scenario/PRC_ECRECOVER ) + (* OOB_INST_SHA2 scenario/PRC_SHA2-256 ) + (* OOB_INST_RIPEMD scenario/PRC_RIPEMD-160 ) + (* OOB_INST_IDENTITY scenario/PRC_IDENTITY ) + (* OOB_INST_ECADD scenario/PRC_ECADD ) + (* OOB_INST_ECMUL scenario/PRC_ECMUL ) + (* OOB_INST_ECPAIRING scenario/PRC_ECPAIRING ) + (* OOB_INST_POINT_EVALUATION scenario/PRC_POINT_EVALUATION ) + (* OOB_INST_BLS_G1_ADD scenario/PRC_BLS_G1_ADD ) + (* OOB_INST_BLS_G1_MSM scenario/PRC_BLS_G1_MSM ) + (* OOB_INST_BLS_G2_ADD scenario/PRC_BLS_G2_ADD ) + (* OOB_INST_BLS_G2_MSM scenario/PRC_BLS_G2_MSM ) + (* OOB_INST_BLS_PAIRING_CHECK scenario/PRC_BLS_PAIRING_CHECK ) + (* OOB_INST_BLS_MAP_FP_TO_G1 scenario/PRC_BLS_MAP_FP_TO_G1 ) + (* OOB_INST_BLS_MAP_FP2_TO_G2 scenario/PRC_BLS_MAP_FP2_TO_G2 ) + )) + + + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; OOB related shorthands ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (precompile-processing---common---OOB-hub-success) (shift [misc/OOB_DATA 4] precompile-processing---common---1st-misc-row---row-offset)) +(defun (precompile-processing---common---OOB-return-gas) (shift [misc/OOB_DATA 5] precompile-processing---common---1st-misc-row---row-offset)) +(defun (precompile-processing---common---OOB-extract-call-data) (shift [misc/OOB_DATA 6] precompile-processing---common---1st-misc-row---row-offset)) +(defun (precompile-processing---common---OOB-empty-call-data) (shift [misc/OOB_DATA 7] precompile-processing---common---1st-misc-row---row-offset)) +(defun (precompile-processing---common---OOB-r@c-nonzero) (shift [misc/OOB_DATA 8] precompile-processing---common---1st-misc-row---row-offset)) ;; "" + +(defproperty precompile-processing---common---sanity-checks-for-BLS-precompiles + (if-not-zero (precompile-processing---common---precondition) + (if-not-zero (scenario-shorthand---PRC---common-BLS-address-bit-sum) + (begin + (eq! (precompile-processing---common---OOB-extract-call-data) + (precompile-processing---common---OOB-hub-success)) + (eq! (precompile-processing---common---OOB-empty-call-data) + 0) + )))) + +(defconstraint precompile-processing---common---setting-MMU-instruction (:guard (precompile-processing---common---precondition)) + (if-not-zero (shift misc/MMU_FLAG precompile-processing---common---1st-misc-row---row-offset) + (begin + (if-not-zero scenario/PRC_IDENTITY + (set-MMU-instruction---ram-to-ram-sans-padding precompile-processing---common---1st-misc-row---row-offset ;; offset + CONTEXT_NUMBER ;; source ID + (+ 1 HUB_STAMP) ;; target ID + ;; aux_id ;; auxiliary ID + ;; src_offset_hi ;; source offset high + (precompile-processing---dup-cdo) ;; source offset low + ;; tgt_offset_lo ;; target offset low + (precompile-processing---dup-cds) ;; size + 0 ;; reference offset + (precompile-processing---dup-cds) ;; reference size + ;; success_bit ;; success bit + ;; limb_1 ;; limb 1 + ;; limb_2 ;; limb 2 + ;; exo_sum ;; weighted exogenous module flag sum + ;; phase ;; phase + )) + (if-not-zero (scenario-shorthand---PRC---common-except-identity-address-bit-sum) + (set-MMU-instruction---ram-to-exo-with-padding precompile-processing---common---1st-misc-row---row-offset ;; offset + CONTEXT_NUMBER ;; source ID + (+ 1 HUB_STAMP) ;; target ID + 0 ;; auxiliary ID (here: ∅) + ;; src_offset_hi ;; source offset high + (precompile-processing---dup-cdo) ;; source offset low + ;; tgt_offset_lo ;; target offset low + (precompile-processing---dup-cds) ;; size + ;; ref_offset ;; reference offset + (precompile-processing---common---MMU-reference-size) ;; reference size + (precompile-processing---common---MMU-success-bit) ;; success bit (TODO: ugly self referential constraint ...) + ;; limb_1 ;; limb 1 + ;; limb_2 ;; limb 2 + (precompile-processing---common---MMU-exo-sum) ;; weighted exogenous module flag sum + (precompile-processing---common---MMU-phase) ;; phase + )) + ) + )) + +(defun (precompile-processing---common---MMU-success-bit) + (shift misc/MMU_SUCCESS_BIT precompile-processing---common---1st-misc-row---row-offset)) + +(defun (precompile-processing---common---MMU-reference-size) + (+ (* 128 scenario/PRC_ECRECOVER ) + (* (precompile-processing---dup-cds) scenario/PRC_SHA2-256 ) + (* (precompile-processing---dup-cds) scenario/PRC_RIPEMD-160 ) + (* 128 scenario/PRC_ECADD ) + (* 96 scenario/PRC_ECMUL ) + (* (precompile-processing---dup-cds) scenario/PRC_ECPAIRING ) + (* (precompile-processing---dup-cds) (scenario-shorthand---PRC---common-BLS-address-bit-sum) ) + )) + +(defun (precompile-processing---common---MMU-exo-sum) + (+ (* EXO_SUM_WEIGHT_ECDATA scenario/PRC_ECRECOVER ) + (* EXO_SUM_WEIGHT_RIPSHA scenario/PRC_SHA2-256 ) + (* EXO_SUM_WEIGHT_RIPSHA scenario/PRC_RIPEMD-160 ) + (* EXO_SUM_WEIGHT_ECDATA scenario/PRC_ECADD ) + (* EXO_SUM_WEIGHT_ECDATA scenario/PRC_ECMUL ) + (* EXO_SUM_WEIGHT_ECDATA scenario/PRC_ECPAIRING ) + (* EXO_SUM_WEIGHT_BLSDATA (scenario-shorthand---PRC---common-BLS-address-bit-sum) ) + )) + +(defun (precompile-processing---common---MMU-phase) + (+ (* PHASE_ECRECOVER_DATA scenario/PRC_ECRECOVER ) + (* PHASE_SHA2_DATA scenario/PRC_SHA2-256 ) + (* PHASE_RIPEMD_DATA scenario/PRC_RIPEMD-160 ) + (* PHASE_ECADD_DATA scenario/PRC_ECADD ) + (* PHASE_ECMUL_DATA scenario/PRC_ECMUL ) + (* PHASE_ECPAIRING_DATA scenario/PRC_ECPAIRING ) + (* PHASE_POINT_EVALUATION_DATA scenario/PRC_POINT_EVALUATION ) + (* PHASE_BLS_G1_ADD_DATA scenario/PRC_BLS_G1_ADD ) + (* PHASE_BLS_G1_MSM_DATA scenario/PRC_BLS_G1_MSM ) + (* PHASE_BLS_G2_ADD_DATA scenario/PRC_BLS_G2_ADD ) + (* PHASE_BLS_G2_MSM_DATA scenario/PRC_BLS_G2_MSM ) + (* PHASE_BLS_PAIRING_CHECK_DATA scenario/PRC_BLS_PAIRING_CHECK ) + (* PHASE_BLS_MAP_FP_TO_G1_DATA scenario/PRC_BLS_MAP_FP_TO_G1 ) + (* PHASE_BLS_MAP_FP2_TO_G2_DATA scenario/PRC_BLS_MAP_FP2_TO_G2 ) + )) + +;; ECRECOVER related shorthands +(defun (precompile-processing---common---address-recovery-failure) + (+ (precompile-processing---common---OOB-empty-call-data) + (* (precompile-processing---common---OOB-extract-call-data) + (- 1 (precompile-processing---common---MMU-success-bit))))) +(defun (precompile-processing---common---address-recovery-success) + (* (precompile-processing---common---OOB-extract-call-data) + (precompile-processing---common---MMU-success-bit))) + +;; ECADD, ECMUL and ECPAIRING related shorthands +(defun (precompile-processing---common---malformed-data) (* (precompile-processing---common---OOB-extract-call-data) + (- 1 (precompile-processing---common---MMU-success-bit)))) +(defun (precompile-processing---common---wellformed-data) (+ (precompile-processing---common---OOB-empty-call-data) + (* (precompile-processing---common---OOB-extract-call-data) + (precompile-processing---common---MMU-success-bit)))) + + +;; (defconstraint precompile-processing---common---debug-constraints-for-address-recovery (:guard (precompile-processing---common---precondition))) +;; (defconstraint precompile-processing---common---debug-constraints-for-data-integrity (:guard (precompile-processing---common---precondition))) +;; (defconstraint precompile-processing---common---debug-constraints-for-automatic-success-bit-vanishing (:guard (precompile-processing---common---precondition))) + +(defconstraint precompile-processing---common---justifying-success-scenario (:guard (precompile-processing---common---precondition)) + (eq! (scenario-shorthand---PRC---success) + (+ (* (precompile-processing---common---OOB-hub-success) + (+ scenario/PRC_ECRECOVER + scenario/PRC_SHA2-256 + scenario/PRC_RIPEMD-160 + scenario/PRC_IDENTITY + )) + (* (precompile-processing---common---wellformed-data) + (+ scenario/PRC_ECADD + scenario/PRC_ECMUL + scenario/PRC_ECPAIRING + (scenario-shorthand---PRC---common-BLS-address-bit-sum) + )) + ))) + +(defconstraint precompile-processing---common---justifying-FAILURE_KNOWN_TO_HUB (:guard (precompile-processing---common---precondition)) + (eq! scenario/PRC_FAILURE_KNOWN_TO_HUB + (- 1 (precompile-processing---common---OOB-hub-success)))) + +(defconstraint precompile-processing---common---justifying-FAILURE_KNOWN_TO_RAM (:guard (precompile-processing---common---precondition)) + (eq! scenario/PRC_FAILURE_KNOWN_TO_RAM + (* (precompile-processing---common---malformed-data) + (+ scenario/PRC_ECADD + scenario/PRC_ECMUL + scenario/PRC_ECPAIRING + (scenario-shorthand---PRC---common-BLS-address-bit-sum) + )))) + +(defconstraint precompile-processing---common---justifying-return-gas-prediction (:guard (precompile-processing---common---precondition)) + (begin + (if-not-zero (scenario-shorthand---PRC---failure) + (vanishes! (precompile-processing---prd-return-gas))) + (if-not-zero (scenario-shorthand---PRC---success) + (eq! (precompile-processing---prd-return-gas) + (precompile-processing---common---OOB-return-gas))) + )) diff --git a/hub/osaka/constraints/instruction-handling/call/precompiles/common/success_ECRECOVER.lisp b/hub/osaka/constraints/instruction-handling/call/precompiles/common/success_ECRECOVER.lisp new file mode 100644 index 000000000..10033183c --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/call/precompiles/common/success_ECRECOVER.lisp @@ -0,0 +1,79 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.Y CALL ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.Z.5 The  PRC/ECRECOVER success case ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defun (precompile-processing---ECRECOVER---success-precondition) (* PEEK_AT_SCENARIO + scenario/PRC_ECRECOVER + (scenario-shorthand---PRC---success))) + +(defconstraint precompile-processing---ECRECOVER-success---2nd-misc-row---setting-module-flags (:guard (precompile-processing---ECRECOVER---success-precondition)) + (eq! (weighted-MISC-flag-sum precompile-processing---common---2nd-misc-row---row-offset) + (* MISC_WEIGHT_MMU (precompile-processing---common---address-recovery-success)))) + +(defconstraint precompile-processing---ECRECOVER-success---2nd-misc-row---setting-MMU-instruction (:guard (precompile-processing---ECRECOVER---success-precondition)) + (if-not-zero (shift misc/MMU_FLAG precompile-processing---common---2nd-misc-row---row-offset) + (set-MMU-instruction---exo-to-ram-transplants precompile-processing---common---2nd-misc-row---row-offset ;; offset + (+ 1 HUB_STAMP) ;; source ID + (+ 1 HUB_STAMP) ;; target ID + ;; aux_id ;; auxiliary ID + ;; src_offset_hi ;; source offset high + ;; src_offset_lo ;; source offset low + ;; tgt_offset_lo ;; target offset low + 32 ;; size + ;; ref_offset ;; reference offset + ;; ref_size ;; reference size + ;; success_bit ;; success bit + ;; limb_1 ;; limb 1 + ;; limb_2 ;; limb 2 + EXO_SUM_WEIGHT_ECDATA ;; weighted exogenous module flag sum + PHASE_ECRECOVER_RESULT ;; phase + ))) + +(defconstraint precompile-processing---ECRECOVER-success---3rd-misc-row---setting-module-flags (:guard (precompile-processing---ECRECOVER---success-precondition)) + (eq! (weighted-MISC-flag-sum precompile-processing---common---3rd-misc-row---row-offset) + (* MISC_WEIGHT_MMU + (precompile-processing---common---address-recovery-success) + (precompile-processing---common---OOB-r@c-nonzero) + ))) + +(defconstraint precompile-processing---ECRECOVER-success---3rd-misc-row---setting-MMU-instruction (:guard (precompile-processing---ECRECOVER---success-precondition)) + (if-not-zero (shift misc/MMU_FLAG precompile-processing---common---3rd-misc-row---row-offset) + (set-MMU-instruction---ram-to-ram-sans-padding precompile-processing---common---3rd-misc-row---row-offset ;; offset + (+ 1 HUB_STAMP) ;; source ID + CONTEXT_NUMBER + ;; aux_id ;; auxiliary ID + ;; src_offset_hi ;; source offset high + 0 ;; source offset low + ;; tgt_offset_lo ;; target offset low + 32 ;; size + (precompile-processing---dup-r@o) ;; reference offset + (precompile-processing---dup-r@c) ;; reference size + ;; success_bit ;; success bit + ;; limb_1 ;; limb 1 + ;; limb_2 ;; limb 2 + ;; exo_sum ;; weighted exogenous module flag sum + ;; phase ;; phase + ) + )) + +(defconstraint precompile-processing---ECRECOVER-success---updating-return-data (:guard (precompile-processing---ECRECOVER---success-precondition)) + (provide-return-data precompile-processing---common---context-row-success---row-offset ;; row offset + CONTEXT_NUMBER ;; receiver context + (+ 1 HUB_STAMP) ;; provider context + 0 ;; rdo + (* 32 (precompile-processing---common---address-recovery-success)) ;; rds + )) diff --git a/hub/osaka/constraints/instruction-handling/call/precompiles/common/success_IDENTITY.lisp b/hub/osaka/constraints/instruction-handling/call/precompiles/common/success_IDENTITY.lisp new file mode 100644 index 000000000..387aaee97 --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/call/precompiles/common/success_IDENTITY.lisp @@ -0,0 +1,57 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.Y CALL ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.Z.5 The  PRC/IDENTITY success case ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defun (precompile-processing---IDENTITY---success-precondition) (* PEEK_AT_SCENARIO + scenario/PRC_IDENTITY + (scenario-shorthand---PRC---success))) + + +(defconstraint precompile-processing---IDENTITY-success---2nd-misc-row---setting-module-flags (:guard (precompile-processing---IDENTITY---success-precondition)) + (eq! (weighted-MISC-flag-sum precompile-processing---IDENTITY---2nd-misc-row---row-offset) + (* MISC_WEIGHT_MMU + (precompile-processing---common---OOB-extract-call-data) + (precompile-processing---common---OOB-r@c-nonzero) + ))) + +(defconstraint precompile-processing---IDENTITY-success---2nd-misc-row---setting-MMU-instruction (:guard (precompile-processing---IDENTITY---success-precondition)) + (if-not-zero (shift misc/MMU_FLAG precompile-processing---IDENTITY---2nd-misc-row---row-offset) + (set-MMU-instruction---ram-to-ram-sans-padding precompile-processing---IDENTITY---2nd-misc-row---row-offset ;; offset + (+ 1 HUB_STAMP) ;; source ID + CONTEXT_NUMBER ;; target ID + ;; aux_id ;; auxiliary ID + ;; src_offset_hi ;; source offset high + 0 ;; source offset low + ;; tgt_offset_lo ;; target offset low + (precompile-processing---dup-cds) ;; size + (precompile-processing---dup-r@o) ;; reference offset + (precompile-processing---dup-r@c) ;; reference size + ;; success_bit ;; success bit + ;; limb_1 ;; limb 1 + ;; limb_2 ;; limb 2 + ;; exo_sum ;; weighted exogenous module flag sum + ;; phase ;; phase + ) + )) + +(defconstraint precompile-processing---IDENTITY-success---updating-return-data (:guard (precompile-processing---IDENTITY---success-precondition)) + (provide-return-data precompile-processing---IDENTITY---context-row-success---row-offset ;; row offset + CONTEXT_NUMBER ;; receiver context + (+ 1 HUB_STAMP) ;; provider context + 0 ;; rdo + (precompile-processing---dup-cds) ;; rds + )) diff --git a/hub/osaka/constraints/instruction-handling/call/precompiles/common/success_SHA2-RIPEMD.lisp b/hub/osaka/constraints/instruction-handling/call/precompiles/common/success_SHA2-RIPEMD.lisp new file mode 100644 index 000000000..74e64c287 --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/call/precompiles/common/success_SHA2-RIPEMD.lisp @@ -0,0 +1,107 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.Y CALL ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.Z.5 The  PRC/SHA2-256 and  PRC/RIPEMD-160 success case ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defun (precompile-processing---SHA2-and-RIPEMD---success-precondition) (* PEEK_AT_SCENARIO + (+ scenario/PRC_SHA2-256 + scenario/PRC_RIPEMD-160) + (scenario-shorthand---PRC---success))) + +(defconstraint precompile-processing---SHA2-and-RIPEMD---success---2nd-misc-row---setting-module-flags (:guard (precompile-processing---SHA2-and-RIPEMD---success-precondition)) + (eq! (weighted-MISC-flag-sum precompile-processing---common---2nd-misc-row---row-offset) + MISC_WEIGHT_MMU)) + +(defconstraint precompile-processing---SHA2-and-RIPEMD---success---2nd-misc-row---setting-MMU-instruction (:guard (precompile-processing---SHA2-and-RIPEMD---success-precondition)) + (begin + (if-not-zero (precompile-processing---common---OOB-empty-call-data) + (set-MMU-instruction---mstore precompile-processing---common---2nd-misc-row---row-offset ;; offset + ;; src_id ;; source ID + (+ 1 HUB_STAMP) ;; target ID + ;; aux_id ;; auxiliary ID + ;; src_offset_hi ;; source offset high + ;; src_offset_lo ;; source offset low + 0 ;; target offset low + ;; size ;; size + ;; ref_offset ;; reference offset + ;; ref_size ;; reference size + ;; success_bit ;; success bit + (precompile-processing---SHA2-and-RIPEMD---relevant-empty-hash-hi) ;; limb 1 + (precompile-processing---SHA2-and-RIPEMD---relevant-empty-hash-lo) ;; limb 2 + ;; exo_sum ;; weighted exogenous module flag sum + ;; phase ;; phase + )) + (if-not-zero (precompile-processing---common---OOB-extract-call-data) + (set-MMU-instruction---exo-to-ram-transplants precompile-processing---common---2nd-misc-row---row-offset ;; offset + (+ 1 HUB_STAMP) ;; source ID + (+ 1 HUB_STAMP) ;; target ID + ;; aux_id ;; auxiliary ID + ;; src_offset_hi ;; source offset high + ;; src_offset_lo ;; source offset low + ;; tgt_offset_lo ;; target offset low + 32 ;; size + ;; ref_offset ;; reference offset + ;; ref_size ;; reference size + ;; success_bit ;; success bit + ;; limb_1 ;; limb 1 + ;; limb_2 ;; limb 2 + EXO_SUM_WEIGHT_RIPSHA ;; weighted exogenous module flag sum + (precompile-processing---SHA2-and-RIPEMD---result-phase) ;; phase + )) + )) + + +(defun (precompile-processing---SHA2-and-RIPEMD---relevant-empty-hash-hi) (+ (* EMPTY_SHA2_HI scenario/PRC_SHA2-256) + (* EMPTY_RIPEMD_HI scenario/PRC_RIPEMD-160))) + +(defun (precompile-processing---SHA2-and-RIPEMD---relevant-empty-hash-lo) (+ (* EMPTY_SHA2_LO scenario/PRC_SHA2-256) + (* EMPTY_RIPEMD_LO scenario/PRC_RIPEMD-160))) + +(defun (precompile-processing---SHA2-and-RIPEMD---result-phase) (+ (* PHASE_SHA2_RESULT scenario/PRC_SHA2-256) + (* PHASE_RIPEMD_RESULT scenario/PRC_RIPEMD-160))) + +(defconstraint precompile-processing---SHA2-and-RIPEMD---success---3rd-misc-row---setting-module-flags (:guard (precompile-processing---SHA2-and-RIPEMD---success-precondition)) + (eq! (weighted-MISC-flag-sum precompile-processing---common---3rd-misc-row---row-offset) + (* MISC_WEIGHT_MMU + (precompile-processing---common---OOB-r@c-nonzero)))) + +(defconstraint precompile-processing---SHA2-and-RIPEMD---success---3rd-misc-row---setting-MMU-instruction (:guard (precompile-processing---SHA2-and-RIPEMD---success-precondition)) + (if-not-zero (shift misc/MMU_FLAG precompile-processing---common---3rd-misc-row---row-offset) + (set-MMU-instruction---ram-to-ram-sans-padding precompile-processing---common---3rd-misc-row---row-offset ;; offset + (+ 1 HUB_STAMP) ;; source ID + CONTEXT_NUMBER ;; target ID + ;; aux_id ;; auxiliary ID + ;; src_offset_hi ;; source offset high + 0 ;; source offset low + ;; tgt_offset_lo ;; target offset low + 32 ;; size + (precompile-processing---dup-r@o) ;; reference offset + (precompile-processing---dup-r@c) ;; reference size + ;; success_bit ;; success bit + ;; limb_1 ;; limb 1 + ;; limb_2 ;; limb 2 + ;; exo_sum ;; weighted exogenous module flag sum + ;; phase ;; phase + ) + )) + +(defconstraint precompile-processing---SHA2-and-RIPEMD---success---updating-return-data (:guard (precompile-processing---SHA2-and-RIPEMD---success-precondition)) + (provide-return-data precompile-processing---common---context-row-success---row-offset ;; row offset + CONTEXT_NUMBER ;; receiver context + (+ 1 HUB_STAMP) ;; provider context + 0 ;; rdo + 32 ;; rds + )) diff --git a/hub/osaka/constraints/instruction-handling/call/precompiles/ec_add_mul_pairing_bls/FKTR.lisp b/hub/osaka/constraints/instruction-handling/call/precompiles/ec_add_mul_pairing_bls/FKTR.lisp new file mode 100644 index 000000000..919ad10bf --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/call/precompiles/ec_add_mul_pairing_bls/FKTR.lisp @@ -0,0 +1,35 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.Y CALL ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.Z ECADD, ECMUL, ECPAIRING and BLS precompiles constraints ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;; +;; Shorthands ;; +;;;;;;;;;;;;;;;; + +(defun (precompile-processing---ECADD_MUL_PAIRING_and_BLS---FKTR-case) (* PEEK_AT_SCENARIO + (+ scenario/PRC_ECADD + scenario/PRC_ECMUL + scenario/PRC_ECPAIRING + (scenario-shorthand---PRC---common-BLS-address-bit-sum) + ) + scenario/PRC_FAILURE_KNOWN_TO_RAM)) + +(defconstraint precompile-processing---ECADD_MUL_PAIRING_and_BLS---FKTR-requires-extracting-non-empty-call-data + (:guard (precompile-processing---ECADD_MUL_PAIRING_and_BLS---FKTR-case)) + (eq! (precompile-processing---common---OOB-extract-call-data) + 1)) + diff --git a/hub/osaka/constraints/instruction-handling/call/precompiles/ec_add_mul_pairing_bls/constants.lisp b/hub/osaka/constraints/instruction-handling/call/precompiles/ec_add_mul_pairing_bls/constants.lisp new file mode 100644 index 000000000..376472702 --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/call/precompiles/ec_add_mul_pairing_bls/constants.lisp @@ -0,0 +1,17 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.Y CALL ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconst + ;; + precompile-processing---ECADD_MUL_PAIRING_and_BLS---misc-row-offset---full-return-data-transfer 2 + precompile-processing---ECADD_MUL_PAIRING_and_BLS---misc-row-offset---partial-return-data-copy 3 + precompile-processing---ECADD_MUL_PAIRING_and_BLS---context-row-offset---updating-caller-context 4 + ) diff --git a/hub/osaka/constraints/instruction-handling/call/precompiles/ec_add_mul_pairing_bls/success_case.lisp b/hub/osaka/constraints/instruction-handling/call/precompiles/ec_add_mul_pairing_bls/success_case.lisp new file mode 100644 index 000000000..d2a95a3d4 --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/call/precompiles/ec_add_mul_pairing_bls/success_case.lisp @@ -0,0 +1,196 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.Y CALL ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.Z.5 ECADD, ECMUL and ECPAIRING constraints ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;; +;; Shorthands ;; +;;;;;;;;;;;;;;;; + +(defun (precompile-processing---ECADD_MUL_PAIRING_and_BLS---success-case) (* PEEK_AT_SCENARIO + (+ scenario/PRC_ECADD + scenario/PRC_ECMUL + scenario/PRC_ECPAIRING + (scenario-shorthand---PRC---common-BLS-address-bit-sum) + ) + (scenario-shorthand---PRC---success) + )) + +(defun (precompile-processing---ECADD_MUL_PAIRING_and_BLS---nontrivial-ECADD) (* (precompile-processing---common---OOB-extract-call-data) scenario/PRC_ECADD)) +(defun (precompile-processing---ECADD_MUL_PAIRING_and_BLS---nontrivial-ECMUL) (* (precompile-processing---common---OOB-extract-call-data) scenario/PRC_ECMUL)) +(defun (precompile-processing---ECADD_MUL_PAIRING_and_BLS---nontrivial-ECPAIRING) (* (precompile-processing---common---OOB-extract-call-data) scenario/PRC_ECPAIRING)) +(defun (precompile-processing---ECADD_MUL_PAIRING_and_BLS---trivial-ECPAIRING) (* (precompile-processing---common---OOB-empty-call-data) scenario/PRC_ECPAIRING)) + +(defun (precompile-processing---ECADD_MUL_PAIRING_and_BLS---nontrivial-cases) (+ (precompile-processing---ECADD_MUL_PAIRING_and_BLS---nontrivial-ECADD) + (precompile-processing---ECADD_MUL_PAIRING_and_BLS---nontrivial-ECMUL) + (precompile-processing---ECADD_MUL_PAIRING_and_BLS---nontrivial-ECPAIRING) + (scenario-shorthand---PRC---common-BLS-address-bit-sum) + )) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Miscellaneous-row i + 2 ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstraint precompile-processing---ECADD_MUL_PAIRING_and_BLS---second-misc-row-peeking-flags + (:guard (precompile-processing---ECADD_MUL_PAIRING_and_BLS---success-case)) + (eq! (weighted-MISC-flag-sum precompile-processing---ECADD_MUL_PAIRING_and_BLS---misc-row-offset---full-return-data-transfer) + (* MISC_WEIGHT_MMU (precompile-processing---ECADD_MUL_PAIRING_and_BLS---trigger_MMU)))) + +(defun (precompile-processing---ECADD_MUL_PAIRING_and_BLS---trigger_MMU) (+ (precompile-processing---ECADD_MUL_PAIRING_and_BLS---nontrivial-ECADD) + (precompile-processing---ECADD_MUL_PAIRING_and_BLS---nontrivial-ECMUL) + (precompile-processing---ECADD_MUL_PAIRING_and_BLS---nontrivial-ECPAIRING) + (precompile-processing---ECADD_MUL_PAIRING_and_BLS---trivial-ECPAIRING) + (scenario-shorthand---PRC---common-BLS-address-bit-sum) + )) + +(defconstraint precompile-processing---ECADD_MUL_PAIRING_and_BLS---setting-MMU-instruction---full-return-data-transfer---trivial-case + (:guard (precompile-processing---ECADD_MUL_PAIRING_and_BLS---success-case)) + (if-not-zero (precompile-processing---ECADD_MUL_PAIRING_and_BLS---trivial-ECPAIRING) + (set-MMU-instruction---mstore precompile-processing---ECADD_MUL_PAIRING_and_BLS---misc-row-offset---full-return-data-transfer ;; offset + ;; src_id ;; source ID + (+ 1 HUB_STAMP) ;; target ID + ;; aux_id ;; auxiliary ID + ;; src_offset_hi ;; source offset high + ;; src_offset_lo ;; source offset low + 0 ;; target offset low + ;; size ;; size + ;; ref_offset ;; reference offset + ;; ref_size ;; reference size + ;; success_bit ;; success bit + 0 ;; limb 1 + 1 ;; limb 2 + ;; exo_sum ;; weighted exogenous module flag sum + ;; phase ;; phase + ))) + +(defconstraint precompile-processing---ECADD_MUL_PAIRING_and_BLS---setting-MMU-instruction---full-return-data-transfer---nontrivial-cases + (:guard (precompile-processing---ECADD_MUL_PAIRING_and_BLS---success-case)) + (if-not-zero (precompile-processing---ECADD_MUL_PAIRING_and_BLS---nontrivial-cases) + (set-MMU-instruction---exo-to-ram-transplants precompile-processing---ECADD_MUL_PAIRING_and_BLS---misc-row-offset---full-return-data-transfer ;; offset + (+ 1 HUB_STAMP) ;; source ID + (+ 1 HUB_STAMP) ;; target ID + ;; aux_id ;; auxiliary ID + ;; src_offset_hi ;; source offset high + ;; src_offset_lo ;; source offset low + ;; tgt_offset_lo ;; target offset low + (precompile-processing---ECADD_MUL_PAIRING_and_BLS---return-data-size) ;; size + ;; ref_offset ;; reference offset + ;; ref_size ;; reference size + ;; success_bit ;; success bit + ;; limb_1 ;; limb 1 + ;; limb_2 ;; limb 2 + (precompile-processing---ECADD_MUL_PAIRING_and_BLS---exo-sum) ;; weighted exogenous module flag sum + (precompile-processing---ECADD_MUL_PAIRING_and_BLS---return-data-phase) ;; phase + ))) + +(defun (precompile-processing---ECADD_MUL_PAIRING_and_BLS---return-data-size) (+ (* PRECOMPILE_RETURN_DATA_SIZE___ECADD (precompile-processing---ECADD_MUL_PAIRING_and_BLS---nontrivial-ECADD) ) + (* PRECOMPILE_RETURN_DATA_SIZE___ECMUL (precompile-processing---ECADD_MUL_PAIRING_and_BLS---nontrivial-ECMUL) ) + (* PRECOMPILE_RETURN_DATA_SIZE___ECPAIRING (precompile-processing---ECADD_MUL_PAIRING_and_BLS---nontrivial-ECPAIRING) ) + (* PRECOMPILE_RETURN_DATA_SIZE___POINT_EVALUATION scenario/PRC_POINT_EVALUATION ) + (* PRECOMPILE_RETURN_DATA_SIZE___BLS_G1_ADD scenario/PRC_BLS_G1_ADD ) + (* PRECOMPILE_RETURN_DATA_SIZE___BLS_G1_MSM scenario/PRC_BLS_G1_MSM ) + (* PRECOMPILE_RETURN_DATA_SIZE___BLS_G2_ADD scenario/PRC_BLS_G2_ADD ) + (* PRECOMPILE_RETURN_DATA_SIZE___BLS_G2_MSM scenario/PRC_BLS_G2_MSM ) + (* PRECOMPILE_RETURN_DATA_SIZE___BLS_PAIRING_CHECK scenario/PRC_BLS_PAIRING_CHECK ) + (* PRECOMPILE_RETURN_DATA_SIZE___BLS_MAP_FP_TO_G1 scenario/PRC_BLS_MAP_FP_TO_G1 ) + (* PRECOMPILE_RETURN_DATA_SIZE___BLS_MAP_FP2_TO_G2 scenario/PRC_BLS_MAP_FP2_TO_G2 ) + )) + +(defun (precompile-processing---ECADD_MUL_PAIRING_and_BLS---return-data-phase) (+ (* PHASE_ECADD_RESULT (precompile-processing---ECADD_MUL_PAIRING_and_BLS---nontrivial-ECADD) ) + (* PHASE_ECMUL_RESULT (precompile-processing---ECADD_MUL_PAIRING_and_BLS---nontrivial-ECMUL) ) + (* PHASE_ECPAIRING_RESULT (precompile-processing---ECADD_MUL_PAIRING_and_BLS---nontrivial-ECPAIRING) ) + (* PHASE_POINT_EVALUATION_RESULT scenario/PRC_POINT_EVALUATION ) + (* PHASE_BLS_G1_ADD_RESULT scenario/PRC_BLS_G1_ADD ) + (* PHASE_BLS_G1_MSM_RESULT scenario/PRC_BLS_G1_MSM ) + (* PHASE_BLS_G2_ADD_RESULT scenario/PRC_BLS_G2_ADD ) + (* PHASE_BLS_G2_MSM_RESULT scenario/PRC_BLS_G2_MSM ) + (* PHASE_BLS_PAIRING_CHECK_RESULT scenario/PRC_BLS_PAIRING_CHECK ) + (* PHASE_BLS_MAP_FP_TO_G1_RESULT scenario/PRC_BLS_MAP_FP_TO_G1 ) + (* PHASE_BLS_MAP_FP2_TO_G2_RESULT scenario/PRC_BLS_MAP_FP2_TO_G2 ) + )) + + +(defun (precompile-processing---ECADD_MUL_PAIRING_and_BLS---exo-sum) (+ (* EXO_SUM_WEIGHT_ECDATA scenario/PRC_ECADD ) + (* EXO_SUM_WEIGHT_ECDATA scenario/PRC_ECMUL ) + (* EXO_SUM_WEIGHT_ECDATA scenario/PRC_ECPAIRING ) + (* EXO_SUM_WEIGHT_BLSDATA (scenario-shorthand---PRC---common-BLS-address-bit-sum) ) + )) + + + + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Miscellaneous-row i + 3 ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstraint precompile-processing---ECADD_MUL_PAIRING_and_BLS---third-misc-row-peeking-flags + (:guard (precompile-processing---ECADD_MUL_PAIRING_and_BLS---success-case)) + (eq! (weighted-MISC-flag-sum precompile-processing---ECADD_MUL_PAIRING_and_BLS---misc-row-offset---partial-return-data-copy) + (* MISC_WEIGHT_MMU + (precompile-processing---common---OOB-r@c-nonzero)))) + + +(defconstraint precompile-processing---ECADD_MUL_PAIRING_and_BLS---setting-the-MMU-instruction---partial-return-data-copy + (:guard (precompile-processing---ECADD_MUL_PAIRING_and_BLS---success-case)) + (if-not-zero (shift misc/MMU_FLAG precompile-processing---ECADD_MUL_PAIRING_and_BLS---misc-row-offset---partial-return-data-copy) + (set-MMU-instruction---ram-to-ram-sans-padding precompile-processing---ECADD_MUL_PAIRING_and_BLS---misc-row-offset---partial-return-data-copy ;; offset + (+ 1 HUB_STAMP) ;; source ID + CONTEXT_NUMBER ;; target ID + ;; aux_id ;; auxiliary ID + ;; src_offset_hi ;; source offset high + 0 ;; source offset low + ;; tgt_offset_lo ;; target offset low + (precompile-processing---ECADD_MUL_PAIRING_and_BLS---return-data-reference-size) ;; size + (precompile-processing---dup-r@o) ;; reference offset + (precompile-processing---dup-r@c) ;; reference size + ;; success_bit ;; success bit + ;; limb_1 ;; limb 1 + ;; limb_2 ;; limb 2 + ;; exo_sum ;; weighted exogenous module flag sum + ;; phase ;; phase + ))) + +(defun (precompile-processing---ECADD_MUL_PAIRING_and_BLS---return-data-reference-size) (+ (* PRECOMPILE_RETURN_DATA_SIZE___ECADD scenario/PRC_ECADD ) + (* PRECOMPILE_RETURN_DATA_SIZE___ECMUL scenario/PRC_ECMUL ) + (* PRECOMPILE_RETURN_DATA_SIZE___ECPAIRING scenario/PRC_ECPAIRING ) + (* PRECOMPILE_RETURN_DATA_SIZE___POINT_EVALUATION scenario/PRC_POINT_EVALUATION ) + (* PRECOMPILE_RETURN_DATA_SIZE___BLS_G1_ADD scenario/PRC_BLS_G1_ADD ) + (* PRECOMPILE_RETURN_DATA_SIZE___BLS_G1_MSM scenario/PRC_BLS_G1_MSM ) + (* PRECOMPILE_RETURN_DATA_SIZE___BLS_G2_ADD scenario/PRC_BLS_G2_ADD ) + (* PRECOMPILE_RETURN_DATA_SIZE___BLS_G2_MSM scenario/PRC_BLS_G2_MSM ) + (* PRECOMPILE_RETURN_DATA_SIZE___BLS_PAIRING_CHECK scenario/PRC_BLS_PAIRING_CHECK ) + (* PRECOMPILE_RETURN_DATA_SIZE___BLS_MAP_FP_TO_G1 scenario/PRC_BLS_MAP_FP_TO_G1 ) + (* PRECOMPILE_RETURN_DATA_SIZE___BLS_MAP_FP2_TO_G2 scenario/PRC_BLS_MAP_FP2_TO_G2 ) + )) + + +;;;;;;;;;;;;;;;;;;;;;;; +;; Context-row i + 4 ;; +;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstraint precompile-processing---ECADD_MUL_PAIRING_and_BLS---updating-caller-context-with-precompile-return-data + (:guard (precompile-processing---ECADD_MUL_PAIRING_and_BLS---success-case)) + (provide-return-data precompile-processing---ECADD_MUL_PAIRING_and_BLS---context-row-offset---updating-caller-context ;; row offset + CONTEXT_NUMBER ;; receiver context + (+ 1 HUB_STAMP) ;; provider context + 0 ;; rdo + (precompile-processing---ECADD_MUL_PAIRING_and_BLS---return-data-reference-size) ;; rds + )) diff --git a/hub/osaka/constraints/instruction-handling/call/precompiles/generalities.lisp b/hub/osaka/constraints/instruction-handling/call/precompiles/generalities.lisp new file mode 100644 index 000000000..3b2105e5e --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/call/precompiles/generalities.lisp @@ -0,0 +1,46 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.Y CALL ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.Z.4 Generalities ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defun (precompile-processing---standard-hypothesis) (* PEEK_AT_SCENARIO + (scenario-shorthand---PRC---sum))) + + +(defconstraint precompile-processing---admissible-failure-scenarios (:guard (precompile-processing---standard-hypothesis)) + (begin + (if-not-zero (scenario-shorthand---PRC---may-only-fail-in-the-HUB) (vanishes! scenario/PRC_FAILURE_KNOWN_TO_RAM)) + (if-not-zero (scenario-shorthand---PRC---may-only-fail-in-the-RAM) (vanishes! scenario/PRC_FAILURE_KNOWN_TO_HUB)) + )) + +(defconstraint precompile-processing---setting-GAS_NEXT (:guard (precompile-processing---standard-hypothesis)) + (begin + (eq! GAS_NEXT (+ (precompile-processing---dup-caller-gas) + (precompile-processing---prd-return-gas))) + (if-not-zero (scenario-shorthand---PRC---failure) + (vanishes! (precompile-processing---prd-return-gas))) + )) + +(defconstraint precompile-processing---setting-NSR (:guard (precompile-processing---standard-hypothesis)) + (eq! NON_STACK_ROWS + (+ (precompile-processing---1st-half-NSR) + (precompile-processing---2nd-half-NSR)) + )) + +(defconstraint precompile-processing---setting-the-peeking-flags (:guard (precompile-processing---standard-hypothesis)) + (eq! (precompile-processing---2nd-half-flag-sum) + (precompile-processing---2nd-half-NSR) + )) diff --git a/hub/osaka/constraints/instruction-handling/call/precompiles/modexp/common.lisp b/hub/osaka/constraints/instruction-handling/call/precompiles/modexp/common.lisp new file mode 100644 index 000000000..f8b58381a --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/call/precompiles/modexp/common.lisp @@ -0,0 +1,280 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.Y CALL ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.Z.4 MODEXP common processing ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defun (precompile-processing---MODEXP---standard-precondition) (* PEEK_AT_SCENARIO scenario/PRC_MODEXP)) + +(defconstraint precompile-processing---MODEXP---excluding-execution-scenarios (:guard (precompile-processing---MODEXP---standard-precondition)) + (vanishes! scenario/PRC_FAILURE_KNOWN_TO_HUB)) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; CALL_DATA_SIZE analysis row ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defconstraint precompile-processing---MODEXP---cds-misc-row---setting-module-flags (:guard (precompile-processing---MODEXP---standard-precondition)) + (eq! (weighted-MISC-flag-sum precompile-processing---MODEXP---misc-row-offset---cds-analysis) + MISC_WEIGHT_OOB)) + +(defconstraint precompile-processing---MODEXP---cds-misc-row---setting-OOB-instruction (:guard (precompile-processing---MODEXP---standard-precondition)) + (set-OOB-instruction---modexp-cds precompile-processing---MODEXP---misc-row-offset---cds-analysis ;; row offset + (precompile-processing---dup-cds))) ;; call data size + +(defun (precompile-processing---MODEXP---extract-bbs) (shift [misc/OOB_DATA 3] precompile-processing---MODEXP---misc-row-offset---cds-analysis)) +(defun (precompile-processing---MODEXP---extract-ebs) (shift [misc/OOB_DATA 4] precompile-processing---MODEXP---misc-row-offset---cds-analysis)) +(defun (precompile-processing---MODEXP---extract-mbs) (shift [misc/OOB_DATA 5] precompile-processing---MODEXP---misc-row-offset---cds-analysis)) ;; "" + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; bbs extraction and analysis row ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstraint precompile-processing---MODEXP---bbs-analysis---setting-misc-module-flags (:guard (precompile-processing---MODEXP---standard-precondition)) + (eq! (weighted-MISC-flag-sum precompile-processing---MODEXP---misc-row-offset---bbs-analysis) + (+ (* MISC_WEIGHT_MMU (precompile-processing---MODEXP---extract-bbs)) + MISC_WEIGHT_OOB) + )) + +(defconstraint precompile-processing---MODEXP---bbs-analysis---setting-MMU-instruction (:guard (precompile-processing---MODEXP---standard-precondition)) + (if-not-zero (shift misc/MMU_FLAG precompile-processing---MODEXP---misc-row-offset---bbs-analysis) + (set-MMU-instruction---right-padded-word-extraction precompile-processing---MODEXP---misc-row-offset---bbs-analysis ;; offset + CONTEXT_NUMBER ;; source ID + ;; tgt_id ;; target ID + ;; aux_id ;; auxiliary ID + ;; src_offset_hi ;; source offset high + 0 ;; source offset low + ;; tgt_offset_lo ;; target offset low + ;; size ;; size + (precompile-processing---dup-cdo) ;; reference offset + (precompile-processing---dup-cds) ;; reference size + ;; success_bit ;; success bit + (shift misc/MMU_LIMB_1 precompile-processing---MODEXP---misc-row-offset---bbs-analysis) ;; limb 1 ;; TODO: remove SELF REFERENCE + (shift misc/MMU_LIMB_2 precompile-processing---MODEXP---misc-row-offset---bbs-analysis) ;; limb 2 ;; TODO: remove SELF REFERENCE + ;; exo_sum ;; weighted exogenous module flag sum + ;; phase ;; phase + ))) + +(defun (precompile-processing---MODEXP---bbs-hi) (* (precompile-processing---MODEXP---extract-bbs) (shift misc/MMU_LIMB_1 precompile-processing---MODEXP---misc-row-offset---bbs-analysis))) +(defun (precompile-processing---MODEXP---bbs-lo) (* (precompile-processing---MODEXP---extract-bbs) (shift misc/MMU_LIMB_2 precompile-processing---MODEXP---misc-row-offset---bbs-analysis))) + +(defconstraint precompile-processing---MODEXP---bbs-analysis---setting-OOB-instruction (:guard (precompile-processing---MODEXP---standard-precondition)) + (set-OOB-instruction---modexp-xbs precompile-processing---MODEXP---misc-row-offset---bbs-analysis ;; offset + (precompile-processing---MODEXP---bbs-hi) ;; high part of some {b,e,m}bs + (precompile-processing---MODEXP---bbs-lo) ;; low part of some {b,e,m}bs + 0 ;; low part of some {b,e,m}bs + 0 ;; bit indicating whether to compute max(xbs, ybs) or not + )) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ebs extraction and analysis row ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstraint precompile-processing---MODEXP---ebs-analysis---setting-misc-module-flags (:guard (precompile-processing---MODEXP---standard-precondition)) + (eq! (weighted-MISC-flag-sum precompile-processing---MODEXP---misc-row-offset---ebs-analysis) + (+ (* MISC_WEIGHT_MMU (precompile-processing---MODEXP---extract-ebs)) + MISC_WEIGHT_OOB) + )) + +(defconstraint precompile-processing---MODEXP---ebs-analysis---setting-MMU-instruction (:guard (precompile-processing---MODEXP---standard-precondition)) + (if-not-zero (shift misc/MMU_FLAG precompile-processing---MODEXP---misc-row-offset---ebs-analysis) + (set-MMU-instruction---right-padded-word-extraction precompile-processing---MODEXP---misc-row-offset---ebs-analysis ;; offset + CONTEXT_NUMBER ;; source ID + ;; tgt_id ;; target ID + ;; aux_id ;; auxiliary ID + ;; src_offset_hi ;; source offset high + 32 ;; source offset low + ;; tgt_offset_lo ;; target offset low + ;; size ;; size + (precompile-processing---dup-cdo) ;; reference offset + (precompile-processing---dup-cds) ;; reference size + ;; success_bit ;; success bit + (shift misc/MMU_LIMB_1 precompile-processing---MODEXP---misc-row-offset---ebs-analysis) ;; limb 1 ;; TODO: remove SELF REFERENCE + (shift misc/MMU_LIMB_2 precompile-processing---MODEXP---misc-row-offset---ebs-analysis) ;; limb 2 ;; TODO: remove SELF REFERENCE + ;; exo_sum ;; weighted exogenous module flag sum + ;; phase ;; phase + ))) + +(defun (precompile-processing---MODEXP---ebs-hi) (* (precompile-processing---MODEXP---extract-ebs) (shift misc/MMU_LIMB_1 precompile-processing---MODEXP---misc-row-offset---ebs-analysis))) +(defun (precompile-processing---MODEXP---ebs-lo) (* (precompile-processing---MODEXP---extract-ebs) (shift misc/MMU_LIMB_2 precompile-processing---MODEXP---misc-row-offset---ebs-analysis))) + +(defconstraint precompile-processing---MODEXP---ebs-analysis---setting-OOB-instruction (:guard (precompile-processing---MODEXP---standard-precondition)) + (set-OOB-instruction---modexp-xbs precompile-processing---MODEXP---misc-row-offset---ebs-analysis ;; offset + (precompile-processing---MODEXP---ebs-hi) ;; high part of some {b,e,m}bs + (precompile-processing---MODEXP---ebs-lo) ;; low part of some {b,e,m}bs + 0 ;; low part of some {b,e,m}bs + 0 ;; bit indicating whether to compute max(xbs, ybs) or not + )) + + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; mbs extraction and analysis row ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstraint precompile-processing---MODEXP---mbs-analysis---setting-misc-module-flags (:guard (precompile-processing---MODEXP---standard-precondition)) + (eq! (weighted-MISC-flag-sum precompile-processing---MODEXP---misc-row-offset---mbs-analysis) + (+ (* MISC_WEIGHT_MMU (precompile-processing---MODEXP---extract-mbs)) + MISC_WEIGHT_OOB) + )) + +(defconstraint precompile-processing---MODEXP---mbs-analysis---setting-MMU-instruction (:guard (precompile-processing---MODEXP---standard-precondition)) + (if-not-zero (shift misc/MMU_FLAG precompile-processing---MODEXP---misc-row-offset---mbs-analysis) + (set-MMU-instruction---right-padded-word-extraction precompile-processing---MODEXP---misc-row-offset---mbs-analysis ;; offset + CONTEXT_NUMBER ;; source ID + ;; tgt_id ;; target ID + ;; aux_id ;; auxiliary ID + ;; src_offset_hi ;; source offset high + 64 ;; source offset low + ;; tgt_offset_lo ;; target offset low + ;; size ;; size + (precompile-processing---dup-cdo) ;; reference offset + (precompile-processing---dup-cds) ;; reference size + ;; success_bit ;; success bit + (shift misc/MMU_LIMB_1 precompile-processing---MODEXP---misc-row-offset---mbs-analysis) ;; limb 1 ;; TODO: remove SELF REFERENCE + (shift misc/MMU_LIMB_2 precompile-processing---MODEXP---misc-row-offset---mbs-analysis) ;; limb 2 ;; TODO: remove SELF REFERENCE + ;; exo_sum ;; weighted exogenous module flag sum + ;; phase ;; phase + ))) + +(defun (precompile-processing---MODEXP---mbs-hi) (* (precompile-processing---MODEXP---extract-mbs) (shift misc/MMU_LIMB_1 precompile-processing---MODEXP---misc-row-offset---mbs-analysis))) +(defun (precompile-processing---MODEXP---mbs-lo) (* (precompile-processing---MODEXP---extract-mbs) (shift misc/MMU_LIMB_2 precompile-processing---MODEXP---misc-row-offset---mbs-analysis))) + +(defconstraint precompile-processing---MODEXP---mbs-analysis---setting-OOB-instruction (:guard (precompile-processing---MODEXP---standard-precondition)) + (set-OOB-instruction---modexp-xbs precompile-processing---MODEXP---misc-row-offset---mbs-analysis ;; offset + (precompile-processing---MODEXP---mbs-hi) ;; high part of some {b,e,m}bs + (precompile-processing---MODEXP---mbs-lo) ;; low part of some {b,e,m}bs + (precompile-processing---MODEXP---bbs-lo) ;; low part of some {b,e,m}bs + 1 ;; bit indicating whether to compute max(xbs, ybs) or not + )) + + +(defun (precompile-processing---MODEXP---max-mbs-bbs) (shift [misc/OOB_DATA 7] precompile-processing---MODEXP---misc-row-offset---mbs-analysis)) +(defun (precompile-processing---MODEXP---mbs-nonzero) (shift [misc/OOB_DATA 8] precompile-processing---MODEXP---misc-row-offset---mbs-analysis)) ;; "" + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; leading_word analysis row ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstraint precompile-processing---MODEXP---lead-log-analysis---setting-misc-module-flags (:guard (precompile-processing---MODEXP---standard-precondition)) + (eq! (weighted-MISC-flag-sum precompile-processing---MODEXP---misc-row-offset---leading-word-analysis) + (+ (* MISC_WEIGHT_EXP (precompile-processing---MODEXP---load-lead)) + (* MISC_WEIGHT_MMU (precompile-processing---MODEXP---load-lead)) + MISC_WEIGHT_OOB) + )) + +(defconstraint precompile-processing---MODEXP---lead-log-analysis---setting-OOB-instruction (:guard (precompile-processing---MODEXP---standard-precondition)) + (set-OOB-instruction---modexp-lead precompile-processing---MODEXP---misc-row-offset---leading-word-analysis ;; offset + (precompile-processing---MODEXP---bbs-lo) ;; low part of bbs (base byte size) + (precompile-processing---dup-cds) ;; call data size + (precompile-processing---MODEXP---ebs-lo) ;; low part of ebs (exponent byte size) + )) + +(defun (precompile-processing---MODEXP---load-lead) (* (precompile-processing---MODEXP---extract-bbs) (shift [misc/OOB_DATA 4] precompile-processing---MODEXP---misc-row-offset---leading-word-analysis))) +(defun (precompile-processing---MODEXP---cds-cutoff) (* (precompile-processing---MODEXP---extract-bbs) (shift [misc/OOB_DATA 6] precompile-processing---MODEXP---misc-row-offset---leading-word-analysis))) +(defun (precompile-processing---MODEXP---ebs-cutoff) (* (precompile-processing---MODEXP---extract-bbs) (shift [misc/OOB_DATA 7] precompile-processing---MODEXP---misc-row-offset---leading-word-analysis))) +(defun (precompile-processing---MODEXP---sub-ebs-32) (* (precompile-processing---MODEXP---extract-bbs) (shift [misc/OOB_DATA 8] precompile-processing---MODEXP---misc-row-offset---leading-word-analysis))) ;; "" + + +(defconstraint precompile-processing---MODEXP---lead-word-analysis---setting-MMU-instruction (:guard (precompile-processing---MODEXP---standard-precondition)) + (if-not-zero (shift misc/MMU_FLAG precompile-processing---MODEXP---misc-row-offset---leading-word-analysis) + (set-MMU-instruction---mload precompile-processing---MODEXP---misc-row-offset---leading-word-analysis ;; offset + CONTEXT_NUMBER ;; source ID + ;; tgt_id ;; target ID + ;; aux_id ;; auxiliary ID + ;; src_offset_hi ;; source offset high + (+ (precompile-processing---dup-cdo) + 96 + (precompile-processing---MODEXP---bbs-lo)) ;; source offset low + ;; tgt_offset_lo ;; target offset low + ;; size ;; size + ;; ref_offset ;; reference offset + ;; ref_size ;; reference size + ;; success_bit ;; success bit + (shift misc/MMU_LIMB_1 precompile-processing---MODEXP---misc-row-offset---leading-word-analysis) ;; limb 1 ;; TODO: remove SELF REFERENCE + (shift misc/MMU_LIMB_2 precompile-processing---MODEXP---misc-row-offset---leading-word-analysis) ;; limb 2 ;; TODO: remove SELF REFERENCE + ;; exo_sum ;; weighted exogenous module flag sum + ;; phase ;; phase + ))) + +(defun (precompile-processing---MODEXP---raw-lead-hi) (* (precompile-processing---MODEXP---load-lead) (shift misc/MMU_LIMB_1 precompile-processing---MODEXP---misc-row-offset---leading-word-analysis))) +(defun (precompile-processing---MODEXP---raw-lead-lo) (* (precompile-processing---MODEXP---load-lead) (shift misc/MMU_LIMB_2 precompile-processing---MODEXP---misc-row-offset---leading-word-analysis))) + + +(defconstraint precompile-processing---MODEXP---lead-word-analysis---setting-EXP-instruction (:guard (precompile-processing---MODEXP---standard-precondition)) + (if-not-zero (shift misc/EXP_FLAG precompile-processing---MODEXP---misc-row-offset---leading-word-analysis) + (set-EXP-instruction-MODEXP-lead-log + precompile-processing---MODEXP---misc-row-offset---leading-word-analysis ;; row offset + (precompile-processing---MODEXP---raw-lead-hi) ;; raw leading word where exponent starts, high part + (precompile-processing---MODEXP---raw-lead-lo) ;; raw leading word where exponent starts, low part + (precompile-processing---MODEXP---cds-cutoff) ;; min{max{cds - 96 - bbs, 0}, 32} + (precompile-processing---MODEXP---ebs-cutoff) ;; min{ebs, 32} + ))) + +(defun (precompile-processing---MODEXP---lead-log) (* (precompile-processing---MODEXP---load-lead) (shift [misc/EXP_DATA 5] precompile-processing---MODEXP---misc-row-offset---leading-word-analysis))) ;; "" +(defun (precompile-processing---MODEXP---modexp-full-log) (+ (precompile-processing---MODEXP---lead-log) (* 8 (precompile-processing---MODEXP---sub-ebs-32)))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; pricing analysis row ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstraint precompile-processing---MODEXP---pricing-analysis---setting-misc-module-flags (:guard (precompile-processing---MODEXP---standard-precondition)) + (eq! (weighted-MISC-flag-sum precompile-processing---MODEXP---misc-row-offset---pricing) + MISC_WEIGHT_OOB + )) + +(defconstraint precompile-processing---MODEXP---pricing-analysis---setting-OOB-instruction (:guard (precompile-processing---MODEXP---standard-precondition)) + (set-OOB-instruction---modexp-pricing precompile-processing---MODEXP---misc-row-offset---pricing ;; offset + (precompile-processing---dup-call-gas) ;; call gas i.e. gas provided to the precompile + (precompile-processing---dup-r@c) ;; return at capacity + (precompile-processing---MODEXP---modexp-full-log) ;; leading (≤) word log of exponent + (precompile-processing---MODEXP---max-mbs-bbs) ;; call data size + )) + +(defun (precompile-processing---MODEXP---ram-success) (shift [misc/OOB_DATA 4] precompile-processing---MODEXP---misc-row-offset---pricing)) +(defun (precompile-processing---MODEXP---return-gas) (shift [misc/OOB_DATA 5] precompile-processing---MODEXP---misc-row-offset---pricing)) +(defun (precompile-processing---MODEXP---r@c-nonzero) (shift [misc/OOB_DATA 8] precompile-processing---MODEXP---misc-row-offset---pricing)) ;; "" + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Justifying precompile success / failure scenarios ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstraint precompile-processing---MODEXP---justifying-success-failure-scenarios (:guard (precompile-processing---MODEXP---standard-precondition)) + (begin + (eq! (scenario-shorthand---PRC---success) (precompile-processing---MODEXP---ram-success)) + (eq! (precompile-processing---prd-return-gas) (precompile-processing---MODEXP---return-gas)) + )) diff --git a/hub/osaka/constraints/instruction-handling/call/precompiles/modexp/constants.lisp b/hub/osaka/constraints/instruction-handling/call/precompiles/modexp/constants.lisp new file mode 100644 index 000000000..f9b7545f0 --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/call/precompiles/modexp/constants.lisp @@ -0,0 +1,27 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.Y CALL ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconst + precompile-processing---MODEXP---misc-row-offset---cds-analysis 1 + precompile-processing---MODEXP---misc-row-offset---bbs-analysis 2 + precompile-processing---MODEXP---misc-row-offset---ebs-analysis 3 + precompile-processing---MODEXP---misc-row-offset---mbs-analysis 4 + precompile-processing---MODEXP---misc-row-offset---leading-word-analysis 5 + precompile-processing---MODEXP---misc-row-offset---pricing 6 + precompile-processing---MODEXP---misc-row-offset---base-extraction 7 + precompile-processing---MODEXP---misc-row-offset---exponent-extraction 8 + precompile-processing---MODEXP---misc-row-offset---modulus-extraction 9 + precompile-processing---MODEXP---misc-row-offset---full-result-extraction 10 + precompile-processing---MODEXP---misc-row-offset---partial-result-transfer 11 + + precompile-processing---MODEXP---context-row-offset---FKTR 7 + precompile-processing---MODEXP---context-row-offset---success 12 + ) diff --git a/hub/osaka/constraints/instruction-handling/call/precompiles/modexp/failure.lisp b/hub/osaka/constraints/instruction-handling/call/precompiles/modexp/failure.lisp new file mode 100644 index 000000000..20cb5da7b --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/call/precompiles/modexp/failure.lisp @@ -0,0 +1,24 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.Y CALL ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.Z.4 MODEXP failure case ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defun (precompile-processing---MODEXP---failure) (* PEEK_AT_SCENARIO + scenario/PRC_MODEXP + (scenario-shorthand---PRC---failure))) + +(defconstraint precompile-processing---MODEXP---failure---provide-empty-return-data-to-caller (:guard (precompile-processing---MODEXP---failure)) + (nonexecution-provides-empty-return-data precompile-processing---MODEXP---context-row-offset---FKTR)) diff --git a/hub/osaka/constraints/instruction-handling/call/precompiles/modexp/success.lisp b/hub/osaka/constraints/instruction-handling/call/precompiles/modexp/success.lisp new file mode 100644 index 000000000..e8339c966 --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/call/precompiles/modexp/success.lisp @@ -0,0 +1,259 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.Y CALL ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.Z.4 MODEXP success case ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defun (precompile-processing---MODEXP---success-case) (* PEEK_AT_SCENARIO + scenario/PRC_MODEXP + (scenario-shorthand---PRC---success))) + +(defun (lets-extract-the-base) (shift misc/MMU_FLAG precompile-processing---MODEXP---misc-row-offset---base-extraction)) +(defun (lets-extract-the-exponent) (shift misc/MMU_FLAG precompile-processing---MODEXP---misc-row-offset---exponent-extraction)) +(defun (lets-extract-the-modulus) (shift misc/MMU_FLAG precompile-processing---MODEXP---misc-row-offset---modulus-extraction)) +(defun (lets-extract-the-full-result) (shift misc/MMU_FLAG precompile-processing---MODEXP---misc-row-offset---full-result-extraction)) +(defun (lets-partially-copy-the-result) (shift misc/MMU_FLAG precompile-processing---MODEXP---misc-row-offset---partial-result-transfer)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; deciding what byte sizes to extract and potentially extracting the base ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstraint precompile-processing---MODEXP---success-case---base-extraction-row---setting-module-flags + (:guard (precompile-processing---MODEXP---success-case)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (begin + (eq! (weighted-MISC-flag-sum-sans-MMU precompile-processing---MODEXP---misc-row-offset---base-extraction) MISC_WEIGHT_OOB) + (eq! (shift misc/MMU_FLAG precompile-processing---MODEXP---misc-row-offset---base-extraction) (precompile-processing---MODEXP---extract-modulus)) + )) + +(defconstraint precompile-processing---MODEXP---success-case---base-extraction-row---setting-the-OOB-instruction-which-decides-which-actual-parameters-to-extract (:guard (precompile-processing---MODEXP---success-case)) + (set-OOB-instruction---modexp-extract precompile-processing---MODEXP---misc-row-offset---base-extraction ;; offset + (precompile-processing---dup-cds) ;; call data size + (precompile-processing---MODEXP---bbs-lo) ;; low part of bbs (base byte size) + (precompile-processing---MODEXP---ebs-lo) ;; low part of ebs (exponent byte size) + (precompile-processing---MODEXP---mbs-lo) ;; low part of mbs (modulus byte size) + )) + +;; Note: we deduce some shorthands AT THE END OF THE FILE. + +(defconstraint precompile-processing---MODEXP---success-case---base-extraction-row---setting-the-MMU-instruction (:guard (precompile-processing---MODEXP---success-case)) + (if-not-zero (lets-extract-the-base) + (if-zero (force-bin (precompile-processing---MODEXP---extract-base)) + ;; extract_base == 0 case: + (set-MMU-instruction---modexp-zero precompile-processing---MODEXP---misc-row-offset---base-extraction ;; offset + ;; src_id ;; source ID + (+ 1 HUB_STAMP) ;; target ID + ;; aux_id ;; auxiliary ID + ;; src_offset_hi ;; source offset high + ;; src_offset_lo ;; source offset low + ;; tgt_offset_lo ;; target offset low + ;; size ;; size + ;; ref_offset ;; reference offset + ;; ref_size ;; reference size + ;; success_bit ;; success bit + ;; limb_1 ;; limb 1 + ;; limb_2 ;; limb 2 + ;; exo_sum ;; weighted exogenous module flag sum + PHASE_MODEXP_BASE ;; phase + ) + ;; extract_base == 1 case: + (set-MMU-instruction---modexp-data precompile-processing---MODEXP---misc-row-offset---base-extraction ;; offset + CONTEXT_NUMBER ;; source ID + (+ 1 HUB_STAMP) ;; target ID + ;; aux_id ;; auxiliary ID + ;; src_offset_hi ;; source offset high + 96 ;; source offset low + ;; tgt_offset_lo ;; target offset low + (precompile-processing---MODEXP---bbs-lo) ;; size + (precompile-processing---dup-cdo) ;; reference offset + (precompile-processing---dup-cds) ;; reference size + ;; success_bit ;; success bit + ;; limb_1 ;; limb 1 + ;; limb_2 ;; limb 2 + ;; exo_sum ;; weighted exogenous module flag sum + PHASE_MODEXP_BASE ;; phase + )))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; potentially extracting the exponent ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstraint precompile-processing---MODEXP---success-case---exponent-extraction-row---setting-module-flags (:guard (precompile-processing---MODEXP---success-case)) + (eq! (weighted-MISC-flag-sum precompile-processing---MODEXP---misc-row-offset---exponent-extraction) + (* MISC_WEIGHT_MMU (precompile-processing---MODEXP---extract-modulus)) + )) + +(defconstraint precompile-processing---MODEXP---success-case---exponent-extraction-row---setting-the-MMU-instruction (:guard (precompile-processing---MODEXP---success-case)) + (if-not-zero (lets-extract-the-exponent) + (if-zero (force-bin (precompile-processing---MODEXP---extract-exponent)) + ;; extract_exponent == 0 case: + (set-MMU-instruction---modexp-zero precompile-processing---MODEXP---misc-row-offset---exponent-extraction ;; offset + ;; src_id ;; source ID + (+ 1 HUB_STAMP) ;; target ID + ;; aux_id ;; auxiliary ID + ;; src_offset_hi ;; source offset high + ;; src_offset_lo ;; source offset low + ;; tgt_offset_lo ;; target offset low + ;; size ;; size + ;; ref_offset ;; reference offset + ;; ref_size ;; reference size + ;; success_bit ;; success bit + ;; limb_1 ;; limb 1 + ;; limb_2 ;; limb 2 + ;; exo_sum ;; weighted exogenous module flag sum + PHASE_MODEXP_EXPONENT ;; phase + ) + ;; extract_exponent == 1 case: + (set-MMU-instruction---modexp-data precompile-processing---MODEXP---misc-row-offset---exponent-extraction ;; offset + CONTEXT_NUMBER ;; source ID + (+ 1 HUB_STAMP) ;; target ID + ;; aux_id ;; auxiliary ID + ;; src_offset_hi ;; source offset high + (+ 96 (precompile-processing---MODEXP---bbs-lo)) ;; source offset low + ;; tgt_offset_lo ;; target offset low + (precompile-processing---MODEXP---ebs-lo) ;; size + (precompile-processing---dup-cdo) ;; reference offset + (precompile-processing---dup-cds) ;; reference size + ;; success_bit ;; success bit + ;; limb_1 ;; limb 1 + ;; limb_2 ;; limb 2 + ;; exo_sum ;; weighted exogenous module flag sum + PHASE_MODEXP_EXPONENT ;; phase + )))) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; potentially extracting the modulus ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstraint precompile-processing---MODEXP---success-case---modulus-extraction-row---setting-module-flags (:guard (precompile-processing---MODEXP---success-case)) + (eq! (weighted-MISC-flag-sum precompile-processing---MODEXP---misc-row-offset---modulus-extraction) + (* MISC_WEIGHT_MMU (precompile-processing---MODEXP---extract-modulus)) + )) + +(defconstraint precompile-processing---MODEXP---success-case---modulus-extraction-row---setting-the-MMU-instruction (:guard (precompile-processing---MODEXP---success-case)) + (if-not-zero (lets-extract-the-modulus) + ;; extract_modulus == 1 case: + (set-MMU-instruction---modexp-data precompile-processing---MODEXP---misc-row-offset---modulus-extraction ;; offset + CONTEXT_NUMBER ;; source ID + (+ 1 HUB_STAMP) ;; target ID + ;; aux_id ;; auxiliary ID + ;; src_offset_hi ;; source offset high + (+ 96 (precompile-processing---MODEXP---bbs-lo) (precompile-processing---MODEXP---ebs-lo)) ;; source offset low + ;; tgt_offset_lo ;; target offset low + (precompile-processing---MODEXP---mbs-lo) ;; size + (precompile-processing---dup-cdo) ;; reference offset + (precompile-processing---dup-cds) ;; reference size + ;; success_bit ;; success bit + ;; limb_1 ;; limb 1 + ;; limb_2 ;; limb 2 + ;; exo_sum ;; weighted exogenous module flag sum + PHASE_MODEXP_MODULUS ;; phase + ))) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; full copy of result to dedicated RAM segment ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstraint precompile-processing---MODEXP---success-case---full-result-extraction-row---set-module-flags (:guard (precompile-processing---MODEXP---success-case)) + (eq! (weighted-MISC-flag-sum precompile-processing---MODEXP---misc-row-offset---full-result-extraction) + (* MISC_WEIGHT_MMU (precompile-processing---MODEXP---extract-modulus)) + )) + +(defconstraint precompile-processing---MODEXP---success-case---full-result-extraction-row---setting-the-MMU-instruction (:guard (precompile-processing---MODEXP---success-case)) + (if-not-zero (lets-extract-the-full-result) + (set-MMU-instruction---exo-to-ram-transplants precompile-processing---MODEXP---misc-row-offset---full-result-extraction ;; offset + (+ 1 HUB_STAMP) ;; source ID + (+ 1 HUB_STAMP) ;; target ID + ;; aux_id ;; auxiliary ID + ;; src_offset_hi ;; source offset high + ;; src_offset_lo ;; source offset low + ;; tgt_offset_lo ;; target offset low + 512 ;; size + ;; ref_offset ;; reference offset + ;; ref_size ;; reference size + ;; success_bit ;; success bit + ;; limb_1 ;; limb 1 + ;; limb_2 ;; limb 2 + EXO_SUM_WEIGHT_BLAKEMODEXP ;; weighted exogenous module flag sum + PHASE_MODEXP_RESULT ;; phase + ))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; partial copy of results to current RAM segment ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstraint precompile-processing---MODEXP---success-case---partial-result-copy-row---set-module-flags (:guard (precompile-processing---MODEXP---success-case)) + (eq! (weighted-MISC-flag-sum precompile-processing---MODEXP---misc-row-offset---partial-result-transfer) + (* MISC_WEIGHT_MMU + (precompile-processing---MODEXP---mbs-nonzero) + (precompile-processing---MODEXP---r@c-nonzero) + ))) + +(defconstraint precompile-processing---MODEXP---success-case---partial-result-copy-row---setting-the-MMU-instruction (:guard (precompile-processing---MODEXP---success-case)) + (if-not-zero (lets-partially-copy-the-result) + (set-MMU-instruction---ram-to-ram-sans-padding precompile-processing---MODEXP---misc-row-offset---partial-result-transfer ;; offset + (+ 1 HUB_STAMP) ;; source ID + CONTEXT_NUMBER ;; target ID + ;; aux_id ;; auxiliary ID + ;; src_offset_hi ;; source offset high + (- 512 (precompile-processing---MODEXP---mbs-lo)) ;; source offset low + ;; tgt_offset_lo ;; target offset low + (precompile-processing---MODEXP---mbs-lo) ;; size + (precompile-processing---dup-r@o) ;; reference offset + (precompile-processing---dup-r@c) ;; reference size + ;; success_bit ;; success bit + ;; limb_1 ;; limb 1 + ;; limb_2 ;; limb 2 + ;; exo_sum ;; weighted exogenous module flag sum + ;; phase ;; phase + ))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; updating current context's return data ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstraint precompile-processing---MODEXP---success-case---return-data-update-row (:guard (precompile-processing---MODEXP---success-case)) + (provide-return-data precompile-processing---MODEXP---context-row-offset---success ;; row offset + CONTEXT_NUMBER ;; receiver context + (+ 1 HUB_STAMP) ;; provider context + (- 512 (precompile-processing---MODEXP---mbs-lo)) ;; rdo + (precompile-processing---MODEXP---mbs-lo) ;; rds + )) + + +;; setting some shorthands +(defun (precompile-processing---MODEXP---extract-base) (shift [ misc/OOB_DATA 6 ] precompile-processing---MODEXP---misc-row-offset---base-extraction)) +(defun (precompile-processing---MODEXP---extract-exponent) (shift [ misc/OOB_DATA 7 ] precompile-processing---MODEXP---misc-row-offset---base-extraction)) +(defun (precompile-processing---MODEXP---extract-modulus) (shift [ misc/OOB_DATA 8 ] precompile-processing---MODEXP---misc-row-offset---base-extraction)) diff --git a/hub/osaka/constraints/instruction-handling/call/precompiles/shorthands.lisp b/hub/osaka/constraints/instruction-handling/call/precompiles/shorthands.lisp new file mode 100644 index 000000000..8dedca5e6 --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/call/precompiles/shorthands.lisp @@ -0,0 +1,28 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.Y CALL ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.Z.1 Introduction ;; +;; X.Y.Z.2 Precompile failure vs. success ;; +;; X.Y.Z.3 Precompile failure classification ;; +;; X.Y.Z.4 Global shorthands ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defun (precompile-processing---dup-caller-gas) scenario/PRC_CALLER_GAS) +(defun (precompile-processing---dup-call-gas) scenario/PRC_CALLEE_GAS) +(defun (precompile-processing---prd-return-gas) scenario/PRC_RETURN_GAS) +(defun (precompile-processing---dup-cdo) scenario/PRC_CDO) +(defun (precompile-processing---dup-cds) scenario/PRC_CDS) +(defun (precompile-processing---dup-r@o) scenario/PRC_RAO) +(defun (precompile-processing---dup-r@c) scenario/PRC_RAC) diff --git a/hub/osaka/constraints/instruction-handling/call/shorthands.lisp b/hub/osaka/constraints/instruction-handling/call/shorthands.lisp new file mode 100644 index 000000000..223ba87ac --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/call/shorthands.lisp @@ -0,0 +1,81 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.Y CALL ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.6 Shorthands ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (call-instruction---is-CALL---unshifted) [stack/DEC_FLAG 1] ) +(defun (call-instruction---is-CALLCODE---unshifted) [stack/DEC_FLAG 2] ) +(defun (call-instruction---is-CALL) (shift [stack/DEC_FLAG 1] CALL_1st_stack_row___row_offset)) +(defun (call-instruction---is-CALLCODE) (shift [stack/DEC_FLAG 2] CALL_1st_stack_row___row_offset)) +(defun (call-instruction---is-DELEGATECALL) (shift [stack/DEC_FLAG 3] CALL_1st_stack_row___row_offset)) +(defun (call-instruction---is-STATICCALL) (shift [stack/DEC_FLAG 4] CALL_1st_stack_row___row_offset)) ;; "" +(defun (call-instruction---STACK-staticx) (shift stack/STATICX CALL_1st_stack_row___row_offset)) +(defun (call-instruction---STACK-mxpx) (shift stack/MXPX CALL_1st_stack_row___row_offset)) +(defun (call-instruction---STACK-oogx) (shift stack/OOGX CALL_1st_stack_row___row_offset)) +(defun (call-instruction---STACK-instruction) (shift stack/INSTRUCTION CALL_1st_stack_row___row_offset)) +(defun (call-instruction---STACK-cdo-hi) (shift [stack/STACK_ITEM_VALUE_HI 1] CALL_1st_stack_row___row_offset)) +(defun (call-instruction---STACK-cdo-lo) (shift [stack/STACK_ITEM_VALUE_LO 1] CALL_1st_stack_row___row_offset)) +(defun (call-instruction---STACK-cds-hi) (shift [stack/STACK_ITEM_VALUE_HI 2] CALL_1st_stack_row___row_offset)) +(defun (call-instruction---STACK-cds-lo) (shift [stack/STACK_ITEM_VALUE_LO 2] CALL_1st_stack_row___row_offset)) +(defun (call-instruction---STACK-r@o-hi) (shift [stack/STACK_ITEM_VALUE_HI 3] CALL_1st_stack_row___row_offset)) +(defun (call-instruction---STACK-r@o-lo) (shift [stack/STACK_ITEM_VALUE_LO 3] CALL_1st_stack_row___row_offset)) +(defun (call-instruction---STACK-r@c-hi) (shift [stack/STACK_ITEM_VALUE_HI 4] CALL_1st_stack_row___row_offset)) +(defun (call-instruction---STACK-r@c-lo) (shift [stack/STACK_ITEM_VALUE_LO 4] CALL_1st_stack_row___row_offset)) +(defun (call-instruction---STACK-gas-hi) (shift [stack/STACK_ITEM_VALUE_HI 1] CALL_2nd_stack_row___row_offset)) +(defun (call-instruction---STACK-gas-lo) (shift [stack/STACK_ITEM_VALUE_LO 1] CALL_2nd_stack_row___row_offset)) +(defun (call-instruction---STACK-raw-callee-address-hi) (shift [stack/STACK_ITEM_VALUE_HI 2] CALL_2nd_stack_row___row_offset)) +(defun (call-instruction---STACK-raw-callee-address-lo) (shift [stack/STACK_ITEM_VALUE_LO 2] CALL_2nd_stack_row___row_offset)) +(defun (call-instruction---STACK-value-hi) (shift [stack/STACK_ITEM_VALUE_HI 3] CALL_2nd_stack_row___row_offset)) +(defun (call-instruction---STACK-value-lo) (shift [stack/STACK_ITEM_VALUE_LO 3] CALL_2nd_stack_row___row_offset)) +(defun (call-instruction---STACK-success-bit-hi) (shift [stack/STACK_ITEM_VALUE_HI 4] CALL_2nd_stack_row___row_offset)) +(defun (call-instruction---STACK-success-bit-lo) (shift [stack/STACK_ITEM_VALUE_LO 4] CALL_2nd_stack_row___row_offset)) ;; "" +(defun (call-instruction---gas-actual) (shift GAS_ACTUAL CALL_2nd_stack_row___row_offset )) +(defun (call-instruction---current-address-hi) (shift context/ACCOUNT_ADDRESS_HI CALL_1st_context_row___row_offset)) +(defun (call-instruction---current-address-lo) (shift context/ACCOUNT_ADDRESS_LO CALL_1st_context_row___row_offset)) +(defun (call-instruction---current-context-is-static) (shift context/IS_STATIC CALL_1st_context_row___row_offset)) +(defun (call-instruction---current-caller-address-hi) (shift context/CALLER_ADDRESS_HI CALL_1st_context_row___row_offset)) +(defun (call-instruction---current-caller-address-lo) (shift context/CALLER_ADDRESS_LO CALL_1st_context_row___row_offset)) +(defun (call-instruction---current-call-value) (shift context/CALL_VALUE CALL_1st_context_row___row_offset)) +(defun (call-instruction---current-call-stack-depth) (shift context/CALL_STACK_DEPTH CALL_1st_context_row___row_offset)) +(defun (call-instruction---MXP-memory-expansion-exception) (shift misc/MXP_MXPX CALL_misc_row___row_offset)) +(defun (call-instruction---MXP-memory-expansion-gas) (shift misc/MXP_GAS_MXP CALL_misc_row___row_offset)) +(defun (call-instruction---MXP-size-1-nonzero-and-no-mxpx) (shift misc/MXP_SIZE_1_NONZERO_NO_MXPX CALL_misc_row___row_offset)) +(defun (call-instruction---MXP-size-2-nonzero-and-no-mxpx) (shift misc/MXP_SIZE_2_NONZERO_NO_MXPX CALL_misc_row___row_offset)) +(defun (call-instruction---STP-gas-upfront) (shift misc/STP_GAS_UPFRONT_GAS_COST CALL_misc_row___row_offset)) +(defun (call-instruction---STP-gas-paid-out-of-pocket) (shift misc/STP_GAS_PAID_OUT_OF_POCKET CALL_misc_row___row_offset)) +(defun (call-instruction---STP-call-stipend) (shift misc/STP_GAS_STIPEND CALL_misc_row___row_offset)) +(defun (call-instruction---STP-out-of-gas-exception) (shift misc/STP_OOGX CALL_misc_row___row_offset)) +(defun (call-instruction---OOB-nonzero-value) (shift [misc/OOB_DATA 7] CALL_misc_row___row_offset)) +(defun (call-instruction---OOB-aborting-condition) (shift [misc/OOB_DATA 8] CALL_misc_row___row_offset)) ;; "" +(defun (call-instruction---caller-balance) (shift account/BALANCE CALL_1st_caller_account_row___row_offset)) +(defun (call-instruction---callee-address-hi) (shift account/ADDRESS_HI CALL_1st_callee_account_row___row_offset)) +(defun (call-instruction---callee-address-lo) (shift account/ADDRESS_LO CALL_1st_callee_account_row___row_offset)) +(defun (call-instruction---callee-code-fragment-index) (shift account/CODE_FRAGMENT_INDEX CALL_1st_callee_account_row___row_offset)) +(defun (call-instruction---callee-has-code) (shift account/HAS_CODE CALL_1st_callee_account_row___row_offset)) +(defun (call-instruction---callee-warmth) (shift account/WARMTH CALL_1st_callee_account_row___row_offset)) +(defun (call-instruction---callee-exists) (shift account/EXISTS CALL_1st_callee_account_row___row_offset)) +(defun (call-instruction---callee-is-precompile) (shift account/IS_PRECOMPILE CALL_1st_callee_account_row___row_offset)) + +;; revert data shorthands +(defun (call-instruction---caller-will-revert) (shift CONTEXT_WILL_REVERT CALL_1st_stack_row___row_offset)) +(defun (call-instruction---caller-revert-stamp) (shift CONTEXT_REVERT_STAMP CALL_1st_stack_row___row_offset)) +(defun (call-instruction---callee-self-reverts) (shift misc/CCSR_FLAG CALL_misc_row___row_offset)) +(defun (call-instruction---callee-revert-stamp) (shift misc/CCRS_STAMP CALL_misc_row___row_offset)) + +;; type safe call data and return at segment values +(defun (call-instruction---type-safe-cdo) (* (call-instruction---STACK-cdo-lo) (call-instruction---MXP-size-1-nonzero-and-no-mxpx))) +(defun (call-instruction---type-safe-cds) (call-instruction---STACK-cds-lo) ) +(defun (call-instruction---type-safe-r@o) (* (call-instruction---STACK-r@o-lo) (call-instruction---MXP-size-2-nonzero-and-no-mxpx))) +(defun (call-instruction---type-safe-r@c) (call-instruction---STACK-r@c-lo) ) diff --git a/hub/osaka/constraints/instruction-handling/call/specialized/first_row_of_callee_context.lisp b/hub/osaka/constraints/instruction-handling/call/specialized/first_row_of_callee_context.lisp new file mode 100644 index 000000000..424693926 --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/call/specialized/first_row_of_callee_context.lisp @@ -0,0 +1,27 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.Y CALL ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.Z.3 firstRowOfCalleeContext constraints ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defun (first-row-of-callee-context relative_row_offset) + (begin + (eq! (shift CALLER_CONTEXT_NUMBER (+ relative_row_offset 1)) (shift CONTEXT_NUMBER relative_row_offset)) + (eq! (shift CONTEXT_NUMBER (+ relative_row_offset 1)) (shift context/CONTEXT_NUMBER relative_row_offset)) + (eq! (shift CODE_FRAGMENT_INDEX (+ relative_row_offset 1)) (call-instruction---callee-code-fragment-index)) + (vanishes! (shift PROGRAM_COUNTER (+ relative_row_offset 1))) + (eq! (shift GAS_EXPECTED (+ relative_row_offset 1)) (+ (call-instruction---STP-gas-paid-out-of-pocket) (call-instruction---STP-call-stipend))) + (eq! (shift GAS_EXPECTED (+ relative_row_offset 1)) (shift GAS_ACTUAL (+ relative_row_offset 1))) + )) diff --git a/hub/osaka/constraints/instruction-handling/call/specialized/initialize_callee_context.lisp b/hub/osaka/constraints/instruction-handling/call/specialized/initialize_callee_context.lisp new file mode 100644 index 000000000..8af43b6d4 --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/call/specialized/initialize_callee_context.lisp @@ -0,0 +1,43 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.Y CALL ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.Z.2 initializeCalleeContext constraints ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defun (initialize-callee-context relative_row_offset) + (initialize-context + relative_row_offset ;; row offset + CONTEXT_NUMBER_NEW ;; context number + (+ 1 (call-instruction---current-call-stack-depth)) ;; call stack depth + 0 ;; is root + (call-instruction---new-context-is-static) ;; is static + (call-instruction---new-account-address-hi) ;; account address high + (call-instruction---new-account-address-lo) ;; account address low + (call-instruction---new-account-deployment-number) ;; account deployment number + (call-instruction---callee-address-hi) ;; byte code address high + (call-instruction---callee-address-lo) ;; byte code address low + (shift account/DEPLOYMENT_NUMBER CALL_1st_callee_account_row___row_offset) ;; byte code deployment number + (shift account/DEPLOYMENT_STATUS CALL_1st_callee_account_row___row_offset) ;; byte code deployment status + (call-instruction---callee-code-fragment-index) ;; byte code code fragment index + (call-instruction---new-caller-address-hi) ;; caller address high + (call-instruction---new-caller-address-lo) ;; caller address low + (call-instruction---new-call-value) ;; call value + CONTEXT_NUMBER ;; caller context + (call-instruction---type-safe-cdo) ;; call data offset + (call-instruction---type-safe-cds) ;; call data size + (call-instruction---type-safe-r@o) ;; return at offset + (call-instruction---type-safe-r@c) ;; return at capacity + ) + ) diff --git a/hub/osaka/constraints/instruction-handling/call/specialized/justify_callee_revert_data.lisp b/hub/osaka/constraints/instruction-handling/call/specialized/justify_callee_revert_data.lisp new file mode 100644 index 000000000..b19d6fce4 --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/call/specialized/justify_callee_revert_data.lisp @@ -0,0 +1,23 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.Y CALL ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.Z.1 justifyCalleeRevertData constraints ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defun (justify-callee-revert-data relative_row_offset) + (begin + (eq! (call-instruction---callee-self-reverts) (shift CONTEXT_SELF_REVERTS (+ relative_row_offset 1))) + (eq! (call-instruction---callee-revert-stamp) (shift CONTEXT_REVERT_STAMP (+ relative_row_offset 1))) + )) diff --git a/hub/osaka/constraints/instruction-handling/call/specialized/missing-context-parameters.lisp b/hub/osaka/constraints/instruction-handling/call/specialized/missing-context-parameters.lisp new file mode 100644 index 000000000..4c1ea4075 --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/call/specialized/missing-context-parameters.lisp @@ -0,0 +1,52 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.Y CALL ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.Z.5 Defining the missing context parameters ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defun (call-instruction---new-context-is-static) (+ (* (call-instruction---is-CALL) (call-instruction---current-context-is-static)) + (* (call-instruction---is-CALLCODE) (call-instruction---current-context-is-static)) + (* (call-instruction---is-DELEGATECALL) (call-instruction---current-context-is-static)) + (* (call-instruction---is-STATICCALL) 1))) + +(defun (call-instruction---new-account-address-hi) (+ (* (call-instruction---is-CALL) (call-instruction---callee-address-hi)) + (* (call-instruction---is-CALLCODE) (call-instruction---current-address-hi)) + (* (call-instruction---is-DELEGATECALL) (call-instruction---current-address-hi)) + (* (call-instruction---is-STATICCALL) (call-instruction---callee-address-hi)))) + +(defun (call-instruction---new-account-address-lo) (+ (* (call-instruction---is-CALL) (call-instruction---callee-address-lo)) + (* (call-instruction---is-CALLCODE) (call-instruction---current-address-lo)) + (* (call-instruction---is-DELEGATECALL) (call-instruction---current-address-lo)) + (* (call-instruction---is-STATICCALL) (call-instruction---callee-address-lo)))) + +(defun (call-instruction---new-account-deployment-number) (+ (* (call-instruction---is-CALL) (shift account/DEPLOYMENT_NUMBER CALL_1st_callee_account_row___row_offset)) + (* (call-instruction---is-CALLCODE) (shift account/DEPLOYMENT_NUMBER CALL_1st_caller_account_row___row_offset)) + (* (call-instruction---is-DELEGATECALL) (shift account/DEPLOYMENT_NUMBER CALL_1st_caller_account_row___row_offset)) + (* (call-instruction---is-STATICCALL) (shift account/DEPLOYMENT_NUMBER CALL_1st_callee_account_row___row_offset)))) + +(defun (call-instruction---new-caller-address-hi) (+ (* (call-instruction---is-CALL) (call-instruction---current-address-hi)) + (* (call-instruction---is-CALLCODE) (call-instruction---current-address-hi)) + (* (call-instruction---is-DELEGATECALL) (call-instruction---current-caller-address-hi)) + (* (call-instruction---is-STATICCALL) (call-instruction---current-address-hi)))) + +(defun (call-instruction---new-caller-address-lo) (+ (* (call-instruction---is-CALL) (call-instruction---current-address-lo)) + (* (call-instruction---is-CALLCODE) (call-instruction---current-address-lo)) + (* (call-instruction---is-DELEGATECALL) (call-instruction---current-caller-address-lo)) + (* (call-instruction---is-STATICCALL) (call-instruction---current-address-lo)))) + +(defun (call-instruction---new-call-value) (+ (* (call-instruction---is-CALL) (call-instruction---STACK-value-lo)) + (* (call-instruction---is-CALLCODE) (call-instruction---STACK-value-lo)) + (* (call-instruction---is-DELEGATECALL) (call-instruction---current-call-value)) + (* (call-instruction---is-STATICCALL) 0))) diff --git a/hub/osaka/constraints/instruction-handling/call/specialized/precompile-scenario-row-setting-for-precompiles.lisp b/hub/osaka/constraints/instruction-handling/call/specialized/precompile-scenario-row-setting-for-precompiles.lisp new file mode 100644 index 000000000..bd4108805 --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/call/specialized/precompile-scenario-row-setting-for-precompiles.lisp @@ -0,0 +1,37 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.Y CALL ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.Z.6 precompileScenarioRow constraints ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defun (precompile-scenario-row-setting relative_row_offset) + (begin + (eq! (shift PEEK_AT_SCENARIO relative_row_offset) 1) + (eq! (shift (scenario-shorthand---PRC---sum) relative_row_offset) 1) + (eq! (shift (scenario-shorthand---PRC---weighted-address-bit-sum) relative_row_offset) (call-instruction---callee-address-lo)) + ;; + (eq! (shift (scenario-shorthand---PRC---failure) relative_row_offset) scenario/CALL_PRC_FAILURE) + (eq! (shift scenario/PRC_SUCCESS_CALLER_WILL_REVERT relative_row_offset) scenario/CALL_PRC_SUCCESS_CALLER_WILL_REVERT) + (eq! (shift scenario/PRC_SUCCESS_CALLER_WONT_REVERT relative_row_offset) scenario/CALL_PRC_SUCCESS_CALLER_WONT_REVERT) + ;; + (eq! (shift scenario/PRC_CALLER_GAS relative_row_offset) (- GAS_ACTUAL (call-instruction---STP-gas-upfront) (call-instruction---STP-gas-paid-out-of-pocket))) + (eq! (shift scenario/PRC_CALLEE_GAS relative_row_offset) (+ (call-instruction---STP-gas-paid-out-of-pocket) (call-instruction---STP-call-stipend))) + ;; gas owed to CALLER will be set later + ;; + (eq! (shift scenario/PRC_CDO relative_row_offset) (call-instruction---type-safe-cdo)) + (eq! (shift scenario/PRC_CDS relative_row_offset) (call-instruction---type-safe-cds)) + (eq! (shift scenario/PRC_RAO relative_row_offset) (call-instruction---type-safe-r@o)) + (eq! (shift scenario/PRC_RAC relative_row_offset) (call-instruction---type-safe-r@c)) + )) diff --git a/hub/osaka/constraints/instruction-handling/call/standpoint.lisp b/hub/osaka/constraints/instruction-handling/call/standpoint.lisp new file mode 100644 index 000000000..a1a6ff046 --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/call/standpoint.lisp @@ -0,0 +1,49 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.Y CALL ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.1 Introduction ;; +;; X.Y.2 Description of the general approach ;; +;; X.Y.3 Supported instructions and flags ;; +;; X.Y.4 Highlevel processing diagram ;; +;; X.Y.5 Forward and backward setting of scenario row ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstraint call-instruction---forward-scenario-setting () + (if-not-zero PEEK_AT_STACK + (if-not-zero stack/CALL_FLAG + (if-not-zero (- 1 CT_TLI) + (if-not-zero (- 1 stack/SUX stack/SOX) + (begin + (eq! (shift PEEK_AT_SCENARIO 2) 1) + (eq! (shift (scenario-shorthand---CALL---sum) 2) 1) + ) + ) + ) + ) + ) + ) + +(defconstraint call-instruction---backward-setting-CALL-instruction () + (if-not-zero PEEK_AT_SCENARIO + (if-not-zero (scenario-shorthand---CALL---sum) + (begin + (eq! (shift PEEK_AT_STACK CALL_1st_stack_row___row_offset) 1) + (eq! (shift stack/CALL_FLAG CALL_1st_stack_row___row_offset) 1) + (eq! (shift CT_TLI CALL_1st_stack_row___row_offset) 0) + (eq! (shift (+ stack/SUX stack/SOX) CALL_1st_stack_row___row_offset) 0) + ) + ) + ) + ) diff --git a/hub/osaka/constraints/instruction-handling/call/triggers.lisp b/hub/osaka/constraints/instruction-handling/call/triggers.lisp new file mode 100644 index 000000000..a4b4f848e --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/call/triggers.lisp @@ -0,0 +1,39 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.Y CALL ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.7 Module triggers ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (call-instruction---trigger_OOB) (+ (* (call-instruction---is-CALL) scenario/CALL_EXCEPTION) + (scenario-shorthand---CALL---unexceptional))) + +(defun (call-instruction---trigger_MXP) (+ (call-instruction---STACK-mxpx) + (call-instruction---STACK-oogx) + (scenario-shorthand---CALL---unexceptional))) + +(defun (call-instruction---trigger_TRM) (+ (call-instruction---STACK-oogx) + (scenario-shorthand---CALL---unexceptional))) + +(defun (call-instruction---trigger_STP) (+ (call-instruction---STACK-oogx) + (scenario-shorthand---CALL---unexceptional))) + +(defun (call-instruction---trigger_ROMLEX) (+ (scenario-shorthand---CALL---smart-contract))) + +;; (defun (call-instruction---call-requires-callee-account) (+ (shift misc/STP_FLAG CALL_misc___row_offset))) + +(defun (call-instruction---call-requires-caller-account) (+ (scenario-shorthand---CALL---unexceptional))) + +(defun (call-instruction---call-requires-both-accounts-twice) (+ (scenario-shorthand---CALL---requires-both-accounts-twice))) + +(defun (call-instruction---call-requires-both-accounts-thrice) (+ scenario/CALL_SMC_FAILURE_CALLER_WILL_REVERT)) diff --git a/hub/osaka/constraints/instruction-handling/con.lisp b/hub/osaka/constraints/instruction-handling/con.lisp new file mode 100644 index 000000000..fd9a75d10 --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/con.lisp @@ -0,0 +1,92 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.5 Instruction handling ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.5.27 Context ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconst + ROFF_CONTEXT_INSTRUCTION___CONTEXT_ROW 1) + +;; NOTE: bytes from the invalid instruction family +;; (ither not an opcode or the INVALID opcode) +;; can't raise stack exceptions +(defun (context-instruction---standard-hypothesis) (* PEEK_AT_STACK + stack/CON_FLAG + (- 1 stack/SUX stack/SOX))) + +(defun (context-instruction---result-hi) [ stack/STACK_ITEM_VALUE_HI 4 ]) +(defun (context-instruction---result-lo) [ stack/STACK_ITEM_VALUE_LO 4 ]) + +(defun (context-instruction---is-ADDRESS) [ stack/DEC_FLAG 1 ]) +(defun (context-instruction---is-CALLER) [ stack/DEC_FLAG 2 ]) +(defun (context-instruction---is-CALLVALUE) [ stack/DEC_FLAG 3 ]) +(defun (context-instruction---is-CALLDATASIZE) [ stack/DEC_FLAG 4 ]) ;; "" +(defun (context-instruction---is-RETURNDATASIZE) (- 1 + (context-instruction---is-ADDRESS) + (context-instruction---is-CALLER) + (context-instruction---is-CALLVALUE) + (context-instruction---is-CALLDATASIZE))) + + +(defconstraint context-instruction---setting-the-stack-pattern (:guard (context-instruction---standard-hypothesis)) + (stack-pattern-0-1)) + +(defconstraint context-instruction---setting-admissible-exceptions (:guard (context-instruction---standard-hypothesis)) + (eq! XAHOY stack/OOGX)) + +(defconstraint context-instruction---setting-the-gas-cost (:guard (context-instruction---standard-hypothesis)) + (eq! GAS_COST stack/STATIC_GAS)) + +(defconstraint context-instruction---setting-NSR (:guard (context-instruction---standard-hypothesis)) + (eq! NSR + (+ 1 CMC))) + +(defconstraint context-instruction---setting-peeking-flags (:guard (context-instruction---standard-hypothesis)) + (eq! NSR + (+ (shift PEEK_AT_CONTEXT ROFF_CONTEXT_INSTRUCTION___CONTEXT_ROW) + (* CMC (shift PEEK_AT_CONTEXT 2))))) + +(defconstraint context-instruction---reading-context-data (:guard (context-instruction---standard-hypothesis)) + (read-context-data ROFF_CONTEXT_INSTRUCTION___CONTEXT_ROW CONTEXT_NUMBER)) + + + +(defun (result-ADDRESS-hi) (shift context/ACCOUNT_ADDRESS_HI ROFF_CONTEXT_INSTRUCTION___CONTEXT_ROW)) +(defun (result-ADDRESS-lo) (shift context/ACCOUNT_ADDRESS_LO ROFF_CONTEXT_INSTRUCTION___CONTEXT_ROW)) +(defun (result-CALLER-hi) (shift context/CALLER_ADDRESS_HI ROFF_CONTEXT_INSTRUCTION___CONTEXT_ROW)) +(defun (result-CALLER-lo) (shift context/CALLER_ADDRESS_LO ROFF_CONTEXT_INSTRUCTION___CONTEXT_ROW)) +(defun (result-CALLVALUE-lo) (shift context/CALL_VALUE ROFF_CONTEXT_INSTRUCTION___CONTEXT_ROW)) +(defun (result-CALLDATASIZE-lo) (shift context/CALL_DATA_SIZE ROFF_CONTEXT_INSTRUCTION___CONTEXT_ROW)) +(defun (result-RETURNDATASIZE-lo) (shift context/RETURN_DATA_SIZE ROFF_CONTEXT_INSTRUCTION___CONTEXT_ROW)) + + + +(defconstraint context-instruction---value-constraints (:guard (context-instruction---standard-hypothesis)) + (if-zero XAHOY + (begin + (if-not-zero (context-instruction---is-ADDRESS) + (begin (eq! (context-instruction---result-hi) (result-ADDRESS-hi)) + (eq! (context-instruction---result-lo) (result-ADDRESS-lo)))) + (if-not-zero (context-instruction---is-CALLER) + (begin (eq! (context-instruction---result-hi) (result-CALLER-hi)) + (eq! (context-instruction---result-lo) (result-CALLER-lo)))) + (if-not-zero (context-instruction---is-CALLVALUE) + (begin (eq! (context-instruction---result-hi) 0) + (eq! (context-instruction---result-lo) (result-CALLVALUE-lo)))) + (if-not-zero (context-instruction---is-CALLDATASIZE) + (begin (eq! (context-instruction---result-hi) 0) + (eq! (context-instruction---result-lo) (result-CALLDATASIZE-lo)))) + (if-not-zero (context-instruction---is-RETURNDATASIZE) + (begin (eq! (context-instruction---result-hi) 0) + (eq! (context-instruction---result-lo) (result-RETURNDATASIZE-lo))))))) diff --git a/hub/osaka/constraints/instruction-handling/copy/calldatacopy.lisp b/hub/osaka/constraints/instruction-handling/copy/calldatacopy.lisp new file mode 100644 index 000000000..bcf461786 --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/copy/calldatacopy.lisp @@ -0,0 +1,22 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.4 Specifics for CALLDATACOPY ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defconstraint copy-instruction---CALLDATACOPY---setting-the-gas-cost---MXPX-case (:guard (copy-instruction---standard-CALLDATACOPY)) + (if-not-zero stack/MXPX + (vanishes! GAS_COST))) + +(defconstraint copy-instruction---CALLDATACOPY---setting-the-gas-cost---no-MXPX-case (:guard (copy-instruction---standard-CALLDATACOPY)) + (if-zero stack/MXPX + (eq! GAS_COST (+ stack/STATIC_GAS (copy-instruction---MXP-memory-expansion-gas))))) + + +(defconstraint copy-instruction---CALLDATACOPY---setting-context-row---exceptional-case (:guard (copy-instruction---standard-CALLDATACOPY)) + (if-not-zero XAHOY + (execution-provides-empty-return-data ROFF_CALLDATACOPY_CONTEXT_ROW) + (read-context-data ROFF_CALLDATACOPY_CONTEXT_ROW CONTEXT_NUMBER))) + diff --git a/hub/osaka/constraints/instruction-handling/copy/codecopy.lisp b/hub/osaka/constraints/instruction-handling/copy/codecopy.lisp new file mode 100644 index 000000000..7cdd65792 --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/copy/codecopy.lisp @@ -0,0 +1,51 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.6 Specifics for CODECOPY ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defconstraint copy-instruction---CODECOPY---setting-the-gas-cost---MXPX-case + (:guard (copy-instruction---standard-CODECOPY)) + (if-not-zero stack/MXPX (vanishes! GAS_COST))) + +(defconstraint copy-instruction---CODECOPY---setting-the-gas-cost---no-MXPX-case + (:guard (copy-instruction---standard-CODECOPY)) + (if-zero stack/MXPX (eq! GAS_COST (+ stack/STATIC_GAS (copy-instruction---MXP-memory-expansion-gas))))) + +(defconstraint copy-instruction---CODECOPY---setting-the-context-row---exceptional-case + (:guard (copy-instruction---standard-CODECOPY)) + (if-not-zero XAHOY + (execution-provides-empty-return-data ROFF_CODECOPY_XAHOY_CONTEXT_ROW))) + +(defconstraint copy-instruction---CODECOPY---setting-the-context-row-unexceptional-case + (:guard (copy-instruction---standard-CODECOPY)) + (if-zero XAHOY + (read-context-data ROFF_CODECOPY_XAHOY_CONTEXT_ROW CONTEXT_NUMBER))) + +(defconstraint copy-instruction---CODECOPY---setting-the-account-row---unexceptional-case + (:guard (copy-instruction---standard-CODECOPY)) + (if-zero XAHOY + (begin (eq! (shift account/ADDRESS_HI ROFF_CODECOPY_NO_XAHOY_ACCOUNT_ROW) (shift context/BYTE_CODE_ADDRESS_HI ROFF_CODECOPY_NO_XAHOY_CONTEXT_ROW)) + (eq! (shift account/ADDRESS_LO ROFF_CODECOPY_NO_XAHOY_ACCOUNT_ROW) (shift context/BYTE_CODE_ADDRESS_LO ROFF_CODECOPY_NO_XAHOY_CONTEXT_ROW)) + ;; deployment number + ;; deployment status + ;; ROM_LEX flag + (account-same-balance ROFF_CODECOPY_NO_XAHOY_ACCOUNT_ROW) + (account-same-nonce ROFF_CODECOPY_NO_XAHOY_ACCOUNT_ROW) + (account-same-code ROFF_CODECOPY_NO_XAHOY_ACCOUNT_ROW) + (account-same-deployment-number-and-status ROFF_CODECOPY_NO_XAHOY_ACCOUNT_ROW) + (account-same-warmth ROFF_CODECOPY_NO_XAHOY_ACCOUNT_ROW) + (account-same-marked-for-deletion ROFF_CODECOPY_NO_XAHOY_ACCOUNT_ROW) + (DOM-SUB-stamps---standard ROFF_CODECOPY_NO_XAHOY_ACCOUNT_ROW 0)))) + +(defconstraint copy-instruction---CODECOPY---consistency-constraints---debug + (:guard (copy-instruction---standard-CODECOPY)) + (if-zero XAHOY + (begin + (eq! (shift account/DEPLOYMENT_NUMBER ROFF_CODECOPY_NO_XAHOY_ACCOUNT_ROW) (shift context/BYTE_CODE_DEPLOYMENT_NUMBER ROFF_CODECOPY_NO_XAHOY_CONTEXT_ROW)) + (eq! (shift account/DEPLOYMENT_STATUS ROFF_CODECOPY_NO_XAHOY_ACCOUNT_ROW) (shift context/BYTE_CODE_DEPLOYMENT_STATUS ROFF_CODECOPY_NO_XAHOY_CONTEXT_ROW)) + (eq! (shift account/CODE_FRAGMENT_INDEX ROFF_CODECOPY_NO_XAHOY_ACCOUNT_ROW) (shift context/BYTE_CODE_CODE_FRAGMENT_INDEX ROFF_CODECOPY_NO_XAHOY_CONTEXT_ROW)) + (eq! (shift account/CODE_FRAGMENT_INDEX ROFF_CODECOPY_NO_XAHOY_ACCOUNT_ROW) CODE_FRAGMENT_INDEX) + (account-retrieve-code-fragment-index ROFF_CODECOPY_NO_XAHOY_ACCOUNT_ROW)))) diff --git a/hub/osaka/constraints/instruction-handling/copy/extcodecopy.lisp b/hub/osaka/constraints/instruction-handling/copy/extcodecopy.lisp new file mode 100644 index 000000000..27ac77f3e --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/copy/extcodecopy.lisp @@ -0,0 +1,84 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.7 Specifics for EXTCODECOPY ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defconstraint copy-instruction---EXTCODECOPY---setting-the-gas-cost---MXPX-case (:guard (copy-instruction---standard-EXTCODECOPY)) + (if-not-zero stack/MXPX + (vanishes! GAS_COST))) + +(defconstraint copy-instruction---EXTCODECOPY---setting-the-gas-cost---no-MXPX-case (:guard (copy-instruction---standard-EXTCODECOPY)) + (if-zero stack/MXPX + (eq! GAS_COST + (+ stack/STATIC_GAS + (copy-instruction---MXP-memory-expansion-gas) + (* (copy-instruction---foreign-address-warmth) GAS_CONST_G_WARM_ACCESS) + (* (- 1 (copy-instruction---foreign-address-warmth)) GAS_CONST_G_COLD_ACCOUNT_ACCESS))))) + +;; ;; completely redundant constraint: +;; (defconstraint copy-instruction---EXTCODECOPY---the-MXPX-case (:guard (copy-instruction---standard-EXTCODECOPY)) +;; (begin +;; (debug +;; (if-not-zero stack/MXPX +;; (execution-provides-empty-return-data ROFF_EXTCODECOPY_MXPX_CONTEXT_ROW))))) + +(defconstraint copy-instruction---EXTCODECOPY---the-OOGX-case (:guard (copy-instruction---standard-EXTCODECOPY)) + (if-not-zero stack/OOGX + (begin + ;; account-row i + 2 + (account-trim-address ROFF_EXTCODECOPY_OOGX_ACCOUNT_ROW (copy-instruction---raw-address-hi) (copy-instruction---raw-address-lo)) + (vanishes! (shift account/ROMLEX_FLAG ROFF_EXTCODECOPY_OOGX_ACCOUNT_ROW)) + (account-same-balance ROFF_EXTCODECOPY_OOGX_ACCOUNT_ROW) + (account-same-nonce ROFF_EXTCODECOPY_OOGX_ACCOUNT_ROW) + (account-same-code ROFF_EXTCODECOPY_OOGX_ACCOUNT_ROW) + (account-same-deployment-number-and-status ROFF_EXTCODECOPY_OOGX_ACCOUNT_ROW) + (account-same-warmth ROFF_EXTCODECOPY_OOGX_ACCOUNT_ROW) + (account-same-marked-for-deletion ROFF_EXTCODECOPY_OOGX_ACCOUNT_ROW) + (DOM-SUB-stamps---standard ROFF_EXTCODECOPY_OOGX_ACCOUNT_ROW 0) + ;; context-row i + 3: redundant constraint ahead + (debug (execution-provides-empty-return-data ROFF_EXTCODECOPY_OOGX_CONTEXT_ROW))))) + +(defun (copy-instruction---trigger-CFI) + (* (copy-instruction---is-EXTCODECOPY) + (copy-instruction---trigger_MMU) + (copy-instruction---foreign-address-has-code))) + +(defconstraint copy-instruction---unexceptional-reverted-EXTCODECOPY---doing-account-row (:guard (copy-instruction---standard-EXTCODECOPY)) + (if-not-zero (* (- 1 XAHOY) CONTEXT_WILL_REVERT) + (begin (account-trim-address ROFF_EXTCODECOPY_OOGX_ACCOUNT_ROW (copy-instruction---raw-address-hi) (copy-instruction---raw-address-lo)) + (eq! (shift account/ROMLEX_FLAG ROFF_EXTCODECOPY_NO_XAHOY_REVERT_ACCOUNT_DOING_ROW) (copy-instruction---trigger-CFI)) + (account-same-balance ROFF_EXTCODECOPY_NO_XAHOY_REVERT_ACCOUNT_DOING_ROW) + (account-same-nonce ROFF_EXTCODECOPY_NO_XAHOY_REVERT_ACCOUNT_DOING_ROW) + (account-same-code ROFF_EXTCODECOPY_NO_XAHOY_REVERT_ACCOUNT_DOING_ROW) + (account-same-deployment-number-and-status ROFF_EXTCODECOPY_NO_XAHOY_REVERT_ACCOUNT_DOING_ROW) + (account-turn-on-warmth ROFF_EXTCODECOPY_NO_XAHOY_REVERT_ACCOUNT_DOING_ROW) + (account-same-marked-for-deletion ROFF_EXTCODECOPY_NO_XAHOY_REVERT_ACCOUNT_DOING_ROW) + (DOM-SUB-stamps---standard ROFF_EXTCODECOPY_NO_XAHOY_REVERT_ACCOUNT_DOING_ROW 0)))) + +(defconstraint copy-instruction---unexceptional-reverted-EXTCODECOPY---undoing-account-row (:guard (copy-instruction---standard-EXTCODECOPY)) + (if-not-zero (* (- 1 XAHOY) CONTEXT_WILL_REVERT) + (begin (account-same-address-as ROFF_EXTCODECOPY_NO_XAHOY_REVERT_ACCOUNT_UNDOING_ROW ROFF_EXTCODECOPY_NO_XAHOY_REVERT_ACCOUNT_DOING_ROW) + (debug (vanishes! (shift account/ROMLEX_FLAG ROFF_EXTCODECOPY_NO_XAHOY_REVERT_ACCOUNT_UNDOING_ROW))) + (account-undo-balance-update ROFF_EXTCODECOPY_NO_XAHOY_REVERT_ACCOUNT_UNDOING_ROW ROFF_EXTCODECOPY_NO_XAHOY_REVERT_ACCOUNT_DOING_ROW) + (account-undo-nonce-update ROFF_EXTCODECOPY_NO_XAHOY_REVERT_ACCOUNT_UNDOING_ROW ROFF_EXTCODECOPY_NO_XAHOY_REVERT_ACCOUNT_DOING_ROW) + (account-undo-code-update ROFF_EXTCODECOPY_NO_XAHOY_REVERT_ACCOUNT_UNDOING_ROW ROFF_EXTCODECOPY_NO_XAHOY_REVERT_ACCOUNT_DOING_ROW) + (account-undo-deployment-status-update ROFF_EXTCODECOPY_NO_XAHOY_REVERT_ACCOUNT_UNDOING_ROW ROFF_EXTCODECOPY_NO_XAHOY_REVERT_ACCOUNT_DOING_ROW) + (account-undo-warmth-update ROFF_EXTCODECOPY_NO_XAHOY_REVERT_ACCOUNT_UNDOING_ROW ROFF_EXTCODECOPY_NO_XAHOY_REVERT_ACCOUNT_DOING_ROW) + (account-same-marked-for-deletion ROFF_EXTCODECOPY_NO_XAHOY_REVERT_ACCOUNT_UNDOING_ROW) + (DOM-SUB-stamps---revert-with-current ROFF_EXTCODECOPY_NO_XAHOY_REVERT_ACCOUNT_UNDOING_ROW 1)))) + +(defconstraint copy-instruction---unexceptional-unreverted-EXTCODECOPY-account-row (:guard (copy-instruction---standard-EXTCODECOPY)) + (if-not-zero (* (- 1 XAHOY) (- 1 CONTEXT_WILL_REVERT)) + (begin (account-trim-address ROFF_EXTCODECOPY_NO_XAHOY_NO_REVERT_ACCOUNT_ROW (copy-instruction---raw-address-hi) (copy-instruction---raw-address-lo)) + (eq! (shift account/ROMLEX_FLAG ROFF_EXTCODECOPY_NO_XAHOY_NO_REVERT_ACCOUNT_ROW) (copy-instruction---trigger-CFI)) + (account-same-balance ROFF_EXTCODECOPY_NO_XAHOY_NO_REVERT_ACCOUNT_ROW) + (account-same-nonce ROFF_EXTCODECOPY_NO_XAHOY_NO_REVERT_ACCOUNT_ROW) + (account-same-code ROFF_EXTCODECOPY_NO_XAHOY_NO_REVERT_ACCOUNT_ROW) + (account-same-deployment-number-and-status ROFF_EXTCODECOPY_NO_XAHOY_NO_REVERT_ACCOUNT_ROW) + (account-turn-on-warmth ROFF_EXTCODECOPY_NO_XAHOY_NO_REVERT_ACCOUNT_ROW) + (account-same-marked-for-deletion ROFF_EXTCODECOPY_NO_XAHOY_NO_REVERT_ACCOUNT_ROW) + (DOM-SUB-stamps---standard ROFF_EXTCODECOPY_NO_XAHOY_NO_REVERT_ACCOUNT_ROW 0)))) + diff --git a/hub/osaka/constraints/instruction-handling/copy/generalities.lisp b/hub/osaka/constraints/instruction-handling/copy/generalities.lisp new file mode 100644 index 000000000..e2b1297ee --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/copy/generalities.lisp @@ -0,0 +1,232 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.Y COPY instruction family ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.1 Introduction ;; +;; X.Y.2 Shorthands ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defconst + ROFF_COPY_INST_MISCELLANEOUS_ROW 1 + ;; + ROFF_CALLDATACOPY_CONTEXT_ROW 2 + ;; + ROFF_RETURNDATACOPY_CURRENT_CONTEXT_ROW 2 + ROFF_RETURNDATACOPY_CALLER_CONTEXT_ROW 3 + ;; + ROFF_CODECOPY_XAHOY_CONTEXT_ROW 2 + ROFF_CODECOPY_NO_XAHOY_CONTEXT_ROW 2 + ROFF_CODECOPY_NO_XAHOY_ACCOUNT_ROW 3 + ;; + ROFF_EXTCODECOPY_MXPX_CONTEXT_ROW 2 + ROFF_EXTCODECOPY_OOGX_ACCOUNT_ROW 2 + ROFF_EXTCODECOPY_OOGX_CONTEXT_ROW 3 + ROFF_EXTCODECOPY_NO_XAHOY_REVERT_ACCOUNT_DOING_ROW 2 + ROFF_EXTCODECOPY_NO_XAHOY_REVERT_ACCOUNT_UNDOING_ROW 3 + ROFF_EXTCODECOPY_NO_XAHOY_NO_REVERT_ACCOUNT_ROW 2 + ROFF_EXTCODECOPY_NO_XAHOY_ACCOUNT_ROW 2) + +(defun (copy-instruction---instruction) stack/INSTRUCTION) + +;; +(defun (copy-instruction---is-CALLDATACOPY) [stack/DEC_FLAG 1]) +(defun (copy-instruction---is-RETURNDATACOPY) [stack/DEC_FLAG 2]) +(defun (copy-instruction---is-CODECOPY) [stack/DEC_FLAG 3]) +(defun (copy-instruction---is-EXTCODECOPY) [stack/DEC_FLAG 4]) + +;; +(defun (copy-instruction---target-offset-hi) [stack/STACK_ITEM_VALUE_HI 1]) +(defun (copy-instruction---target-offset-lo) [stack/STACK_ITEM_VALUE_LO 1]) +(defun (copy-instruction---size-hi) [stack/STACK_ITEM_VALUE_HI 2]) +(defun (copy-instruction---size-lo) [stack/STACK_ITEM_VALUE_LO 2]) +(defun (copy-instruction---source-offset-hi) [stack/STACK_ITEM_VALUE_HI 3]) +(defun (copy-instruction---source-offset-lo) [stack/STACK_ITEM_VALUE_LO 3]) +(defun (copy-instruction---raw-address-hi) [stack/STACK_ITEM_VALUE_HI 4]) +(defun (copy-instruction---raw-address-lo) [stack/STACK_ITEM_VALUE_LO 4]) + +;; +(defun (copy-instruction---OOB-raises-return-data-exception) (shift [misc/OOB_DATA 7] ROFF_COPY_INST_MISCELLANEOUS_ROW)) ;; "" +(defun (copy-instruction---MXP-raises-memory-expansion-exception) (shift misc/MXP_MXPX ROFF_COPY_INST_MISCELLANEOUS_ROW)) +(defun (copy-instruction---MXP-memory-expansion-gas) (shift misc/MXP_GAS_MXP ROFF_COPY_INST_MISCELLANEOUS_ROW)) + +;; call data related +(defun (copy-instruction---call-data-context) (shift context/CALL_DATA_CONTEXT_NUMBER ROFF_CALLDATACOPY_CONTEXT_ROW)) +(defun (copy-instruction---call-data-offset) (shift context/CALL_DATA_OFFSET ROFF_CALLDATACOPY_CONTEXT_ROW)) +(defun (copy-instruction---call-data-size) (shift context/CALL_DATA_SIZE ROFF_CALLDATACOPY_CONTEXT_ROW)) + +;; return data related +(defun (copy-instruction---return-data-context) (shift context/RETURN_DATA_CONTEXT_NUMBER ROFF_RETURNDATACOPY_CURRENT_CONTEXT_ROW)) +(defun (copy-instruction---return-data-offset) (shift context/RETURN_DATA_OFFSET ROFF_RETURNDATACOPY_CURRENT_CONTEXT_ROW)) +(defun (copy-instruction---return-data-size) (shift context/RETURN_DATA_SIZE ROFF_RETURNDATACOPY_CURRENT_CONTEXT_ROW)) + +;; for ext code copy +(defun (copy-instruction---bytecode-address-code-fragment-index) (shift account/CODE_FRAGMENT_INDEX ROFF_CODECOPY_NO_XAHOY_ACCOUNT_ROW)) +(defun (copy-instruction---bytecode-address-code-size) (shift account/CODE_SIZE ROFF_CODECOPY_NO_XAHOY_ACCOUNT_ROW)) + +;; +(defun (copy-instruction---foreign-address-warmth) (shift account/WARMTH ROFF_EXTCODECOPY_NO_XAHOY_ACCOUNT_ROW)) +(defun (copy-instruction---foreign-address-has-code) (shift account/HAS_CODE ROFF_EXTCODECOPY_NO_XAHOY_ACCOUNT_ROW)) +(defun (copy-instruction---foreign-address-code-size) (shift account/CODE_SIZE ROFF_EXTCODECOPY_NO_XAHOY_ACCOUNT_ROW)) +(defun (copy-instruction---foreign-address-code-fragment-index) (shift account/CODE_FRAGMENT_INDEX ROFF_EXTCODECOPY_NO_XAHOY_ACCOUNT_ROW)) +(defun (copy-instruction---standard-precondition) (* PEEK_AT_STACK stack/COPY_FLAG (- 1 stack/SUX stack/SOX))) +(defun (copy-instruction---standard-CALLDATACOPY) (* (copy-instruction---standard-precondition) (copy-instruction---is-CALLDATACOPY))) +(defun (copy-instruction---standard-RETURNDATACOPY) (* (copy-instruction---standard-precondition) (copy-instruction---is-RETURNDATACOPY))) +(defun (copy-instruction---standard-CODECOPY) (* (copy-instruction---standard-precondition) (copy-instruction---is-CODECOPY))) +(defun (copy-instruction---standard-EXTCODECOPY) (* (copy-instruction---standard-precondition) (copy-instruction---is-EXTCODECOPY))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.3 General constraints ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defconstraint copy-instruction---setting-the-stack-pattern (:guard (copy-instruction---standard-precondition)) + (copy-stack-pattern (copy-instruction---is-EXTCODECOPY))) + +(defconstraint copy-instruction---allowable-exceptions (:guard (copy-instruction---standard-precondition));; could be debug ... + (eq! XAHOY + (+ (* (copy-instruction---is-RETURNDATACOPY) stack/RDCX) stack/MXPX stack/OOGX))) + +(defconstraint copy-instruction---setting-NSR-and-peeking-flags---CALLDATACOPY-case (:guard (copy-instruction---standard-CALLDATACOPY)) + (begin (eq! NSR 2) + (eq! NSR + (+ (shift PEEK_AT_MISCELLANEOUS ROFF_COPY_INST_MISCELLANEOUS_ROW) + (shift PEEK_AT_CONTEXT ROFF_CALLDATACOPY_CONTEXT_ROW))))) + +(defconstraint copy-instruction---setting-NSR-and-peeking-flags---RETURNDATACOPY-case (:guard (copy-instruction---standard-RETURNDATACOPY)) + (begin + (eq! NSR (+ 2 XAHOY)) + (eq! NSR + (+ (shift PEEK_AT_MISCELLANEOUS ROFF_COPY_INST_MISCELLANEOUS_ROW ) + (shift PEEK_AT_CONTEXT ROFF_RETURNDATACOPY_CURRENT_CONTEXT_ROW ) + (* (shift PEEK_AT_CONTEXT ROFF_RETURNDATACOPY_CALLER_CONTEXT_ROW ) XAHOY))))) + +(defconstraint copy-instruction---setting-NSR-and-peeking-flags---CODECOPY-case (:guard (copy-instruction---standard-CODECOPY)) + (begin (eq! NSR (- 3 XAHOY)) + (if-not-zero XAHOY + ;; XAHOY ≡ 1 + (eq! NSR + (+ (shift PEEK_AT_MISCELLANEOUS ROFF_COPY_INST_MISCELLANEOUS_ROW) + (shift PEEK_AT_CONTEXT ROFF_CODECOPY_XAHOY_CONTEXT_ROW))) + ;; XAHOY ≡ 0 + (eq! NSR + (+ (shift PEEK_AT_MISCELLANEOUS ROFF_COPY_INST_MISCELLANEOUS_ROW) + (shift PEEK_AT_CONTEXT ROFF_CODECOPY_NO_XAHOY_CONTEXT_ROW) + (shift PEEK_AT_ACCOUNT ROFF_CODECOPY_NO_XAHOY_ACCOUNT_ROW)))))) + +(defconstraint copy-instruction---setting-NSR-and-peeking-flags---EXTCODECOPY-case (:guard (copy-instruction---standard-EXTCODECOPY)) + (begin (eq! NSR + (+ 2 + stack/OOGX + (* (- 1 XAHOY) CONTEXT_WILL_REVERT))) + (if-not-zero stack/MXPX + (eq! NSR + (+ (shift PEEK_AT_MISCELLANEOUS ROFF_COPY_INST_MISCELLANEOUS_ROW) + (shift PEEK_AT_CONTEXT ROFF_EXTCODECOPY_MXPX_CONTEXT_ROW)))) + (if-not-zero stack/OOGX + (eq! NSR + (+ (shift PEEK_AT_MISCELLANEOUS ROFF_COPY_INST_MISCELLANEOUS_ROW) + (shift PEEK_AT_CONTEXT ROFF_EXTCODECOPY_OOGX_CONTEXT_ROW) + (shift PEEK_AT_ACCOUNT ROFF_EXTCODECOPY_OOGX_ACCOUNT_ROW)))) + (if-zero XAHOY + (if-not-zero CONTEXT_WILL_REVERT + ;; CN_WILL_REV ≡ 1 + (eq! NSR + (+ (shift PEEK_AT_MISCELLANEOUS ROFF_COPY_INST_MISCELLANEOUS_ROW) + (shift PEEK_AT_ACCOUNT ROFF_EXTCODECOPY_NO_XAHOY_REVERT_ACCOUNT_DOING_ROW) + (shift PEEK_AT_ACCOUNT ROFF_EXTCODECOPY_NO_XAHOY_REVERT_ACCOUNT_UNDOING_ROW))) + ;; CN_WILL_REV ≡ 0 + (eq! NSR + (+ (shift PEEK_AT_MISCELLANEOUS ROFF_COPY_INST_MISCELLANEOUS_ROW) + (shift PEEK_AT_ACCOUNT ROFF_EXTCODECOPY_NO_XAHOY_NO_REVERT_ACCOUNT_ROW))))))) + +(defconstraint copy-instruction---setting-misc-row-module-flags (:guard (copy-instruction---standard-precondition)) + (begin + (eq! (weighted-MISC-flag-sum-sans-MMU ROFF_COPY_INST_MISCELLANEOUS_ROW) + (+ (* MISC_WEIGHT_MXP (copy-instruction---trigger_MXP)) + (* MISC_WEIGHT_OOB (copy-instruction---trigger_OOB)))) + (eq! (shift misc/MMU_FLAG ROFF_COPY_INST_MISCELLANEOUS_ROW) (copy-instruction---trigger_MMU)) + )) + +(defun (copy-instruction---trigger_OOB) (copy-instruction---is-RETURNDATACOPY)) +(defun (copy-instruction---trigger_MXP) (- 1 stack/RDCX)) +(defun (copy-instruction---trigger_MMU) (* (- 1 XAHOY) (shift misc/MXP_SIZE_1_NONZERO_NO_MXPX ROFF_COPY_INST_MISCELLANEOUS_ROW))) + +(defconstraint copy-instruction---misc-row---setting-OOB-instruction (:guard (copy-instruction---standard-precondition)) + (if-not-zero (shift misc/OOB_FLAG ROFF_COPY_INST_MISCELLANEOUS_ROW) + (set-OOB-instruction---rdc ROFF_COPY_INST_MISCELLANEOUS_ROW + (copy-instruction---source-offset-hi) + (copy-instruction---source-offset-lo) + (copy-instruction---size-hi) + (copy-instruction---size-lo) + (copy-instruction---return-data-size)))) + +(defconstraint copy-instruction---misc-row---setting-RDCX (:guard (copy-instruction---standard-precondition)) + (if-zero (shift misc/OOB_FLAG ROFF_COPY_INST_MISCELLANEOUS_ROW) + ;; OOB_FLAG ≡ 0 + ;; zero case is redundant ... + (vanishes! stack/RDCX) + ;; OOB_FLAG ≡ 1 + (eq! stack/RDCX (copy-instruction---OOB-raises-return-data-exception)))) + +(defconstraint copy-instruction---misc-row---setting-MXP-instruction (:guard (copy-instruction---standard-precondition)) + (if-not-zero (shift misc/MXP_FLAG ROFF_COPY_INST_MISCELLANEOUS_ROW) + (set-MXP-instruction---single-mxp-offset-instructions ROFF_COPY_INST_MISCELLANEOUS_ROW ;; row offset kappa + stack/INSTRUCTION ;; instruction + 0 ;; deploys (bit modifying the behaviour of RETURN pricing) + (copy-instruction---target-offset-hi) ;; offset high + (copy-instruction---target-offset-lo) ;; offset low + (copy-instruction---size-hi) ;; size high + (copy-instruction---size-lo)))) ;; size low + +(defconstraint copy-instruction---misc-row---setting-MXPX (:guard (copy-instruction---standard-precondition)) + (if-zero (shift misc/MXP_FLAG ROFF_COPY_INST_MISCELLANEOUS_ROW) + ;; MXP_FLAG ≡ 0 + ;; can only happen for RETURNDATACOPY instruction raising the returnDataCopyException; redundant constraint; + (eq! stack/MXPX 0) + ;; MXP_FLAG ≡ 1 + (eq! stack/MXPX (copy-instruction---MXP-raises-memory-expansion-exception)))) + +(defconstraint copy-instruction---misc-row---partially-setting-the-MMU-instruction (:guard (copy-instruction---standard-precondition)) + (if-not-zero (shift misc/MMU_FLAG ROFF_COPY_INST_MISCELLANEOUS_ROW) + (set-MMU-instruction---any-to-ram-with-padding ROFF_COPY_INST_MISCELLANEOUS_ROW ;; offset + (copy-instruction---source-id) ;; source ID + CONTEXT_NUMBER ;; target ID + ;; aux_id ;; auxiliary ID + (copy-instruction---source-offset-hi) ;; source offset high + (copy-instruction---source-offset-lo) ;; source offset low + (copy-instruction---target-offset-lo) ;; target offset low + (copy-instruction---size-lo) ;; size + (copy-instruction---reference-offset) ;; reference offset + (copy-instruction---reference-size) ;; reference size + ;; success_bit ;; success bit + ;; limb_1 ;; limb 1 + ;; limb_2 ;; limb 2 + (copy-instruction---exo-sum) ;; weighted exogenous module flag sum + ;; phase ;; phase + ))) + +(defun (copy-instruction---source-id) (+ (* (copy-instruction---is-CALLDATACOPY) (copy-instruction---call-data-context)) + (* (copy-instruction---is-RETURNDATACOPY) (copy-instruction---return-data-context)) + (* (copy-instruction---is-CODECOPY) (copy-instruction---bytecode-address-code-fragment-index)) + (* (copy-instruction---is-EXTCODECOPY) (copy-instruction---foreign-address-code-fragment-index) (copy-instruction---foreign-address-has-code)))) + +(defun (copy-instruction---reference-offset) (+ (* (copy-instruction---is-CALLDATACOPY) (copy-instruction---call-data-offset)) + (* (copy-instruction---is-RETURNDATACOPY) (copy-instruction---return-data-offset)))) + +(defun (copy-instruction---reference-size) (+ (* (copy-instruction---is-CALLDATACOPY) (copy-instruction---call-data-size)) + (* (copy-instruction---is-RETURNDATACOPY) (copy-instruction---return-data-size)) + (* (copy-instruction---is-CODECOPY) (copy-instruction---bytecode-address-code-size)) + (* (copy-instruction---is-EXTCODECOPY) (copy-instruction---foreign-address-code-size) (copy-instruction---foreign-address-has-code)))) + +(defun (copy-instruction---exo-sum) (+ (* (copy-instruction---is-CODECOPY) EXO_SUM_WEIGHT_ROM) + (* (copy-instruction---is-EXTCODECOPY) EXO_SUM_WEIGHT_ROM))) diff --git a/hub/osaka/constraints/instruction-handling/copy/returndatacopy.lisp b/hub/osaka/constraints/instruction-handling/copy/returndatacopy.lisp new file mode 100644 index 000000000..de12c52b6 --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/copy/returndatacopy.lisp @@ -0,0 +1,22 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.5 Specifics for RETURNDATACOPY ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defconstraint copy-instruction---RETURNDATACOPY---setting-the-gas-cost---sans-computation (:guard (copy-instruction---standard-RETURNDATACOPY)) + (begin + (if-not-zero stack/RDCX (vanishes! GAS_COST)) + (if-not-zero stack/MXPX (vanishes! GAS_COST)))) + +(defconstraint copy-instruction---RETURNDATACOPY---setting-the-gas-cost---with-computation (:guard (copy-instruction---standard-RETURNDATACOPY)) + (begin + (if-not-zero stack/OOGX (eq! GAS_COST (+ stack/STATIC_GAS (copy-instruction---MXP-memory-expansion-gas)))) + (if-zero XAHOY (eq! GAS_COST (+ stack/STATIC_GAS (copy-instruction---MXP-memory-expansion-gas)))))) + +(defconstraint copy-instruction---RETURNDATACOPY---setting-the-context-rows (:guard (copy-instruction---standard-RETURNDATACOPY)) + (begin + (read-context-data ROFF_RETURNDATACOPY_CURRENT_CONTEXT_ROW CONTEXT_NUMBER) + (if-not-zero XAHOY (execution-provides-empty-return-data ROFF_RETURNDATACOPY_CALLER_CONTEXT_ROW )))) diff --git a/hub/osaka/constraints/instruction-handling/create/constants.lisp b/hub/osaka/constraints/instruction-handling/create/constants.lisp new file mode 100644 index 000000000..f7be3dff9 --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/create/constants.lisp @@ -0,0 +1,32 @@ +(module hub) + +(defconst + CREATE_first_stack_row___row_offset -2 + CREATE_second_stack_row___row_offset -1 + CREATE_current_context_row___row_offset 1 + CREATE_miscellaneous_row___row_offset 2 + CREATE_first_creator_account_row___row_offset 3 + CREATE_first_createe_account_row___row_offset 4 + CREATE_second_creator_account_row___row_offset 5 + CREATE_second_createe_account_row___row_offset 6 + CREATE_third_creator_account_row___row_offset 7 + CREATE_third_createe_account_row___row_offset 8 + ;; Exception + CREATE_exception_caller_context_row___row_offset 3 + ;; Abort + CREATE_abort_current_account_row___row_offset 3 + CREATE_abort_current_context_row___row_offset 4 + ;; Failure condition (will or won't revert) + CREATE_fcond_will_revert_current_context_row___row_offset 7 + CREATE_fcond_wont_revert_current_context_row___row_offset 5 + ;; Empty initialization code (will or won't revert) + CREATE_empty_init_code_will_revert_current_context_row___row_offset 7 + CREATE_empty_init_code_wont_revert_current_context_row___row_offset 5 + ;; Nonempty initialization code failure (will or won't revert) + CREATE_nonempty_init_code_failure_will_revert_new_context_row___row_offset 9 + CREATE_nonempty_init_code_failure_wont_revert_new_context_row___row_offset 7 + ;; Nonempty initialization code success (will or won't revert) + CREATE_nonempty_init_code_success_will_revert_new_context_row___row_offset 7 + CREATE_nonempty_init_code_success_wont_revert_new_context_row___row_offset 5 + ) + diff --git a/hub/osaka/constraints/instruction-handling/create/constraints/deployment-failures.lisp b/hub/osaka/constraints/instruction-handling/create/constraints/deployment-failures.lisp new file mode 100644 index 000000000..1258e13f2 --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/create/constraints/deployment-failures.lisp @@ -0,0 +1,51 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.Y CREATE ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;; + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.14 Deployment failure CREATE's ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (create-instruction---deployment-failure-precondition) (* PEEK_AT_SCENARIO (scenario-shorthand---CREATE---deployment-failure))) + +(defconstraint create-instruction---nonempty-deployment-failure---undoing-creator-account-operations + (:guard (create-instruction---deployment-failure-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (begin + (account-same-address-as CREATE_second_creator_account_row___row_offset CREATE_first_creator_account_row___row_offset) + (account-undo-balance-update CREATE_second_creator_account_row___row_offset CREATE_first_creator_account_row___row_offset) + (account-same-nonce CREATE_second_creator_account_row___row_offset) + (account-same-code CREATE_second_creator_account_row___row_offset) + (account-same-warmth CREATE_second_creator_account_row___row_offset) + (account-same-deployment-number-and-status CREATE_second_creator_account_row___row_offset) + (account-same-marked-for-deletion CREATE_second_creator_account_row___row_offset) + (vanishes! (shift account/TRM_FLAG CREATE_second_creator_account_row___row_offset)) + (vanishes! (shift account/ROMLEX_FLAG CREATE_second_creator_account_row___row_offset)) + (vanishes! (shift account/RLPADDR_FLAG CREATE_second_creator_account_row___row_offset)) + (DOM-SUB-stamps---revert-with-child CREATE_second_creator_account_row___row_offset 0 (create-instruction---createe-revert-stamp)) + )) + +(defconstraint create-instruction---nonempty-deployment-failure---undoing-createe-account-operations + (:guard (create-instruction---deployment-failure-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (begin + (account-same-address-as CREATE_second_createe_account_row___row_offset CREATE_first_createe_account_row___row_offset) + (account-undo-balance-update CREATE_second_createe_account_row___row_offset CREATE_first_createe_account_row___row_offset) + (account-undo-nonce-update CREATE_second_createe_account_row___row_offset CREATE_first_createe_account_row___row_offset) + (account-undo-code-update CREATE_second_createe_account_row___row_offset CREATE_first_createe_account_row___row_offset) + (account-same-warmth CREATE_second_createe_account_row___row_offset) + (account-undo-deployment-status-update CREATE_second_createe_account_row___row_offset CREATE_first_createe_account_row___row_offset) + (account-same-marked-for-deletion CREATE_second_createe_account_row___row_offset) + (vanishes! (shift account/TRM_FLAG CREATE_second_createe_account_row___row_offset)) + (vanishes! (shift account/ROMLEX_FLAG CREATE_second_createe_account_row___row_offset)) + (vanishes! (shift account/RLPADDR_FLAG CREATE_second_createe_account_row___row_offset)) + (DOM-SUB-stamps---revert-with-child CREATE_second_createe_account_row___row_offset 1 (create-instruction---createe-revert-stamp)) + )) diff --git a/hub/osaka/constraints/instruction-handling/create/constraints/exceptional.lisp b/hub/osaka/constraints/instruction-handling/create/constraints/exceptional.lisp new file mode 100644 index 000000000..b5ae04eb2 --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/create/constraints/exceptional.lisp @@ -0,0 +1,20 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.Y CREATE ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;; + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.11 Exceptional CREATE's ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (create-instruction---exceptional-CREATE-precondition) (* PEEK_AT_SCENARIO scenario/CREATE_EXCEPTION)) + +(defconstraint create-instruction---exceptional-CREATE-updating-the-caller-context (:guard (create-instruction---exceptional-CREATE-precondition)) + (execution-provides-empty-return-data CREATE_exception_caller_context_row___row_offset)) diff --git a/hub/osaka/constraints/instruction-handling/create/constraints/final-context-row.lisp b/hub/osaka/constraints/instruction-handling/create/constraints/final-context-row.lisp new file mode 100644 index 000000000..bc848fcc8 --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/create/constraints/final-context-row.lisp @@ -0,0 +1,103 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.Y CREATE ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;; + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.16 Final context row ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstraint create-instruction---final-context-row-for-exceptional-CREATEs (:guard (* PEEK_AT_SCENARIO scenario/CREATE_EXCEPTION )) + (execution-provides-empty-return-data CREATE_exception_caller_context_row___row_offset)) + +(defconstraint create-instruction---final-context-row-for-aborted-CREATEs (:guard (* PEEK_AT_SCENARIO scenario/CREATE_ABORT )) + (nonexecution-provides-empty-return-data CREATE_abort_current_context_row___row_offset)) + +(defconstraint create-instruction---final-context-row-when-raising-failure-condition-and-reverting (:guard (* PEEK_AT_SCENARIO scenario/CREATE_FAILURE_CONDITION_WILL_REVERT )) + (nonexecution-provides-empty-return-data CREATE_fcond_will_revert_current_context_row___row_offset)) + +(defconstraint create-instruction---final-context-row-when-raising-failure-condition-but-not-reverting (:guard (* PEEK_AT_SCENARIO scenario/CREATE_FAILURE_CONDITION_WONT_REVERT )) + (nonexecution-provides-empty-return-data CREATE_fcond_wont_revert_current_context_row___row_offset)) + +(defconstraint create-instruction---final-context-row-with-empty-init-code-and-reverting (:guard (* PEEK_AT_SCENARIO scenario/CREATE_EMPTY_INIT_CODE_WILL_REVERT )) + (nonexecution-provides-empty-return-data CREATE_empty_init_code_will_revert_current_context_row___row_offset)) + +(defconstraint create-instruction---final-context-row-with-empty-init-code-but-not-reverting (:guard (* PEEK_AT_SCENARIO scenario/CREATE_EMPTY_INIT_CODE_WONT_REVERT )) + (nonexecution-provides-empty-return-data CREATE_empty_init_code_wont_revert_current_context_row___row_offset)) + +(defconstraint create-instruction---final-context-row-for-deployment-failures-that-will-revert (:guard (* PEEK_AT_SCENARIO scenario/CREATE_NONEMPTY_INIT_CODE_FAILURE_WILL_REVERT )) + (begin + (initialize-deployment-context CREATE_nonempty_init_code_failure_will_revert_new_context_row___row_offset) + (first-row-of-deployment-context CREATE_nonempty_init_code_failure_will_revert_new_context_row___row_offset) + (justify-createe-revert-data CREATE_nonempty_init_code_failure_will_revert_new_context_row___row_offset) + )) + +(defconstraint create-instruction---final-context-row-for-deployment-failures-that-wont-revert (:guard (* PEEK_AT_SCENARIO scenario/CREATE_NONEMPTY_INIT_CODE_FAILURE_WONT_REVERT )) + (begin + (initialize-deployment-context CREATE_nonempty_init_code_failure_wont_revert_new_context_row___row_offset) + (first-row-of-deployment-context CREATE_nonempty_init_code_failure_wont_revert_new_context_row___row_offset) + (justify-createe-revert-data CREATE_nonempty_init_code_failure_wont_revert_new_context_row___row_offset) + )) + +(defconstraint create-instruction---final-context-row-for-deployment-successes-that-will-revert (:guard (* PEEK_AT_SCENARIO scenario/CREATE_NONEMPTY_INIT_CODE_SUCCESS_WILL_REVERT )) + (begin + (initialize-deployment-context CREATE_nonempty_init_code_success_will_revert_new_context_row___row_offset) + (first-row-of-deployment-context CREATE_nonempty_init_code_success_will_revert_new_context_row___row_offset) + (justify-createe-revert-data CREATE_nonempty_init_code_success_will_revert_new_context_row___row_offset) + )) + +(defconstraint create-instruction---final-context-row-for-deployment-successes-that-wont-revert (:guard (* PEEK_AT_SCENARIO scenario/CREATE_NONEMPTY_INIT_CODE_SUCCESS_WONT_REVERT )) + (begin + (initialize-deployment-context CREATE_nonempty_init_code_success_wont_revert_new_context_row___row_offset) + (first-row-of-deployment-context CREATE_nonempty_init_code_success_wont_revert_new_context_row___row_offset) + (justify-createe-revert-data CREATE_nonempty_init_code_success_wont_revert_new_context_row___row_offset) + )) + +(defun (initialize-deployment-context relative_row_offset) + (initialize-context + relative_row_offset ;; row offset + (+ 1 HUB_STAMP) ;; context number + (+ 1 (create-instruction---current-context-csd)) ;; call stack depth + 0 ;; is root + 0 ;; is static + (create-instruction---createe-address-hi) ;; account address high + (create-instruction---createe-address-lo) ;; account address low + (shift account/DEPLOYMENT_NUMBER_NEW CREATE_first_createe_account_row___row_offset) ;; account deployment number + (create-instruction---createe-address-hi) ;; byte code address high + (create-instruction---createe-address-lo) ;; byte code address low + (shift account/DEPLOYMENT_NUMBER_NEW CREATE_first_createe_account_row___row_offset) ;; byte code deployment number + 1 ;; byte code deployment status + (create-instruction---deployment-cfi) ;; byte code code fragment index + (create-instruction---creator-address-hi) ;; caller address high + (create-instruction---creator-address-lo) ;; caller address low + (create-instruction---STACK-value-lo) ;; call value + CONTEXT_NUMBER ;; caller context + 0 ;; call data offset + 0 ;; call data size + 0 ;; return at offset + 0 ;; return at capacity + )) + + +(defun (first-row-of-deployment-context relative_row_offset) + (begin + (eq! (shift CONTEXT_NUMBER (+ relative_row_offset 1)) (shift context/CONTEXT_NUMBER relative_row_offset)) + (eq! (shift CALLER_CONTEXT_NUMBER (+ relative_row_offset 1)) (shift CONTEXT_NUMBER relative_row_offset)) + (eq! (shift CFI (+ relative_row_offset 1)) (shift context/BYTE_CODE_CODE_FRAGMENT_INDEX relative_row_offset)) + (eq! (shift PROGRAM_COUNTER (+ relative_row_offset 1)) 0) + (eq! (shift GAS_XPCT (+ relative_row_offset 1)) (create-instruction---STP-gas-paid-out-of-pocket)) + )) + +(defun (justify-createe-revert-data relative_row_offset) + (begin + (eq! (create-instruction---createe-self-reverts) (shift CONTEXT_SELF_REVERTS (+ relative_row_offset 1))) + (eq! (create-instruction---createe-revert-stamp) (shift CONTEXT_REVERT_STAMP (+ relative_row_offset 1))) + )) diff --git a/hub/osaka/constraints/instruction-handling/create/constraints/generalities.lisp b/hub/osaka/constraints/instruction-handling/create/constraints/generalities.lisp new file mode 100644 index 000000000..6c2cabda2 --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/create/constraints/generalities.lisp @@ -0,0 +1,206 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.Y CREATE ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;; + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.9 Generalities for all CREATE's ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (create-instruction---generic-precondition) (* PEEK_AT_SCENARIO (scenario-shorthand---CREATE---sum))) + +;; monstrous ... +(defconstraint create-instruction---setting-the-stack-pattern (:guard (create-instruction---generic-precondition)) + (shift (create-stack-pattern (shift (create-instruction---is-CREATE2) 2)) -2)) + +(defconstraint create-instruction---setting-the-deployment-address-stack-output (:guard (create-instruction---generic-precondition)) + (begin (eq! (create-instruction---STACK-output-hi) (* (scenario-shorthand---CREATE---deployment-success) (create-instruction---createe-address-hi))) + (eq! (create-instruction---STACK-output-lo) (* (scenario-shorthand---CREATE---deployment-success) (create-instruction---createe-address-lo))) + )) + +(defconstraint create-instruction---triggering-the-HASHINFO-lookup-and-settings (:guard (create-instruction---generic-precondition)) + (maybe-request-hash CREATE_first_stack_row___row_offset + (create-instruction---trigger_HASHINFO))) + +(defconstraint create-instruction---setting-the-first-context-row (:guard (create-instruction---generic-precondition)) + (read-context-data CREATE_current_context_row___row_offset + CONTEXT_NUMBER)) + +(defconstraint create-instruction---setting-the-static-exception (:guard (create-instruction---generic-precondition)) + (eq! (create-instruction---STACK-staticx) + (create-instruction---current-context-is-static))) + +(defconstraint create-instruction---setting-the-module-flags-of-the-miscellaneous-row (:guard (create-instruction---generic-precondition)) + (begin + (eq! (shift misc/EXP_FLAG CREATE_miscellaneous_row___row_offset) 0) + (eq! (shift misc/MMU_FLAG CREATE_miscellaneous_row___row_offset) (create-instruction---trigger_MMU)) + (eq! (shift misc/MXP_FLAG CREATE_miscellaneous_row___row_offset) (create-instruction---trigger_MXP)) + (eq! (shift misc/OOB_FLAG CREATE_miscellaneous_row___row_offset) (create-instruction---trigger_OOB)) + (eq! (shift misc/STP_FLAG CREATE_miscellaneous_row___row_offset) (create-instruction---trigger_STP)) + )) + +(defconstraint create-instruction---setting-the-MXP-instruction (:guard (create-instruction---generic-precondition)) + (if-not-zero (shift misc/MXP_FLAG CREATE_miscellaneous_row___row_offset) + (set-MXP-instruction---single-mxp-offset-instructions CREATE_miscellaneous_row___row_offset ;; row offset kappa + (create-instruction---instruction) ;; instruction + 0 ;; bit modifying the behaviour of RETURN pricing + (create-instruction---STACK-offset-hi) ;; offset high + (create-instruction---STACK-offset-lo) ;; offset low + (create-instruction---STACK-size-hi) ;; size high + (create-instruction---STACK-size-lo)) ;; size low + )) + +(defconstraint create-instruction---setting-the-memory-expansion-exception (:guard (create-instruction---generic-precondition)) + (if-zero (shift misc/MXP_FLAG CREATE_miscellaneous_row___row_offset) + ;; MXP_FLAG ≡ 0 + (vanishes! (create-instruction---STACK-mxpx)) + ;; MXP_FLAG ≡ 1 + (eq! (create-instruction---STACK-mxpx) + (create-instruction---MXP-mxpx)) + )) + +(defconstraint create-instruction---setting-the-STP-instruction (:guard (create-instruction---generic-precondition)) + (if-not-zero (shift misc/STP_FLAG CREATE_miscellaneous_row___row_offset) + (set-STP-instruction-create CREATE_miscellaneous_row___row_offset ;; relative row offset + (create-instruction---instruction) ;; instruction + (create-instruction---STACK-value-hi) ;; value to transfer, high part + (create-instruction---STACK-value-lo) ;; value to transfer, low part + (create-instruction---MXP-gas) ;; memory expansion gas + ))) + +(defconstraint create-instruction---setting-the-out-of-gas-exception + (:guard (create-instruction---generic-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-zero (shift misc/STP_FLAG CREATE_miscellaneous_row___row_offset) + ;; STP_FLAG ≡ 0 + (vanishes! (create-instruction---STACK-oogx)) + ;; STP_FLAG ≡ 1 + (eq! (create-instruction---STACK-oogx) + (create-instruction---STP-oogx)) + )) + +(defconstraint create-instruction---setting-the-OOB-instruction---exceptional-case + (:guard (create-instruction---generic-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-not-zero (create-instruction---trigger_OOB_X) + (set-OOB-instruction---xcreate CREATE_miscellaneous_row___row_offset ;; offset + (create-instruction---STACK-size-hi) ;; init code size (high part) + (create-instruction---STACK-size-lo) ;; init code size (low part, stack argument of CREATE-type instruction) + ))) + +(defconstraint create-instruction---setting-the-OOB-instruction---unexceptional-case + (:guard (create-instruction---generic-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-not-zero (create-instruction---trigger_OOB_U) + (set-OOB-instruction---create CREATE_miscellaneous_row___row_offset ;; offset + (create-instruction---STACK-value-hi) ;; value (high part) + (create-instruction---STACK-value-lo) ;; value (low part, stack argument of CALL-type instruction) + (create-instruction---creator-balance) ;; balance (from caller account) + (create-instruction---createe-nonce) ;; callee's nonce + (create-instruction---createe-has-code) ;; callee's HAS_CODE + (create-instruction---current-context-csd) ;; current call stack depth + (create-instruction---creator-nonce) ;; creator account nonce + (create-instruction---init-code-size) ;; init code size + ))) + +(defun (create-instruction---createe-nonce) (* (scenario-shorthand---CREATE---load-createe-account) (shift account/NONCE CREATE_first_createe_account_row___row_offset))) +(defun (create-instruction---createe-has-code) (* (scenario-shorthand---CREATE---load-createe-account) (shift account/HAS_CODE CREATE_first_createe_account_row___row_offset))) + +(defconstraint create-instruction---setting-the-CREATE-scenario---exceptional + (:guard (create-instruction---generic-precondition)) + (eq! scenario/CREATE_EXCEPTION XAHOY)) + +(defconstraint create-instruction---setting-the-CREATE-scenario---unexceptional-generalities + (:guard (create-instruction---generic-precondition)) + (if-not-zero (scenario-shorthand---CREATE---unexceptional) + (begin + (eq! scenario/CREATE_ABORT (create-instruction---OOB-aborting-condition)) + (eq! (scenario-shorthand---CREATE---failure-condition) (create-instruction---OOB-failure-condition) ) + (debug (eq! (scenario-shorthand---CREATE---not-rebuffed) (- 1 + (create-instruction---OOB-aborting-condition) + (create-instruction---OOB-failure-condition))))))) + +(defconstraint create-instruction---setting-the-CREATE-scenario---WILL_REVERT-scenarios + (:guard (create-instruction---generic-precondition)) + (if-not-zero (scenario-shorthand---CREATE---creator-state-change) + (eq! (scenario-shorthand---CREATE---creator-state-change-will-revert) + CONTEXT_WILL_REVERT))) + +(defconstraint create-instruction---setting-the-CREATE-scenario---not-rebuffed-scenarios + (:guard (create-instruction---generic-precondition)) + (if-not-zero (scenario-shorthand---CREATE---not-rebuffed) + (eq! (scenario-shorthand---CREATE---not-rebuffed-nonempty-init-code) + (create-instruction---MXP-s1nznomxpx)))) + +(defconstraint create-instruction---setting-the-CREATE-scenario---not-rebuffed-nonempty-init-code + (:guard (create-instruction---generic-precondition)) + (if-not-zero (scenario-shorthand---CREATE---not-rebuffed-nonempty-init-code) + (eq! (scenario-shorthand---CREATE---deployment-failure) + (shift misc/CCSR_FLAG CREATE_miscellaneous_row___row_offset)))) + +(defconstraint create-instruction---setting-the-MMU-instruction (:guard (create-instruction---generic-precondition)) + (if-not-zero (shift misc/MMU_FLAG CREATE_miscellaneous_row___row_offset) + (set-MMU-instruction---ram-to-exo-with-padding CREATE_miscellaneous_row___row_offset ;; offset + CONTEXT_NUMBER ;; source ID + (create-instruction---tgt-id) ;; target ID + (create-instruction---aux-id) ;; auxiliary ID + ;; src_offset_hi ;; source offset high + (create-instruction---STACK-offset-lo) ;; source offset low + ;; tgt_offset_lo ;; target offset low + (create-instruction---STACK-size-lo) ;; size + ;; ref_offset ;; reference offset + (create-instruction---STACK-size-lo) ;; reference size + 0 ;; success bit + ;; limb_1 ;; limb 1 + ;; limb_2 ;; limb 2 + (create-instruction---exo-sum) ;; weighted exogenous module flag sum + 0 ;; phase + ))) + +(defun (create-instruction---tgt-id) (+ (* (create-instruction---hash-init-code-and-send-to-ROM) (create-instruction---deployment-cfi)) + (* (create-instruction---send-init-code-to-ROM) (create-instruction---deployment-cfi)))) + +(defun (create-instruction---aux-id) (+ (* (create-instruction---hash-init-code) (+ 1 HUB_STAMP)) + (* (create-instruction---hash-init-code-and-send-to-ROM) (+ 1 HUB_STAMP)))) + +(defun (create-instruction---exo-sum) (+ (* (create-instruction---hash-init-code) EXO_SUM_WEIGHT_KEC) + (* (create-instruction---hash-init-code-and-send-to-ROM) (+ EXO_SUM_WEIGHT_ROM EXO_SUM_WEIGHT_KEC)) + (* (create-instruction---send-init-code-to-ROM) EXO_SUM_WEIGHT_ROM))) + +(defconstraint create-instruction---setting-the-next-context-number (:guard (create-instruction---generic-precondition)) + (begin + (if-not-zero scenario/CREATE_EXCEPTION (next-context-is-caller)) + (if-not-zero (scenario-shorthand---CREATE---no-context-change) (next-context-is-current)) + (if-not-zero (scenario-shorthand---CREATE---not-rebuffed-nonempty-init-code) (next-context-is-new)))) + +(defun (create-instruction---upfront-gas-cost) (+ GAS_CONST_G_CREATE + (create-instruction---MXP-gas))) +(defun (create-instruction---full-gas-cost) (+ (create-instruction---upfront-gas-cost) + (create-instruction---STP-gas-paid-out-of-pocket))) + + +(defconstraint create-instruction---setting-GAS_COST (:guard (create-instruction---generic-precondition)) + (begin + (if-not-zero (+ (create-instruction---STACK-staticx) + (create-instruction---STACK-mxpx)) + (eq! GAS_COST 0)) + (if-not-zero (+ (create-instruction---STACK-oogx) + (scenario-shorthand---CREATE---unexceptional)) + (eq! GAS_COST (create-instruction---upfront-gas-cost))) + )) + +(defconstraint create-instruction---setting-GAS_NEXT (:guard (create-instruction---generic-precondition)) + (begin + (if-not-zero scenario/CREATE_EXCEPTION (eq! GAS_NEXT 0)) + (if-not-zero scenario/CREATE_ABORT (eq! GAS_NEXT (- GAS_ACTUAL (create-instruction---upfront-gas-cost)))) + (if-not-zero (scenario-shorthand---CREATE---failure-condition) (eq! GAS_NEXT (- GAS_ACTUAL (create-instruction---full-gas-cost)))) + (if-not-zero (scenario-shorthand---CREATE---not-rebuffed-empty-init-code) (eq! GAS_NEXT (- GAS_ACTUAL (create-instruction---upfront-gas-cost)))) + (if-not-zero (scenario-shorthand---CREATE---not-rebuffed-nonempty-init-code) (eq! GAS_NEXT (- GAS_ACTUAL (create-instruction---full-gas-cost)))) + )) diff --git a/hub/osaka/constraints/instruction-handling/create/constraints/reverting-one-step.lisp b/hub/osaka/constraints/instruction-handling/create/constraints/reverting-one-step.lisp new file mode 100644 index 000000000..cd9270931 --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/create/constraints/reverting-one-step.lisp @@ -0,0 +1,47 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.Y CREATE ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;; + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.13 One step reverting CREATE's ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (create-instruction---one-step-reverting-precondition) (* PEEK_AT_SCENARIO (scenario-shorthand---CREATE---simple-revert))) + +(defconstraint create-instruction---one-step-reverting---undoing-creator-account-operations (:guard (create-instruction---one-step-reverting-precondition)) + (begin + (account-same-address-as CREATE_second_creator_account_row___row_offset CREATE_first_creator_account_row___row_offset) + (account-undo-balance-update CREATE_second_creator_account_row___row_offset CREATE_first_creator_account_row___row_offset) + (account-undo-nonce-update CREATE_second_creator_account_row___row_offset CREATE_first_creator_account_row___row_offset) + (account-same-code CREATE_second_creator_account_row___row_offset) + (account-same-warmth CREATE_second_creator_account_row___row_offset) + (account-same-deployment-number-and-status CREATE_second_creator_account_row___row_offset) + (account-same-marked-for-deletion CREATE_second_creator_account_row___row_offset) + (vanishes! (shift account/TRM_FLAG CREATE_second_creator_account_row___row_offset)) + (vanishes! (shift account/ROMLEX_FLAG CREATE_second_creator_account_row___row_offset)) + (vanishes! (shift account/RLPADDR_FLAG CREATE_second_creator_account_row___row_offset)) + (DOM-SUB-stamps---revert-with-current CREATE_second_creator_account_row___row_offset 0) + )) + +(defconstraint create-instruction---one-step-reverting---undoing-createe-account-operations (:guard (create-instruction---one-step-reverting-precondition)) + (begin + (account-same-address-as CREATE_second_createe_account_row___row_offset CREATE_first_createe_account_row___row_offset) + (account-undo-balance-update CREATE_second_createe_account_row___row_offset CREATE_first_createe_account_row___row_offset) + (account-undo-nonce-update CREATE_second_createe_account_row___row_offset CREATE_first_createe_account_row___row_offset) + (account-undo-code-update CREATE_second_createe_account_row___row_offset CREATE_first_createe_account_row___row_offset) + (account-undo-warmth-update CREATE_second_createe_account_row___row_offset CREATE_first_createe_account_row___row_offset) + (account-undo-deployment-status-update CREATE_second_createe_account_row___row_offset CREATE_first_createe_account_row___row_offset) + (account-same-marked-for-deletion CREATE_second_createe_account_row___row_offset) + (vanishes! (shift account/TRM_FLAG CREATE_second_createe_account_row___row_offset)) + (vanishes! (shift account/ROMLEX_FLAG CREATE_second_createe_account_row___row_offset)) + (vanishes! (shift account/RLPADDR_FLAG CREATE_second_createe_account_row___row_offset)) + (DOM-SUB-stamps---revert-with-current CREATE_second_createe_account_row___row_offset 1) + )) diff --git a/hub/osaka/constraints/instruction-handling/create/constraints/reverting-two-step.lisp b/hub/osaka/constraints/instruction-handling/create/constraints/reverting-two-step.lisp new file mode 100644 index 000000000..cc589a9f3 --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/create/constraints/reverting-two-step.lisp @@ -0,0 +1,51 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.Y CREATE ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;; + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.15 Two step reverting CREATE's ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (create-instruction---two-step-reverting-precondition) (* PEEK_AT_SCENARIO scenario/CREATE_NONEMPTY_INIT_CODE_FAILURE_WILL_REVERT)) + +(defconstraint create-instruction---deployment-FAILURE_WILL_REVERT---fully-undoing-creator-account-operations + (:guard (create-instruction---two-step-reverting-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (begin + (account-same-address-as CREATE_third_creator_account_row___row_offset CREATE_first_creator_account_row___row_offset) + (account-same-balance CREATE_third_creator_account_row___row_offset) + (account-undo-nonce-update CREATE_third_creator_account_row___row_offset CREATE_first_creator_account_row___row_offset) + (account-same-code CREATE_third_creator_account_row___row_offset) + (account-same-warmth CREATE_third_creator_account_row___row_offset) + (account-same-deployment-number-and-status CREATE_third_creator_account_row___row_offset) + (account-same-marked-for-deletion CREATE_third_creator_account_row___row_offset) + (vanishes! (shift account/TRM_FLAG CREATE_third_creator_account_row___row_offset)) + (vanishes! (shift account/ROMLEX_FLAG CREATE_third_creator_account_row___row_offset)) + (vanishes! (shift account/RLPADDR_FLAG CREATE_third_creator_account_row___row_offset)) + (DOM-SUB-stamps---revert-with-current CREATE_third_creator_account_row___row_offset 2) + )) + +(defconstraint create-instruction---deployment-FAILURE_WILL_REVERT---fully-undoing-createe-account-operations + (:guard (create-instruction---two-step-reverting-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (begin + (account-same-address-as CREATE_third_createe_account_row___row_offset CREATE_first_createe_account_row___row_offset) + (account-same-balance CREATE_third_createe_account_row___row_offset) + (account-same-nonce CREATE_third_createe_account_row___row_offset) + (account-same-code CREATE_third_createe_account_row___row_offset) + (account-undo-warmth-update CREATE_third_createe_account_row___row_offset CREATE_first_createe_account_row___row_offset) + (account-same-deployment-status CREATE_third_createe_account_row___row_offset) + (account-same-marked-for-deletion CREATE_third_createe_account_row___row_offset) + (vanishes! (shift account/TRM_FLAG CREATE_third_createe_account_row___row_offset)) + (vanishes! (shift account/ROMLEX_FLAG CREATE_third_createe_account_row___row_offset)) + (vanishes! (shift account/RLPADDR_FLAG CREATE_third_createe_account_row___row_offset)) + (DOM-SUB-stamps---revert-with-current CREATE_third_createe_account_row___row_offset 3) + )) diff --git a/hub/osaka/constraints/instruction-handling/create/constraints/unaborted.lisp b/hub/osaka/constraints/instruction-handling/create/constraints/unaborted.lisp new file mode 100644 index 000000000..4165714ba --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/create/constraints/unaborted.lisp @@ -0,0 +1,83 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.Y CREATE ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;; + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.12 Unexceptional, unaborted CREATE's ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defun (create-instruction---unexceptional-and-unaborted-precondition) (* PEEK_AT_SCENARIO (scenario-shorthand---CREATE---compute-deployment-address))) + +;; see specs for this suprising (and seemingly out of place) instance of address trimming ... +(defconstraint create-instruction---createe-account-row-first-appearance (:guard (create-instruction---unexceptional-and-unaborted-precondition)) + (begin + (eq! (shift account/ADDRESS_HI CREATE_first_createe_account_row___row_offset) (create-instruction---createe-address-hi)) + (eq! (shift account/ADDRESS_LO CREATE_first_createe_account_row___row_offset) (create-instruction---createe-address-lo)) + ;; balance operation done below + ;; nonce operation done below + ;; code operation done below + ;; warmth operation done below + ;; deployment number operation done below + ;; deployment status operation done below + (account-same-marked-for-deletion CREATE_first_createe_account_row___row_offset) + (eq! (shift account/ROMLEX_FLAG CREATE_first_createe_account_row___row_offset) (create-instruction---trigger_ROMLEX)) + (account-trim-address CREATE_first_createe_account_row___row_offset ;; row offset + (create-instruction---createe-address-hi) ;; high part of raw, potentially untrimmed address + (create-instruction---createe-address-lo)) ;; low part of raw, potentially untrimmed address + (vanishes! (shift account/RLPADDR_FLAG CREATE_first_createe_account_row___row_offset)) + (DOM-SUB-stamps---standard CREATE_first_createe_account_row___row_offset + 1) + )) + +(defconstraint create-instruction---createe-balance-operation (:guard (create-instruction---unexceptional-and-unaborted-precondition)) + (begin + (if-not-zero (scenario-shorthand---CREATE---rebuffed) (account-same-balance CREATE_first_createe_account_row___row_offset)) + (if-not-zero (scenario-shorthand---CREATE---not-rebuffed) (account-increment-balance-by CREATE_first_createe_account_row___row_offset + (create-instruction---STACK-value-lo))) + )) + +(defconstraint create-instruction---createe-nonce-operation (:guard (create-instruction---unexceptional-and-unaborted-precondition)) + (begin + (if-not-zero (scenario-shorthand---CREATE---rebuffed) (account-same-nonce CREATE_first_createe_account_row___row_offset)) + (if-not-zero (scenario-shorthand---CREATE---not-rebuffed) (account-increment-nonce CREATE_first_createe_account_row___row_offset)) + )) + +(defconstraint create-instruction---createe-code-operation (:guard (create-instruction---unexceptional-and-unaborted-precondition)) + (begin + (if-not-zero (scenario-shorthand---CREATE---rebuffed) (account-same-code CREATE_first_createe_account_row___row_offset)) + (if-not-zero (scenario-shorthand---CREATE---not-rebuffed) (begin + (account-same-code-hash CREATE_first_createe_account_row___row_offset) + (eq! (shift account/CODE_SIZE_NEW CREATE_first_createe_account_row___row_offset) + (create-instruction---STACK-size-lo)) + (debug (eq! account/CODE_HASH_HI_NEW EMPTY_KECCAK_HI)) + (debug (eq! account/CODE_HASH_LO_NEW EMPTY_KECCAK_LO)) + )) + )) + +(defconstraint create-instruction---createe-warmth-operation (:guard (create-instruction---unexceptional-and-unaborted-precondition)) + (begin + (if-not-zero (scenario-shorthand---CREATE---no-creator-state-change) (account-same-warmth CREATE_first_createe_account_row___row_offset)) + (if-not-zero (scenario-shorthand---CREATE---creator-state-change) (account-turn-on-warmth CREATE_first_createe_account_row___row_offset)) + )) + +(defconstraint create-instruction---createe-deployment-number-operation (:guard (create-instruction---unexceptional-and-unaborted-precondition)) + (begin + (if-not-zero (scenario-shorthand---CREATE---rebuffed) (account-same-deployment-number CREATE_first_createe_account_row___row_offset)) + (if-not-zero (scenario-shorthand---CREATE---not-rebuffed) (account-increment-deployment-number CREATE_first_createe_account_row___row_offset)) + )) + +(defconstraint create-instruction---createe-deployment-status-operation (:guard (create-instruction---unexceptional-and-unaborted-precondition)) + (begin + (if-not-zero (scenario-shorthand---CREATE---rebuffed) (account-same-deployment-status CREATE_first_createe_account_row___row_offset)) + (if-not-zero (scenario-shorthand---CREATE---not-rebuffed-nonempty-init-code) (account-turn-on-deployment-status CREATE_first_createe_account_row___row_offset)) + (if-not-zero (scenario-shorthand---CREATE---not-rebuffed-empty-init-code) (account-same-deployment-status CREATE_first_createe_account_row___row_offset)) + )) diff --git a/hub/osaka/constraints/instruction-handling/create/constraints/unexceptional.lisp b/hub/osaka/constraints/instruction-handling/create/constraints/unexceptional.lisp new file mode 100644 index 000000000..77cd40a9d --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/create/constraints/unexceptional.lisp @@ -0,0 +1,81 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.Y CREATE ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;; + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.11 Exceptional CREATE's ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (create-instruction---unexceptional-CREATE-precondition) (* PEEK_AT_SCENARIO (scenario-shorthand---CREATE---unexceptional))) + +(defconstraint create-instruction---creator-account-first-encouter (:guard (create-instruction---unexceptional-CREATE-precondition)) + (begin + (eq! (shift account/ADDRESS_HI CREATE_first_creator_account_row___row_offset) (create-instruction---creator-address-hi)) + (eq! (shift account/ADDRESS_LO CREATE_first_creator_account_row___row_offset) (create-instruction---creator-address-lo)) + ;; balance operation done below + ;; nonce operation done below + (account-same-code CREATE_first_creator_account_row___row_offset) + (account-same-warmth CREATE_first_creator_account_row___row_offset) + (account-same-deployment-number-and-status CREATE_first_creator_account_row___row_offset) + (account-same-marked-for-deletion CREATE_first_creator_account_row___row_offset) + (vanishes! (shift account/ROMLEX_FLAG CREATE_first_creator_account_row___row_offset)) + (vanishes! (shift account/TRM_FLAG CREATE_first_creator_account_row___row_offset)) + (eq! (shift account/RLPADDR_FLAG CREATE_first_creator_account_row___row_offset) (create-instruction---trigger_RLPADDR)) + (DOM-SUB-stamps---standard CREATE_first_creator_account_row___row_offset + 0) + )) + +(defconstraint create-instruction---creator-balance-update (:guard (create-instruction---unexceptional-CREATE-precondition)) + (begin + (if-not-zero (scenario-shorthand---CREATE---rebuffed) + (account-same-balance CREATE_first_creator_account_row___row_offset)) + (if-not-zero (scenario-shorthand---CREATE---not-rebuffed) + (account-decrement-balance-by CREATE_first_creator_account_row___row_offset + (create-instruction---STACK-value-lo))) + )) + +(defconstraint create-instruction---creator-nonce-update (:guard (create-instruction---unexceptional-CREATE-precondition)) + (begin + (if-not-zero (scenario-shorthand---CREATE---no-creator-state-change) + (account-same-nonce CREATE_first_creator_account_row___row_offset)) + (if-not-zero (scenario-shorthand---CREATE---creator-state-change) + (account-increment-nonce CREATE_first_creator_account_row___row_offset)) + )) + +(defconstraint create-instruction---creator-RLPADDR-parameters (:guard (create-instruction---unexceptional-CREATE-precondition)) + (if-not-zero (shift account/RLPADDR_FLAG CREATE_first_creator_account_row___row_offset) + (begin + ;; (eq! (shift account/RLPADDR_FLAG CREATE_first_creator_account_row___row_offset) ) + (eq! (shift account/RLPADDR_RECIPE CREATE_first_creator_account_row___row_offset) (create-instruction---address-computation-recipe)) + ;; (eq! (shift account/RLPADDR_DEP_ADDR_HI CREATE_first_creator_account_row___row_offset) ) + ;; (eq! (shift account/RLPADDR_DEP_ADDR_LO CREATE_first_creator_account_row___row_offset) ) + (eq! (shift account/RLPADDR_SALT_HI CREATE_first_creator_account_row___row_offset) (create-instruction---STACK-salt-hi)) + (eq! (shift account/RLPADDR_SALT_LO CREATE_first_creator_account_row___row_offset) (create-instruction---STACK-salt-lo)) + (eq! (shift account/RLPADDR_KEC_HI CREATE_first_creator_account_row___row_offset) (create-instruction---init-code-hash-hi)) + (eq! (shift account/RLPADDR_KEC_LO CREATE_first_creator_account_row___row_offset) (create-instruction---init-code-hash-lo)) + ))) + +(defun (create-instruction---address-computation-recipe) (+ (* (create-instruction---is-CREATE) RLP_ADDR_RECIPE_1) + (* (create-instruction---is-CREATE2) RLP_ADDR_RECIPE_2))) + +(defun (create-instruction---init-code-hash-hi) (* (create-instruction---is-CREATE2) + (if-not-zero (create-instruction---trigger_HASHINFO) + ;; HASH_INFO required, nonempty code + (create-instruction---HASHINFO-keccak-hi) + ;; HASH_INFO not required, empty code + EMPTY_KECCAK_HI))) + +(defun (create-instruction---init-code-hash-lo) (* (create-instruction---is-CREATE2) + (if-not-zero (create-instruction---trigger_HASHINFO) + ;; HASH_INFO needed to be triggered + (create-instruction---HASHINFO-keccak-lo) + ;; HASH_INFO didn't need to be triggered + EMPTY_KECCAK_LO))) diff --git a/hub/osaka/constraints/instruction-handling/create/non_stack_rows.lisp b/hub/osaka/constraints/instruction-handling/create/non_stack_rows.lisp new file mode 100644 index 000000000..6d151b8eb --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/create/non_stack_rows.lisp @@ -0,0 +1,50 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.Y CREATE ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;; + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.6 Non stack rows and peeking flags ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defconstraint create-instruction---setting-NSR (:guard (create-instruction---standard-precondition)) + (eq! (shift NON_STACK_ROWS CREATE_first_stack_row___row_offset) + (+ (* (+ 1 CREATE_exception_caller_context_row___row_offset ) scenario/CREATE_EXCEPTION ) + (* (+ 1 CREATE_abort_current_context_row___row_offset ) scenario/CREATE_ABORT ) + (* (+ 1 CREATE_fcond_will_revert_current_context_row___row_offset ) scenario/CREATE_FAILURE_CONDITION_WILL_REVERT ) + (* (+ 1 CREATE_fcond_wont_revert_current_context_row___row_offset ) scenario/CREATE_FAILURE_CONDITION_WONT_REVERT ) + (* (+ 1 CREATE_empty_init_code_will_revert_current_context_row___row_offset ) scenario/CREATE_EMPTY_INIT_CODE_WILL_REVERT ) + (* (+ 1 CREATE_empty_init_code_wont_revert_current_context_row___row_offset ) scenario/CREATE_EMPTY_INIT_CODE_WONT_REVERT ) + (* (+ 1 CREATE_nonempty_init_code_failure_will_revert_new_context_row___row_offset ) scenario/CREATE_NONEMPTY_INIT_CODE_FAILURE_WILL_REVERT ) + (* (+ 1 CREATE_nonempty_init_code_failure_wont_revert_new_context_row___row_offset ) scenario/CREATE_NONEMPTY_INIT_CODE_FAILURE_WONT_REVERT ) + (* (+ 1 CREATE_nonempty_init_code_success_will_revert_new_context_row___row_offset ) scenario/CREATE_NONEMPTY_INIT_CODE_SUCCESS_WILL_REVERT ) + (* (+ 1 CREATE_nonempty_init_code_success_wont_revert_new_context_row___row_offset ) scenario/CREATE_NONEMPTY_INIT_CODE_SUCCESS_WONT_REVERT ) + ) + ) + ) + +(defconstraint create-instruction---setting-the-peeking-flags (:guard (create-instruction---standard-precondition)) + (eq! (shift NON_STACK_ROWS CREATE_first_stack_row___row_offset) + (+ (* (create-instruction---flag-sum-staticx) (create-instruction---STACK-staticx) ) + (+ (* (create-instruction---flag-sum-maxcsx) (create-instruction---STACK-maxcsx) ) + (* (create-instruction---flag-sum-mxpx) (create-instruction---STACK-mxpx) ) + (* (create-instruction---flag-sum-oogx) (create-instruction---STACK-oogx) ) + (* (create-instruction---flag-sum-abort) scenario/CREATE_ABORT ) + (* (create-instruction---flag-sum-fcond-will-revert) scenario/CREATE_FAILURE_CONDITION_WILL_REVERT ) + (* (create-instruction---flag-sum-fcond-wont-revert) scenario/CREATE_FAILURE_CONDITION_WONT_REVERT ) + (* (create-instruction---flag-sum-empty-init-code-will-revert) scenario/CREATE_EMPTY_INIT_CODE_WILL_REVERT ) + (* (create-instruction---flag-sum-empty-init-code-wont-revert) scenario/CREATE_EMPTY_INIT_CODE_WONT_REVERT ) + (* (create-instruction---flag-sum-nonempty-init-failure-will-revert) scenario/CREATE_NONEMPTY_INIT_CODE_FAILURE_WILL_REVERT ) + (* (create-instruction---flag-sum-nonempty-init-failure-wont-revert) scenario/CREATE_NONEMPTY_INIT_CODE_FAILURE_WONT_REVERT ) + (* (create-instruction---flag-sum-nonempty-init-success-will-revert) scenario/CREATE_NONEMPTY_INIT_CODE_SUCCESS_WILL_REVERT ) + (* (create-instruction---flag-sum-nonempty-init-success-wont-revert) scenario/CREATE_NONEMPTY_INIT_CODE_SUCCESS_WONT_REVERT ) + ) + ) + )) diff --git a/hub/osaka/constraints/instruction-handling/create/peeking_flags_shorthands.lisp b/hub/osaka/constraints/instruction-handling/create/peeking_flags_shorthands.lisp new file mode 100644 index 000000000..3d9e06060 --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/create/peeking_flags_shorthands.lisp @@ -0,0 +1,97 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.Y CREATE ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;; + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.5 Peeking flag shorthands ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (create-instruction---standard-precondition) (* PEEK_AT_SCENARIO + (scenario-shorthand---CREATE---sum))) + +(defun (create-instruction---std-prefix) (+ PEEK_AT_SCENARIO + (shift PEEK_AT_CONTEXT CREATE_current_context_row___row_offset) + (shift PEEK_AT_MISCELLANEOUS CREATE_miscellaneous_row___row_offset) + )) + +(defun (create-instruction---flag-sum-staticx) (+ (create-instruction---std-prefix) + (shift PEEK_AT_CONTEXT CREATE_exception_caller_context_row___row_offset) + )) + +(defun (create-instruction---flag-sum-maxcsx) (+ (create-instruction---std-prefix) + (shift PEEK_AT_CONTEXT CREATE_exception_caller_context_row___row_offset) + )) + +(defun (create-instruction---flag-sum-mxpx) (+ (create-instruction---std-prefix) + (shift PEEK_AT_CONTEXT CREATE_exception_caller_context_row___row_offset) + )) + +(defun (create-instruction---flag-sum-oogx) (+ (create-instruction---std-prefix) + (shift PEEK_AT_CONTEXT CREATE_exception_caller_context_row___row_offset) + )) + +(defun (create-instruction---flag-sum-abort) (+ (create-instruction---std-prefix) + (shift PEEK_AT_ACCOUNT CREATE_abort_current_account_row___row_offset) + (shift PEEK_AT_CONTEXT CREATE_abort_current_context_row___row_offset) + )) + +(defun (create-instruction---flag-sum-fcond-will-revert) (+ (create-instruction---std-prefix) + (shift PEEK_AT_ACCOUNT CREATE_first_creator_account_row___row_offset ) + (shift PEEK_AT_ACCOUNT CREATE_first_createe_account_row___row_offset ) + (shift PEEK_AT_ACCOUNT CREATE_second_creator_account_row___row_offset ) + (shift PEEK_AT_ACCOUNT CREATE_second_createe_account_row___row_offset ) + (shift PEEK_AT_CONTEXT CREATE_fcond_will_revert_current_context_row___row_offset ) + )) + +(defun (create-instruction---flag-sum-fcond-wont-revert) (+ (create-instruction---std-prefix) + (shift PEEK_AT_ACCOUNT CREATE_first_creator_account_row___row_offset ) + (shift PEEK_AT_ACCOUNT CREATE_first_createe_account_row___row_offset ) + (shift PEEK_AT_CONTEXT CREATE_fcond_wont_revert_current_context_row___row_offset ) + )) + +(defun (create-instruction---sanctioned-prefix) (+ (create-instruction---std-prefix) + (shift PEEK_AT_ACCOUNT CREATE_first_creator_account_row___row_offset ) + (shift PEEK_AT_ACCOUNT CREATE_first_createe_account_row___row_offset ) + )) + +(defun (create-instruction---flag-sum-empty-init-code-will-revert) (+ (create-instruction---sanctioned-prefix) + (shift PEEK_AT_ACCOUNT CREATE_second_creator_account_row___row_offset ) + (shift PEEK_AT_ACCOUNT CREATE_second_createe_account_row___row_offset ) + (shift PEEK_AT_CONTEXT CREATE_empty_init_code_will_revert_current_context_row___row_offset) + )) + +(defun (create-instruction---flag-sum-empty-init-code-wont-revert) (+ (create-instruction---sanctioned-prefix) + (shift PEEK_AT_CONTEXT CREATE_empty_init_code_wont_revert_current_context_row___row_offset) + )) + +(defun (create-instruction---flag-sum-nonempty-init-failure-will-revert) (+ (create-instruction---sanctioned-prefix) + (shift PEEK_AT_ACCOUNT CREATE_second_creator_account_row___row_offset ) + (shift PEEK_AT_ACCOUNT CREATE_second_createe_account_row___row_offset ) + (shift PEEK_AT_ACCOUNT CREATE_third_creator_account_row___row_offset ) + (shift PEEK_AT_ACCOUNT CREATE_third_createe_account_row___row_offset ) + (shift PEEK_AT_CONTEXT CREATE_nonempty_init_code_failure_will_revert_new_context_row___row_offset) + )) + +(defun (create-instruction---flag-sum-nonempty-init-failure-wont-revert) (+ (create-instruction---sanctioned-prefix) + (shift PEEK_AT_ACCOUNT CREATE_second_creator_account_row___row_offset ) + (shift PEEK_AT_ACCOUNT CREATE_second_createe_account_row___row_offset ) + (shift PEEK_AT_CONTEXT CREATE_nonempty_init_code_failure_wont_revert_new_context_row___row_offset) + )) + +(defun (create-instruction---flag-sum-nonempty-init-success-will-revert) (+ (create-instruction---sanctioned-prefix) + (shift PEEK_AT_ACCOUNT CREATE_second_creator_account_row___row_offset ) + (shift PEEK_AT_ACCOUNT CREATE_second_createe_account_row___row_offset ) + (shift PEEK_AT_CONTEXT CREATE_nonempty_init_code_success_will_revert_new_context_row___row_offset) + )) + +(defun (create-instruction---flag-sum-nonempty-init-success-wont-revert) (+ (create-instruction---sanctioned-prefix) + (shift PEEK_AT_CONTEXT CREATE_nonempty_init_code_success_wont_revert_new_context_row___row_offset) + )) diff --git a/hub/osaka/constraints/instruction-handling/create/shorthands.lisp b/hub/osaka/constraints/instruction-handling/create/shorthands.lisp new file mode 100644 index 000000000..ea83605c6 --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/create/shorthands.lisp @@ -0,0 +1,58 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.Y CREATE ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;; + +;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.6 Shorthands ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (create-instruction---instruction) (shift stack/INSTRUCTION CREATE_first_stack_row___row_offset)) +(defun (create-instruction---is-CREATE) (shift [stack/DEC_FLAG 1] CREATE_first_stack_row___row_offset)) +(defun (create-instruction---is-CREATE2) (shift [stack/DEC_FLAG 2] CREATE_first_stack_row___row_offset)) +(defun (create-instruction---STACK-staticx) (shift stack/STATICX CREATE_first_stack_row___row_offset)) +(defun (create-instruction---STACK-maxcsx) (shift stack/MAXCSX CREATE_first_stack_row___row_offset)) +(defun (create-instruction---STACK-mxpx) (shift stack/MXPX CREATE_first_stack_row___row_offset)) +(defun (create-instruction---STACK-oogx) (shift stack/OOGX CREATE_first_stack_row___row_offset)) +(defun (create-instruction---STACK-offset-hi) (shift [stack/STACK_ITEM_VALUE_HI 1] CREATE_first_stack_row___row_offset)) +(defun (create-instruction---STACK-offset-lo) (shift [stack/STACK_ITEM_VALUE_LO 1] CREATE_first_stack_row___row_offset)) +(defun (create-instruction---STACK-size-hi) (shift [stack/STACK_ITEM_VALUE_HI 2] CREATE_first_stack_row___row_offset)) +(defun (create-instruction---STACK-size-lo) (shift [stack/STACK_ITEM_VALUE_LO 2] CREATE_first_stack_row___row_offset)) +(defun (create-instruction---creator-will-revert) (shift CONTEXT_WILL_REVERT CREATE_first_stack_row___row_offset)) +(defun (create-instruction---creator-revert-stamp) (shift CONTEXT_REVERT_STAMP CREATE_first_stack_row___row_offset)) +(defun (create-instruction---HASHINFO-keccak-hi) (shift stack/HASH_INFO_KECCAK_HI CREATE_first_stack_row___row_offset)) +(defun (create-instruction---HASHINFO-keccak-lo) (shift stack/HASH_INFO_KECCAK_LO CREATE_first_stack_row___row_offset)) +(defun (create-instruction---init-code-size) (shift [stack/STACK_ITEM_VALUE_LO 2] CREATE_first_stack_row___row_offset)) +(defun (create-instruction---STACK-salt-hi) (shift [stack/STACK_ITEM_VALUE_HI 2] CREATE_second_stack_row___row_offset)) +(defun (create-instruction---STACK-salt-lo) (shift [stack/STACK_ITEM_VALUE_LO 2] CREATE_second_stack_row___row_offset)) +(defun (create-instruction---STACK-value-hi) (shift [stack/STACK_ITEM_VALUE_HI 3] CREATE_second_stack_row___row_offset)) +(defun (create-instruction---STACK-value-lo) (shift [stack/STACK_ITEM_VALUE_LO 3] CREATE_second_stack_row___row_offset)) +(defun (create-instruction---STACK-output-hi) (shift [stack/STACK_ITEM_VALUE_HI 4] CREATE_second_stack_row___row_offset)) +(defun (create-instruction---STACK-output-lo) (shift [stack/STACK_ITEM_VALUE_LO 4] CREATE_second_stack_row___row_offset)) +(defun (create-instruction---creator-address-hi) (shift context/ACCOUNT_ADDRESS_HI CREATE_current_context_row___row_offset)) +(defun (create-instruction---creator-address-lo) (shift context/ACCOUNT_ADDRESS_LO CREATE_current_context_row___row_offset)) +(defun (create-instruction---current-context-is-static) (shift context/IS_STATIC CREATE_current_context_row___row_offset)) +(defun (create-instruction---current-context-csd) (shift context/CALL_STACK_DEPTH CREATE_current_context_row___row_offset)) +(defun (create-instruction---createe-self-reverts) (shift misc/CCSR_FLAG CREATE_miscellaneous_row___row_offset)) +(defun (create-instruction---createe-revert-stamp) (shift misc/CCRS_STAMP CREATE_miscellaneous_row___row_offset)) +(defun (create-instruction---OOB-aborting-condition) (shift [misc/OOB_DATA 7] CREATE_miscellaneous_row___row_offset)) +(defun (create-instruction---OOB-failure-condition) (shift [misc/OOB_DATA 8] CREATE_miscellaneous_row___row_offset)) +(defun (create-instruction---MXP-mxpx) (shift misc/MXP_MXPX CREATE_miscellaneous_row___row_offset)) +(defun (create-instruction---MXP-gas) (shift misc/MXP_GAS_MXP CREATE_miscellaneous_row___row_offset)) +(defun (create-instruction---MXP-s1nznomxpx) (shift misc/MXP_SIZE_1_NONZERO_NO_MXPX CREATE_miscellaneous_row___row_offset)) +(defun (create-instruction---STP-gas-paid-out-of-pocket) (shift misc/STP_GAS_PAID_OUT_OF_POCKET CREATE_miscellaneous_row___row_offset)) +(defun (create-instruction---STP-oogx) (shift misc/STP_OOGX CREATE_miscellaneous_row___row_offset)) +(defun (create-instruction---compute-createe-address) (shift account/RLPADDR_FLAG CREATE_first_creator_account_row___row_offset)) +(defun (create-instruction---createe-address-hi) (shift account/RLPADDR_DEP_ADDR_HI CREATE_first_creator_account_row___row_offset)) +(defun (create-instruction---createe-address-lo) (shift account/RLPADDR_DEP_ADDR_LO CREATE_first_creator_account_row___row_offset)) +(defun (create-instruction---creator-nonce) (shift account/NONCE CREATE_first_creator_account_row___row_offset)) +(defun (create-instruction---creator-balance) (shift account/BALANCE CREATE_first_creator_account_row___row_offset)) +(defun (create-instruction---deployment-cfi) (shift account/CODE_FRAGMENT_INDEX CREATE_first_createe_account_row___row_offset)) +(defun (create-instruction---ROMLEX-flag) (shift account/ROMLEX_FLAG CREATE_first_createe_account_row___row_offset)) diff --git a/hub/osaka/constraints/instruction-handling/create/standpoint.lisp b/hub/osaka/constraints/instruction-handling/create/standpoint.lisp new file mode 100644 index 000000000..88fe549bf --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/create/standpoint.lisp @@ -0,0 +1,36 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.Y CREATE ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.1 Introduction ;; +;; X.Y.2 Supported instructions and flags ;; +;; X.Y.3 Highlevel processing diagram ;; +;; X.Y.4 Forward and backward setting of scenario row ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstraint create-instruction---forward-scenario-setting () + (if-not-zero PEEK_AT_STACK + (if-not-zero stack/CREATE_FLAG + (if-not-zero (- 1 CT_TLI) + (if-not-zero (- 1 stack/SUX stack/SOX) + (begin (eq! (shift PEEK_AT_SCENARIO 2) 1) + (eq! (shift (scenario-shorthand---CREATE---sum) 2) 1))))))) + +(defconstraint create-instruction---backward-setting-CREATE-instruction () + (if-not-zero PEEK_AT_SCENARIO + (if-not-zero (scenario-shorthand---CREATE---sum) + (begin (eq! (shift PEEK_AT_STACK CREATE_first_stack_row___row_offset) 1) + (eq! (shift stack/CREATE_FLAG CREATE_first_stack_row___row_offset) 1) + (eq! (shift CT_TLI CREATE_first_stack_row___row_offset) 0) + (eq! (shift stack/SUX CREATE_first_stack_row___row_offset) 0))))) diff --git a/hub/osaka/constraints/instruction-handling/create/triggers.lisp b/hub/osaka/constraints/instruction-handling/create/triggers.lisp new file mode 100644 index 000000000..ccaa041c8 --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/create/triggers.lisp @@ -0,0 +1,52 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.Y CREATE ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.7 Triggers ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (create-instruction---trigger_MXP) (+ (create-instruction---STACK-mxpx) + (create-instruction---STACK-oogx) + (scenario-shorthand---CREATE---unexceptional))) + +(defun (create-instruction---trigger_STP) (+ (create-instruction---STACK-oogx) + (scenario-shorthand---CREATE---unexceptional))) + +(defun (create-instruction---trigger_OOB_X) (+ (create-instruction---STACK-maxcsx) )) +(defun (create-instruction---trigger_OOB_U) (+ (scenario-shorthand---CREATE---unexceptional) )) +(defun (create-instruction---trigger_OOB) (+ (create-instruction---trigger_OOB_X) + (create-instruction---trigger_OOB_U) )) + +(defun (create-instruction---trigger_MMU) (+ (create-instruction---hash-init-code) + (create-instruction---hash-init-code-and-send-to-ROM) + (create-instruction---send-init-code-to-ROM))) + +(defun (create-instruction---trigger_HASHINFO) (* (create-instruction---is-CREATE2) + (+ (* (scenario-shorthand---CREATE---failure-condition) + (create-instruction---MXP-s1nznomxpx)) + (scenario-shorthand---CREATE---not-rebuffed-nonempty-init-code)))) + +(defun (create-instruction---trigger_RLPADDR) (scenario-shorthand---CREATE---compute-deployment-address)) +(defun (create-instruction---trigger_ROMLEX) (scenario-shorthand---CREATE---not-rebuffed-nonempty-init-code)) + + +;; auxiliary shorthands required for (create-instruction---trigger_MMU) +(defun (create-instruction---hash-init-code) (* (scenario-shorthand---CREATE---failure-condition) + (create-instruction---MXP-s1nznomxpx) + (create-instruction---is-CREATE2))) + +(defun (create-instruction---hash-init-code-and-send-to-ROM) (* (scenario-shorthand---CREATE---not-rebuffed-nonempty-init-code) + (create-instruction---is-CREATE2))) + +(defun (create-instruction---send-init-code-to-ROM) (* (scenario-shorthand---CREATE---not-rebuffed-nonempty-init-code) + (create-instruction---is-CREATE))) diff --git a/hub/osaka/constraints/instruction-handling/dup.lisp b/hub/osaka/constraints/instruction-handling/dup.lisp new file mode 100644 index 000000000..7274e4402 --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/dup.lisp @@ -0,0 +1,19 @@ +(module hub) + +(defun (dup-no-stack-exceptions) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (* PEEK_AT_STACK + stack/DUP_FLAG + (- 1 stack/SUX stack/SOX))) + +(defconstraint dup-stack-pattern (:guard (dup-no-stack-exceptions)) + (dup-stack-pattern (- stack/INSTRUCTION EVM_INST_DUP1))) + +(defconstraint dup-setting-NSR (:guard (dup-no-stack-exceptions)) + (eq! NSR CMC)) + +(defconstraint dup-setting-peeking-flags (:guard (dup-no-stack-exceptions)) + (eq! NSR (* CMC (next PEEK_AT_CONTEXT)))) + +(defconstraint dup-setting-gas-costs (:guard (dup-no-stack-exceptions)) + (eq! GAS_COST stack/STATIC_GAS)) diff --git a/hub/osaka/constraints/instruction-handling/halting/return.lisp b/hub/osaka/constraints/instruction-handling/halting/return.lisp new file mode 100644 index 000000000..b0fbb6f03 --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/halting/return.lisp @@ -0,0 +1,499 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.Y RETURN ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;; + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.1 Introduction ;; +;; X.Y.2 Scenario row seting ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (return-instruction---standard-precondition) (* PEEK_AT_STACK + stack/HALT_FLAG + (halting-instruction---is-RETURN) + (- 1 stack/SUX ))) + +(defun (return-instruction---standard-scenario-row) (* PEEK_AT_SCENARIO + (scenario-shorthand---RETURN---sum))) + +(defconstraint return-instruction---imposing-some-RETURN-scenario (:guard (return-instruction---standard-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (begin (eq! (next PEEK_AT_SCENARIO) 1) + (eq! (next (scenario-shorthand---RETURN---sum)) 1))) + + +;; Note: we could pack into a single constraint the last 3 constraints. +(defconstraint return-instruction---imposing-the-converse (:guard (return-instruction---standard-scenario-row)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (begin (eq! (shift PEEK_AT_STACK ROFF_RETURN___STACK_ROW) 1) + (eq! (shift stack/HALT_FLAG ROFF_RETURN___STACK_ROW) 1) + (eq! (shift (halting-instruction---is-RETURN) ROFF_RETURN___STACK_ROW) 1) + (vanishes! (shift (+ stack/SUX stack/SOX) ROFF_RETURN___STACK_ROW)))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.3 Shorthands ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +;; as per usual ROFF ≡ ROW_OFFSET +(defconst + ROFF_RETURN___STACK_ROW -1 + ROFF_RETURN___SCENARIO_ROW 0 + ROFF_RETURN___CURRENT_CONTEXT_ROW 1 + ROFF_RETURN___1ST_MISC_ROW 2 + ROFF_RETURN___2ND_MISC_ROW___DEPLOY_AND_HASH 3 + ROFF_RETURN___EMPTY_DEPLOYMENT___1ST_ACCOUNT_ROW 3 + ROFF_RETURN___EMPTY_DEPLOYMENT___2ND_ACCOUNT_ROW 4 + ROFF_RETURN___NONEMPTY_DEPLOYMENT___1ST_ACCOUNT_ROW 4 + ROFF_RETURN___NONEMPTY_DEPLOYMENT___2ND_ACCOUNT_ROW 5 + ROFF_RETURN___CALLER_CONTEXT___EXCEPTION 3 + ROFF_RETURN___CALLER_CONTEXT___MESSAGE_CALL 3 + ROFF_RETURN___CALLER_CONTEXT___EMPTY_DEPLOYMENT_WILL_REVERT 5 + ROFF_RETURN___CALLER_CONTEXT___EMPTY_DEPLOYMENT_WONT_REVERT 4 + ROFF_RETURN___CALLER_CONTEXT___NONEMPTY_DEPLOYMENT_WILL_REVERT 6 + ROFF_RETURN___CALLER_CONTEXT___NONEMPTY_DEPLOYMENT_WONT_REVERT 5 + ) + + + +(defun (return-instruction---instruction) (shift stack/INSTRUCTION ROFF_RETURN___STACK_ROW)) +(defun (return-instruction---exception-flag-MXPX) (shift stack/MXPX ROFF_RETURN___STACK_ROW)) +(defun (return-instruction---exception-flag-OOGX) (shift stack/OOGX ROFF_RETURN___STACK_ROW)) +(defun (return-instruction---exception-flag-MAXCSX) (shift stack/MAXCSX ROFF_RETURN___STACK_ROW)) +(defun (return-instruction---exception-flag-ICPX) (shift stack/ICPX ROFF_RETURN___STACK_ROW)) +(defun (return-instruction---offset-hi) (shift [ stack/STACK_ITEM_VALUE_HI 1] ROFF_RETURN___STACK_ROW)) +(defun (return-instruction---offset-lo) (shift [ stack/STACK_ITEM_VALUE_LO 1] ROFF_RETURN___STACK_ROW)) +(defun (return-instruction---size-hi) (shift [ stack/STACK_ITEM_VALUE_HI 2] ROFF_RETURN___STACK_ROW)) +(defun (return-instruction---size-lo) (shift [ stack/STACK_ITEM_VALUE_LO 2] ROFF_RETURN___STACK_ROW)) ;; "" +(defun (return-instruction---code-hash-hi) (shift stack/HASH_INFO_KECCAK_HI ROFF_RETURN___STACK_ROW)) +(defun (return-instruction---code-hash-lo) (shift stack/HASH_INFO_KECCAK_LO ROFF_RETURN___STACK_ROW)) +(defun (return-instruction---is-root) (shift context/IS_ROOT ROFF_RETURN___CURRENT_CONTEXT_ROW)) +(defun (return-instruction---deployment-address-hi) (shift context/BYTE_CODE_ADDRESS_HI ROFF_RETURN___CURRENT_CONTEXT_ROW)) +(defun (return-instruction---deployment-address-lo) (shift context/BYTE_CODE_ADDRESS_LO ROFF_RETURN___CURRENT_CONTEXT_ROW)) +(defun (return-instruction---is-deployment) (shift context/BYTE_CODE_DEPLOYMENT_STATUS ROFF_RETURN___CURRENT_CONTEXT_ROW)) +(defun (return-instruction---return-at-offset) (shift context/RETURN_AT_OFFSET ROFF_RETURN___CURRENT_CONTEXT_ROW)) +(defun (return-instruction---return-at-capacity) (shift context/RETURN_AT_CAPACITY ROFF_RETURN___CURRENT_CONTEXT_ROW)) +(defun (return-instruction---MXP-memory-expansion-gas) (shift misc/MXP_GAS_MXP ROFF_RETURN___1ST_MISC_ROW)) +(defun (return-instruction---MXP-memory-expansion-exception) (shift misc/MXP_MXPX ROFF_RETURN___1ST_MISC_ROW)) +(defun (return-instruction---MXP-s1nznomxpx) (shift misc/MXP_SIZE_1_NONZERO_NO_MXPX ROFF_RETURN___1ST_MISC_ROW)) +(defun (return-instruction---MMU-success-bit) (shift misc/MMU_SUCCESS_BIT ROFF_RETURN___1ST_MISC_ROW)) +(defun (return-instruction---OOB-max-code-size-exception) (shift [ misc/OOB_DATA 7 ] ROFF_RETURN___1ST_MISC_ROW)) ;; "" +(defun (return-instruction---deployment-code-fragment-index) (shift account/CODE_FRAGMENT_INDEX ROFF_RETURN___NONEMPTY_DEPLOYMENT___1ST_ACCOUNT_ROW)) + +(defun (return-instruction---type-safe-return-data-offset) (* (return-instruction---offset-lo) (return-instruction---MXP-s1nznomxpx))) +(defun (return-instruction---type-safe-return-data-size) (return-instruction---size-lo)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.4 Generalities ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defconstraint return-instruction---acceptable-exceptions (:guard PEEK_AT_SCENARIO) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (begin + (if-not-zero (scenario-shorthand---RETURN---message-call) + (eq! XAHOY + (+ (return-instruction---exception-flag-MXPX) + (return-instruction---exception-flag-OOGX)))) + (if-not-zero (scenario-shorthand---RETURN---deployment) + (eq! XAHOY + (+ (return-instruction---exception-flag-MXPX) + (return-instruction---exception-flag-OOGX) + (return-instruction---exception-flag-MAXCSX) + (return-instruction---exception-flag-ICPX)))))) + +(defconstraint return-instruction---setting-stack-pattern (:guard (return-instruction---standard-scenario-row)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (shift (stack-pattern-2-0) ROFF_RETURN___STACK_ROW)) + +(defconstraint return-instruction---setting-NSR (:guard (return-instruction---standard-scenario-row)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (eq! NSR + (+ (* 4 scenario/RETURN_EXCEPTION ) + (* 4 scenario/RETURN_FROM_MESSAGE_CALL_WILL_TOUCH_RAM ) + (* 4 scenario/RETURN_FROM_MESSAGE_CALL_WONT_TOUCH_RAM ) + (* 6 scenario/RETURN_FROM_DEPLOYMENT_EMPTY_CODE_WILL_REVERT ) + (* 5 scenario/RETURN_FROM_DEPLOYMENT_EMPTY_CODE_WONT_REVERT ) + (* 7 scenario/RETURN_FROM_DEPLOYMENT_NONEMPTY_CODE_WILL_REVERT ) + (* 6 scenario/RETURN_FROM_DEPLOYMENT_NONEMPTY_CODE_WONT_REVERT ) + ))) + +(defconstraint return-instruction---setting-peeking-flags (:guard (return-instruction---standard-scenario-row)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (begin + (if-not-zero scenario/RETURN_EXCEPTION + ;;;;;;;;;;;;;;;;;;;;;;;;; + (eq! NSR + (+ (shift PEEK_AT_SCENARIO ROFF_RETURN___SCENARIO_ROW) + (shift PEEK_AT_CONTEXT ROFF_RETURN___CURRENT_CONTEXT_ROW) + (shift PEEK_AT_MISCELLANEOUS ROFF_RETURN___1ST_MISC_ROW) + (shift PEEK_AT_CONTEXT ROFF_RETURN___CALLER_CONTEXT___EXCEPTION)))) + (if-not-zero scenario/RETURN_FROM_MESSAGE_CALL_WILL_TOUCH_RAM + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (eq! NSR + (+ (shift PEEK_AT_SCENARIO ROFF_RETURN___SCENARIO_ROW) + (shift PEEK_AT_CONTEXT ROFF_RETURN___CURRENT_CONTEXT_ROW) + (shift PEEK_AT_MISCELLANEOUS ROFF_RETURN___1ST_MISC_ROW) + (shift PEEK_AT_CONTEXT ROFF_RETURN___CALLER_CONTEXT___MESSAGE_CALL)))) + (if-not-zero scenario/RETURN_FROM_MESSAGE_CALL_WONT_TOUCH_RAM + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (eq! NSR + (+ (shift PEEK_AT_SCENARIO ROFF_RETURN___SCENARIO_ROW) + (shift PEEK_AT_CONTEXT ROFF_RETURN___CURRENT_CONTEXT_ROW) + (shift PEEK_AT_MISCELLANEOUS ROFF_RETURN___1ST_MISC_ROW) + (shift PEEK_AT_CONTEXT ROFF_RETURN___CALLER_CONTEXT___MESSAGE_CALL)))) + (if-not-zero scenario/RETURN_FROM_DEPLOYMENT_EMPTY_CODE_WILL_REVERT + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (eq! NSR + (+ (shift PEEK_AT_SCENARIO ROFF_RETURN___SCENARIO_ROW) + (shift PEEK_AT_CONTEXT ROFF_RETURN___CURRENT_CONTEXT_ROW) + (shift PEEK_AT_MISCELLANEOUS ROFF_RETURN___1ST_MISC_ROW) + (shift PEEK_AT_ACCOUNT ROFF_RETURN___EMPTY_DEPLOYMENT___1ST_ACCOUNT_ROW) + (shift PEEK_AT_ACCOUNT ROFF_RETURN___EMPTY_DEPLOYMENT___2ND_ACCOUNT_ROW) + (shift PEEK_AT_CONTEXT ROFF_RETURN___CALLER_CONTEXT___EMPTY_DEPLOYMENT_WILL_REVERT)))) + (if-not-zero scenario/RETURN_FROM_DEPLOYMENT_EMPTY_CODE_WONT_REVERT + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (eq! NSR + (+ (shift PEEK_AT_SCENARIO ROFF_RETURN___SCENARIO_ROW) + (shift PEEK_AT_CONTEXT ROFF_RETURN___CURRENT_CONTEXT_ROW) + (shift PEEK_AT_MISCELLANEOUS ROFF_RETURN___1ST_MISC_ROW) + (shift PEEK_AT_ACCOUNT ROFF_RETURN___EMPTY_DEPLOYMENT___1ST_ACCOUNT_ROW) + (shift PEEK_AT_CONTEXT ROFF_RETURN___CALLER_CONTEXT___EMPTY_DEPLOYMENT_WONT_REVERT)))) + (if-not-zero scenario/RETURN_FROM_DEPLOYMENT_NONEMPTY_CODE_WILL_REVERT + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (eq! NSR + (+ (shift PEEK_AT_SCENARIO ROFF_RETURN___SCENARIO_ROW) + (shift PEEK_AT_CONTEXT ROFF_RETURN___CURRENT_CONTEXT_ROW) + (shift PEEK_AT_MISCELLANEOUS ROFF_RETURN___1ST_MISC_ROW) + (shift PEEK_AT_MISCELLANEOUS ROFF_RETURN___2ND_MISC_ROW___DEPLOY_AND_HASH) + (shift PEEK_AT_ACCOUNT ROFF_RETURN___NONEMPTY_DEPLOYMENT___1ST_ACCOUNT_ROW) + (shift PEEK_AT_ACCOUNT ROFF_RETURN___NONEMPTY_DEPLOYMENT___2ND_ACCOUNT_ROW) + (shift PEEK_AT_CONTEXT ROFF_RETURN___CALLER_CONTEXT___NONEMPTY_DEPLOYMENT_WILL_REVERT)))) + (if-not-zero scenario/RETURN_FROM_DEPLOYMENT_NONEMPTY_CODE_WONT_REVERT + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (eq! NSR + (+ (shift PEEK_AT_SCENARIO ROFF_RETURN___SCENARIO_ROW) + (shift PEEK_AT_CONTEXT ROFF_RETURN___CURRENT_CONTEXT_ROW) + (shift PEEK_AT_MISCELLANEOUS ROFF_RETURN___1ST_MISC_ROW) + (shift PEEK_AT_MISCELLANEOUS ROFF_RETURN___2ND_MISC_ROW___DEPLOY_AND_HASH) + (shift PEEK_AT_ACCOUNT ROFF_RETURN___NONEMPTY_DEPLOYMENT___1ST_ACCOUNT_ROW) + (shift PEEK_AT_CONTEXT ROFF_RETURN___CALLER_CONTEXT___NONEMPTY_DEPLOYMENT_WONT_REVERT)))) + ) + ) + +(defconstraint return-instruction---first-context-row (:guard (return-instruction---standard-scenario-row)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (read-context-data ROFF_RETURN___CURRENT_CONTEXT_ROW + CONTEXT_NUMBER) + ) + +(defconstraint return-instruction---refining-the-return-scenario (:guard (return-instruction---standard-scenario-row)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (begin + (eq! scenario/RETURN_EXCEPTION XAHOY) + (if-not-zero (scenario-shorthand---RETURN---unexceptional) + (eq! (scenario-shorthand---RETURN---deployment) (return-instruction---is-deployment))) + (if-not-zero (scenario-shorthand---RETURN---deployment) + (begin + (eq! (scenario-shorthand---RETURN---deployment-will-revert) CONTEXT_WILL_REVERT) + (eq! (scenario-shorthand---RETURN---nonempty-deployment) (return-instruction---MXP-s1nznomxpx)))) + (if-not-zero (scenario-shorthand---RETURN---message-call) + (if-zero (return-touch-ram-expression) + ;; touch_ram_expression = 0 + (eq! scenario/RETURN_FROM_MESSAGE_CALL_WONT_TOUCH_RAM 1) + ;; touch_ram_expression ≠ 0 + (eq! scenario/RETURN_FROM_MESSAGE_CALL_WILL_TOUCH_RAM 1) + )))) + +(defun (return-touch-ram-expression) (* (- 1 (return-instruction---is-root)) + (return-instruction---MXP-s1nznomxpx) + (return-instruction---return-at-capacity) + )) + +(defconstraint return-instruction---setting-the-first-misc-row + (:guard (return-instruction---standard-scenario-row)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (begin + (eq! (shift misc/EXP_FLAG ROFF_RETURN___1ST_MISC_ROW) 0) + (eq! (shift misc/MMU_FLAG ROFF_RETURN___1ST_MISC_ROW) (return-instruction---trigger_MMU)) + (eq! (shift misc/MXP_FLAG ROFF_RETURN___1ST_MISC_ROW) (return-instruction---trigger_MXP)) + (eq! (shift misc/OOB_FLAG ROFF_RETURN___1ST_MISC_ROW) (return-instruction---trigger_OOB)) + (eq! (shift misc/STP_FLAG ROFF_RETURN___1ST_MISC_ROW) 0))) + +(defun (return-instruction---trigger_MXP) 1) +(defun (return-instruction---trigger_OOB) (+ (return-instruction---exception-flag-MAXCSX) (scenario-shorthand---RETURN---nonempty-deployment))) +(defun (return-instruction---trigger_MMU) (+ (return-instruction---check-first-byte) (return-instruction---write-return-data-to-caller-ram))) +(defun (return-instruction---check-first-byte) (+ (return-instruction---exception-flag-ICPX) (scenario-shorthand---RETURN---nonempty-deployment))) +(defun (return-instruction---write-return-data-to-caller-ram) scenario/RETURN_FROM_MESSAGE_CALL_WILL_TOUCH_RAM) +(defun (return-instruction---trigger_HASHINFO) (scenario-shorthand---RETURN---nonempty-deployment)) ;; "" + +(defconstraint return-instruction---setting-trigger_HASHINFO (:guard (return-instruction---standard-scenario-row)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (eq! (shift stack/HASH_INFO_FLAG ROFF_RETURN___STACK_ROW) + (return-instruction---trigger_HASHINFO))) + +(defconstraint return-instruction---setting-MXP-data (:guard (return-instruction---standard-scenario-row)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-not-zero (shift misc/MXP_FLAG ROFF_RETURN___1ST_MISC_ROW) + (set-MXP-instruction---single-mxp-offset-instructions ROFF_RETURN___1ST_MISC_ROW ;; row offset kappa + (return-instruction---instruction) ;; instruction + (return-instruction---is-deployment) ;; bit modifying the behaviour of RETURN pricing + (return-instruction---offset-hi) ;; offset high + (return-instruction---offset-lo) ;; offset low + (return-instruction---size-hi) ;; size high + (return-instruction---size-lo) ;; size low + ))) + +(defconstraint return-instruction---setting-OOB-data (:guard (return-instruction---standard-scenario-row)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-not-zero (shift misc/OOB_FLAG ROFF_RETURN___1ST_MISC_ROW) + (set-OOB-instruction---deployment ROFF_RETURN___1ST_MISC_ROW ;; offset + (return-instruction---size-hi) ;; code size hi + (return-instruction---size-lo) ;; code size lo + ))) + + +(defconstraint return-instruction---setting-MMU-data-first-call (:guard (return-instruction---standard-scenario-row)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (begin + (if-not-zero (return-instruction---check-first-byte) + (set-MMU-instruction---invalid-code-prefix ROFF_RETURN___1ST_MISC_ROW ;; offset + CONTEXT_NUMBER ;; source ID + ;; tgt_id ;; target ID + ;; aux_id ;; auxiliary ID + ;; src_offset_hi ;; source offset high + (return-instruction---offset-lo) ;; source offset low + ;; tgt_offset_lo ;; target offset low + ;; size ;; size + ;; ref_offset ;; reference offset + ;; ref_size ;; reference size + (return-instruction---exception-flag-ICPX) ;; success bit; this double negation stuff will be resolved by spec issue #715 + ;; limb_1 ;; limb 1 + ;; limb_2 ;; limb 2 + ;; exo_sum ;; weighted exogenous module flag sum + ;; phase ;; phase + )) + (if-not-zero (return-instruction---write-return-data-to-caller-ram) + (set-MMU-instruction---ram-to-ram-sans-padding ROFF_RETURN___1ST_MISC_ROW ;; offset + CONTEXT_NUMBER ;; source ID + CALLER_CONTEXT_NUMBER ;; target ID + ;; aux_id ;; auxiliary ID + ;; src_offset_hi ;; source offset high + (return-instruction---offset-lo) ;; source offset low + ;; tgt_offset_lo ;; target offset low + (return-instruction---size-lo) ;; size + (return-instruction---return-at-offset) ;; reference offset + (return-instruction---return-at-capacity) ;; reference size + ;; success_bit ;; success bit + ;; limb_1 ;; limb 1 + ;; limb_2 ;; limb 2 + ;; exo_sum ;; weighted exogenous module flag sum + ;; phase ;; phase + )))) + +(defconstraint return-instruction---justifying-the-MXPX + (:guard (return-instruction---standard-scenario-row)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (eq! (return-instruction---exception-flag-MXPX) + (return-instruction---MXP-memory-expansion-exception))) + +(defconstraint return-instruction---justifying-the-ICPX + (:guard (return-instruction---standard-scenario-row)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-zero (force-bin (return-instruction---check-first-byte)) + ;; check_first_byte ≡ 0 + (vanishes! (return-instruction---exception-flag-ICPX)) + ;; check_first_byte ≡ 1 + (eq! (return-instruction---exception-flag-ICPX) + (return-instruction---MMU-success-bit)))) + +(defconstraint return-instruction---justifying-the-MAXCSX (:guard (return-instruction---standard-scenario-row)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-zero (shift misc/OOB_FLAG ROFF_RETURN___1ST_MISC_ROW) + ;; no OOB call + (vanishes! (return-instruction---exception-flag-MAXCSX)) + ;; OOB was called + (eq! (return-instruction---exception-flag-MAXCSX) + (return-instruction---OOB-max-code-size-exception)))) + +(defconstraint return-instruction---setting-the-gas-cost (:guard (return-instruction---standard-scenario-row)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-zero (force-bin (return-instruction---gas-cost-required)) + ;; we don't require the computation of gas cost + (vanishes! GAS_COST) + ;; we require the computation of gas cost (either OOGX or unexceptional) + (eq! GAS_COST + (+ (shift stack/STATIC_GAS ROFF_RETURN___STACK_ROW) + (return-instruction---MXP-memory-expansion-gas))))) + +(defun (return-instruction---gas-cost-required) (+ (return-instruction---exception-flag-OOGX) + (scenario-shorthand---RETURN---unexceptional))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.4  RETURN/EXCEPTION ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (return-instruction---exception-scenario) (* PEEK_AT_SCENARIO scenario/RETURN_EXCEPTION)) + +;; redundant +(defconstraint return-instruction---resetting-the-caller-contexts-return-data (:guard (return-instruction---exception-scenario)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (execution-provides-empty-return-data ROFF_RETURN___CALLER_CONTEXT___EXCEPTION)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.4  RETURN/message_call ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (return-instruction---message-call-scenario) (* PEEK_AT_SCENARIO (scenario-shorthand---RETURN---message-call))) + +(defconstraint return-instruction---setting-the-callers-new-return-data-message-call-case (:guard (return-instruction---message-call-scenario)) + (provide-return-data ROFF_RETURN___CALLER_CONTEXT___MESSAGE_CALL ;; row offset + CALLER_CONTEXT_NUMBER ;; receiver context + CONTEXT_NUMBER ;; provider context + (return-instruction---type-safe-return-data-offset) ;; (type safe) rdo + (return-instruction---type-safe-return-data-size) ;; (type safe) rds + )) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.4  RETURN/empty_deployment ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (return-instruction---empty-deployment-scenario) (* PEEK_AT_SCENARIO (scenario-shorthand---RETURN---empty-deployment))) + +(defconstraint return-instruction---first-account-row-for-empty-deployments (:guard (return-instruction---empty-deployment-scenario)) + (begin + (eq! (shift account/ADDRESS_HI ROFF_RETURN___EMPTY_DEPLOYMENT___1ST_ACCOUNT_ROW) (return-instruction---deployment-address-hi)) + (eq! (shift account/ADDRESS_LO ROFF_RETURN___EMPTY_DEPLOYMENT___1ST_ACCOUNT_ROW) (return-instruction---deployment-address-lo)) + (account-same-balance ROFF_RETURN___EMPTY_DEPLOYMENT___1ST_ACCOUNT_ROW) + (account-same-nonce ROFF_RETURN___EMPTY_DEPLOYMENT___1ST_ACCOUNT_ROW) + (eq! (shift account/CODE_SIZE_NEW ROFF_RETURN___EMPTY_DEPLOYMENT___1ST_ACCOUNT_ROW) (return-instruction---size-lo)) + (eq! (shift account/CODE_HASH_HI_NEW ROFF_RETURN___EMPTY_DEPLOYMENT___1ST_ACCOUNT_ROW) EMPTY_KECCAK_HI) + (eq! (shift account/CODE_HASH_LO_NEW ROFF_RETURN___EMPTY_DEPLOYMENT___1ST_ACCOUNT_ROW) EMPTY_KECCAK_LO) + (account-same-deployment-number ROFF_RETURN___EMPTY_DEPLOYMENT___1ST_ACCOUNT_ROW) + (eq! (shift account/DEPLOYMENT_STATUS_NEW ROFF_RETURN___EMPTY_DEPLOYMENT___1ST_ACCOUNT_ROW) 0) + (account-same-warmth ROFF_RETURN___EMPTY_DEPLOYMENT___1ST_ACCOUNT_ROW) + (account-same-marked-for-deletion ROFF_RETURN___EMPTY_DEPLOYMENT___1ST_ACCOUNT_ROW) + (vanishes! (shift account/ROMLEX_FLAG ROFF_RETURN___EMPTY_DEPLOYMENT___1ST_ACCOUNT_ROW)) + (vanishes! (shift account/TRM_FLAG ROFF_RETURN___EMPTY_DEPLOYMENT___1ST_ACCOUNT_ROW)) + (DOM-SUB-stamps---standard ROFF_RETURN___EMPTY_DEPLOYMENT___1ST_ACCOUNT_ROW 0) + ;; debug constraints + (debug (vanishes! (shift account/CODE_SIZE_NEW ROFF_RETURN___EMPTY_DEPLOYMENT___1ST_ACCOUNT_ROW))) + (debug (eq! (shift account/CODE_HASH_HI ROFF_RETURN___EMPTY_DEPLOYMENT___1ST_ACCOUNT_ROW) EMPTY_KECCAK_HI)) + (debug (eq! (shift account/CODE_HASH_LO ROFF_RETURN___EMPTY_DEPLOYMENT___1ST_ACCOUNT_ROW) EMPTY_KECCAK_LO)) + (debug (eq! (shift account/DEPLOYMENT_STATUS ROFF_RETURN___EMPTY_DEPLOYMENT___1ST_ACCOUNT_ROW) 1)) + (debug (account-isnt-precompile ROFF_RETURN___EMPTY_DEPLOYMENT___1ST_ACCOUNT_ROW)) + )) + +(defconstraint return-instruction---second-account-row-for-empty-deployments (:guard (return-instruction---empty-deployment-scenario)) + (if-not-zero scenario/RETURN_FROM_DEPLOYMENT_EMPTY_CODE_WILL_REVERT + (begin + (account-same-address-as ROFF_RETURN___EMPTY_DEPLOYMENT___2ND_ACCOUNT_ROW ROFF_RETURN___EMPTY_DEPLOYMENT___1ST_ACCOUNT_ROW) + (account-undo-balance-update ROFF_RETURN___EMPTY_DEPLOYMENT___2ND_ACCOUNT_ROW ROFF_RETURN___EMPTY_DEPLOYMENT___1ST_ACCOUNT_ROW) + (account-undo-nonce-update ROFF_RETURN___EMPTY_DEPLOYMENT___2ND_ACCOUNT_ROW ROFF_RETURN___EMPTY_DEPLOYMENT___1ST_ACCOUNT_ROW) + (account-undo-code-update ROFF_RETURN___EMPTY_DEPLOYMENT___2ND_ACCOUNT_ROW ROFF_RETURN___EMPTY_DEPLOYMENT___1ST_ACCOUNT_ROW) + (account-undo-deployment-status-update ROFF_RETURN___EMPTY_DEPLOYMENT___2ND_ACCOUNT_ROW ROFF_RETURN___EMPTY_DEPLOYMENT___1ST_ACCOUNT_ROW) + (account-undo-warmth-update ROFF_RETURN___EMPTY_DEPLOYMENT___2ND_ACCOUNT_ROW ROFF_RETURN___EMPTY_DEPLOYMENT___1ST_ACCOUNT_ROW) + (account-same-marked-for-deletion ROFF_RETURN___EMPTY_DEPLOYMENT___2ND_ACCOUNT_ROW) + (vanishes! (shift account/ROMLEX_FLAG ROFF_RETURN___EMPTY_DEPLOYMENT___2ND_ACCOUNT_ROW)) + (vanishes! (shift account/TRM_FLAG ROFF_RETURN___EMPTY_DEPLOYMENT___2ND_ACCOUNT_ROW)) + (DOM-SUB-stamps---revert-with-current ROFF_RETURN___EMPTY_DEPLOYMENT___2ND_ACCOUNT_ROW 1) + ))) + +(defconstraint return-instruction---empty-deployment---squasing-the-creators-return-data (:guard (return-instruction---empty-deployment-scenario)) + (begin + (if-not-zero scenario/RETURN_FROM_DEPLOYMENT_EMPTY_CODE_WILL_REVERT + (execution-provides-empty-return-data ROFF_RETURN___CALLER_CONTEXT___EMPTY_DEPLOYMENT_WILL_REVERT)) + (if-not-zero scenario/RETURN_FROM_DEPLOYMENT_EMPTY_CODE_WONT_REVERT + (execution-provides-empty-return-data ROFF_RETURN___CALLER_CONTEXT___EMPTY_DEPLOYMENT_WONT_REVERT)))) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.4  RETURN/nonempty_deployment ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defun (return-instruction---nonempty-deployment-scenario) (* PEEK_AT_SCENARIO (scenario-shorthand---RETURN---nonempty-deployment))) + +(defconstraint return-instruction---setting-the-second-miscellaneous-row-nonempty-deployments (:guard (return-instruction---nonempty-deployment-scenario)) + (eq! (weighted-MISC-flag-sum ROFF_RETURN___2ND_MISC_ROW___DEPLOY_AND_HASH) MISC_WEIGHT_MMU)) + +(defconstraint return-instruction---setting-the-second-MMU-instruction (:guard (return-instruction---nonempty-deployment-scenario)) + (set-MMU-instruction---ram-to-exo-with-padding ROFF_RETURN___2ND_MISC_ROW___DEPLOY_AND_HASH ;; offset + CONTEXT_NUMBER ;; source ID + (return-instruction---deployment-code-fragment-index) ;; target ID + (+ 1 HUB_STAMP) ;; auxiliary ID + ;; src_offset_hi ;; source offset high + (return-instruction---offset-lo) ;; source offset low + ;; tgt_offset_lo ;; target offset low + (return-instruction---size-lo) ;; size + ;; ref_offset ;; reference offset + (return-instruction---size-lo) ;; reference size + 0 ;; success bit <== here: irrelevant + ;; limb_1 ;; limb 1 + ;; limb_2 ;; limb 2 + (+ EXO_SUM_WEIGHT_ROM EXO_SUM_WEIGHT_KEC) ;; weighted exogenous module flag sum + 0 ;; phase <== here: irrelevant + )) + +(defconstraint return-instruction---first-account-row-for-nonempty-deployments (:guard (return-instruction---nonempty-deployment-scenario)) + (begin + (eq! (shift account/ADDRESS_HI ROFF_RETURN___NONEMPTY_DEPLOYMENT___1ST_ACCOUNT_ROW) (return-instruction---deployment-address-hi)) + (eq! (shift account/ADDRESS_LO ROFF_RETURN___NONEMPTY_DEPLOYMENT___1ST_ACCOUNT_ROW) (return-instruction---deployment-address-lo)) + (account-same-balance ROFF_RETURN___NONEMPTY_DEPLOYMENT___1ST_ACCOUNT_ROW) + (account-same-nonce ROFF_RETURN___NONEMPTY_DEPLOYMENT___1ST_ACCOUNT_ROW) + (eq! (shift account/CODE_SIZE_NEW ROFF_RETURN___NONEMPTY_DEPLOYMENT___1ST_ACCOUNT_ROW) (return-instruction---size-lo)) + (eq! (shift account/CODE_HASH_HI_NEW ROFF_RETURN___NONEMPTY_DEPLOYMENT___1ST_ACCOUNT_ROW) (return-instruction---code-hash-hi)) + (eq! (shift account/CODE_HASH_LO_NEW ROFF_RETURN___NONEMPTY_DEPLOYMENT___1ST_ACCOUNT_ROW) (return-instruction---code-hash-lo)) + (account-same-deployment-number ROFF_RETURN___NONEMPTY_DEPLOYMENT___1ST_ACCOUNT_ROW) + (vanishes! (shift account/DEPLOYMENT_STATUS_NEW ROFF_RETURN___NONEMPTY_DEPLOYMENT___1ST_ACCOUNT_ROW)) + (account-same-warmth ROFF_RETURN___NONEMPTY_DEPLOYMENT___1ST_ACCOUNT_ROW) + (account-same-marked-for-deletion ROFF_RETURN___NONEMPTY_DEPLOYMENT___1ST_ACCOUNT_ROW) + (eq! (shift account/ROMLEX_FLAG ROFF_RETURN___NONEMPTY_DEPLOYMENT___1ST_ACCOUNT_ROW) 1) + (vanishes! (shift account/TRM_FLAG ROFF_RETURN___NONEMPTY_DEPLOYMENT___1ST_ACCOUNT_ROW)) + (DOM-SUB-stamps---standard ROFF_RETURN___NONEMPTY_DEPLOYMENT___1ST_ACCOUNT_ROW 0) + ;; debug constraints + (debug (eq! (shift account/CODE_HASH_HI ROFF_RETURN___NONEMPTY_DEPLOYMENT___1ST_ACCOUNT_ROW) EMPTY_KECCAK_HI)) + (debug (eq! (shift account/CODE_HASH_LO ROFF_RETURN___NONEMPTY_DEPLOYMENT___1ST_ACCOUNT_ROW) EMPTY_KECCAK_LO)) + (debug (eq! (shift account/DEPLOYMENT_STATUS ROFF_RETURN___NONEMPTY_DEPLOYMENT___1ST_ACCOUNT_ROW) 1)) + (debug (account-isnt-precompile ROFF_RETURN___NONEMPTY_DEPLOYMENT___1ST_ACCOUNT_ROW)) + )) + +(defconstraint return-instruction---second-account-row-for-nonempty-deployments (:guard (return-instruction---nonempty-deployment-scenario)) + (if-not-zero scenario/RETURN_FROM_DEPLOYMENT_NONEMPTY_CODE_WILL_REVERT + (begin + (account-same-address-as ROFF_RETURN___NONEMPTY_DEPLOYMENT___2ND_ACCOUNT_ROW ROFF_RETURN___NONEMPTY_DEPLOYMENT___1ST_ACCOUNT_ROW) + (account-undo-balance-update ROFF_RETURN___NONEMPTY_DEPLOYMENT___2ND_ACCOUNT_ROW ROFF_RETURN___NONEMPTY_DEPLOYMENT___1ST_ACCOUNT_ROW) + (account-undo-nonce-update ROFF_RETURN___NONEMPTY_DEPLOYMENT___2ND_ACCOUNT_ROW ROFF_RETURN___NONEMPTY_DEPLOYMENT___1ST_ACCOUNT_ROW) + (account-undo-code-update ROFF_RETURN___NONEMPTY_DEPLOYMENT___2ND_ACCOUNT_ROW ROFF_RETURN___NONEMPTY_DEPLOYMENT___1ST_ACCOUNT_ROW) + (account-undo-deployment-status-update ROFF_RETURN___NONEMPTY_DEPLOYMENT___2ND_ACCOUNT_ROW ROFF_RETURN___NONEMPTY_DEPLOYMENT___1ST_ACCOUNT_ROW) + (account-undo-warmth-update ROFF_RETURN___NONEMPTY_DEPLOYMENT___2ND_ACCOUNT_ROW ROFF_RETURN___NONEMPTY_DEPLOYMENT___1ST_ACCOUNT_ROW) + (account-same-marked-for-deletion ROFF_RETURN___NONEMPTY_DEPLOYMENT___2ND_ACCOUNT_ROW) + (vanishes! (shift account/ROMLEX_FLAG ROFF_RETURN___NONEMPTY_DEPLOYMENT___2ND_ACCOUNT_ROW)) + (vanishes! (shift account/TRM_FLAG ROFF_RETURN___NONEMPTY_DEPLOYMENT___2ND_ACCOUNT_ROW)) + (DOM-SUB-stamps---revert-with-current ROFF_RETURN___NONEMPTY_DEPLOYMENT___2ND_ACCOUNT_ROW 1) + ))) + +(defconstraint return-instruction---nonempty-deployment---squasing-the-creators-return-data (:guard (return-instruction---nonempty-deployment-scenario)) + (begin + (if-not-zero scenario/RETURN_FROM_DEPLOYMENT_NONEMPTY_CODE_WILL_REVERT + (execution-provides-empty-return-data ROFF_RETURN___CALLER_CONTEXT___NONEMPTY_DEPLOYMENT_WILL_REVERT)) + (if-not-zero scenario/RETURN_FROM_DEPLOYMENT_NONEMPTY_CODE_WONT_REVERT + (execution-provides-empty-return-data ROFF_RETURN___CALLER_CONTEXT___NONEMPTY_DEPLOYMENT_WONT_REVERT)))) diff --git a/hub/osaka/constraints/instruction-handling/halting/revert.lisp b/hub/osaka/constraints/instruction-handling/halting/revert.lisp new file mode 100644 index 000000000..bfc3289f8 --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/halting/revert.lisp @@ -0,0 +1,154 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.5 REVERT ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;; + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.5.1 Introduction ;; +;; X.5.2 Shorthands ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconst + ROFF_REVERT___MISC_ROW 1 + ;; + ROFF_REVERT___XAHOY_CALLER_CONTEXT_ROW 2 + ;; + ROFF_REVERT___NO_XAHOY_CURRENT_CONTEXT_ROW 2 + ROFF_REVERT___NO_XAHOY_CALLER_CONTEXT_ROW 3) + + + +(defun (revert-instruction---instruction) stack/INSTRUCTION) +(defun (revert-instruction---offset-hi) [ stack/STACK_ITEM_VALUE_HI 1 ]) +(defun (revert-instruction---offset-lo) [ stack/STACK_ITEM_VALUE_LO 1 ]) +(defun (revert-instruction---size-hi) [ stack/STACK_ITEM_VALUE_HI 2 ]) +(defun (revert-instruction---size-lo) [ stack/STACK_ITEM_VALUE_LO 2 ]) + +(defun (revert-instruction---current-context) CONTEXT_NUMBER) +(defun (revert-instruction---caller-context) CALLER_CONTEXT_NUMBER) +(defun (revert-instruction---MXP-memory-expansion-gas) (shift misc/MXP_GAS_MXP ROFF_REVERT___MISC_ROW)) +(defun (revert-instruction---MXP-size-1-is-nonzero-and-no-mxpx) (shift misc/MXP_SIZE_1_NONZERO_NO_MXPX ROFF_REVERT___MISC_ROW)) +(defun (revert-instruction---current-context-is-root) (shift context/IS_ROOT ROFF_REVERT___NO_XAHOY_CURRENT_CONTEXT_ROW)) +(defun (revert-instruction---r@o) (shift context/RETURN_AT_OFFSET ROFF_REVERT___NO_XAHOY_CURRENT_CONTEXT_ROW)) +(defun (revert-instruction---r@c) (shift context/RETURN_AT_CAPACITY ROFF_REVERT___NO_XAHOY_CURRENT_CONTEXT_ROW)) + +(defun (revert-instruction---type-safe-return-data-offset) (* (revert-instruction---offset-lo) (revert-instruction---MXP-size-1-is-nonzero-and-no-mxpx))) +(defun (revert-instruction---type-safe-return-data-size) (revert-instruction---size-lo)) ;; "" + +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.5.1 Constraints ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (revert-instruction---standard-precondition) (* PEEK_AT_STACK + stack/HALT_FLAG + (halting-instruction---is-REVERT) + (- 1 stack/SUX stack/SOX ))) + +(defconstraint revert-instruction---setting-the-stack-pattern + (:guard (revert-instruction---standard-precondition)) + (stack-pattern-2-0)) + +(defconstraint revert-instruction---allowable-exceptions + (:guard (revert-instruction---standard-precondition)) + (eq! XAHOY + (+ stack/MXPX + stack/OOGX))) + +(defconstraint revert-instruction---setting-NSR + (:guard (revert-instruction---standard-precondition)) + (eq! NSR + (- 3 XAHOY))) + +(defconstraint revert-instruction---setting-the-peeking-flags + (:guard (revert-instruction---standard-precondition)) + (if-not-zero XAHOY + ;; XAHOY ≡ 1 + (eq! NSR + (+ (shift PEEK_AT_MISCELLANEOUS ROFF_REVERT___MISC_ROW ) + (shift PEEK_AT_CONTEXT ROFF_REVERT___XAHOY_CALLER_CONTEXT_ROW))) + ;; XAHOY ≡ 0 + (eq! NSR + (+ (shift PEEK_AT_MISCELLANEOUS ROFF_REVERT___MISC_ROW ) + (shift PEEK_AT_CONTEXT ROFF_REVERT___NO_XAHOY_CURRENT_CONTEXT_ROW) + (shift PEEK_AT_CONTEXT ROFF_REVERT___NO_XAHOY_CALLER_CONTEXT_ROW ))))) + +(defconstraint revert-instruction---setting-the-context-rows---exceptional + (:guard (revert-instruction---standard-precondition)) + (if-not-zero XAHOY + (execution-provides-empty-return-data ROFF_REVERT___XAHOY_CALLER_CONTEXT_ROW))) + +(defconstraint revert-instruction---setting-the-context-rows---unexceptional + (:guard (revert-instruction---standard-precondition)) + (if-zero XAHOY + (provide-return-data ROFF_REVERT___NO_XAHOY_CALLER_CONTEXT_ROW ;; row offset + (revert-instruction---caller-context) ;; receiver context + (revert-instruction---current-context) ;; provider context + (revert-instruction---type-safe-return-data-offset) ;; type safe rdo + (revert-instruction---type-safe-return-data-size) ;; type safe rds + ))) + +(defconstraint revert-instruction---setting-the-miscellaneous-row-module-flags + (:guard (revert-instruction---standard-precondition)) + (let ((FLAG (weighted-MISC-flag-sum ROFF_REVERT___MISC_ROW))) + ;; + (if (or! + (eq! XAHOY 1) + (eq! (revert-instruction---current-context-is-root) 1) + (eq! (revert-instruction---size-lo) 0) + (eq! (revert-instruction---r@c) 0)) + ;; trigger_MMU == 0 + (eq! FLAG MISC_WEIGHT_MXP) + ;; trigger_MMU == 1 + (eq! FLAG (+ MISC_WEIGHT_MXP MISC_WEIGHT_MMU))))) + +(defconstraint revert-instruction---setting-the-MXP-instruction + (:guard (revert-instruction---standard-precondition)) + (set-MXP-instruction---single-mxp-offset-instructions ROFF_REVERT___MISC_ROW ;; row offset kappa + (revert-instruction---instruction) ;; instruction + 0 ;; bit modifying the behaviour of RETURN pricing + (revert-instruction---offset-hi) ;; offset high + (revert-instruction---offset-lo) ;; offset low + (revert-instruction---size-hi) ;; size high + (revert-instruction---size-lo))) ;; size low + +(defconstraint revert-instruction---setting-the-MXPX + (:guard (revert-instruction---standard-precondition)) + (eq! stack/MXPX (shift misc/MXP_MXPX ROFF_REVERT___MISC_ROW))) + +(defconstraint revert-instruction---setting-the-MMU-data + (:guard (revert-instruction---standard-precondition)) + (if-not-zero (shift misc/MMU_FLAG ROFF_REVERT___MISC_ROW) + (set-MMU-instruction---ram-to-ram-sans-padding ROFF_REVERT___MISC_ROW ;; row offset + (revert-instruction---current-context) ;; source ID + (revert-instruction---caller-context) ;; target ID + ;; aux_id ;; auxiliary ID + ;; src_offset_hi ;; source offset high + (revert-instruction---offset-lo) ;; source offset low + ;; tgt_offset_lo ;; target offset low + (revert-instruction---size-lo) ;; size + (revert-instruction---r@o) ;; reference offset + (revert-instruction---r@c) ;; reference size + ;; success_bit ;; success bit + ;; limb_1 ;; limb 1 + ;; limb_2 ;; limb 2 + ;; exo_sum ;; weighted exogenous module flag sum + ;; phase ;; phase + ))) + +(defconstraint revert-instruction---setting-the-gas-cost + (:guard (revert-instruction---standard-precondition)) + (if-not-zero stack/MXPX + (vanishes! GAS_COST) + (eq! GAS_COST + (+ stack/STATIC_GAS + (revert-instruction---MXP-memory-expansion-gas))))) diff --git a/hub/osaka/constraints/instruction-handling/halting/selfdestruct/constraints.lisp b/hub/osaka/constraints/instruction-handling/halting/selfdestruct/constraints.lisp new file mode 100644 index 000000000..e9818a7a1 --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/halting/selfdestruct/constraints.lisp @@ -0,0 +1,239 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.5 SELFDESTRUCT ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.5.5 Constraints ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (selfdestruct-instruction---scenario-precondition) (* PEEK_AT_SCENARIO (scenario-shorthand---SELFDESTRUCT---sum))) + +(defconstraint selfdestruct-instruction---looking-back (:guard (selfdestruct-instruction---scenario-precondition)) + (begin + (eq! (shift PEEK_AT_STACK ROFF_SELFDESTRUCT___STACK_ROW) 1) + (eq! (shift stack/INSTRUCTION ROFF_SELFDESTRUCT___STACK_ROW) EVM_INST_SELFDESTRUCT) + (eq! (+ (selfdestruct-instruction---STATICX) (selfdestruct-instruction---OOGX)) + XAHOY))) + +(defconstraint selfdestruct-instruction---setting-stack-pattern (:guard (selfdestruct-instruction---scenario-precondition)) + (shift (stack-pattern-1-0) ROFF_SELFDESTRUCT___STACK_ROW)) + +(defconstraint selfdestruct-instruction---setting-the-right-scenario (:guard (selfdestruct-instruction---scenario-precondition)) + (begin + (eq! XAHOY scenario/SELFDESTRUCT_EXCEPTION) + (if-zero XAHOY + (begin + (eq! scenario/SELFDESTRUCT_WILL_REVERT CONTEXT_WILL_REVERT) + (eq! (scenario-shorthand---SELFDESTRUCT---wont-revert) (- 1 CONTEXT_WILL_REVERT)))) + (if-zero CONTEXT_WILL_REVERT + (begin + (eq! (scenario-shorthand---SELFDESTRUCT---wont-revert) 1) + (eq! scenario/SELFDESTRUCT_WONT_REVERT_ALREADY_MARKED (- 1 (selfdestruct-instruction---trigger-future-acc-deletion))) + (eq! scenario/SELFDESTRUCT_WONT_REVERT_NOT_YET_MARKED (selfdestruct-instruction---trigger-future-acc-deletion)))))) + +(defconstraint selfdestruct-instruction---setting-NSR-and-peeking-flags---STATICX-case + (:guard (selfdestruct-instruction---scenario-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-not-zero (selfdestruct-instruction---STATICX) + (begin + (eq! (shift NSR ROFF_SELFDESTRUCT___STACK_ROW) 3) + (eq! (shift NSR ROFF_SELFDESTRUCT___STACK_ROW) (+ (shift PEEK_AT_SCENARIO ROFF_SELFDESTRUCT___SCENARIO_ROW ) + (shift PEEK_AT_CONTEXT ROFF_SELFDESTRUCT___1ST_CONTEXT_ROW) + (shift PEEK_AT_CONTEXT ROFF_SELFDESTRUCT___FINAL_CONTEXT_STATICX)))))) + +(defconstraint selfdestruct-instruction---setting-NSR-and-peeking-flags---OOGX-case + (:guard (selfdestruct-instruction---scenario-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-not-zero (selfdestruct-instruction---OOGX) + (begin + (eq! (shift NSR ROFF_SELFDESTRUCT___STACK_ROW) 5) + (eq! (shift NSR ROFF_SELFDESTRUCT___STACK_ROW) (+ (shift PEEK_AT_SCENARIO ROFF_SELFDESTRUCT___SCENARIO_ROW ) + (shift PEEK_AT_CONTEXT ROFF_SELFDESTRUCT___1ST_CONTEXT_ROW ) + (shift PEEK_AT_ACCOUNT ROFF_SELFDESTRUCT___ACCOUNT___1ST_DOING_ROW) + (shift PEEK_AT_ACCOUNT ROFF_SELFDESTRUCT___ACCOUNT___2ND_DOING_ROW) + (shift PEEK_AT_CONTEXT ROFF_SELFDESTRUCT___FINAL_CONTEXT_OOGX)))))) + +(defconstraint selfdestruct-instruction---setting-NSR-and-peeking-flags---WILL_REVERT-case + (:guard (selfdestruct-instruction---scenario-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-not-zero scenario/SELFDESTRUCT_WILL_REVERT + (begin + (eq! (shift NSR ROFF_SELFDESTRUCT___STACK_ROW) 7) + (eq! (shift NSR ROFF_SELFDESTRUCT___STACK_ROW) (+ (shift PEEK_AT_SCENARIO ROFF_SELFDESTRUCT___SCENARIO_ROW ) + (shift PEEK_AT_CONTEXT ROFF_SELFDESTRUCT___1ST_CONTEXT_ROW ) + (shift PEEK_AT_ACCOUNT ROFF_SELFDESTRUCT___ACCOUNT___1ST_DOING_ROW ) + (shift PEEK_AT_ACCOUNT ROFF_SELFDESTRUCT___ACCOUNT___2ND_DOING_ROW ) + (shift PEEK_AT_ACCOUNT ROFF_SELFDESTRUCT___ACCOUNT___1ST_UNDOING_ROW) + (shift PEEK_AT_ACCOUNT ROFF_SELFDESTRUCT___ACCOUNT___2ND_UNDOING_ROW) + (shift PEEK_AT_CONTEXT ROFF_SELFDESTRUCT___FINAL_CONTEXT_WILL_REVERT)))))) + +(defconstraint selfdestruct-instruction---setting-NSR-and-peeking-flags---WONT_REVERT_ALREADY_MARKED-case + (:guard (selfdestruct-instruction---scenario-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-not-zero scenario/SELFDESTRUCT_WONT_REVERT_ALREADY_MARKED + (begin + (eq! (shift NSR ROFF_SELFDESTRUCT___STACK_ROW) 5) + (eq! (shift NSR ROFF_SELFDESTRUCT___STACK_ROW) (+ (shift PEEK_AT_SCENARIO ROFF_SELFDESTRUCT___SCENARIO_ROW ) + (shift PEEK_AT_CONTEXT ROFF_SELFDESTRUCT___1ST_CONTEXT_ROW ) + (shift PEEK_AT_ACCOUNT ROFF_SELFDESTRUCT___ACCOUNT___1ST_DOING_ROW) + (shift PEEK_AT_ACCOUNT ROFF_SELFDESTRUCT___ACCOUNT___2ND_DOING_ROW) + (shift PEEK_AT_CONTEXT ROFF_SELFDESTRUCT___FINAL_CONTEXT_WONT_REVERT_ALREADY_MARKED)))))) + +(defconstraint selfdestruct-instruction---setting-NSR-and-peeking-flags---WONT_REVERT_NOT_YET_MARKED-case + (:guard (selfdestruct-instruction---scenario-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-not-zero scenario/SELFDESTRUCT_WONT_REVERT_NOT_YET_MARKED + (begin + (eq! (shift NSR ROFF_SELFDESTRUCT___STACK_ROW) 6) + (eq! (shift NSR ROFF_SELFDESTRUCT___STACK_ROW) (+ (shift PEEK_AT_SCENARIO ROFF_SELFDESTRUCT___SCENARIO_ROW ) + (shift PEEK_AT_CONTEXT ROFF_SELFDESTRUCT___1ST_CONTEXT_ROW ) + (shift PEEK_AT_ACCOUNT ROFF_SELFDESTRUCT___ACCOUNT___1ST_DOING_ROW) + (shift PEEK_AT_ACCOUNT ROFF_SELFDESTRUCT___ACCOUNT___2ND_DOING_ROW) + (shift PEEK_AT_ACCOUNT ROFF_SELFDESTRUCT___ACCOUNT_DELETION_ROW ) + (shift PEEK_AT_CONTEXT ROFF_SELFDESTRUCT___FINAL_CONTEXT_WONT_REVERT_NOT_YET_MARKED)))))) + +(defconstraint selfdestruct-instruction---reading-context-data (:guard (selfdestruct-instruction---scenario-precondition)) + (read-context-data ROFF_SELFDESTRUCT___1ST_CONTEXT_ROW ;; row offset + CONTEXT_NUMBER)) ;; context to read + +(defconstraint selfdestruct-instruction---returning-empty-return-data (:guard (selfdestruct-instruction---scenario-precondition)) + (begin + (if-not-zero (selfdestruct-instruction---STATICX) (execution-provides-empty-return-data ROFF_SELFDESTRUCT___FINAL_CONTEXT_STATICX)) + (if-not-zero (selfdestruct-instruction---OOGX) (execution-provides-empty-return-data ROFF_SELFDESTRUCT___FINAL_CONTEXT_OOGX)) + (if-not-zero scenario/SELFDESTRUCT_WILL_REVERT (execution-provides-empty-return-data ROFF_SELFDESTRUCT___FINAL_CONTEXT_WILL_REVERT)) + (if-not-zero scenario/SELFDESTRUCT_WONT_REVERT_ALREADY_MARKED (execution-provides-empty-return-data ROFF_SELFDESTRUCT___FINAL_CONTEXT_WONT_REVERT_ALREADY_MARKED)) + (if-not-zero scenario/SELFDESTRUCT_WONT_REVERT_NOT_YET_MARKED (execution-provides-empty-return-data ROFF_SELFDESTRUCT___FINAL_CONTEXT_WONT_REVERT_NOT_YET_MARKED)))) + +(defconstraint selfdestruct-instruction---justifying-the-static-exception (:guard (selfdestruct-instruction---scenario-precondition)) + (eq! (selfdestruct-instruction---STATICX) + (selfdestruct-instruction---is-static))) + +(defconstraint selfdestruct-instruction---justifying-the-gas-cost (:guard (selfdestruct-instruction---scenario-precondition)) + (if-zero (selfdestruct-instruction---STATICX) + (if-zero (selfdestruct-instruction---balance) + ;; account has zero balance + (eq! GAS_COST + (+ (shift stack/STATIC_GAS ROFF_SELFDESTRUCT___STACK_ROW) + (* (- 1 (selfdestruct-instruction---recipient-warmth)) GAS_CONST_G_COLD_ACCOUNT_ACCESS))) + ;; account has nonzero balance + (eq! GAS_COST + (+ (shift stack/STATIC_GAS ROFF_SELFDESTRUCT___STACK_ROW) + (* (- 1 (selfdestruct-instruction---recipient-warmth)) GAS_CONST_G_COLD_ACCOUNT_ACCESS) + (* (- 1 (selfdestruct-instruction---recipient-exists)) GAS_CONST_G_NEW_ACCOUNT )))))) + +(defconstraint selfdestruct-instruction---first-account-row---generalities + (:guard (selfdestruct-instruction---scenario-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (begin + (if-zero (selfdestruct-instruction---STATICX) + (begin + (debug (vanishes! (shift account/ROMLEX_FLAG ROFF_SELFDESTRUCT___ACCOUNT___1ST_DOING_ROW))) + (debug (vanishes! (shift account/TRM_FLAG ROFF_SELFDESTRUCT___ACCOUNT___1ST_DOING_ROW))) + (eq! (selfdestruct-instruction---account-address-hi) (shift account/ADDRESS_HI ROFF_SELFDESTRUCT___ACCOUNT___1ST_DOING_ROW)) + (eq! (selfdestruct-instruction---account-address-lo) (shift account/ADDRESS_LO ROFF_SELFDESTRUCT___ACCOUNT___1ST_DOING_ROW)) + ;; balance + (account-same-nonce ROFF_SELFDESTRUCT___ACCOUNT___1ST_DOING_ROW) + (account-same-warmth ROFF_SELFDESTRUCT___ACCOUNT___1ST_DOING_ROW) + ;; code + ;; depoyment + ;; selfdestruct marking + (DOM-SUB-stamps---standard ROFF_SELFDESTRUCT___ACCOUNT___1ST_DOING_ROW + 0) + )))) + +(defconstraint selfdestruct-instruction---first-account-row---setting-code-and-deployment + (:guard (selfdestruct-instruction---scenario-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-zero (selfdestruct-instruction---STATICX) + (begin + (if-not-zero (selfdestruct-instruction---OOGX) + ;; OOGX = 1 + (begin (account-same-code ROFF_SELFDESTRUCT___ACCOUNT___1ST_DOING_ROW) + (account-same-deployment-number-and-status ROFF_SELFDESTRUCT___ACCOUNT___1ST_DOING_ROW)) + ;; OOGX = 0 + (if-zero (force-bin (selfdestruct-instruction---is-deployment)) + (begin (account-same-code ROFF_SELFDESTRUCT___ACCOUNT___1ST_DOING_ROW) + (account-same-deployment-number-and-status ROFF_SELFDESTRUCT___ACCOUNT___1ST_DOING_ROW)) + (begin + (eq! (shift account/CODE_SIZE_NEW ROFF_SELFDESTRUCT___ACCOUNT___1ST_DOING_ROW) 0) + (eq! (shift account/CODE_HASH_HI_NEW ROFF_SELFDESTRUCT___ACCOUNT___1ST_DOING_ROW) EMPTY_KECCAK_HI) + (eq! (shift account/CODE_HASH_LO_NEW ROFF_SELFDESTRUCT___ACCOUNT___1ST_DOING_ROW) EMPTY_KECCAK_LO) + (debug (eq! (shift account/DEPLOYMENT_STATUS ROFF_SELFDESTRUCT___ACCOUNT___1ST_DOING_ROW) 1)) + (eq! (shift account/DEPLOYMENT_STATUS_NEW ROFF_SELFDESTRUCT___ACCOUNT___1ST_DOING_ROW) 0) + (account-same-deployment-number ROFF_SELFDESTRUCT___ACCOUNT___1ST_DOING_ROW))))))) + +(defconstraint selfdestruct-instruction---first-account-row---setting-balance-and-marked-for-SELFDESTRUCT + (:guard (selfdestruct-instruction---scenario-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-zero (selfdestruct-instruction---STATICX) + (begin + (if-not-zero (selfdestruct-instruction---OOGX) + (begin + (account-same-balance ROFF_SELFDESTRUCT___ACCOUNT___1ST_DOING_ROW) + (account-same-marked-for-deletion ROFF_SELFDESTRUCT___ACCOUNT___1ST_DOING_ROW))) + (if-not-zero (scenario-shorthand---SELFDESTRUCT---unexceptional) (account-decrement-balance-by ROFF_SELFDESTRUCT___ACCOUNT___1ST_DOING_ROW (selfdestruct-instruction---balance))) + (if-not-zero scenario/SELFDESTRUCT_WILL_REVERT (account-same-marked-for-deletion ROFF_SELFDESTRUCT___ACCOUNT___1ST_DOING_ROW)) + (if-not-zero scenario/SELFDESTRUCT_WONT_REVERT_ALREADY_MARKED (account-same-marked-for-deletion ROFF_SELFDESTRUCT___ACCOUNT___1ST_DOING_ROW)) + (if-not-zero scenario/SELFDESTRUCT_WONT_REVERT_NOT_YET_MARKED (account-mark-account-for-deletion ROFF_SELFDESTRUCT___ACCOUNT___1ST_DOING_ROW))))) + +(defconstraint selfdestruct-instruction---generalities-for-the-second-account-row + (:guard (selfdestruct-instruction---scenario-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (begin + (if-zero (selfdestruct-instruction---STATICX) + (begin + (debug (eq! (shift account/ROMLEX_FLAG ROFF_SELFDESTRUCT___ACCOUNT___2ND_DOING_ROW) 0 ) ) + (eq! (shift account/TRM_FLAG ROFF_SELFDESTRUCT___ACCOUNT___2ND_DOING_ROW) 1 ) + (eq! (shift account/TRM_RAW_ADDRESS_HI ROFF_SELFDESTRUCT___ACCOUNT___2ND_DOING_ROW) (selfdestruct-instruction---raw-recipient-address-hi)) + (eq! (shift account/ADDRESS_LO ROFF_SELFDESTRUCT___ACCOUNT___2ND_DOING_ROW) (selfdestruct-instruction---raw-recipient-address-lo)) + ;; balance + (account-same-nonce ROFF_SELFDESTRUCT___ACCOUNT___2ND_DOING_ROW) + ;; warmth + (account-same-code ROFF_SELFDESTRUCT___ACCOUNT___2ND_DOING_ROW) + (account-same-deployment-number-and-status ROFF_SELFDESTRUCT___ACCOUNT___2ND_DOING_ROW) + (account-same-marked-for-deletion ROFF_SELFDESTRUCT___ACCOUNT___2ND_DOING_ROW) + (DOM-SUB-stamps---standard ROFF_SELFDESTRUCT___ACCOUNT___2ND_DOING_ROW 1 ))))) + +(defconstraint selfdestruct-instruction---balance-and-warmth-for-second-account-row + (:guard (selfdestruct-instruction---scenario-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (begin + (if-not-zero (selfdestruct-instruction---OOGX) + (begin + (account-same-balance ROFF_SELFDESTRUCT___ACCOUNT___2ND_DOING_ROW) + (account-same-warmth ROFF_SELFDESTRUCT___ACCOUNT___2ND_DOING_ROW))) + (if-not-zero (scenario-shorthand---SELFDESTRUCT---unexceptional) + (begin + (account-turn-on-warmth ROFF_SELFDESTRUCT___ACCOUNT___2ND_DOING_ROW) + + (if-not-zero (selfdestruct-instruction---had-no-code-initially) + ;; case HAD_CODE_INITIALLY = 1 + (if-eq-else (selfdestruct-instruction---account-address) (selfdestruct-instruction---recipient-address) + ;; self destructing account address = recipient address + (begin + ;;(debug (vanishes! account/BALANCE ROFF_SELFDESTRUCT___ACCOUNT___2ND_DOING_ROW)) + (account-same-balance ROFF_SELFDESTRUCT___ACCOUNT___2ND_DOING_ROW)) + ;; self destructing account address ≠ recipient address + (account-increment-balance-by ROFF_SELFDESTRUCT___ACCOUNT___2ND_DOING_ROW (selfdestruct-instruction---balance))) + ))))) + +;; (defconstraint selfdestruct-instruction---returning-empty-return-data (:guard (selfdestruct-instruction---scenario-precondition)) +;; (begin +;; (if-zero (selfdestruct-instruction---STATICX) +;; (if-not-zero (prev stack/STATICX) +;; (if-not-zero (selfdestruct-instruction---OOGX) +;; (if-not-zero scenario/SELFDESTRUCT_WILL_REVERT +;; (if-not-zero scenario/SELFDESTRUCT_WONT_REVERT_ALREADY_MARKED +;; (if-not-zero scenario/SELFDESTRUCT_WONT_REVERT_NOT_YET_MARKED + + +;; (defconstraint selfdestruct-instruction--- (:guard (selfdestruct-instruction---scenario-precondition)) +;; (begin diff --git a/hub/osaka/constraints/instruction-handling/halting/selfdestruct/scenario.lisp b/hub/osaka/constraints/instruction-handling/halting/selfdestruct/scenario.lisp new file mode 100644 index 000000000..40a6240b1 --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/halting/selfdestruct/scenario.lisp @@ -0,0 +1,33 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.5 SELFDESTRUCT ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.5.1 Introduction ;; +;; X.5.2 Representation ;; +;; X.5.3 Scenario ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defconstraint selfdestruct-instruction---setting-scenario-sum () + (if-not-zero PEEK_AT_STACK + (if-not-zero stack/HALT_FLAG + (if-not-zero (halting-instruction---is-SELFDESTRUCT) + (if-not-zero (- 1 stack/SUX stack/SOX) + (begin + (will-eq! PEEK_AT_SCENARIO 1) + (will-eq! (scenario-shorthand---SELFDESTRUCT---sum) 1))))))) + +(defconstraint selfdestruct-instruction---scenario-back-propagation (:guard (selfdestruct-instruction---scenario-precondition)) + (begin + (eq! (shift PEEK_AT_STACK ROFF_SELFDESTRUCT___STACK_ROW) 1) + (eq! (shift stack/HALT_FLAG ROFF_SELFDESTRUCT___STACK_ROW) 1) + (eq! (shift (halting-instruction---is-SELFDESTRUCT) ROFF_SELFDESTRUCT___STACK_ROW) 1) + (eq! (shift (- 1 stack/SUX stack/SOX) ROFF_SELFDESTRUCT___STACK_ROW) 1))) diff --git a/hub/osaka/constraints/instruction-handling/halting/selfdestruct/shorthands.lisp b/hub/osaka/constraints/instruction-handling/halting/selfdestruct/shorthands.lisp new file mode 100644 index 000000000..fc48a287c --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/halting/selfdestruct/shorthands.lisp @@ -0,0 +1,60 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.5 SELFDESTRUCT ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.5.4 Shorthands ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defconst + ROFF_SELFDESTRUCT___STACK_ROW -1 + ROFF_SELFDESTRUCT___SCENARIO_ROW 0 + ROFF_SELFDESTRUCT___1ST_CONTEXT_ROW 1 + ROFF_SELFDESTRUCT___ACCOUNT___1ST_DOING_ROW 2 + ROFF_SELFDESTRUCT___ACCOUNT___2ND_DOING_ROW 3 + ROFF_SELFDESTRUCT___ACCOUNT___1ST_UNDOING_ROW 4 + ROFF_SELFDESTRUCT___ACCOUNT___2ND_UNDOING_ROW 5 + ROFF_SELFDESTRUCT___ACCOUNT_DELETION_ROW 4 + ROFF_SELFDESTRUCT___FINAL_CONTEXT_STATICX 2 + ROFF_SELFDESTRUCT___FINAL_CONTEXT_OOGX 4 + ROFF_SELFDESTRUCT___FINAL_CONTEXT_WILL_REVERT 6 + ROFF_SELFDESTRUCT___FINAL_CONTEXT_WONT_REVERT_ALREADY_MARKED 4 + ROFF_SELFDESTRUCT___FINAL_CONTEXT_WONT_REVERT_NOT_YET_MARKED 5 + ) + +;; +(defun (selfdestruct-instruction---raw-recipient-address-hi) (shift [stack/STACK_ITEM_VALUE_HI 1] ROFF_SELFDESTRUCT___STACK_ROW)) ;; "" +(defun (selfdestruct-instruction---raw-recipient-address-lo) (shift [stack/STACK_ITEM_VALUE_LO 1] ROFF_SELFDESTRUCT___STACK_ROW)) ;; "" +(defun (selfdestruct-instruction---STATICX) (shift stack/STATICX ROFF_SELFDESTRUCT___STACK_ROW)) +(defun (selfdestruct-instruction---OOGX) (shift stack/OOGX ROFF_SELFDESTRUCT___STACK_ROW)) +;; +(defun (selfdestruct-instruction---is-static) (shift context/IS_STATIC ROFF_SELFDESTRUCT___1ST_CONTEXT_ROW)) +(defun (selfdestruct-instruction---is-deployment) (shift context/BYTE_CODE_DEPLOYMENT_STATUS ROFF_SELFDESTRUCT___1ST_CONTEXT_ROW)) +(defun (selfdestruct-instruction---account-address-hi) (shift context/ACCOUNT_ADDRESS_HI ROFF_SELFDESTRUCT___1ST_CONTEXT_ROW)) +(defun (selfdestruct-instruction---account-address-lo) (shift context/ACCOUNT_ADDRESS_LO ROFF_SELFDESTRUCT___1ST_CONTEXT_ROW)) +;; +(defun (selfdestruct-instruction---balance) (shift account/BALANCE ROFF_SELFDESTRUCT___ACCOUNT___1ST_DOING_ROW)) +(defun (selfdestruct-instruction---is-marked) (shift account/MARKED_FOR_DELETION ROFF_SELFDESTRUCT___ACCOUNT___1ST_DOING_ROW)) +(defun (selfdestruct-instruction---had-no-code-initially) (force-bin (- 1 + (shift account/HAD_CODE_INITIALLY ROFF_SELFDESTRUCT___ACCOUNT___1ST_DOING_ROW)))) +;; +(defun (selfdestruct-instruction---recipient-address-hi) (shift account/ADDRESS_HI ROFF_SELFDESTRUCT___ACCOUNT___2ND_DOING_ROW)) +(defun (selfdestruct-instruction---recipient-address-lo) (shift account/ADDRESS_LO ROFF_SELFDESTRUCT___ACCOUNT___2ND_DOING_ROW)) +(defun (selfdestruct-instruction---recipient-trm-flag) (shift account/TRM_FLAG ROFF_SELFDESTRUCT___ACCOUNT___2ND_DOING_ROW)) +(defun (selfdestruct-instruction---recipient-exists) (shift account/EXISTS ROFF_SELFDESTRUCT___ACCOUNT___2ND_DOING_ROW)) +(defun (selfdestruct-instruction---recipient-warmth) (shift account/WARMTH ROFF_SELFDESTRUCT___ACCOUNT___2ND_DOING_ROW)) + +(defun (selfdestruct-instruction---account-address) (+ (* (^ 256 LLARGE) (selfdestruct-instruction---account-address-hi)) (selfdestruct-instruction---account-address-lo))) +(defun (selfdestruct-instruction---recipient-address) (+ (* (^ 256 LLARGE) (selfdestruct-instruction---recipient-address-hi)) (selfdestruct-instruction---recipient-address-lo))) ;; "" + +(defun (selfdestruct-instruction---trigger-future-acc-deletion) + (* (- 1 (selfdestruct-instruction---is-marked)) + (selfdestruct-instruction---had-no-code-initially))) diff --git a/hub/osaka/constraints/instruction-handling/halting/selfdestruct/will_revert.lisp b/hub/osaka/constraints/instruction-handling/halting/selfdestruct/will_revert.lisp new file mode 100644 index 000000000..b6f08e7f4 --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/halting/selfdestruct/will_revert.lisp @@ -0,0 +1,47 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.5 SELFDESTRUCT ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.5.6 Undoing rows for scenario/SELFDESTRUCT_WILL_REVERT ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (selfdestruct-instruction---scenario-WILL_REVERT-precondition) (* PEEK_AT_SCENARIO scenario/SELFDESTRUCT_WILL_REVERT)) + +(defconstraint selfdestruct-instruction---first-undoing-row-for-WILL_REVERT-scenario + (:guard (selfdestruct-instruction---scenario-WILL_REVERT-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (begin + (debug (eq! (shift account/ROMLEX_FLAG ROFF_SELFDESTRUCT___ACCOUNT___1ST_UNDOING_ROW) 0)) + (debug (eq! (shift account/TRM_FLAG ROFF_SELFDESTRUCT___ACCOUNT___1ST_UNDOING_ROW) 0)) + (account-same-address-as ROFF_SELFDESTRUCT___ACCOUNT___1ST_UNDOING_ROW ROFF_SELFDESTRUCT___ACCOUNT___1ST_DOING_ROW) + (account-undo-balance-update ROFF_SELFDESTRUCT___ACCOUNT___1ST_UNDOING_ROW ROFF_SELFDESTRUCT___ACCOUNT___1ST_DOING_ROW) + (account-undo-nonce-update ROFF_SELFDESTRUCT___ACCOUNT___1ST_UNDOING_ROW ROFF_SELFDESTRUCT___ACCOUNT___1ST_DOING_ROW) + (account-undo-warmth-update ROFF_SELFDESTRUCT___ACCOUNT___1ST_UNDOING_ROW ROFF_SELFDESTRUCT___ACCOUNT___1ST_DOING_ROW) + (account-undo-code-update ROFF_SELFDESTRUCT___ACCOUNT___1ST_UNDOING_ROW ROFF_SELFDESTRUCT___ACCOUNT___1ST_DOING_ROW) + (account-undo-deployment-status-update ROFF_SELFDESTRUCT___ACCOUNT___1ST_UNDOING_ROW ROFF_SELFDESTRUCT___ACCOUNT___1ST_DOING_ROW) + (account-same-marked-for-deletion ROFF_SELFDESTRUCT___ACCOUNT___1ST_UNDOING_ROW) + (DOM-SUB-stamps---revert-with-current ROFF_SELFDESTRUCT___ACCOUNT___1ST_UNDOING_ROW 2))) + +(defconstraint selfdestruct-instruction---second-undoing-row-for-WILL_REVERT-scenario + (:guard (selfdestruct-instruction---scenario-WILL_REVERT-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (begin + (debug (eq! (shift account/ROMLEX_FLAG ROFF_SELFDESTRUCT___ACCOUNT___2ND_UNDOING_ROW) 0)) + (debug (eq! (shift account/TRM_FLAG ROFF_SELFDESTRUCT___ACCOUNT___2ND_UNDOING_ROW) 0)) + (account-same-address-as ROFF_SELFDESTRUCT___ACCOUNT___2ND_UNDOING_ROW ROFF_SELFDESTRUCT___ACCOUNT___2ND_DOING_ROW) + (account-undo-balance-update ROFF_SELFDESTRUCT___ACCOUNT___2ND_UNDOING_ROW ROFF_SELFDESTRUCT___ACCOUNT___2ND_DOING_ROW) + (account-undo-nonce-update ROFF_SELFDESTRUCT___ACCOUNT___2ND_UNDOING_ROW ROFF_SELFDESTRUCT___ACCOUNT___2ND_DOING_ROW) + (account-undo-warmth-update ROFF_SELFDESTRUCT___ACCOUNT___2ND_UNDOING_ROW ROFF_SELFDESTRUCT___ACCOUNT___2ND_DOING_ROW) + (account-undo-code-update ROFF_SELFDESTRUCT___ACCOUNT___2ND_UNDOING_ROW ROFF_SELFDESTRUCT___ACCOUNT___2ND_DOING_ROW) + (account-undo-deployment-status-update ROFF_SELFDESTRUCT___ACCOUNT___2ND_UNDOING_ROW ROFF_SELFDESTRUCT___ACCOUNT___2ND_DOING_ROW) + (account-same-marked-for-deletion ROFF_SELFDESTRUCT___ACCOUNT___2ND_UNDOING_ROW) + (DOM-SUB-stamps---revert-with-current ROFF_SELFDESTRUCT___ACCOUNT___2ND_UNDOING_ROW 3))) diff --git a/hub/osaka/constraints/instruction-handling/halting/selfdestruct/wont_revert_not_yet_marked.lisp b/hub/osaka/constraints/instruction-handling/halting/selfdestruct/wont_revert_not_yet_marked.lisp new file mode 100644 index 000000000..b2987439a --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/halting/selfdestruct/wont_revert_not_yet_marked.lisp @@ -0,0 +1,73 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.5 SELFDESTRUCT ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.5.6 Account deletion row for scenario/SELFDESTRUCT_WONT_REVERT_NOT_YET_MARKED ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (selfdestruct-instruction---scenario-WONT_REVERT_NOT_YET_MARKED-precondition) (* PEEK_AT_SCENARIO scenario/SELFDESTRUCT_WONT_REVERT_NOT_YET_MARKED)) + + + + +(defconstraint selfdestruct-instruction---account-deletion-row---flags + (:guard (selfdestruct-instruction---scenario-WONT_REVERT_NOT_YET_MARKED-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (begin + (debug (eq! (shift account/ROMLEX_FLAG ROFF_SELFDESTRUCT___ACCOUNT_DELETION_ROW) 0)) + (debug (eq! (shift account/TRM_FLAG ROFF_SELFDESTRUCT___ACCOUNT_DELETION_ROW) 0)))) + +(defconstraint selfdestruct-instruction---account-deletion-row---address-duplication + (:guard (selfdestruct-instruction---scenario-WONT_REVERT_NOT_YET_MARKED-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (account-same-address-as ROFF_SELFDESTRUCT___ACCOUNT_DELETION_ROW ROFF_SELFDESTRUCT___ACCOUNT___1ST_DOING_ROW)) + +(defconstraint selfdestruct-instruction---account-deletion-row---balance-squashing + (:guard (selfdestruct-instruction---scenario-WONT_REVERT_NOT_YET_MARKED-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (eq! (shift account/BALANCE_NEW ROFF_SELFDESTRUCT___ACCOUNT_DELETION_ROW) 0)) + +(defconstraint selfdestruct-instruction---account-deletion-row---nonce-squashing + (:guard (selfdestruct-instruction---scenario-WONT_REVERT_NOT_YET_MARKED-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (eq! (shift account/NONCE_NEW ROFF_SELFDESTRUCT___ACCOUNT_DELETION_ROW) 0)) + +(defconstraint selfdestruct-instruction---account-deletion-row---no-change-in-warmth + (:guard (selfdestruct-instruction---scenario-WONT_REVERT_NOT_YET_MARKED-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (account-same-warmth ROFF_SELFDESTRUCT___ACCOUNT_DELETION_ROW)) + +(defconstraint selfdestruct-instruction---account-deletion-row---code-squashing + (:guard (selfdestruct-instruction---scenario-WONT_REVERT_NOT_YET_MARKED-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (begin + (eq! (shift account/CODE_SIZE_NEW ROFF_SELFDESTRUCT___ACCOUNT_DELETION_ROW) 0) + (eq! (shift account/CODE_HASH_HI_NEW ROFF_SELFDESTRUCT___ACCOUNT_DELETION_ROW) EMPTY_KECCAK_HI) + (eq! (shift account/CODE_HASH_LO_NEW ROFF_SELFDESTRUCT___ACCOUNT_DELETION_ROW) EMPTY_KECCAK_LO))) + +(defconstraint selfdestruct-instruction---account-deletion-row---fresh-new-deployment + (:guard (selfdestruct-instruction---scenario-WONT_REVERT_NOT_YET_MARKED-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (begin + (shift (eq! account/DEPLOYMENT_NUMBER_NEW (+ 1 account/DEPLOYMENT_NUMBER)) ROFF_SELFDESTRUCT___ACCOUNT_DELETION_ROW) + (shift (eq! account/DEPLOYMENT_STATUS_NEW 0 ) ROFF_SELFDESTRUCT___ACCOUNT_DELETION_ROW))) + +(defconstraint selfdestruct-instruction---account-deletion-row---no-change-in-MARKED_FOR_SELFDESTRUCT + (:guard (selfdestruct-instruction---scenario-WONT_REVERT_NOT_YET_MARKED-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (account-same-marked-for-deletion ROFF_SELFDESTRUCT___ACCOUNT_DELETION_ROW)) + +(defconstraint selfdestruct-instruction---account-deletion-row---DOM_SUB-stamps + (:guard (selfdestruct-instruction---scenario-WONT_REVERT_NOT_YET_MARKED-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (selfdestruct-dom-sub-stamps ROFF_SELFDESTRUCT___ACCOUNT_DELETION_ROW)) diff --git a/hub/osaka/constraints/instruction-handling/halting/shorthands.lisp b/hub/osaka/constraints/instruction-handling/halting/shorthands.lisp new file mode 100644 index 000000000..2e5df8186 --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/halting/shorthands.lisp @@ -0,0 +1,19 @@ +(module hub) + + +;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.Y HALTING ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defun (halting-instruction---is-RETURN) [ stack/DEC_FLAG 1 ]) +(defun (halting-instruction---is-REVERT) [ stack/DEC_FLAG 2 ]) +(defun (halting-instruction---is-STOP) [ stack/DEC_FLAG 3 ]) +(defun (halting-instruction---is-SELFDESTRUCT) [ stack/DEC_FLAG 4 ]) + +(defun (halting-instruction---was-RETURN) (shift (halting-instruction---is-RETURN) ROFF_RETURN___STACK_ROW)) +(defun (halting-instruction---was-SELFDESTRUCT) (shift (halting-instruction---is-SELFDESTRUCT) ROFF_SELFDESTRUCT___STACK_ROW)) diff --git a/hub/osaka/constraints/instruction-handling/halting/stop.lisp b/hub/osaka/constraints/instruction-handling/halting/stop.lisp new file mode 100644 index 000000000..e91ac85bd --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/halting/stop.lisp @@ -0,0 +1,104 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.Y STOP ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;; + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.1 Introduction ;; +;; X.Y.2 Shorthands ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (stop-instruction---during-active-deployment) (next context/BYTE_CODE_DEPLOYMENT_STATUS)) +(defun (stop-instruction---code-address-hi) (next context/BYTE_CODE_ADDRESS_HI)) +(defun (stop-instruction---code-address-lo) (next context/BYTE_CODE_ADDRESS_LO)) +(defun (stop-instruction---will-revert) CONTEXT_WILL_REVERT) + +(defun (stop-instruction---standard-precondition) (* PEEK_AT_STACK + stack/HALT_FLAG + (halting-instruction---is-STOP))) ;; "" + +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.5.1 Constraints ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defconstraint stop-instruction---stack-pattern (:guard (stop-instruction---standard-precondition)) + (stack-pattern-0-0)) + +(defconstraint stop-instruction---gas-cost (:guard (stop-instruction---standard-precondition)) + (vanishes! GAS_COST)) + +(defconstraint stop-instruction---raises-no-exceptions (:guard (stop-instruction---standard-precondition)) + (vanishes! XAHOY)) + +(defconstraint stop-instruction---first-non-stack-row (:guard (stop-instruction---standard-precondition)) + (begin + (will-eq! PEEK_AT_CONTEXT 1) + (read-context-data 1 CONTEXT_NUMBER))) + +(defconstraint stop-instruction---setting-NSR-and-peeking-flags (:guard (stop-instruction---standard-precondition)) + (begin + (eq! NSR + (+ 2 + (* (stop-instruction---during-active-deployment) + (+ 1 (stop-instruction---will-revert))))) + (if-zero (force-bin (stop-instruction---during-active-deployment)) + (begin + (debug (eq! NSR 2) ) + (eq! NSR + (+ (shift PEEK_AT_CONTEXT 1) + (shift PEEK_AT_CONTEXT 2))) + (execution-provides-empty-return-data 2)) + (if-zero (force-bin (stop-instruction---will-revert)) + (begin + (debug (eq! NSR 3) ) + (eq! NSR + (+ (shift PEEK_AT_CONTEXT 1) + (shift PEEK_AT_ACCOUNT 2) + (shift PEEK_AT_CONTEXT 3))) + (execution-provides-empty-return-data 3)) + (begin + (debug (eq! NSR 4) ) + (eq! NSR + (+ (shift PEEK_AT_CONTEXT 1) + (shift PEEK_AT_ACCOUNT 2) + (shift PEEK_AT_ACCOUNT 3) + (shift PEEK_AT_CONTEXT 4))) + (execution-provides-empty-return-data 4)))))) + + +(defconstraint stop-instruction---first-address-row (:guard (* (stop-instruction---standard-precondition) (stop-instruction---during-active-deployment))) + (begin (debug (vanishes! (shift account/TRM_FLAG 2))) + (debug (vanishes! (shift account/ROMLEX_FLAG 2))) + (eq! (shift account/ADDRESS_HI 2) (stop-instruction---code-address-hi)) + (eq! (shift account/ADDRESS_LO 2) (stop-instruction---code-address-lo)) + (account-same-balance 2) + (account-same-nonce 2) + (account-same-warmth 2) + (vanishes! (shift account/CODE_SIZE_NEW 2)) + (eq! (shift account/CODE_HASH_HI_NEW 2) EMPTY_KECCAK_HI) + (eq! (shift account/CODE_HASH_LO_NEW 2) EMPTY_KECCAK_LO) + (account-same-deployment-number 2) + (eq! (shift account/DEPLOYMENT_STATUS 2) 1) + (eq! (shift account/DEPLOYMENT_STATUS_NEW 2) 0) + (DOM-SUB-stamps---standard 2 + 0))) + +(defconstraint stop-instruction---second-address-row (:guard (* (stop-instruction---standard-precondition) (stop-instruction---during-active-deployment) (stop-instruction---will-revert))) + (begin (debug (vanishes! (shift account/TRM_FLAG 3))) + (debug (vanishes! (shift account/ROMLEX_FLAG 3))) + (account-same-address-as 3 2) + (account-undo-balance-update 3 2) + (account-undo-nonce-update 3 2) + (account-undo-warmth-update 3 2) + (account-undo-code-update 3 2) + (account-undo-deployment-status-update 3 2) + (DOM-SUB-stamps---revert-with-current 3 1))) diff --git a/hub/osaka/constraints/instruction-handling/invalid.lisp b/hub/osaka/constraints/instruction-handling/invalid.lisp new file mode 100644 index 000000000..94326ff6b --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/invalid.lisp @@ -0,0 +1,44 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.5 Instruction handling ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.5.27 Invalid ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;; + +;; NOTE: bytes from the invalid instruction family +;; (either not an opcode or the INVALID opcode) +;; can't raise stack exceptions + +(defun (invalid-instruction---standard-hypothesis) + ;;;;;;;;;;;;;;;;;;;;;;;;;; + (* PEEK_AT_STACK + stack/INVALID_FLAG)) + +(defconstraint invalid-instruction---setting-the-stack-pattern (:guard (invalid-instruction---standard-hypothesis)) + (stack-pattern-0-0)) + +(defconstraint invalid-instruction---setting-NSR (:guard (invalid-instruction---standard-hypothesis)) + (eq! NSR CMC)) + +;; ;; If anything, this is debug (formally follows from other constraints.) +;; (defconstraint invalid-instruction---setting-the-peeking-flags (:guard (invalid-instruction---standard-hypothesis)) +;; (eq! NSR +;; (* CMC (next PEEK_AT_CONTEXT)))) + +(defconstraint invalid-instruction---setting-the-gas-cost (:guard (invalid-instruction---standard-hypothesis)) + (eq! GAS_COST stack/STATIC_GAS)) + +(defconstraint invalid-instruction---debugging-constraints (:guard (invalid-instruction---standard-hypothesis)) + (begin + (eq! CMC 1) + (eq! XAHOY 1) + (eq! stack/OPCX 1))) diff --git a/hub/osaka/constraints/instruction-handling/jump.lisp b/hub/osaka/constraints/instruction-handling/jump.lisp new file mode 100644 index 000000000..6b5402c70 --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/jump.lisp @@ -0,0 +1,150 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.5 Instruction handling ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.5.27 Jump instructions ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (jump-instruction---no-stack-exception) + (* PEEK_AT_STACK + stack/JUMP_FLAG + (- 1 stack/SUX stack/SOX))) + +(defun (jump-instruction---no-stack-exception-and-no-oogx) + (* (jump-instruction---no-stack-exception) + (- 1 stack/OOGX))) + +(defconst + ;; OOGX case + ROW_OFFSET_FOR_JUMP_OOGX_CONTEXT_ROW 1 + ;; no OOGX case + ROW_OFFSET_FOR_JUMP_NO_OOGX_CURRENT_CONTEXT_ROW 1 + ROW_OFFSET_FOR_JUMP_NO_OOGX_ADDRESS_ROW 2 + ROW_OFFSET_FOR_JUMP_NO_OOGX_MISC_ROW 3 + ROW_OFFSET_FOR_JUMP_NO_OOGX_JUMPX_CALLER_CONTEXT_ROW 4) + +(defun (jump-instruction---new-pc-hi) [ stack/STACK_ITEM_VALUE_HI 1 ]) +(defun (jump-instruction---new-pc-lo) [ stack/STACK_ITEM_VALUE_LO 1 ]) +(defun (jump-instruction---jump-condition-hi) [ stack/STACK_ITEM_VALUE_HI 2 ]) +(defun (jump-instruction---jump-condition-lo) [ stack/STACK_ITEM_VALUE_LO 2 ]) +(defun (jump-instruction---is-JUMP) [ stack/DEC_FLAG 1 ]) +(defun (jump-instruction---is-JUMPI) [ stack/DEC_FLAG 2 ]) +;; +(defun (jump-instruction---code-address-hi) (shift context/BYTE_CODE_ADDRESS_HI ROW_OFFSET_FOR_JUMP_NO_OOGX_CURRENT_CONTEXT_ROW)) +(defun (jump-instruction---code-address-lo) (shift context/BYTE_CODE_ADDRESS_LO ROW_OFFSET_FOR_JUMP_NO_OOGX_CURRENT_CONTEXT_ROW)) +;; +(defun (jump-instruction---code-size) (shift account/CODE_SIZE ROW_OFFSET_FOR_JUMP_NO_OOGX_ADDRESS_ROW)) +;; +(defun (jump-instruction---JUMP-guaranteed-exception) (shift [ misc/OOB_DATA 7 ] ROW_OFFSET_FOR_JUMP_NO_OOGX_MISC_ROW)) +(defun (jump-instruction---JUMP-must-be-attempted) (shift [ misc/OOB_DATA 8 ] ROW_OFFSET_FOR_JUMP_NO_OOGX_MISC_ROW)) +;; +(defun (jump-instruction---JUMPI-jump-not-attempted) (shift [ misc/OOB_DATA 6 ] ROW_OFFSET_FOR_JUMP_NO_OOGX_MISC_ROW)) +(defun (jump-instruction---JUMPI-guaranteed-exception) (shift [ misc/OOB_DATA 7 ] ROW_OFFSET_FOR_JUMP_NO_OOGX_MISC_ROW)) +(defun (jump-instruction---JUMPI-must-be-attempted) (shift [ misc/OOB_DATA 8 ] ROW_OFFSET_FOR_JUMP_NO_OOGX_MISC_ROW)) ;; "" + +(defconstraint jump-instruction---setting-the-stack-pattern (:guard (jump-instruction---no-stack-exception)) + (begin + (if-not-zero (jump-instruction---is-JUMP) (stack-pattern-1-0)) + (if-not-zero (jump-instruction---is-JUMPI) (stack-pattern-2-0)))) + +(defconstraint jump-instruction---allowable-exceptions (:guard (jump-instruction---no-stack-exception)) + (eq! XAHOY (+ stack/OOGX stack/JUMPX))) + + +(defconstraint jump-instruction---setting-the-gas-cost (:guard (jump-instruction---no-stack-exception)) + (eq! GAS_COST stack/STATIC_GAS)) + +(defconstraint jump-instruction---setting-NSR (:guard (jump-instruction---no-stack-exception)) + (if-not-zero (force-bin stack/OOGX) + ;; OOGX = 1 + (eq! NSR CMC) + ;; OOGX = 0 + (eq! NSR (+ 3 CMC)))) + +(defconstraint jump-instruction---setting-peeking-flags (:guard (jump-instruction---no-stack-exception)) + (if-not-zero (force-bin stack/OOGX) + ;; OOGX = 1 + (eq! NSR (shift PEEK_AT_CONTEXT ROW_OFFSET_FOR_JUMP_OOGX_CONTEXT_ROW)) + ;; OOGX = 0 + (eq! NSR (+ (shift PEEK_AT_CONTEXT ROW_OFFSET_FOR_JUMP_NO_OOGX_CURRENT_CONTEXT_ROW) + (shift PEEK_AT_ACCOUNT ROW_OFFSET_FOR_JUMP_NO_OOGX_ADDRESS_ROW) + (shift PEEK_AT_MISCELLANEOUS ROW_OFFSET_FOR_JUMP_NO_OOGX_MISC_ROW) + (* CMC (shift PEEK_AT_CONTEXT ROW_OFFSET_FOR_JUMP_NO_OOGX_JUMPX_CALLER_CONTEXT_ROW)))))) + +(defconstraint jump-instruction---setting-the-first-context-row (:guard (jump-instruction---no-stack-exception)) + (if-not-zero (force-bin stack/OOGX) + ;; OOGX = 1 + (execution-provides-empty-return-data ROW_OFFSET_FOR_JUMP_NO_OOGX_CURRENT_CONTEXT_ROW) + ;; OOGX = 0 + (read-context-data ROW_OFFSET_FOR_JUMP_NO_OOGX_CURRENT_CONTEXT_ROW + CONTEXT_NUMBER))) + +;; stronger preconditions start here +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defconstraint jump-instruction---the-account-row (:guard (jump-instruction---no-stack-exception-and-no-oogx)) + (begin + (eq! (shift account/ADDRESS_HI ROW_OFFSET_FOR_JUMP_NO_OOGX_ADDRESS_ROW) (jump-instruction---code-address-hi)) + (eq! (shift account/ADDRESS_LO ROW_OFFSET_FOR_JUMP_NO_OOGX_ADDRESS_ROW) (jump-instruction---code-address-lo)) + (account-same-balance ROW_OFFSET_FOR_JUMP_NO_OOGX_ADDRESS_ROW) + (account-same-nonce ROW_OFFSET_FOR_JUMP_NO_OOGX_ADDRESS_ROW) + (account-same-code ROW_OFFSET_FOR_JUMP_NO_OOGX_ADDRESS_ROW) + (account-same-deployment-number-and-status ROW_OFFSET_FOR_JUMP_NO_OOGX_ADDRESS_ROW) + (account-same-warmth ROW_OFFSET_FOR_JUMP_NO_OOGX_ADDRESS_ROW) + (account-same-marked-for-deletion ROW_OFFSET_FOR_JUMP_NO_OOGX_ADDRESS_ROW) + (DOM-SUB-stamps---standard ROW_OFFSET_FOR_JUMP_NO_OOGX_ADDRESS_ROW + 0))) + +(defconstraint jump-instruction---miscellaneous-row---setting-the-module-flags (:guard (jump-instruction---no-stack-exception-and-no-oogx)) + (eq! (weighted-MISC-flag-sum ROW_OFFSET_FOR_JUMP_NO_OOGX_MISC_ROW) MISC_WEIGHT_OOB)) + +(defconstraint jump-instruction---miscellaneous-row---setting-the-OOB-instruction---JUMP-case (:guard (jump-instruction---no-stack-exception-and-no-oogx)) + (if-not-zero (jump-instruction---is-JUMP) + (set-OOB-instruction---jump ROW_OFFSET_FOR_JUMP_NO_OOGX_MISC_ROW + (jump-instruction---new-pc-hi) + (jump-instruction---new-pc-lo) + (jump-instruction---code-size)))) + +(defconstraint jump-instruction---miscellaneous-row---setting-the-OOB-instruction---JUMPI-case (:guard (jump-instruction---no-stack-exception-and-no-oogx)) + (if-not-zero (jump-instruction---is-JUMPI) + (set-OOB-instruction---jumpi ROW_OFFSET_FOR_JUMP_NO_OOGX_MISC_ROW + (jump-instruction---new-pc-hi) + (jump-instruction---new-pc-lo) + (jump-instruction---jump-condition-hi) + (jump-instruction---jump-condition-lo) + (jump-instruction---code-size)))) + + +(defconstraint jump-instruction---setting-PC_NEW-and-JUMP_DESTINATION_VETTING-for-JUMP (:guard (jump-instruction---no-stack-exception-and-no-oogx)) + (if-not-zero (jump-instruction---is-JUMP) + (begin + (if-not-zero (jump-instruction---JUMP-guaranteed-exception) + (begin (eq! stack/JUMP_DESTINATION_VETTING_REQUIRED 0) + (eq! stack/JUMPX 1))) + (if-not-zero (jump-instruction---JUMP-must-be-attempted) + (begin (eq! stack/JUMP_DESTINATION_VETTING_REQUIRED 1) + (if-zero XAHOY (eq! PC_NEW (jump-instruction---new-pc-lo)))))))) + + +(defconstraint jump-instruction---setting-PC_NEW-and-JUMP_DESTINATION_VETTING-for-JUMPI (:guard (jump-instruction---no-stack-exception-and-no-oogx)) + (if-not-zero (jump-instruction---is-JUMPI) + (begin + (if-not-zero (jump-instruction---JUMPI-jump-not-attempted) + (begin (eq! stack/JUMP_DESTINATION_VETTING_REQUIRED 0) + (eq! stack/JUMPX 0) + (eq! PC_NEW (+ 1 PC)))) + (if-not-zero (jump-instruction---JUMPI-guaranteed-exception) + (begin (eq! stack/JUMP_DESTINATION_VETTING_REQUIRED 0) + (eq! stack/JUMPX 1))) + (if-not-zero (jump-instruction---JUMPI-must-be-attempted) + (begin (eq! stack/JUMP_DESTINATION_VETTING_REQUIRED 1) + (if-zero XAHOY (eq! PC_NEW (jump-instruction---new-pc-lo)))))))) diff --git a/hub/osaka/constraints/instruction-handling/keccak.lisp b/hub/osaka/constraints/instruction-handling/keccak.lisp new file mode 100644 index 000000000..7be49a254 --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/keccak.lisp @@ -0,0 +1,112 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.5 Instruction handling ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.5.10 Keccak ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;; + +;;;;;;;;;;;;;;;;;; +;; Shorthands ;; +;;;;;;;;;;;;;;;;;; + +(defconst ROFF___KEC___MISCELLANEOUS_ROW 1) + +(defun (keccak-instruction---offset-hi) [ stack/STACK_ITEM_VALUE_HI 1 ]) +(defun (keccak-instruction---offset-lo) [ stack/STACK_ITEM_VALUE_LO 1 ]) +(defun (keccak-instruction---size-hi) [ stack/STACK_ITEM_VALUE_HI 2 ]) +(defun (keccak-instruction---size-lo) [ stack/STACK_ITEM_VALUE_LO 2 ]) +(defun (keccak-instruction---result-hi) [ stack/STACK_ITEM_VALUE_HI 4 ]) +(defun (keccak-instruction---result-lo) [ stack/STACK_ITEM_VALUE_LO 4 ]) ;; "" +(defun (keccak-instruction---MXP-mxpx) (shift misc/MXP_MXPX ROFF___KEC___MISCELLANEOUS_ROW)) +(defun (keccak-instruction---MXP-gas-mxp) (shift misc/MXP_GAS_MXP ROFF___KEC___MISCELLANEOUS_ROW)) +(defun (keccak-instruction---MXP-s1nznomxpx) (shift misc/MXP_SIZE_1_NONZERO_NO_MXPX ROFF___KEC___MISCELLANEOUS_ROW)) +(defun (keccak-instruction---trigger_MMU) (* (- 1 XAHOY) (keccak-instruction---MXP-s1nznomxpx))) +(defun (keccak-instruction---no-stack-exceptions) (* PEEK_AT_STACK stack/KEC_FLAG (- 1 stack/SUX stack/SOX))) + +(defconstraint keccak-instruction---setting-stack-pattern + (:guard (keccak-instruction---no-stack-exceptions)) + (stack-pattern-2-1)) + +(defconstraint keccak-instruction---allowable-exceptions + (:guard (keccak-instruction---no-stack-exceptions)) + (eq! XAHOY + (+ stack/MXPX + stack/OOGX))) + +(defconstraint keccak-instruction---setting-NSR-and-peeking-flags + (:guard (keccak-instruction---no-stack-exceptions)) + (begin (eq! NON_STACK_ROWS (+ 1 CONTEXT_MAY_CHANGE)) + (eq! NON_STACK_ROWS + (+ (shift PEEK_AT_MISCELLANEOUS ROFF___KEC___MISCELLANEOUS_ROW) + (* (shift PEEK_AT_CONTEXT 2) CONTEXT_MAY_CHANGE))))) + +(defconstraint keccak-instruction---setting-MISC-flags + (:guard (keccak-instruction---no-stack-exceptions)) + (begin + (eq! (weighted-MISC-flag-sum-sans-MMU ROFF___KEC___MISCELLANEOUS_ROW) MISC_WEIGHT_MXP) + (eq! (shift misc/MMU_FLAG ROFF___KEC___MISCELLANEOUS_ROW) (keccak-instruction---trigger_MMU)))) + +(defconstraint keccak-instruction---setting-MXP-parameters + (:guard (keccak-instruction---no-stack-exceptions)) + (set-MXP-instruction---single-mxp-offset-instructions ROFF___KEC___MISCELLANEOUS_ROW ;; row offset kappa + EVM_INST_SHA3 ;; instruction + 0 ;; deploys (bit modifying the behaviour of RETURN pricing) + (keccak-instruction---offset-hi) ;; source offset high + (keccak-instruction---offset-lo) ;; source offset low + (keccak-instruction---size-hi) ;; source size high + (keccak-instruction---size-lo) ;; source size low + )) + +(defconstraint keccak-instruction---setting-MMU-parameters + (:guard (keccak-instruction---no-stack-exceptions)) + (if-not-zero misc/MMU_FLAG + (set-MMU-instruction---ram-to-exo-with-padding ROFF___KEC___MISCELLANEOUS_ROW ;; offset + CN ;; source ID + 0 ;; target ID + (+ 1 HUB_STAMP) ;; auxiliary ID + ;; src_offset_hi ;; source offset high + (keccak-instruction---offset-lo) ;; source offset low + ;; tgt_offset_lo ;; target offset low + (keccak-instruction---size-lo) ;; size + ;; ref_offset ;; reference offset + (keccak-instruction---size-lo) ;; reference size + 0 ;; success bit + ;; limb_1 ;; limb 1 + ;; limb_2 ;; limb 2 + EXO_SUM_WEIGHT_KEC ;; weighted exogenous module flag sum + 0 ;; phase + ))) + +(defconstraint keccak-instruction---transferring-MXPX-to-stack + (:guard (keccak-instruction---no-stack-exceptions)) + (eq! stack/MXPX (keccak-instruction---MXP-mxpx))) + +(defconstraint keccak-instruction---setting-gas-cost + (:guard (keccak-instruction---no-stack-exceptions)) + ;; (if-zero (force-bin (keccak-instruction---MXP-mxpx)) + (if-zero (keccak-instruction---MXP-mxpx) + (eq! GAS_COST (+ stack/STATIC_GAS (keccak-instruction---MXP-gas-mxp))) + (vanishes! GAS_COST))) + +(defconstraint keccak-instruction---setting-setting-HASH_INFO_FLAG + (:guard (keccak-instruction---no-stack-exceptions)) + (eq! stack/HASH_INFO_FLAG (keccak-instruction---trigger_MMU))) + +(defconstraint keccak-instruction---setting-value-constraints (:guard (keccak-instruction---no-stack-exceptions)) + (if-zero XAHOY + ;; (if-zero (force-bin (keccak-instruction---trigger_MMU)) + (if-zero (keccak-instruction---trigger_MMU) + (begin (eq! (keccak-instruction---result-hi) EMPTY_KECCAK_HI) + (eq! (keccak-instruction---result-lo) EMPTY_KECCAK_LO)) + (begin (eq! (keccak-instruction---result-hi) stack/HASH_INFO_KECCAK_HI) + (eq! (keccak-instruction---result-lo) stack/HASH_INFO_KECCAK_LO))))) + diff --git a/hub/osaka/constraints/instruction-handling/log.lisp b/hub/osaka/constraints/instruction-handling/log.lisp new file mode 100644 index 000000000..d35e6bfc5 --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/log.lisp @@ -0,0 +1,134 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.U Instruction handling ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.U Instructions raising the LOG_FLAG ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.U.1 Supported instructions and flags ;; +;; X.U.2 Shorthands ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (log-instruction---instruction) stack/INSTRUCTION) +(defun (log-instruction---offset-hi) [stack/STACK_ITEM_VALUE_HI 1]) +(defun (log-instruction---offset-lo) [stack/STACK_ITEM_VALUE_LO 1]) +(defun (log-instruction---size-hi) [stack/STACK_ITEM_VALUE_HI 2]) +(defun (log-instruction---size-lo) [stack/STACK_ITEM_VALUE_LO 2]) ;; "" +(defun (log-instruction---standard-hypothesis) (* PEEK_AT_STACK + stack/LOG_FLAG + (- 1 stack/SUX stack/SOX) + (- 1 COUNTER_TLI))) + +(defconst + ROFF_LOG___CURRENT_CONTEXT_ROW 2 + ROFF_LOG___MISCELLANEOUS_ROW 3 + ROFF_LOG___STATICX_XCONTEXT_ROW 3 + ROFF_LOG___OTHERX_XCONTEXT_ROW 4) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.U.2 Constraints ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defconstraint log-instruction---setting-the-stack-pattern (:guard (log-instruction---standard-hypothesis)) + (log-stack-pattern (- stack/INSTRUCTION EVM_INST_LOG0) + [ stack/DEC_FLAG 1 ] + [ stack/DEC_FLAG 2 ] + [ stack/DEC_FLAG 3 ] + [ stack/DEC_FLAG 4 ])) ;; "" + +(defconstraint log-instruction---allowable-exceptions (:guard (log-instruction---standard-hypothesis)) + (eq! XAHOY (+ stack/STATICX + stack/MXPX + stack/OOGX))) + +(defconstraint log-instruction---setting-NSR (:guard (log-instruction---standard-hypothesis)) + (if-zero (force-bin stack/STATICX) + (eq! NSR (+ 2 CMC)) + (eq! NSR 2))) + +(defconstraint log-instruction---setting-the-peeking-flags (:guard (log-instruction---standard-hypothesis)) + (if-zero (force-bin stack/STATICX) + ;; STATICX = 0 + (eq! NSR (+ (shift PEEK_AT_CONTEXT ROFF_LOG___CURRENT_CONTEXT_ROW ) + (shift PEEK_AT_MISCELLANEOUS ROFF_LOG___MISCELLANEOUS_ROW ) + (* CMC (shift PEEK_AT_CONTEXT ROFF_LOG___OTHERX_XCONTEXT_ROW )))) + ;; STATICX = 1 + (eq! NSR (+ (shift PEEK_AT_CONTEXT ROFF_LOG___CURRENT_CONTEXT_ROW ) + (shift PEEK_AT_CONTEXT ROFF_LOG___STATICX_XCONTEXT_ROW ))))) + +(defconstraint log-instruction---justifying-static-exception (:guard (log-instruction---standard-hypothesis)) + (begin + (read-context-data ROFF_LOG___CURRENT_CONTEXT_ROW CONTEXT_NUMBER) + (eq! stack/STATICX + (shift context/IS_STATIC ROFF_LOG___CURRENT_CONTEXT_ROW)))) + +(defconstraint log-instruction---justifying-memory-expansion-exception (:guard (log-instruction---standard-hypothesis)) + (if-zero (force-bin stack/STATICX) + (eq! stack/MXPX + (shift misc/MXP_MXPX ROFF_LOG___MISCELLANEOUS_ROW)))) + +(defconstraint log-instruction---setting-the-gas-cost (:guard (log-instruction---standard-hypothesis)) + (if-zero (force-bin (+ stack/STATICX stack/MXPX)) + (eq! GAS_COST + (+ stack/STATIC_GAS + (shift misc/MXP_GAS_MXP ROFF_LOG___MISCELLANEOUS_ROW))) + (eq! GAS_COST 0))) + +(defconstraint log-instruction---the-final-context-row (:guard (log-instruction---standard-hypothesis)) + (begin + (if-not-zero stack/STATICX (execution-provides-empty-return-data ROFF_LOG___STATICX_XCONTEXT_ROW)) + (if-not-zero (+ stack/MXPX stack/OOGX) (execution-provides-empty-return-data ROFF_LOG___OTHERX_XCONTEXT_ROW)))) + +(defconstraint log-instruction---setting-MISC-module-flags (:guard (log-instruction---standard-hypothesis)) + (if-zero stack/STATICX + (begin + (eq! (weighted-MISC-flag-sum-sans-MMU ROFF_LOG___MISCELLANEOUS_ROW) MISC_WEIGHT_MXP) + (eq! (shift misc/MMU_FLAG ROFF_LOG___MISCELLANEOUS_ROW) (log-instruction---trigger-MMU))))) + + +(defconstraint log-instruction---MISC-row-setting-MXP-data (:guard (log-instruction---standard-hypothesis)) + (if-zero stack/STATICX + (set-MXP-instruction---single-mxp-offset-instructions ROFF_LOG___MISCELLANEOUS_ROW ;; row offset kappa + (log-instruction---instruction) ;; instruction + 0 ;; bit modifying the behaviour of RETURN pricing + (log-instruction---offset-hi) ;; offset high + (log-instruction---offset-lo) ;; offset low + (log-instruction---size-hi) ;; size high + (log-instruction---size-lo)))) ;; size low + +(defun (log-instruction---trigger-MMU) (* (- 1 CONTEXT_WILL_REVERT) + (shift misc/MXP_SIZE_1_NONZERO_NO_MXPX ROFF_LOG___MISCELLANEOUS_ROW))) + +(defconstraint log-instruction---MISC-row-setting-MMU-data (:guard (log-instruction---standard-hypothesis)) + (if-zero (force-bin stack/STATICX) + (if-not-zero (shift misc/MMU_FLAG ROFF_LOG___MISCELLANEOUS_ROW) + (set-MMU-instruction---ram-to-exo-with-padding ROFF_LOG___MISCELLANEOUS_ROW ;; offset + CONTEXT_NUMBER ;; source ID + LOG_INFO_STAMP ;; target ID + 0 ;; auxiliary ID + ;; src_offset_hi ;; source offset high + (log-instruction---offset-lo) ;; source offset low + ;; tgt_offset_lo ;; target offset low + (log-instruction---size-lo) ;; size + ;; ref_offset ;; reference offset + (log-instruction---size-lo) ;; reference size + 0 ;; success bit + ;; limb_1 ;; limb 1 + ;; limb_2 ;; limb 2 + EXO_SUM_WEIGHT_LOG ;; weighted exogenous module flag sum + 0 ;; phase + )))) diff --git a/hub/osaka/constraints/instruction-handling/machine_state.lisp b/hub/osaka/constraints/instruction-handling/machine_state.lisp new file mode 100644 index 000000000..aa03d3bc9 --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/machine_state.lisp @@ -0,0 +1,93 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.5 Instruction handling ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.5.27 Machine state instructions ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconst + ROFF_MACHINESTATE___NOT_MSIZE___XCONTEXT_ROW 1 + + ROFF_MACHINESTATE___MSIZE___MISC_ROW 1 + ROFF_MACHINESTATE___MSIZE___XCONTEXT_ROW 2) + + +(defun (machine-state-instruction---is-PC) [ stack/DEC_FLAG 1 ]) +(defun (machine-state-instruction---is-MSIZE) [ stack/DEC_FLAG 2 ]) +(defun (machine-state-instruction---is-GAS) [ stack/DEC_FLAG 3 ]) +(defun (machine-state-instruction---is-JUMPDEST) [ stack/DEC_FLAG 4 ]) + +(defun (machine-state-instruction---result-hi) [ stack/STACK_ITEM_VALUE_HI 4 ]) +(defun (machine-state-instruction---result-lo) [ stack/STACK_ITEM_VALUE_LO 4 ]) ;; "" + +(defun (machine-state-instruction---isnt-MSIZE) (+ (machine-state-instruction---is-PC) + (machine-state-instruction---is-GAS) + (machine-state-instruction---is-JUMPDEST))) + +(defun (machine-state-instruction---isnt-JUMPDEST) (+ (machine-state-instruction---is-PC) + (machine-state-instruction---is-MSIZE) + (machine-state-instruction---is-GAS))) + +(defun (machine-state-instruction---no-stack-exception) (* PEEK_AT_STACK + stack/MACHINE_STATE_FLAG + (- 1 stack/SUX stack/SOX))) + +(defconstraint machine-state-instruction---setting-the-stack-pattern (:guard (machine-state-instruction---no-stack-exception)) + (begin + (if-not-zero (machine-state-instruction---isnt-JUMPDEST) (stack-pattern-0-1)) + (if-not-zero (machine-state-instruction---is-JUMPDEST) (stack-pattern-0-0)))) + +(defconstraint machine-state-instruction---excluding-certain-exceptions (:guard (machine-state-instruction---no-stack-exception)) + (eq! XAHOY stack/OOGX)) + +(defconstraint machine-state-instruction---setting-NSR (:guard (machine-state-instruction---no-stack-exception)) + (eq! NSR (+ (machine-state-instruction---is-MSIZE) CMC))) + +(defconstraint machine-state-instruction---setting-peeking-flags (:guard (machine-state-instruction---no-stack-exception)) + (begin + (if-not-zero (machine-state-instruction---isnt-MSIZE) (eq! NSR (* (shift PEEK_AT_CONTEXT ROFF_MACHINESTATE___NOT_MSIZE___XCONTEXT_ROW) CMC))) + (if-not-zero (machine-state-instruction---is-MSIZE) (eq! NSR (+ (shift PEEK_AT_MISCELLANEOUS ROFF_MACHINESTATE___MSIZE___MISC_ROW ) + (* (shift PEEK_AT_CONTEXT ROFF_MACHINESTATE___MSIZE___XCONTEXT_ROW ) CMC)))))) + +(defconstraint machine-state-instruction---setting-miscellaneous-row (:guard (machine-state-instruction---no-stack-exception)) + (if-not-zero (machine-state-instruction---is-MSIZE) + (begin + (eq! (weighted-MISC-flag-sum ROFF_MACHINESTATE___MSIZE___MISC_ROW) MISC_WEIGHT_MXP) + (set-MXP-instruction---for-MSIZE ROFF_MACHINESTATE___MSIZE___MISC_ROW)))) + +(defconstraint machine-state-instruction---setting-gas-cost + (:guard (machine-state-instruction---no-stack-exception)) + (eq! GAS_COST stack/STATIC_GAS)) + +(defconstraint machine-state-instruction---all-instructions-produce-zero-high-part + (:guard (machine-state-instruction---no-stack-exception)) + (if-zero XAHOY + (vanishes! (machine-state-instruction---result-hi)))) + +(defconstraint machine-state-instruction---setting-stack-value---PC-case + (:guard (machine-state-instruction---no-stack-exception)) + (if-zero XAHOY + (if-not-zero (machine-state-instruction---is-PC) + (eq! (machine-state-instruction---result-lo) PROGRAM_COUNTER)))) + +(defconstraint machine-state-instruction---setting-stack-value---MSIZE-case + (:guard (machine-state-instruction---no-stack-exception)) + (if-zero XAHOY + (if-not-zero (machine-state-instruction---is-MSIZE) + (eq! (machine-state-instruction---result-lo) (shift (* misc/MXP_WORDS WORD_SIZE) ROFF_MACHINESTATE___MSIZE___MISC_ROW))))) + +(defconstraint machine-state-instruction---setting-stack-value---GAS-case + (:guard (machine-state-instruction---no-stack-exception)) + (if-zero XAHOY + (if-not-zero (machine-state-instruction---is-GAS) + (eq! (machine-state-instruction---result-lo) GAS_NEXT)))) diff --git a/hub/osaka/constraints/instruction-handling/mcopy/constraints.lisp b/hub/osaka/constraints/instruction-handling/mcopy/constraints.lisp new file mode 100644 index 000000000..2f174a660 --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/mcopy/constraints.lisp @@ -0,0 +1,143 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.5 Instruction handling ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.Z MCOPY instruction ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstraint mcopy-instruction---setting-the-stack-pattern + (:guard (mcopy-instruction---standard-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (stack-pattern-3-0)) + +(defconstraint mcopy-instruction---the-first-row-must-be-misc-and-we-call-MXP + (:guard (mcopy-instruction---standard-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (begin + (eq! (shift PEEK_AT_MISCELLANEOUS MCOPY_ROFF___1ST_MISC_ROW) 1) + (eq! (shift misc/MXP_FLAG MCOPY_ROFF___1ST_MISC_ROW) 1) + )) + +(defconstraint mcopy-instruction---defining-the-MXP-instruction + (:guard (mcopy-instruction---standard-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (set-MXP-instruction---for-MCOPY MCOPY_ROFF___1ST_MISC_ROW ;; row offset kappa + (mcopy-instruction---target-offset-hi) ;; target offset hi + (mcopy-instruction---target-offset-lo) ;; target offset lo + (mcopy-instruction---source-offset-hi) ;; source offset hi + (mcopy-instruction---source-offset-lo) ;; source offset lo + (mcopy-instruction---size-hi) ;; size hi + (mcopy-instruction---size-lo) ;; size lo + )) + +(defun (mcopy-instruction---trigger_MXP) 1) +(defun (mcopy-instruction---trigger_MMU) (* (- 1 XAHOY) + (mcopy-instruction---MXP-s1nznomxpx))) ;; "" + +(defconstraint mcopy-instruction---setting-NSR + (:guard (mcopy-instruction---standard-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-not-zero XAHOY + ;; XAHOY ≡ true + (eq! NSR 2) + ;; XAHOY ≡ false + (eq! NSR (+ 1 (mcopy-instruction---trigger_MMU)))) + ) + +(defconstraint mcopy-instruction---setting-the-peeking-flags + (:guard (mcopy-instruction---standard-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-not-zero XAHOY + ;; XAHOY ≡ true + (eq! NSR + (+ (shift PEEK_AT_MISCELLANEOUS MCOPY_ROFF___1ST_MISC_ROW ) + (shift PEEK_AT_CONTEXT MCOPY_ROFF___XCON_ROW ))) + ;; XAHOY ≡ false + (eq! NSR + (+ (shift PEEK_AT_MISCELLANEOUS MCOPY_ROFF___1ST_MISC_ROW ) + (* (mcopy-instruction---trigger_MMU) (shift PEEK_AT_MISCELLANEOUS MCOPY_ROFF___2ND_MISC_ROW )))) + )) + +(defconstraint mcopy-instruction---justifying-the-stacks-MXPX-flag + (:guard (mcopy-instruction---standard-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (eq! stack/MXPX + (mcopy-instruction---MXP-mxpx) + )) + +(defconstraint mcopy-instruction---setting-the-gas-cost + (:guard (mcopy-instruction---standard-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-zero stack/MXPX + ;; MXPX ≡ false + (eq! GAS_COST (+ stack/STATIC_GAS (mcopy-instruction---MXP-gas-mxp))) + ;; MXPX ≡ true + (eq! GAS_COST 0 ) + )) + +(defconstraint mcopy-instruction---1st-MISC-row---setting-the-flags + (:guard (mcopy-instruction---standard-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (begin + (eq! (weighted-MISC-flag-sum-sans-MMU MCOPY_ROFF___1ST_MISC_ROW) (* MISC_WEIGHT_MXP (mcopy-instruction---trigger_MXP))) + (eq! (shift misc/MMU_FLAG MCOPY_ROFF___1ST_MISC_ROW) (mcopy-instruction---trigger_MMU)) + )) + +(defconstraint mcopy-instruction---2nd-MISC-row---setting-the-flags + (:guard (mcopy-instruction---standard-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-not-zero (mcopy-instruction---trigger_MMU) + (eq! (weighted-MISC-flag-sum MCOPY_ROFF___2ND_MISC_ROW) + MISC_WEIGHT_MMU))) + +(defconstraint mcopy-instruction---1st-MISC-row---setting-the-MMU-call + (:guard (mcopy-instruction---standard-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-not-zero (mcopy-instruction---trigger_MMU) + (set-MMU-instruction---ram-to-ram-sans-padding MCOPY_ROFF___1ST_MISC_ROW ;; offset + CONTEXT_NUMBER ;; source ID + (+ 1 HUB_STAMP) ;; target ID + ;; aux_id ;; auxiliary ID + ;; src_offset_hi ;; source offset high + (mcopy-instruction---source-offset-lo) ;; source offset low + ;; tgt_offset_lo ;; target offset low + (mcopy-instruction---size-lo) ;; size + 0 ;; reference offset + (mcopy-instruction---size-lo) ;; reference size + ;; success_bit ;; success bit + ;; limb_1 ;; limb 1 + ;; limb_2 ;; limb 2 + ;; exo_sum ;; weighted exogenous module flag sum + ;; phase ;; phase + ))) + +(defconstraint mcopy-instruction---2nd-MISC-row---setting-the-MMU-call + (:guard (mcopy-instruction---standard-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-not-zero (mcopy-instruction---trigger_MMU) + (set-MMU-instruction---ram-to-ram-sans-padding MCOPY_ROFF___2ND_MISC_ROW ;; offset + (+ 1 HUB_STAMP) ;; source ID + CONTEXT_NUMBER ;; target ID + ;; aux_id ;; auxiliary ID + ;; src_offset_hi ;; source offset high + 0 ;; source offset low + ;; tgt_offset_lo ;; target offset low + (mcopy-instruction---size-lo) ;; size + (mcopy-instruction---target-offset-lo) ;; reference offset + (mcopy-instruction---size-lo) ;; reference size + ;; success_bit ;; success bit + ;; limb_1 ;; limb 1 + ;; limb_2 ;; limb 2 + ;; exo_sum ;; weighted exogenous module flag sum + ;; phase ;; phase + ))) diff --git a/hub/osaka/constraints/instruction-handling/mcopy/shorthands.lisp b/hub/osaka/constraints/instruction-handling/mcopy/shorthands.lisp new file mode 100644 index 000000000..be16faab6 --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/mcopy/shorthands.lisp @@ -0,0 +1,38 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.5 Instruction handling ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.Z MCOPY instruction ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (mcopy-instruction---target-offset-hi) [ stack/STACK_ITEM_VALUE_HI 1 ] ) +(defun (mcopy-instruction---target-offset-lo) [ stack/STACK_ITEM_VALUE_LO 1 ] ) +(defun (mcopy-instruction---source-offset-hi) [ stack/STACK_ITEM_VALUE_HI 2 ] ) +(defun (mcopy-instruction---source-offset-lo) [ stack/STACK_ITEM_VALUE_LO 2 ] ) +(defun (mcopy-instruction---size-hi) [ stack/STACK_ITEM_VALUE_HI 3 ] ) +(defun (mcopy-instruction---size-lo) [ stack/STACK_ITEM_VALUE_LO 3 ] ) ;; "" + +(defun (mcopy-instruction---MXP-mxpx) (shift misc/MXP_MXPX MCOPY_ROFF___1ST_MISC_ROW )) +(defun (mcopy-instruction---MXP-gas-mxp) (shift misc/MXP_GAS_MXP MCOPY_ROFF___1ST_MISC_ROW )) +(defun (mcopy-instruction---MXP-s1nznomxpx) (shift misc/MXP_SIZE_1_NONZERO_NO_MXPX MCOPY_ROFF___1ST_MISC_ROW )) + +(defun (mcopy-instruction---standard-precondition) (* PEEK_AT_STACK + stack/MCOPY_FLAG + (- 1 + stack/SUX + stack/SOX))) + +(defconst + MCOPY_ROFF___1ST_MISC_ROW 1 + MCOPY_ROFF___2ND_MISC_ROW 2 + MCOPY_ROFF___XCON_ROW 2 + ) diff --git a/hub/osaka/constraints/instruction-handling/push_pop.lisp b/hub/osaka/constraints/instruction-handling/push_pop.lisp new file mode 100644 index 000000000..36cb5acc7 --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/push_pop.lisp @@ -0,0 +1,54 @@ +(module hub) + +(defun (push-pop-instruction---standard-hypothesis) (force-bin (* PEEK_AT_STACK stack/PUSHPOP_FLAG (- 1 stack/SUX stack/SOX)))) +(defun (push-pop-instruction---result-hi) [ stack/STACK_ITEM_VALUE_HI 4 ]) +(defun (push-pop-instruction---result-lo) [ stack/STACK_ITEM_VALUE_LO 4 ]) +(defun (push-pop-instruction---is-POP) [ stack/DEC_FLAG 1 ]) +(defun (push-pop-instruction---is-PUSH) [ stack/DEC_FLAG 2 ]) +(defun (push-pop-instruction---is-PUSH-ZERO) [ stack/DEC_FLAG 3 ]) + +(defconstraint push-pop-instruction---setting-the-stack-pattern---POP-case + (:guard (push-pop-instruction---standard-hypothesis)) + (if-not-zero (push-pop-instruction---is-POP) + (stack-pattern-1-0))) + +(defconstraint push-pop-instruction---setting-the-stack-pattern---PUSH-case + (:guard (push-pop-instruction---standard-hypothesis)) + (if-not-zero (force-bin (+ (push-pop-instruction---is-PUSH) (push-pop-instruction---is-PUSH-ZERO))) + (stack-pattern-0-1))) + +(defconstraint push-pop-instruction---setting-NSR + (:guard (push-pop-instruction---standard-hypothesis)) + (eq! NSR CMC)) + +;; this could be debug ... +(defconstraint push-pop-instruction---setting-the-peeking-flags + (:guard (push-pop-instruction---standard-hypothesis)) + (eq! NSR + (* CMC (next PEEK_AT_CONTEXT)))) + +(defconstraint push-pop-instruction---setting-gas-costs + (:guard (push-pop-instruction---standard-hypothesis)) + (eq! GAS_COST stack/STATIC_GAS)) + +(defconstraint push-pop-instruction---setting-stack-values---PUSH-case + (:guard (push-pop-instruction---standard-hypothesis)) + (if-not-zero (push-pop-instruction---is-PUSH) + (begin (eq! (push-pop-instruction---result-hi) stack/PUSH_VALUE_HI) + (eq! (push-pop-instruction---result-lo) stack/PUSH_VALUE_LO)))) + +(defconstraint push-pop-instruction---setting-stack-values---PUSH0-case + (:guard (push-pop-instruction---standard-hypothesis)) + (if-not-zero (push-pop-instruction---is-PUSH-ZERO) + (begin (vanishes! (push-pop-instruction---result-hi)) + (vanishes! (push-pop-instruction---result-lo))))) + +(defconstraint push-pop-instruction---setting-PC_NEW---POP-case + (:guard (push-pop-instruction---standard-hypothesis)) + (if-not-zero (push-pop-instruction---is-POP) + (eq! PC_NEW (+ 1 PC)))) + +(defconstraint push-pop-instruction---setting-PC_NEW---PUSH-case + (:guard (push-pop-instruction---standard-hypothesis)) + (if-not-zero (force-bin (+ (push-pop-instruction---is-PUSH) (push-pop-instruction---is-PUSH-ZERO))) + (eq! PC_NEW (+ 1 PC (- stack/INSTRUCTION EVM_INST_PUSH0))))) diff --git a/hub/osaka/constraints/instruction-handling/stack_exceptions.lisp b/hub/osaka/constraints/instruction-handling/stack_exceptions.lisp new file mode 100644 index 000000000..d2a88cd8e --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/stack_exceptions.lisp @@ -0,0 +1,21 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.5 Instruction handling ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.5.2 Instructions raising the SUX_FLAG or SOX_FLAG ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defconstraint handling-stack-exceptions (:perspective stack) + (if-not-zero (+ SUX SOX) + (begin + (eq! NON_STACK_ROWS 1) + (empty-stack-pattern)))) diff --git a/hub/osaka/constraints/instruction-handling/stack_ram.lisp b/hub/osaka/constraints/instruction-handling/stack_ram.lisp new file mode 100644 index 000000000..c98ffde90 --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/stack_ram.lisp @@ -0,0 +1,250 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.5 Instruction handling ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.5.Y Instructions raising the STACK_RAM_FLAG ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.5.1 Supported instructions and flags ;; +;; X.5.2 Shorthands ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defconst + ROFF_STACK_RAM___MISC_ROW 1 + ROFF_STACK_RAM___CONTEXT_ROW 2) + +(defun (stack-ram---instruction) stack/INSTRUCTION) +(defun (stack-ram---is-CDL) [ stack/DEC_FLAG 1 ]) +(defun (stack-ram---is-MLOAD) [ stack/DEC_FLAG 2 ]) +(defun (stack-ram---is-MSTORE) [ stack/DEC_FLAG 3 ]) +(defun (stack-ram---is-MSTORE8) [ stack/DEC_FLAG 4 ]) ;; "" +(defun (stack-ram---is-store-instruction) (+ (stack-ram---is-MSTORE) (stack-ram---is-MSTORE8))) +(defun (stack-ram---is-MXX) (+ (stack-ram---is-MLOAD) (stack-ram---is-MSTORE) (stack-ram---is-MSTORE8))) +(defun (stack-ram---offset-hi) [ stack/STACK_ITEM_VALUE_HI 1 ]) +(defun (stack-ram---offset-lo) [ stack/STACK_ITEM_VALUE_LO 1 ]) +(defun (stack-ram---value-hi) [ stack/STACK_ITEM_VALUE_HI 4 ]) +(defun (stack-ram---value-lo) [ stack/STACK_ITEM_VALUE_LO 4 ]) +(defun (stack-ram---CDL-is-oob) (shift [ misc/OOB_DATA 7 ] ROFF_STACK_RAM___MISC_ROW)) ;; "" +(defun (stack-ram---MXP-mxp-gas) (shift misc/MXP_GAS_MXP ROFF_STACK_RAM___MISC_ROW)) +(defun (stack-ram---MXP-mxpx) (shift misc/MXP_MXPX ROFF_STACK_RAM___MISC_ROW)) +(defun (stack-ram---call-data-size) (shift context/CALL_DATA_SIZE ROFF_STACK_RAM___CONTEXT_ROW)) +(defun (stack-ram---call-data-offset) (shift context/CALL_DATA_OFFSET ROFF_STACK_RAM___CONTEXT_ROW)) +(defun (stack-ram---call-data-context-number) (shift context/CALL_DATA_CONTEXT_NUMBER ROFF_STACK_RAM___CONTEXT_ROW)) +(defun (stack-ram---fixed-size) (+ (* WORD_SIZE (stack-ram---is-MLOAD) ) + (* WORD_SIZE (stack-ram---is-MSTORE) ) + (* 1 (stack-ram---is-MSTORE8) ))) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.5.3 Constraints ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defun (stack-ram---std-hyp) (* PEEK_AT_STACK + stack/STACKRAM_FLAG + (- 1 stack/SUX stack/SOX))) + +(defconstraint stack-ram---setting-the-stack-pattern + (:guard (stack-ram---std-hyp)) + (load-store-stack-pattern (force-bin (stack-ram---is-store-instruction)))) + +(defconstraint stack-ram---allowable-exceptions + (:guard (stack-ram---std-hyp)) + (begin + (if-not-zero (stack-ram---is-MXX) (eq! XAHOY (+ stack/MXPX stack/OOGX))) + (if-not-zero (stack-ram---is-CDL) (eq! XAHOY stack/OOGX)))) + +(defconstraint stack-ram---setting-NSR + (:guard (stack-ram---std-hyp)) + (eq! NSR + (+ 1 (stack-ram---is-CDL) CMC))) + +(defconstraint stack-ram---setting-the-peeking-flags + (:guard (stack-ram---std-hyp)) + (begin (if-not-zero (stack-ram---is-CDL) + (eq! NSR + (+ (shift PEEK_AT_MISCELLANEOUS ROFF_STACK_RAM___MISC_ROW) + (shift PEEK_AT_CONTEXT ROFF_STACK_RAM___CONTEXT_ROW) + (* (shift PEEK_AT_CONTEXT 3) CMC)))) + (if-not-zero (stack-ram---is-MXX) + (eq! NSR + (+ (shift PEEK_AT_MISCELLANEOUS ROFF_STACK_RAM___MISC_ROW) + (* (shift PEEK_AT_CONTEXT 2) CMC)))) + (debug (eq! CMC XAHOY)))) + +(defconstraint stack-ram---setting-the-memory-expansion-exception + (:guard (stack-ram---std-hyp)) + (begin (if-not-zero (stack-ram---is-CDL) + (vanishes! stack/MXPX)) + (if-not-zero (stack-ram---is-MXX) + (eq! stack/MXPX (stack-ram---MXP-mxpx))))) + +(defconstraint stack-ram---setting-the-gas-cost + (:guard (stack-ram---std-hyp)) + (begin (if-not-zero (stack-ram---is-CDL) + (eq! GAS_COST stack/STATIC_GAS)) + (if-not-zero (stack-ram---is-MXX) + (if-zero (force-bin (stack-ram---MXP-mxpx)) + (eq! GAS_COST + (+ stack/STATIC_GAS + (stack-ram---MXP-mxp-gas))) + (vanishes! GAS_COST))))) + +(defconstraint stack-ram---setting-MISC-module-flags + (:guard (stack-ram---std-hyp)) + (begin + (eq! (weighted-MISC-flag-sum-sans-MMU ROFF_STACK_RAM___MISC_ROW) + (+ (* MISC_WEIGHT_MXP (stack-ram---trigger_MXP)) + (* MISC_WEIGHT_OOB (stack-ram---trigger_OOB)))) + (eq! (shift misc/MMU_FLAG ROFF_STACK_RAM___MISC_ROW) (stack-ram---trigger_MMU)) + )) + +(defun (stack-ram---trigger_MXP) (stack-ram---is-MXX)) +(defun (stack-ram---trigger_OOB) (stack-ram---is-CDL)) +(defun (stack-ram---trigger_MMU) (+ (* (stack-ram---is-CDL) (- 1 XAHOY) (- 1 (stack-ram---CDL-is-oob))) + (* (stack-ram---is-MXX) (- 1 XAHOY) ))) + +;; shorthands specific to the constraints +(defun (stack-ram---misc-MXP-flag) (shift misc/MXP_FLAG ROFF_STACK_RAM___MISC_ROW)) +(defun (stack-ram---misc-OOB-flag) (shift misc/OOB_FLAG ROFF_STACK_RAM___MISC_ROW)) +(defun (stack-ram---misc-MMU-flag) (shift misc/MMU_FLAG ROFF_STACK_RAM___MISC_ROW)) + +(defconstraint stack-ram---setting-OOB-instruction + (:guard (stack-ram---std-hyp)) + (if-not-zero (stack-ram---misc-OOB-flag) + (set-OOB-instruction---cdl ROFF_STACK_RAM___MISC_ROW ;; row offset + (stack-ram---offset-hi) ;; offset within call data, high part + (stack-ram---offset-lo) ;; offset within call data, low part + (stack-ram---call-data-size) ;; call data size + ))) + +(defconstraint stack-ram---setting-value-for-trivial-CALLDATALOAD + (:guard (stack-ram---std-hyp)) + (if-not-zero (stack-ram---is-CDL) + (if-not-zero (stack-ram---CDL-is-oob) + (begin + (vanishes! (stack-ram---value-hi)) + (vanishes! (stack-ram---value-lo)))))) + +(defconstraint stack-ram---setting-MXP-instruction + (:guard (stack-ram---std-hyp)) + (if-not-zero (stack-ram---misc-MXP-flag) + (set-MXP-instruction---single-mxp-offset-instructions ROFF_STACK_RAM___MISC_ROW ;; row offset + (stack-ram---instruction) ;; instruction + 0 ;; deploys + (stack-ram---offset-hi) ;; source offset high + (stack-ram---offset-lo) ;; source offset low + 0 ;; size high + (stack-ram---fixed-size) ;; size low + ))) + +(defconstraint stack-ram---setting-MMU-instruction---CALLDATALOAD-case + (:guard (stack-ram---std-hyp)) + (if-not-zero (stack-ram---misc-MMU-flag) + ;; CALLDATALOAD case + ;;;;;;;;;;;;;;;;;;;; + (if-not-zero (stack-ram---is-CDL) + (set-MMU-instruction---right-padded-word-extraction ROFF_STACK_RAM___MISC_ROW ;; row offset + (stack-ram---call-data-context-number) ;; source ID + ;; tgt_id ;; target ID + ;; aux_id ;; auxiliary ID + ;; src_offset_hi ;; source offset high + (stack-ram---offset-lo) ;; source offset low + ;; tgt_offset_lo ;; target offset low + ;; size ;; size + (stack-ram---call-data-offset) ;; reference offset + (stack-ram---call-data-size) ;; reference size + ;; success_bit ;; success bit + (stack-ram---value-hi) ;; limb 1 + (stack-ram---value-lo) ;; limb 2 + ;; exo_sum ;; weighted exogenous module flag sum + ;; phase ;; phase + )))) + +(defconstraint stack-ram---setting-MMU-instruction---MLOAD-case + (:guard (stack-ram---std-hyp)) + (if-not-zero (stack-ram---misc-MMU-flag) + ;; MLOAD case + ;;;;;;;;;;;;; + (if-not-zero (stack-ram---is-MLOAD) + (set-MMU-instruction---mload ROFF_STACK_RAM___MISC_ROW ;; offset + CONTEXT_NUMBER ;; source ID + ;; tgt_id ;; target ID + ;; aux_id ;; auxiliary ID + ;; src_offset_hi ;; source offset high + (stack-ram---offset-lo) ;; source offset low + ;; tgt_offset_lo ;; target offset low + ;; size ;; size + ;; ref_offset ;; reference offset + ;; ref_size ;; reference size + ;; success_bit ;; success bit + (stack-ram---value-hi) ;; limb 1 + (stack-ram---value-lo) ;; limb 2 + ;; exo_sum ;; weighted exogenous module flag sum + ;; phase ;; phase + )))) + +(defconstraint stack-ram---setting-MMU-instruction---MSTORE-case + (:guard (stack-ram---std-hyp)) + (if-not-zero (stack-ram---misc-MMU-flag) + ;; MSTORE case + ;;;;;;;;;;;;;; + (if-not-zero (stack-ram---is-MSTORE) + (set-MMU-instruction---mstore ROFF_STACK_RAM___MISC_ROW ;; offset + ;; src_id ;; source ID + CONTEXT_NUMBER ;; target ID + ;; aux_id ;; auxiliary ID + ;; src_offset_hi ;; source offset high + ;; src_offset_lo ;; source offset low + (stack-ram---offset-lo) ;; target offset low + ;; size ;; size + ;; ref_offset ;; reference offset + ;; ref_size ;; reference size + ;; success_bit ;; success bit + (stack-ram---value-hi) ;; limb 1 + (stack-ram---value-lo) ;; limb 2 + ;; exo_sum ;; weighted exogenous module flag sum + ;; phase ;; phase + )))) + +(defconstraint stack-ram---setting-MMU-instruction---MSTORE8-case + (:guard (stack-ram---std-hyp)) + (if-not-zero (stack-ram---misc-MMU-flag) + ;; MSTORE8 case + ;;;;;;;;;;;;;;; + (if-not-zero (stack-ram---is-MSTORE8) + (set-MMU-instruction---mstore8 ROFF_STACK_RAM___MISC_ROW ;; offset + ;; src_id ;; source ID + CONTEXT_NUMBER ;; target ID + ;; aux_id ;; auxiliary ID + ;; src_offset_hi ;; source offset high + ;; src_offset_lo ;; source offset low + (stack-ram---offset-lo) ;; target offset low + ;; size ;; size + ;; ref_offset ;; reference offset + ;; ref_size ;; reference size + ;; success_bit ;; success bit + (stack-ram---value-hi) ;; limb 1 + (stack-ram---value-lo) ;; limb 2 + ;; exo_sum ;; weighted exogenous module flag sum + ;; phase ;; phase + )))) + +(defconstraint stack-ram---setting-context-row-for-CALLDATALOAD + (:guard (stack-ram---std-hyp)) + (if-not-zero (stack-ram---is-CDL) + (read-context-data ROFF_STACK_RAM___CONTEXT_ROW CONTEXT_NUMBER))) diff --git a/hub/osaka/constraints/instruction-handling/sto.lisp b/hub/osaka/constraints/instruction-handling/sto.lisp new file mode 100644 index 000000000..1532df053 --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/sto.lisp @@ -0,0 +1,252 @@ +(module hub) + +(defun (storage-instruction---no-stack-exceptions) (* PEEK_AT_STACK stack/STO_FLAG (- 1 stack/SUX stack/SOX))) +(defun (storage-instruction---is-SLOAD) [ stack/DEC_FLAG 1 ]) +(defun (storage-instruction---is-SSTORE) [ stack/DEC_FLAG 2 ]) +(defun (storage-instruction---storage-key-hi) [ stack/STACK_ITEM_VALUE_HI 1 ]) +(defun (storage-instruction---storage-key-lo) [ stack/STACK_ITEM_VALUE_LO 1 ]) +(defun (storage-instruction---loaded-value-hi) [ stack/STACK_ITEM_VALUE_HI 4 ]) +(defun (storage-instruction---loaded-value-lo) [ stack/STACK_ITEM_VALUE_LO 4 ]) +(defun (storage-instruction---value-to-store-hi) [ stack/STACK_ITEM_VALUE_HI 4 ]) +(defun (storage-instruction---value-to-store-lo) [ stack/STACK_ITEM_VALUE_LO 4 ]) +(defun (storage-instruction---OOB-prediction-of-sstorex) (shift [ misc/OOB_DATA 7 ] 2)) ;; "" + +(defconstraint storage-instruction---stack-pattern + (:guard (storage-instruction---no-stack-exceptions)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (load-store-stack-pattern (storage-instruction---is-SSTORE))) + +(defconstraint storage-instruction---valid-exceptions + (:guard (storage-instruction---no-stack-exceptions)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (begin + (if-not-zero (storage-instruction---is-SLOAD) + (eq! XAHOY stack/OOGX)) + (if-not-zero (storage-instruction---is-SSTORE) + (eq! XAHOY + (+ stack/STATICX + stack/SSTOREX + stack/OOGX))))) + +(defconstraint storage-instruction---setting-NSR-and-peeking-flags-STATICX + (:guard (storage-instruction---no-stack-exceptions)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; static exception + ;;;;;;;;;;;;;;;;;;; + (if-not-zero stack/STATICX + (begin + (eq! NSR 2) + (eq! NSR + (+ (shift PEEK_AT_CONTEXT 1) + (shift PEEK_AT_CONTEXT 2)))))) + +(defconstraint storage-instruction---setting-NSR-and-peeking-flags-SSTOREX + (:guard (storage-instruction---no-stack-exceptions)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; sstore gas exception + ;;;;;;;;;;;;;;;;;;;;;;; + (if-not-zero stack/SSTOREX + (begin + (eq! NSR 3) + (eq! NSR + (+ (shift PEEK_AT_CONTEXT 1) + (shift PEEK_AT_MISCELLANEOUS 2) + (shift PEEK_AT_CONTEXT 3)))))) + +(defconstraint storage-instruction---setting-NSR-and-peeking-flags-OOGX + (:guard (storage-instruction---no-stack-exceptions)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; out of gas exception + ;;;;;;;;;;;;;;;;;;;;;;; + (if-not-zero stack/OOGX + (begin + (eq! NSR 5) + (eq! NSR + (+ (shift PEEK_AT_CONTEXT 1) + (shift PEEK_AT_MISCELLANEOUS 2) + (shift PEEK_AT_STORAGE 3) + (shift PEEK_AT_STORAGE 4) + (shift PEEK_AT_CONTEXT 5)))))) + +(defconstraint storage-instruction---setting-NSR-and-peeking-flags-UNEXCEPTIONAL + (:guard (storage-instruction---no-stack-exceptions)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; unexceptional + ;;;;;;;;;;;;;;;; + (if-zero XAHOY + (begin + (eq! NSR (+ 3 CONTEXT_WILL_REVERT)) + (eq! NSR + (+ (shift PEEK_AT_CONTEXT 1) + (shift PEEK_AT_MISCELLANEOUS 2) + (shift PEEK_AT_STORAGE 3) + (* CONTEXT_WILL_REVERT (shift PEEK_AT_STORAGE 4))))))) + +(defconstraint storage-instruction---first-context-row + (:guard (storage-instruction---no-stack-exceptions)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (read-context-data 1 ;; row offset + CONTEXT_NUMBER )) ;; context to read + +(defconstraint storage-instruction---justifying-STATICX + (:guard (storage-instruction---no-stack-exceptions)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (eq! stack/STATICX + (* (storage-instruction---is-SSTORE) + (shift context/IS_STATIC 1)))) + +(defconstraint storage-instruction---setting-MISC-row + (:guard (storage-instruction---no-stack-exceptions)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-not-zero (shift PEEK_AT_MISCELLANEOUS 2) + (begin + (eq! (weighted-MISC-flag-sum 2) + (* (storage-instruction---is-SSTORE) MISC_WEIGHT_OOB)) + (if-not-zero (storage-instruction---is-SSTORE) + (set-OOB-instruction---sstore 2 ;; offset + GAS_ACTUAL )) ;; GAS_ACTUAL + ))) + +(defconstraint storage-instruction---justifying-SSTOREX + (:guard (storage-instruction---no-stack-exceptions)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-not-zero (shift PEEK_AT_MISCELLANEOUS 2) + (if-not-zero (storage-instruction---is-SSTORE) + (eq! stack/SSTOREX + (storage-instruction---OOB-prediction-of-sstorex))))) + +(defun (no-exception) (- 1 XAHOY)) +(defun (oogx-or-no-exception) (+ stack/OOGX (no-exception))) + +(defconstraint storage-instruction---setting-storage-slot-parameters + (:guard (storage-instruction---no-stack-exceptions)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-not-zero (oogx-or-no-exception) + (begin + (eq! (shift storage/ADDRESS_HI 3) (shift context/ACCOUNT_ADDRESS_HI 1)) + (eq! (shift storage/ADDRESS_LO 3) (shift context/ACCOUNT_ADDRESS_LO 1)) + (eq! (shift storage/DEPLOYMENT_NUMBER 3) (shift context/ACCOUNT_DEPLOYMENT_NUMBER 1)) + (eq! (shift storage/STORAGE_KEY_HI 3) (storage-instruction---storage-key-hi)) + (eq! (shift storage/STORAGE_KEY_LO 3) (storage-instruction---storage-key-lo)) + (storage-turn-on-warmth 3) + (DOM-SUB-stamps---standard 3 ;; kappa + 0)))) ;; c + +(defconstraint storage-instruction---1st-logging-of-the-underlying-storage-operation + (:guard (storage-instruction---no-stack-exceptions)) + (if-not-zero (oogx-or-no-exception) + (begin + (eq! (shift storage/SLOAD_OPERATION 3) (storage-instruction---is-SLOAD)) + (eq! (shift storage/SSTORE_OPERATION 3) (storage-instruction---is-SSTORE))))) + +(defconstraint storage-instruction---setting-storage-slot-values---doing-for-SLOAD + (:guard (storage-instruction---no-stack-exceptions)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-not-zero (storage-instruction---is-SLOAD) + (begin + (if-not-zero (oogx-or-no-exception) + (storage-reading 3)) + (if-not-zero (no-exception) + (begin + (eq! (storage-instruction---loaded-value-hi) (shift storage/VALUE_CURR_HI 3)) + (eq! (storage-instruction---loaded-value-lo) (shift storage/VALUE_CURR_LO 3))))))) + +(defconstraint storage-instruction---setting-storage-slot-values---doing-for-SSTORE + (:guard (storage-instruction---no-stack-exceptions)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-not-zero (storage-instruction---is-SSTORE) + (if-not-zero (oogx-or-no-exception) + (begin + (eq! (storage-instruction---value-to-store-hi) (shift storage/VALUE_NEXT_HI 3)) + (eq! (storage-instruction---value-to-store-lo) (shift storage/VALUE_NEXT_LO 3)))))) + +(defconstraint storage-instruction---setting-storage-slot-values---undoing-storage-operation + (:guard (storage-instruction---no-stack-exceptions)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-not-zero (oogx-or-no-exception) + (if-not-zero CONTEXT_WILL_REVERT + (begin + (storage-same-slot 4) + (undo-storage-warmth-and-value-update 4) + (DOM-SUB-stamps---revert-with-current 4 ;; kappa + 0))))) ;; c + +(defconstraint storage-instruction---2nd-logging-of-the-underlying-storage-operation + (:guard (storage-instruction---no-stack-exceptions)) + (if-not-zero (oogx-or-no-exception) + (if-not-zero CONTEXT_WILL_REVERT + (begin + (eq! (shift storage/SLOAD_OPERATION 4) (storage-instruction---is-SLOAD)) + (eq! (shift storage/SSTORE_OPERATION 4) (storage-instruction---is-SSTORE)))))) + +(defun (orig-is-zero) (shift storage/VALUE_ORIG_IS_ZERO 3)) +(defun (curr-is-zero) (shift storage/VALUE_CURR_IS_ZERO 3)) +(defun (next-is-zero) (shift storage/VALUE_NEXT_IS_ZERO 3)) +(defun (curr-is-orig) (shift storage/VALUE_CURR_IS_ORIG 3)) +(defun (next-is-orig) (shift storage/VALUE_NEXT_IS_ORIG 3)) +(defun (next-is-curr) (shift storage/VALUE_NEXT_IS_CURR 3)) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defun (orig-not-zero) (force-bin (- 1 (orig-is-zero)))) +(defun (curr-not-zero) (force-bin (- 1 (curr-is-zero)))) +(defun (next-not-zero) (force-bin (- 1 (next-is-zero)))) +(defun (curr-not-orig) (force-bin (- 1 (curr-is-orig)))) +(defun (next-not-orig) (force-bin (- 1 (next-is-orig)))) +(defun (next-not-curr) (force-bin (- 1 (next-is-curr)))) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defun (context-wont-revert) (force-bin (- 1 CONTEXT_WILL_REVERT))) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defun (cold-slot) (force-bin (- 1 (shift storage/WARMTH 3)))) + + +(defconstraint storage-instruction---setting-gas-costs---SLOAD-case + (:guard (storage-instruction---no-stack-exceptions)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-not-zero (oogx-or-no-exception) + (if-not-zero (storage-instruction---is-SLOAD) + (if-not-zero (cold-slot) + (eq! GAS_COST GAS_CONST_G_COLD_SLOAD) + (eq! GAS_COST GAS_CONST_G_WARM_ACCESS))))) + +(defconstraint storage-instruction---setting-gas-costs---SSTORE-case + (:guard (storage-instruction---no-stack-exceptions)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-not-zero (oogx-or-no-exception) + (if-not-zero (storage-instruction---is-SSTORE) + (begin + (if-not-zero (next-is-curr) + (eq! GAS_COST (+ GAS_CONST_G_WARM_ACCESS (* (cold-slot) GAS_CONST_G_COLD_SLOAD)))) + (if-not-zero (curr-not-orig) + (eq! GAS_COST (+ GAS_CONST_G_WARM_ACCESS (* (cold-slot) GAS_CONST_G_COLD_SLOAD)))) + (if-not-zero (next-not-curr) + (if-not-zero (curr-is-orig) + (if-not-zero (orig-is-zero) + (eq! GAS_COST (+ GAS_CONST_G_SSET (* (cold-slot) GAS_CONST_G_COLD_SLOAD))) + (eq! GAS_COST (+ GAS_CONST_G_SRESET (* (cold-slot) GAS_CONST_G_COLD_SLOAD)))))))))) + +(defun (r-clean-clear) (* (next-not-curr) + (curr-is-orig) + (next-is-zero) + REFUND_CONST_R_SCLEAR)) +(defun (r-dirty-clear) (* (next-not-curr) + (curr-not-orig) + (orig-not-zero) + (- (next-is-zero) + (curr-is-zero)) + REFUND_CONST_R_SCLEAR)) +(defun (r-dirty-reset) (* (next-not-curr) + (curr-not-orig) + (next-is-orig) + (+ (* (orig-is-zero) (- GAS_CONST_G_SSET GAS_CONST_G_WARM_ACCESS)) + (* (orig-not-zero) (- GAS_CONST_G_SRESET GAS_CONST_G_WARM_ACCESS))))) + +(defconstraint storage-instruction---setting-the-refund + (:guard (storage-instruction---no-stack-exceptions)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (eq! + REFUND_COUNTER_NEW + (+ REFUND_COUNTER + (* (context-wont-revert) + (storage-instruction---is-SSTORE) + (+ (r-clean-clear) + (r-dirty-clear) + (r-dirty-reset)))))) diff --git a/hub/osaka/constraints/instruction-handling/swap.lisp b/hub/osaka/constraints/instruction-handling/swap.lisp new file mode 100644 index 000000000..5351b493f --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/swap.lisp @@ -0,0 +1,19 @@ +(module hub) + +(defun (swap-no-stack-exceptions) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (* PEEK_AT_STACK + stack/SWAP_FLAG + (- 1 stack/SUX stack/SOX))) + +(defconstraint swap-stack-pattern (:guard (swap-no-stack-exceptions)) + (swap-stack-pattern (- stack/INSTRUCTION (- EVM_INST_SWAP1 1)))) + +(defconstraint swap-setting-NSR (:guard (swap-no-stack-exceptions)) + (eq! NSR CMC)) + +(defconstraint swap-setting-peeking-flags (:guard (swap-no-stack-exceptions)) + (eq! NSR (* CMC (next PEEK_AT_CONTEXT)))) + +(defconstraint swap-setting-gas-costs (:guard (swap-no-stack-exceptions)) + (eq! GAS_COST stack/STATIC_GAS)) diff --git a/hub/osaka/constraints/instruction-handling/trans/constraints.lisp b/hub/osaka/constraints/instruction-handling/trans/constraints.lisp new file mode 100644 index 000000000..f41b8f199 --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/trans/constraints.lisp @@ -0,0 +1,113 @@ +(module hub) + + + +(defconstraint transient-storage-instruction---setting-the-stack-pattern + (:guard (transient-storage-instruction---no-stack-exceptions)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (load-store-stack-pattern (transient-storage-instruction---is-TSTORE))) + +(defconstraint transient-storage-instruction---valid-exceptions + (:guard (transient-storage-instruction---no-stack-exceptions)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (begin + (if-not-zero (transient-storage-instruction---is-TLOAD) (eq! XAHOY stack/OOGX)) + (if-not-zero (transient-storage-instruction---is-TSTORE) (eq! XAHOY (+ stack/STATICX + stack/OOGX))))) + +(defconstraint transient-storage-instruction---setting-NSR-and-peeking-flags---exceptional-case + (:guard (transient-storage-instruction---no-stack-exceptions)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; exceptional case + ;;;;;;;;;;;;;;;;;;; + (if-not-zero XAHOY + (begin + (eq! NSR 2) + (eq! NSR + (+ (shift PEEK_AT_CONTEXT TRANSIENT___EXCEPTIONAL___CONTEXT_CURRENT___ROFF ) + (shift PEEK_AT_CONTEXT TRANSIENT___EXCEPTIONAL___CONTEXT_PARENT___ROFF )))))) + +(defun (tstore-must-be-undone) (* (transient-storage-instruction---is-TSTORE) CN_WILL_REV)) +(defun (transient-no-exception) (- 1 XAHOY)) + +(defconstraint transient-storage-instruction---setting-NSR-and-peeking-flags---unexceptional-case + (:guard (transient-storage-instruction---no-stack-exceptions)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; unexceptional case + ;;;;;;;;;;;;;;;;;;;;; + (if-not-zero (transient-no-exception) + (begin + (eq! NSR (+ 2 (tstore-must-be-undone))) + (eq! NSR + (+ (shift PEEK_AT_CONTEXT TRANSIENT___UNEXCEPTIONAL___CONTEXT_CURR_ROFF ) + (shift PEEK_AT_TRANSIENT TRANSIENT___UNEXCEPTIONAL___TRANSIENT_DOING_ROFF ) + (* (shift PEEK_AT_TRANSIENT TRANSIENT___UNEXCEPTIONAL___TRANSIENT_UNDOING_ROFF ) + (tstore-must-be-undone)) + ))))) + +(defconstraint transient-storage-instruction---first-context-row + (:guard (transient-storage-instruction---no-stack-exceptions)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (read-context-data TRANSIENT___UNEXCEPTIONAL___CONTEXT_CURR_ROFF ;; row offset + CONTEXT_NUMBER ;; context to read + )) + +(defconstraint transient-storage-instruction---setting-the-STATICX-flag + (:guard (transient-storage-instruction---no-stack-exceptions)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (eq! stack/STATICX + (* (transient-storage-instruction---is-TSTORE) + (shift context/IS_STATIC TRANSIENT___UNEXCEPTIONAL___CONTEXT_CURR_ROFF)))) + +(defun (transient-oogx-or-no-exception) (+ stack/OOGX (transient-no-exception))) + +(defconstraint transient-storage-instruction---setting-storage-slot-parameters + (:guard (transient-storage-instruction---no-stack-exceptions)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-not-zero (transient-no-exception) + (begin + (eq! (shift transient/ADDRESS_HI TRANSIENT___UNEXCEPTIONAL___TRANSIENT_DOING_ROFF) (shift context/ACCOUNT_ADDRESS_HI TRANSIENT___UNEXCEPTIONAL___CONTEXT_CURR_ROFF)) + (eq! (shift transient/ADDRESS_LO TRANSIENT___UNEXCEPTIONAL___TRANSIENT_DOING_ROFF) (shift context/ACCOUNT_ADDRESS_LO TRANSIENT___UNEXCEPTIONAL___CONTEXT_CURR_ROFF)) + (eq! (shift transient/STORAGE_KEY_HI TRANSIENT___UNEXCEPTIONAL___TRANSIENT_DOING_ROFF) (transient-storage-instruction---transient-key-hi)) + (eq! (shift transient/STORAGE_KEY_LO TRANSIENT___UNEXCEPTIONAL___TRANSIENT_DOING_ROFF) (transient-storage-instruction---transient-key-lo)) + (DOM-SUB-stamps---standard TRANSIENT___UNEXCEPTIONAL___TRANSIENT_DOING_ROFF ;; kappa + 0)))) ;; c + +(defconstraint transient-storage-instruction---setting-storage-slot-values---unexceptional-TLOAD + (:guard (transient-storage-instruction---no-stack-exceptions)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-not-zero (transient-storage-instruction---is-TLOAD) + (if-not-zero (transient-no-exception) + (begin + (transient-storage-reading TRANSIENT___UNEXCEPTIONAL___TRANSIENT_DOING_ROFF) + (eq! (shift transient/VALUE_CURR_HI TRANSIENT___UNEXCEPTIONAL___TRANSIENT_DOING_ROFF) (transient-storage-instruction---value-to-tload-hi) ) + (eq! (shift transient/VALUE_CURR_LO TRANSIENT___UNEXCEPTIONAL___TRANSIENT_DOING_ROFF) (transient-storage-instruction---value-to-tload-lo) ))))) + +(defconstraint transient-storage-instruction---setting-storage-slot-values---unexceptional-TSTORE---doing + (:guard (transient-storage-instruction---no-stack-exceptions)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-not-zero (transient-storage-instruction---is-TSTORE) + (if-not-zero (transient-no-exception) + (begin + (eq! (shift transient/VALUE_NEXT_HI TRANSIENT___UNEXCEPTIONAL___TRANSIENT_DOING_ROFF) (transient-storage-instruction---value-to-tstore-hi) ) + (eq! (shift transient/VALUE_NEXT_LO TRANSIENT___UNEXCEPTIONAL___TRANSIENT_DOING_ROFF) (transient-storage-instruction---value-to-tstore-lo) ))))) + +(defconstraint transient-storage-instruction---setting-storage-slot-values---unexceptional-TSTORE---undoing + (:guard (transient-storage-instruction---no-stack-exceptions)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-not-zero (transient-storage-instruction---is-TSTORE) + (if-not-zero (transient-no-exception) + (if-not-zero CONTEXT_WILL_REVERT + (begin + (transient-storage-same-slot TRANSIENT___UNEXCEPTIONAL___TRANSIENT_UNDOING_ROFF TRANSIENT___UNEXCEPTIONAL___TRANSIENT_DOING_ROFF) + (transient-storage-undoing-value-update TRANSIENT___UNEXCEPTIONAL___TRANSIENT_UNDOING_ROFF TRANSIENT___UNEXCEPTIONAL___TRANSIENT_DOING_ROFF) + (DOM-SUB-stamps---revert-with-current TRANSIENT___UNEXCEPTIONAL___TRANSIENT_UNDOING_ROFF ;; row offset + 0) + ))))) + +(defconstraint transient-storage-instruction---setting-gas-costs + (:guard (transient-storage-instruction---no-stack-exceptions)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-not-zero (transient-oogx-or-no-exception) + (eq! GAS_COST + stack/STATIC_GAS))) diff --git a/hub/osaka/constraints/instruction-handling/trans/shorthands_and_constants.lisp b/hub/osaka/constraints/instruction-handling/trans/shorthands_and_constants.lisp new file mode 100644 index 000000000..f3bf6ecf9 --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/trans/shorthands_and_constants.lisp @@ -0,0 +1,25 @@ +(module hub) + + +(defun (transient-storage-instruction---no-stack-exceptions) (* PEEK_AT_STACK stack/TRANS_FLAG (- 1 stack/SUX stack/SOX))) +(defun (transient-storage-instruction---is-TLOAD) [ stack/DEC_FLAG 1 ]) +(defun (transient-storage-instruction---is-TSTORE) [ stack/DEC_FLAG 2 ]) +(defun (transient-storage-instruction---transient-key-hi) [ stack/STACK_ITEM_VALUE_HI 1 ]) +(defun (transient-storage-instruction---transient-key-lo) [ stack/STACK_ITEM_VALUE_LO 1 ]) +(defun (transient-storage-instruction---value-to-tload-hi) [ stack/STACK_ITEM_VALUE_HI 4 ]) +(defun (transient-storage-instruction---value-to-tload-lo) [ stack/STACK_ITEM_VALUE_LO 4 ]) +(defun (transient-storage-instruction---value-to-tstore-hi) [ stack/STACK_ITEM_VALUE_HI 4 ]) +(defun (transient-storage-instruction---value-to-tstore-lo) [ stack/STACK_ITEM_VALUE_LO 4 ]) ;; "" + + +(defconst + + ;; row offsets for exceptional instructions + TRANSIENT___EXCEPTIONAL___CONTEXT_CURRENT___ROFF 1 + TRANSIENT___EXCEPTIONAL___CONTEXT_PARENT___ROFF 2 + + ;; row offsets for unexceptional instructions + TRANSIENT___UNEXCEPTIONAL___CONTEXT_CURR_ROFF 1 + TRANSIENT___UNEXCEPTIONAL___TRANSIENT_DOING_ROFF 2 + TRANSIENT___UNEXCEPTIONAL___TRANSIENT_UNDOING_ROFF 3 + ) diff --git a/hub/osaka/constraints/instruction-handling/txn.lisp b/hub/osaka/constraints/instruction-handling/txn.lisp new file mode 100644 index 000000000..9f34a299c --- /dev/null +++ b/hub/osaka/constraints/instruction-handling/txn.lisp @@ -0,0 +1,54 @@ +(module hub) + +(defun (txn-instruction---standard-precondition) (force-bin (* PEEK_AT_STACK stack/TXN_FLAG (- 1 stack/SUX stack/SOX)))) +(defun (txn-instruction---is-ORIGIN) (force-bin [ stack/DEC_FLAG 1 ])) +(defun (txn-instruction---is-GASPRICE) (force-bin [ stack/DEC_FLAG 2 ])) +(defun (txn-instruction---is-BLOBHASH) (force-bin [ stack/DEC_FLAG 3 ])) +(defun (txn-instruction---result-hi) [ stack/STACK_ITEM_VALUE_HI 4 ]) +(defun (txn-instruction---result-lo) [ stack/STACK_ITEM_VALUE_LO 4 ]) ;; "" + +(defconst + roff---txn-instruction---transaction-row 1 + roff---txn-instruction---exceptional-context-row 2 + ) + +(defconstraint txn-instruction---setting-the-stack-pattern + (:guard (txn-instruction---standard-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (begin + (if-eq (txn-instruction---is-ORIGIN) 1 (stack-pattern-0-1)) + (if-eq (txn-instruction---is-GASPRICE) 1 (stack-pattern-0-1)) + (if-eq (txn-instruction---is-BLOBHASH) 1 (stack-pattern-1-1)))) + +(defconstraint txn-instruction---setting-NSR + (:guard (txn-instruction---standard-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (eq! NSR (+ 1 CMC))) + +(defconstraint txn-instruction---setting-the-peeking-flags + (:guard (txn-instruction---standard-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (eq! NSR + (+ (shift PEEK_AT_TRANSACTION roff---txn-instruction---transaction-row) + (* (shift PEEK_AT_CONTEXT roff---txn-instruction---exceptional-context-row) CMC)))) + +(defconstraint txn-instruction---setting-the-gas-cost + (:guard (txn-instruction---standard-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (eq! GAS_COST stack/STATIC_GAS)) + +(defconstraint txn-instruction---setting-the-result + (:guard (txn-instruction---standard-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (begin + (if-zero XAHOY + (begin + (if-eq (txn-instruction---is-ORIGIN) 1 + (begin (eq! (txn-instruction---result-hi) (shift transaction/FROM_ADDRESS_HI roff---txn-instruction---transaction-row)) + (eq! (txn-instruction---result-lo) (shift transaction/FROM_ADDRESS_LO roff---txn-instruction---transaction-row)))) + (if-eq (txn-instruction---is-GASPRICE) 1 + (begin (eq! (txn-instruction---result-hi) 0) + (eq! (txn-instruction---result-lo) (shift transaction/GAS_PRICE roff---txn-instruction---transaction-row)))) + (if-eq (txn-instruction---is-BLOBHASH) 1 + (begin (eq! (txn-instruction---result-hi) 0) + (eq! (txn-instruction---result-lo) 0))))))) diff --git a/hub/osaka/constraints/miscellaneous-rows/exp.lisp b/hub/osaka/constraints/miscellaneous-rows/exp.lisp new file mode 100644 index 000000000..26fdab952 --- /dev/null +++ b/hub/osaka/constraints/miscellaneous-rows/exp.lisp @@ -0,0 +1,30 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; 9.1 MISC/EXP constraints ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (set-EXP-instruction-exp-log + kappa ;; row offset + exponent_hi ;; exponent high + exponent_lo ;; exponent low + ) (begin + (eq! (shift misc/EXP_INST kappa) EXP_INST_EXPLOG) + (eq! (shift [misc/EXP_DATA 1] kappa) exponent_hi ) + (eq! (shift [misc/EXP_DATA 2] kappa) exponent_lo ))) + +(defun (set-EXP-instruction-MODEXP-lead-log + kappa ;; row offset + raw_lead_hi ;; raw leading word where exponent starts, high part + raw_lead_lo ;; raw leading word where exponent starts, low part + cds_cutoff ;; min{max{cds - 96 - bbs, 0}, 32} + ebs_cutoff ;; min{ebs, 32} + ) (begin + (eq! (shift misc/EXP_INST kappa) EXP_INST_MODEXPLOG) + (eq! (shift [misc/EXP_DATA 1] kappa) raw_lead_hi ) + (eq! (shift [misc/EXP_DATA 2] kappa) raw_lead_lo ) + (eq! (shift [misc/EXP_DATA 3] kappa) cds_cutoff ) + (eq! (shift [misc/EXP_DATA 4] kappa) ebs_cutoff ) + )) diff --git a/hub/osaka/constraints/miscellaneous-rows/mmu.lisp b/hub/osaka/constraints/miscellaneous-rows/mmu.lisp new file mode 100644 index 000000000..227d6bc1f --- /dev/null +++ b/hub/osaka/constraints/miscellaneous-rows/mmu.lisp @@ -0,0 +1,448 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; 9.3 MISC/MMU constraints ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (set-MMU-instruction---mload kappa ;; offset + src_id ;; source ID + ;; tgt_id ;; target ID + ;; aux_id ;; auxiliary ID + ;; src_offset_hi ;; source offset high + src_offset_lo ;; source offset low + ;; tgt_offset_lo ;; target offset low + ;; size ;; size + ;; ref_offset ;; reference offset + ;; ref_size ;; reference size + ;; success_bit ;; success bit + limb_1 ;; limb 1 + limb_2 ;; limb 2 + ;; exo_sum ;; weighted exogenous module flag sum + ;; phase ;; phase + ) (begin + (eq! (shift misc/MMU_INST kappa) MMU_INST_MLOAD ) + (eq! (shift misc/MMU_SRC_ID kappa) src_id ) + ;; (eq! (shift misc/MMU_TGT_ID kappa) ) + ;; (eq! (shift misc/MMU_AUX_ID kappa) ) + ;; (eq! (shift misc/MMU_SRC_OFFSET_HI kappa) ) + (eq! (shift misc/MMU_SRC_OFFSET_LO kappa) src_offset_lo ) + ;; (eq! (shift misc/MMU_TGT_OFFSET_LO kappa) ) + ;; (eq! (shift misc/MMU_SIZE kappa) ) + ;; (eq! (shift misc/MMU_REF_OFFSET kappa) ) + ;; (eq! (shift misc/MMU_REF_SIZE kappa) ) + ;; (eq! (shift misc/MMU_SUCCESS_BIT kappa) ) + (eq! (shift misc/MMU_LIMB_1 kappa) limb_1) + (eq! (shift misc/MMU_LIMB_2 kappa) limb_2) + ;; (eq! (shift misc/MMU_EXO_SUM kappa) ) + ;; (eq! (shift misc/MMU_PHASE kappa) ) + )) + + +(defun (set-MMU-instruction---mstore kappa ;; offset + ;; src_id ;; source ID + tgt_id ;; target ID + ;; aux_id ;; auxiliary ID + ;; src_offset_hi ;; source offset high + ;; src_offset_lo ;; source offset low + tgt_offset_lo ;; target offset low + ;; size ;; size + ;; ref_offset ;; reference offset + ;; ref_size ;; reference size + ;; success_bit ;; success bit + limb_1 ;; limb 1 + limb_2 ;; limb 2 + ;; exo_sum ;; weighted exogenous module flag sum + ;; phase ;; phase + ) (begin + (eq! (shift misc/MMU_INST kappa) MMU_INST_MSTORE) + ;; (eq! (shift misc/MMU_SRC_ID kappa) ) + (eq! (shift misc/MMU_TGT_ID kappa) tgt_id ) + ;; (eq! (shift misc/MMU_AUX_ID kappa) ) + ;; (eq! (shift misc/MMU_SRC_OFFSET_HI kappa) ) + ;; (eq! (shift misc/MMU_SRC_OFFSET_LO kappa) ) + (eq! (shift misc/MMU_TGT_OFFSET_LO kappa) tgt_offset_lo ) + ;; (eq! (shift misc/MMU_SIZE kappa) ) + ;; (eq! (shift misc/MMU_REF_OFFSET kappa) ) + ;; (eq! (shift misc/MMU_REF_SIZE kappa) ) + ;; (eq! (shift misc/MMU_SUCCESS_BIT kappa) ) + (eq! (shift misc/MMU_LIMB_1 kappa) limb_1) + (eq! (shift misc/MMU_LIMB_2 kappa) limb_2) + ;; (eq! (shift misc/MMU_EXO_SUM kappa) ) + ;; (eq! (shift misc/MMU_PHASE kappa) ) + )) + + +(defun (set-MMU-instruction---mstore8 kappa ;; offset + ;; src_id ;; source ID + tgt_id ;; target ID + ;; aux_id ;; auxiliary ID + ;; src_offset_hi ;; source offset high + ;; src_offset_lo ;; source offset low + tgt_offset_lo ;; target offset low + ;; size ;; size + ;; ref_offset ;; reference offset + ;; ref_size ;; reference size + ;; success_bit ;; success bit + limb_1 ;; limb 1 + limb_2 ;; limb 2 + ;; exo_sum ;; weighted exogenous module flag sum + ;; phase ;; phase + ) (begin + (eq! (shift misc/MMU_INST kappa) MMU_INST_MSTORE8) + ;; (eq! (shift misc/MMU_SRC_ID kappa) ) + (eq! (shift misc/MMU_TGT_ID kappa) tgt_id ) + ;; (eq! (shift misc/MMU_AUX_ID kappa) ) + ;; (eq! (shift misc/MMU_SRC_OFFSET_HI kappa) ) + ;; (eq! (shift misc/MMU_SRC_OFFSET_LO kappa) ) + (eq! (shift misc/MMU_TGT_OFFSET_LO kappa) tgt_offset_lo ) + ;; (eq! (shift misc/MMU_SIZE kappa) ) + ;; (eq! (shift misc/MMU_REF_OFFSET kappa) ) + ;; (eq! (shift misc/MMU_REF_SIZE kappa) ) + ;; (eq! (shift misc/MMU_SUCCESS_BIT kappa) ) + (eq! (shift misc/MMU_LIMB_1 kappa) limb_1) + (eq! (shift misc/MMU_LIMB_2 kappa) limb_2) + ;; (eq! (shift misc/MMU_EXO_SUM kappa) ) + ;; (eq! (shift misc/MMU_PHASE kappa) ) + )) + + +(defun (set-MMU-instruction---invalid-code-prefix kappa ;; offset + src_id ;; source ID + ;; tgt_id ;; target ID + ;; aux_id ;; auxiliary ID + ;; src_offset_hi ;; source offset high + src_offset_lo ;; source offset low + ;; tgt_offset_lo ;; target offset low + ;; size ;; size + ;; ref_offset ;; reference offset + ;; ref_size ;; reference size + success_bit ;; success bit + ;; limb_1 ;; limb 1 + ;; limb_2 ;; limb 2 + ;; exo_sum ;; weighted exogenous module flag sum + ;; phase ;; phase + ) (begin + (eq! (shift misc/MMU_INST kappa) MMU_INST_INVALID_CODE_PREFIX ) + (eq! (shift misc/MMU_SRC_ID kappa) src_id ) + ;; (eq! (shift misc/MMU_TGT_ID kappa) ) + ;; (eq! (shift misc/MMU_AUX_ID kappa) ) + (eq! (shift misc/MMU_SRC_OFFSET_LO kappa) src_offset_lo ) + ;; (eq! (shift misc/MMU_SRC_OFFSET_LO kappa) ) + ;; (eq! (shift misc/MMU_TGT_OFFSET_LO kappa) ) + ;; (eq! (shift misc/MMU_SIZE kappa) ) + ;; (eq! (shift misc/MMU_REF_OFFSET kappa) ) + ;; (eq! (shift misc/MMU_REF_SIZE kappa) ) + (eq! (shift misc/MMU_SUCCESS_BIT kappa) success_bit ) + ;; (eq! (shift misc/MMU_LIMB_1 kappa) ) + ;; (eq! (shift misc/MMU_LIMB_2 kappa) ) + ;; (eq! (shift misc/MMU_EXO_SUM kappa) ) + ;; (eq! (shift misc/MMU_PHASE kappa) ) + )) + + +(defun (set-MMU-instruction---right-padded-word-extraction kappa ;; offset + src_id ;; source ID + ;; tgt_id ;; target ID + ;; aux_id ;; auxiliary ID + ;; src_offset_hi ;; source offset high + src_offset_lo ;; source offset low + ;; tgt_offset_lo ;; target offset low + ;; size ;; size + ref_offset ;; reference offset + ref_size ;; reference size + ;; success_bit ;; success bit + limb_1 ;; limb 1 + limb_2 ;; limb 2 + ;; exo_sum ;; weighted exogenous module flag sum + ;; phase ;; phase + ) (begin + (eq! (shift misc/MMU_INST kappa) MMU_INST_RIGHT_PADDED_WORD_EXTRACTION) + (eq! (shift misc/MMU_SRC_ID kappa) src_id ) + ;; (eq! (shift misc/MMU_TGT_ID kappa) tgt_id ) + ;; (eq! (shift misc/MMU_AUX_ID kappa) aux_id ) + ;; (eq! (shift misc/MMU_SRC_OFFSET_HI kappa) src_offset_hi ) + (eq! (shift misc/MMU_SRC_OFFSET_LO kappa) src_offset_lo ) + ;; (eq! (shift misc/MMU_TGT_OFFSET_LO kappa) tgt_offset_lo ) + ;; (eq! (shift misc/MMU_SIZE kappa) size ) + (eq! (shift misc/MMU_REF_OFFSET kappa) ref_offset ) + (eq! (shift misc/MMU_REF_SIZE kappa) ref_size ) + ;; (eq! (shift misc/MMU_SUCCESS_BIT kappa) success_bit ) + (eq! (shift misc/MMU_LIMB_1 kappa) limb_1 ) + (eq! (shift misc/MMU_LIMB_2 kappa) limb_2 ) + ;; (eq! (shift misc/MMU_EXO_SUM kappa) exo_sum ) + ;; (eq! (shift misc/MMU_PHASE kappa) phase ) + )) + + +(defun (set-MMU-instruction---ram-to-exo-with-padding kappa ;; offset + src_id ;; source ID + tgt_id ;; target ID + aux_id ;; auxiliary ID + ;; src_offset_hi ;; source offset high + src_offset_lo ;; source offset low + ;; tgt_offset_lo ;; target offset low + size ;; size + ;; ref_offset ;; reference offset + ref_size ;; reference size + success_bit ;; success bit + ;; limb_1 ;; limb 1 + ;; limb_2 ;; limb 2 + exo_sum ;; weighted exogenous module flag sum + phase ;; phase + ) (begin + (eq! (shift misc/MMU_INST kappa) MMU_INST_RAM_TO_EXO_WITH_PADDING) + (eq! (shift misc/MMU_SRC_ID kappa) src_id ) + (eq! (shift misc/MMU_TGT_ID kappa) tgt_id ) + (eq! (shift misc/MMU_AUX_ID kappa) aux_id ) + ;; (eq! (shift misc/MMU_SRC_OFFSET_HI kappa) src_offset_hi ) + (eq! (shift misc/MMU_SRC_OFFSET_LO kappa) src_offset_lo ) + ;; (eq! (shift misc/MMU_TGT_OFFSET_LO kappa) tgt_offset_lo ) + (eq! (shift misc/MMU_SIZE kappa) size ) + ;; (eq! (shift misc/MMU_REF_OFFSET kappa) ref_offset ) + (eq! (shift misc/MMU_REF_SIZE kappa) ref_size ) + (eq! (shift misc/MMU_SUCCESS_BIT kappa) success_bit ) + ;; (eq! (shift misc/MMU_LIMB_1 kappa) limb_1 ) + ;; (eq! (shift misc/MMU_LIMB_2 kappa) limb_2 ) + (eq! (shift misc/MMU_EXO_SUM kappa) exo_sum ) + (eq! (shift misc/MMU_PHASE kappa) phase ) + )) + + +(defun (set-MMU-instruction---exo-to-ram-transplants kappa ;; offset + src_id ;; source ID + tgt_id ;; target ID + ;; aux_id ;; auxiliary ID + ;; src_offset_hi ;; source offset high + ;; src_offset_lo ;; source offset low + ;; tgt_offset_lo ;; target offset low + size ;; size + ;; ref_offset ;; reference offset + ;; ref_size ;; reference size + ;; success_bit ;; success bit + ;; limb_1 ;; limb 1 + ;; limb_2 ;; limb 2 + exo_sum ;; weighted exogenous module flag sum + phase ;; phase + ) (begin + (eq! (shift misc/MMU_INST kappa) MMU_INST_EXO_TO_RAM_TRANSPLANTS) + (eq! (shift misc/MMU_SRC_ID kappa) src_id ) + (eq! (shift misc/MMU_TGT_ID kappa) tgt_id ) + ;; (eq! (shift misc/MMU_AUX_ID kappa) aux_id ) + ;; (eq! (shift misc/MMU_SRC_OFFSET_HI kappa) src_offset_hi ) + ;; (eq! (shift misc/MMU_SRC_OFFSET_LO kappa) src_offset_lo ) + ;; (eq! (shift misc/MMU_TGT_OFFSET_LO kappa) tgt_offset_lo ) + (eq! (shift misc/MMU_SIZE kappa) size ) + ;; (eq! (shift misc/MMU_REF_OFFSET kappa) ref_offset ) + ;; (eq! (shift misc/MMU_REF_SIZE kappa) ref_size ) + ;; (eq! (shift misc/MMU_SUCCESS_BIT kappa) success_bit ) + ;; (eq! (shift misc/MMU_LIMB_1 kappa) limb_1 ) + ;; (eq! (shift misc/MMU_LIMB_2 kappa) limb_2 ) + (eq! (shift misc/MMU_EXO_SUM kappa) exo_sum ) + (eq! (shift misc/MMU_PHASE kappa) phase ) + )) + + +(defun (set-MMU-instruction---ram-to-ram-sans-padding kappa ;; offset + src_id ;; source ID + tgt_id ;; target ID + ;; aux_id ;; auxiliary ID + ;; src_offset_hi ;; source offset high + src_offset_lo ;; source offset low + ;; tgt_offset_lo ;; target offset low + size ;; size + ref_offset ;; reference offset + ref_size ;; reference size + ;; success_bit ;; success bit + ;; limb_1 ;; limb 1 + ;; limb_2 ;; limb 2 + ;; exo_sum ;; weighted exogenous module flag sum + ;; phase ;; phase + ) (begin + (eq! (shift misc/MMU_INST kappa) MMU_INST_RAM_TO_RAM_SANS_PADDING) + (eq! (shift misc/MMU_SRC_ID kappa) src_id ) + (eq! (shift misc/MMU_TGT_ID kappa) tgt_id ) + ;; (eq! (shift misc/MMU_AUX_ID kappa) aux_id ) + ;; (eq! (shift misc/MMU_SRC_OFFSET_HI kappa) src_offset_hi ) + (eq! (shift misc/MMU_SRC_OFFSET_LO kappa) src_offset_lo ) + ;; (eq! (shift misc/MMU_TGT_OFFSET_LO kappa) tgt_offset_lo ) + (eq! (shift misc/MMU_SIZE kappa) size ) + (eq! (shift misc/MMU_REF_OFFSET kappa) ref_offset ) + (eq! (shift misc/MMU_REF_SIZE kappa) ref_size ) + ;; (eq! (shift misc/MMU_SUCCESS_BIT kappa) success_bit ) + ;; (eq! (shift misc/MMU_LIMB_1 kappa) limb_1 ) + ;; (eq! (shift misc/MMU_LIMB_2 kappa) limb_2 ) + ;; (eq! (shift misc/MMU_EXO_SUM kappa) exo_sum ) + ;; (eq! (shift misc/MMU_PHASE kappa) phase ) + )) + + +(defun (set-MMU-instruction---any-to-ram-with-padding kappa ;; offset + src_id ;; source ID + tgt_id ;; target ID + ;; aux_id ;; auxiliary ID + src_offset_hi ;; source offset high + src_offset_lo ;; source offset low + tgt_offset_lo ;; target offset low + size ;; size + ref_offset ;; reference offset + ref_size ;; reference size + ;; success_bit ;; success bit + ;; limb_1 ;; limb 1 + ;; limb_2 ;; limb 2 + exo_sum ;; weighted exogenous module flag sum + ;; phase ;; phase + ) (begin + (eq! (shift misc/MMU_INST kappa) MMU_INST_ANY_TO_RAM_WITH_PADDING) + (eq! (shift misc/MMU_SRC_ID kappa) src_id ) + (eq! (shift misc/MMU_TGT_ID kappa) tgt_id ) + ;; (eq! (shift misc/MMU_AUX_ID kappa) aux_id ) + (eq! (shift misc/MMU_SRC_OFFSET_HI kappa) src_offset_hi ) + (eq! (shift misc/MMU_SRC_OFFSET_LO kappa) src_offset_lo ) + (eq! (shift misc/MMU_TGT_OFFSET_LO kappa) tgt_offset_lo ) + (eq! (shift misc/MMU_SIZE kappa) size ) + (eq! (shift misc/MMU_REF_OFFSET kappa) ref_offset ) + (eq! (shift misc/MMU_REF_SIZE kappa) ref_size ) + ;; (eq! (shift misc/MMU_SUCCESS_BIT kappa) success_bit ) + ;; (eq! (shift misc/MMU_LIMB_1 kappa) limb_1 ) + ;; (eq! (shift misc/MMU_LIMB_2 kappa) limb_2 ) + (eq! (shift misc/MMU_EXO_SUM kappa) exo_sum ) + ;; (eq! (shift misc/MMU_PHASE kappa) phase ) + )) + + +(defun (set-MMU-instruction---modexp-zero kappa ;; offset + ;; src_id ;; source ID + tgt_id ;; target ID + ;; aux_id ;; auxiliary ID + ;; src_offset_hi ;; source offset high + ;; src_offset_lo ;; source offset low + ;; tgt_offset_lo ;; target offset low + ;; size ;; size + ;; ref_offset ;; reference offset + ;; ref_size ;; reference size + ;; success_bit ;; success bit + ;; limb_1 ;; limb 1 + ;; limb_2 ;; limb 2 + ;; exo_sum ;; weighted exogenous module flag sum + phase ;; phase + ) (begin + (eq! (shift misc/MMU_INST kappa) MMU_INST_MODEXP_ZERO ) + ;; (eq! (shift misc/MMU_SRC_ID kappa) src_id ) + (eq! (shift misc/MMU_TGT_ID kappa) tgt_id ) + ;; (eq! (shift misc/MMU_AUX_ID kappa) aux_id ) + ;; (eq! (shift misc/MMU_SRC_OFFSET_HI kappa) src_offset_hi ) + ;; (eq! (shift misc/MMU_SRC_OFFSET_LO kappa) src_offset_lo ) + ;; (eq! (shift misc/MMU_TGT_OFFSET_LO kappa) tgt_offset_lo ) + ;; (eq! (shift misc/MMU_SIZE kappa) size ) + ;; (eq! (shift misc/MMU_REF_OFFSET kappa) ref_offset ) + ;; (eq! (shift misc/MMU_REF_SIZE kappa) ref_size ) + ;; (eq! (shift misc/MMU_SUCCESS_BIT kappa) success_bit ) + ;; (eq! (shift misc/MMU_LIMB_1 kappa) limb_1 ) + ;; (eq! (shift misc/MMU_LIMB_2 kappa) limb_2 ) + (eq! (shift misc/MMU_EXO_SUM kappa) EXO_SUM_WEIGHT_BLAKEMODEXP ) + (eq! (shift misc/MMU_PHASE kappa) phase ) + )) + + +(defun (set-MMU-instruction---modexp-data kappa ;; offset + src_id ;; source ID + tgt_id ;; target ID + ;; aux_id ;; auxiliary ID + ;; src_offset_hi ;; source offset high + src_offset_lo ;; source offset low + ;; tgt_offset_lo ;; target offset low + size ;; size + ref_offset ;; reference offset + ref_size ;; reference size + ;; success_bit ;; success bit + ;; limb_1 ;; limb 1 + ;; limb_2 ;; limb 2 + ;; exo_sum ;; weighted exogenous module flag sum + phase ;; phase + ) (begin + (eq! (shift misc/MMU_INST kappa) MMU_INST_MODEXP_DATA ) + (eq! (shift misc/MMU_SRC_ID kappa) src_id ) + (eq! (shift misc/MMU_TGT_ID kappa) tgt_id ) + ;; (eq! (shift misc/MMU_AUX_ID kappa) aux_id ) + ;; (eq! (shift misc/MMU_SRC_OFFSET_HI kappa) src_offset_hi ) + (eq! (shift misc/MMU_SRC_OFFSET_LO kappa) src_offset_lo ) + ;; (eq! (shift misc/MMU_TGT_OFFSET_LO kappa) tgt_offset_lo ) + (eq! (shift misc/MMU_SIZE kappa) size ) + (eq! (shift misc/MMU_REF_OFFSET kappa) ref_offset ) + (eq! (shift misc/MMU_REF_SIZE kappa) ref_size ) + ;; (eq! (shift misc/MMU_SUCCESS_BIT kappa) success_bit ) + ;; (eq! (shift misc/MMU_LIMB_1 kappa) limb_1 ) + ;; (eq! (shift misc/MMU_LIMB_2 kappa) limb_2 ) + (eq! (shift misc/MMU_EXO_SUM kappa) EXO_SUM_WEIGHT_BLAKEMODEXP ) + (eq! (shift misc/MMU_PHASE kappa) phase ) + )) + + +(defun (set-MMU-instruction---blake kappa ;; offset + src_id ;; source ID + tgt_id ;; target ID + ;; aux_id ;; auxiliary ID + ;; src_offset_hi ;; source offset high + src_offset_lo ;; source offset low + ;; tgt_offset_lo ;; target offset low + ;; size ;; size + ;; ref_offset ;; reference offset + ;; ref_size ;; reference size + ;; success_bit ;; success bit + ;; limb_1 ;; limb 1 + ;; limb_2 ;; limb 2 + ;; exo_sum ;; weighted exogenous module flag sum + ;; phase ;; phase + ) (begin + (eq! (shift misc/MMU_INST kappa) MMU_INST_BLAKE ) + (eq! (shift misc/MMU_SRC_ID kappa) src_id ) + (eq! (shift misc/MMU_TGT_ID kappa) tgt_id ) + ;; (eq! (shift misc/MMU_AUX_ID kappa) aux_id ) + ;; (eq! (shift misc/MMU_SRC_OFFSET_HI kappa) src_offset_hi ) + (eq! (shift misc/MMU_SRC_OFFSET_LO kappa) src_offset_lo ) + ;; (eq! (shift misc/MMU_TGT_OFFSET_LO kappa) tgt_offset_lo ) + ;; (eq! (shift misc/MMU_SIZE kappa) size ) + ;; (eq! (shift misc/MMU_REF_OFFSET kappa) ref_offset ) + ;; (eq! (shift misc/MMU_REF_SIZE kappa) ref_size ) + ;; (eq! (shift misc/MMU_SUCCESS_BIT kappa) success_bit ) + ;; (eq! (shift misc/MMU_LIMB_1 kappa) limb_1 ) + ;; (eq! (shift misc/MMU_LIMB_2 kappa) limb_2 ) + ;; (eq! (shift misc/MMU_EXO_SUM kappa) exo_sum ) + ;; (eq! (shift misc/MMU_PHASE kappa) phase ) + )) + + +;; (defun (set-MMU-instruction---Z kappa ;; offset +;; ;; src_id ;; source ID +;; ;; tgt_id ;; target ID +;; ;; aux_id ;; auxiliary ID +;; ;; src_offset_hi ;; source offset high +;; ;; src_offset_lo ;; source offset low +;; ;; tgt_offset_lo ;; target offset low +;; ;; size ;; size +;; ;; ref_offset ;; reference offset +;; ;; ref_size ;; reference size +;; ;; success_bit ;; success bit +;; ;; limb_1 ;; limb 1 +;; ;; limb_2 ;; limb 2 +;; ;; exo_sum ;; weighted exogenous module flag sum +;; ;; phase ;; phase +;; ) (begin +;; (eq! (shift misc/MMU_INST kappa) MMU_INST_) +;; ;; (eq! (shift misc/MMU_SRC_ID kappa) src_id ) +;; ;; (eq! (shift misc/MMU_TGT_ID kappa) tgt_id ) +;; ;; (eq! (shift misc/MMU_AUX_ID kappa) aux_id ) +;; ;; (eq! (shift misc/MMU_SRC_OFFSET_HI kappa) src_offset_hi ) +;; ;; (eq! (shift misc/MMU_SRC_OFFSET_LO kappa) src_offset_lo ) +;; ;; (eq! (shift misc/MMU_TGT_OFFSET_LO kappa) tgt_offset_lo ) +;; ;; (eq! (shift misc/MMU_SIZE kappa) size ) +;; ;; (eq! (shift misc/MMU_REF_OFFSET kappa) ref_offset ) +;; ;; (eq! (shift misc/MMU_REF_SIZE kappa) ref_size ) +;; ;; (eq! (shift misc/MMU_SUCCESS_BIT kappa) success_bit ) +;; ;; (eq! (shift misc/MMU_LIMB_1 kappa) limb_1 ) +;; ;; (eq! (shift misc/MMU_LIMB_2 kappa) limb_2 ) +;; ;; (eq! (shift misc/MMU_EXO_SUM kappa) exo_sum ) +;; ;; (eq! (shift misc/MMU_PHASE kappa) phase ) +;; )) diff --git a/hub/osaka/constraints/miscellaneous-rows/mxp/calls.lisp b/hub/osaka/constraints/miscellaneous-rows/mxp/calls.lisp new file mode 100644 index 000000000..e5e993172 --- /dev/null +++ b/hub/osaka/constraints/miscellaneous-rows/mxp/calls.lisp @@ -0,0 +1,31 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y MISC/MXP CALL-type instructions ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defun (set-MXP-instruction---for-CALL-type kappa ;; row offset kappa + instruction ;; instruction + cdo_hi ;; call data offset high + cdo_lo ;; call data offset low + cds_hi ;; call data size high + cds_lo ;; call data size low + r@o_hi ;; return at offset high + r@o_lo ;; return at offset low + r@c_hi ;; return at capacity high + r@c_lo ;; return at capacity low + ) + (begin + (eq! (shift misc/MXP_INST kappa) instruction ) + (eq! (shift misc/MXP_OFFSET_1_HI kappa) cdo_hi ) + (eq! (shift misc/MXP_OFFSET_1_LO kappa) cdo_lo ) + (eq! (shift misc/MXP_SIZE_1_HI kappa) cds_hi ) + (eq! (shift misc/MXP_SIZE_1_LO kappa) cds_lo ) + (eq! (shift misc/MXP_OFFSET_2_HI kappa) r@o_hi ) + (eq! (shift misc/MXP_OFFSET_2_LO kappa) r@o_lo ) + (eq! (shift misc/MXP_SIZE_2_HI kappa) r@c_hi ) + (eq! (shift misc/MXP_SIZE_2_LO kappa) r@c_lo ) + )) diff --git a/hub/osaka/constraints/miscellaneous-rows/mxp/mcopy.lisp b/hub/osaka/constraints/miscellaneous-rows/mxp/mcopy.lisp new file mode 100644 index 000000000..4383b0cd8 --- /dev/null +++ b/hub/osaka/constraints/miscellaneous-rows/mxp/mcopy.lisp @@ -0,0 +1,27 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y MISC/MXP constraints ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (set-MXP-instruction---for-MCOPY kappa ;; row offset kappa + target_offset_hi ;; target offset hi + target_offset_lo ;; target offset lo + source_offset_hi ;; source offset hi + source_offset_lo ;; source offset lo + size_hi ;; size hi + size_lo ;; size lo + ) + (begin + (eq! (shift misc/MXP_INST kappa) EVM_INST_MCOPY ) + (eq! (shift misc/MXP_OFFSET_1_HI kappa) target_offset_hi ) + (eq! (shift misc/MXP_OFFSET_1_LO kappa) target_offset_lo ) + (eq! (shift misc/MXP_SIZE_1_HI kappa) size_hi ) + (eq! (shift misc/MXP_SIZE_1_LO kappa) size_lo ) + (eq! (shift misc/MXP_OFFSET_2_HI kappa) source_offset_hi ) + (eq! (shift misc/MXP_OFFSET_2_LO kappa) source_offset_lo ) + (eq! (shift misc/MXP_SIZE_2_HI kappa) size_hi ) + (eq! (shift misc/MXP_SIZE_2_LO kappa) size_lo ))) + diff --git a/hub/osaka/constraints/miscellaneous-rows/mxp/msize.lisp b/hub/osaka/constraints/miscellaneous-rows/mxp/msize.lisp new file mode 100644 index 000000000..ee80e4908 --- /dev/null +++ b/hub/osaka/constraints/miscellaneous-rows/mxp/msize.lisp @@ -0,0 +1,11 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; 9.2 MISC/MXP instruction for MSIZE ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (set-MXP-instruction---for-MSIZE kappa) + (eq! + (shift misc/MXP_INST kappa) EVM_INST_MSIZE)) diff --git a/hub/osaka/constraints/miscellaneous-rows/mxp/mxp.lisp b/hub/osaka/constraints/miscellaneous-rows/mxp/mxp.lisp new file mode 100644 index 000000000..e69de29bb diff --git a/hub/osaka/constraints/miscellaneous-rows/mxp/single_offset.lisp b/hub/osaka/constraints/miscellaneous-rows/mxp/single_offset.lisp new file mode 100644 index 000000000..04e226b72 --- /dev/null +++ b/hub/osaka/constraints/miscellaneous-rows/mxp/single_offset.lisp @@ -0,0 +1,25 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y MISC/MXP CALL-type instructions ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defun (set-MXP-instruction---single-mxp-offset-instructions kappa ;; row offset kappa + instruction ;; instruction + deploys ;; bit modifying the behaviour of RETURN pricing + offset_hi ;; offset high + offset_lo ;; offset low + size_hi ;; size high + size_lo ;; size low + ) + (begin + (eq! (shift misc/MXP_INST kappa) instruction ) + (eq! (shift misc/MXP_DEPLOYS kappa) deploys ) + (eq! (shift misc/MXP_OFFSET_1_HI kappa) offset_hi ) + (eq! (shift misc/MXP_OFFSET_1_LO kappa) offset_lo ) + (eq! (shift misc/MXP_SIZE_1_HI kappa) size_hi ) + (eq! (shift misc/MXP_SIZE_1_LO kappa) size_lo ) + )) diff --git a/hub/osaka/constraints/miscellaneous-rows/oob/opcodes/oob_inst_call.lisp b/hub/osaka/constraints/miscellaneous-rows/oob/opcodes/oob_inst_call.lisp new file mode 100644 index 000000000..a16638f6f --- /dev/null +++ b/hub/osaka/constraints/miscellaneous-rows/oob/opcodes/oob_inst_call.lisp @@ -0,0 +1,21 @@ +(module hub) + + +(defun (set-OOB-instruction---call kappa ;; offset + value_hi ;; value (high part) + value_lo ;; value (low part, stack argument of CALL-type instruction) + balance ;; balance (from caller account) + call_stack_depth ;; call stack depth + ) (begin + (eq! (shift misc/OOB_INST kappa) OOB_INST_CALL ) + (eq! (shift (misc_oob_data_1) kappa) value_hi ) + (eq! (shift (misc_oob_data_2) kappa) value_lo ) + (eq! (shift (misc_oob_data_3) kappa) balance ) + ;; (eq! (shift (misc_oob_data_4) kappa) ) + ;; (eq! (shift (misc_oob_data_5) kappa) ) + (eq! (shift (misc_oob_data_6) kappa) call_stack_depth) + ;; (eq! (shift (misc_oob_data_7) kappa) ) ;; value_is_nonzero + ;; (eq! (shift (misc_oob_data_8) kappa) ) ;; aborting condition + ;; (eq! (shift (misc_oob_data_9) kappa) ) + ;; (eq! (shift (misc_oob_data_10) kappa) ) + )) diff --git a/hub/osaka/constraints/miscellaneous-rows/oob/opcodes/oob_inst_cdl.lisp b/hub/osaka/constraints/miscellaneous-rows/oob/opcodes/oob_inst_cdl.lisp new file mode 100644 index 000000000..ed3bcd5b3 --- /dev/null +++ b/hub/osaka/constraints/miscellaneous-rows/oob/opcodes/oob_inst_cdl.lisp @@ -0,0 +1,21 @@ +(module hub) + + +(defun (set-OOB-instruction---cdl kappa ;; row offset + offset_hi ;; offset within call data, high part + offset_lo ;; offset within call data, low part + call_data_size ;; call data size + ) (begin + (eq! (shift misc/OOB_INST kappa) OOB_INST_CDL ) + (eq! (shift (misc_oob_data_1) kappa) offset_hi) + (eq! (shift (misc_oob_data_2) kappa) offset_lo) + ;; (eq! (shift (misc_oob_data_3) kappa) ) + ;; (eq! (shift (misc_oob_data_4) kappa) ) + (eq! (shift (misc_oob_data_5) kappa) call_data_size) + ;; (eq! (shift (misc_oob_data_6) kappa) ) + ;; (eq! (shift (misc_oob_data_7) kappa) ) + ;; (eq! (shift (misc_oob_data_8) kappa) ) + ;; (eq! (shift (misc_oob_data_9) kappa) ) + ;; (eq! (shift (misc_oob_data_10) kappa) ) + )) + diff --git a/hub/osaka/constraints/miscellaneous-rows/oob/opcodes/oob_inst_create.lisp b/hub/osaka/constraints/miscellaneous-rows/oob/opcodes/oob_inst_create.lisp new file mode 100644 index 000000000..ddf2459fd --- /dev/null +++ b/hub/osaka/constraints/miscellaneous-rows/oob/opcodes/oob_inst_create.lisp @@ -0,0 +1,25 @@ +(module hub) + + +(defun (set-OOB-instruction---create kappa ;; offset + value_hi ;; value (high part) + value_lo ;; value (low part, stack argument of CALL-type instruction) + balance ;; balance (from caller account) + nonce ;; callee's nonce + has_code ;; callee's HAS_CODE + call_stack_depth ;; current call stack depth + creator_nonce ;; creator account nonce + init_code_size ;; init code size (it's necessarily small at this point, so only low part required) + ) (begin + (eq! (shift misc/OOB_INST kappa) OOB_INST_CREATE ) + (eq! (shift (misc_oob_data_1) kappa) value_hi ) + (eq! (shift (misc_oob_data_2) kappa) value_lo ) + (eq! (shift (misc_oob_data_3) kappa) balance ) + (eq! (shift (misc_oob_data_4) kappa) nonce ) + (eq! (shift (misc_oob_data_5) kappa) has_code ) + (eq! (shift (misc_oob_data_6) kappa) call_stack_depth ) + ;; (eq! (shift (misc_oob_data_7) kappa) ) ;; value_is_nonzero + ;; (eq! (shift (misc_oob_data_8) kappa) ) ;; aborting condition + (eq! (shift (misc_oob_data_9) kappa) creator_nonce ) + (eq! (shift (misc_oob_data_10) kappa) init_code_size ) + )) diff --git a/hub/osaka/constraints/miscellaneous-rows/oob/opcodes/oob_inst_deployment.lisp b/hub/osaka/constraints/miscellaneous-rows/oob/opcodes/oob_inst_deployment.lisp new file mode 100644 index 000000000..ce7c72a2f --- /dev/null +++ b/hub/osaka/constraints/miscellaneous-rows/oob/opcodes/oob_inst_deployment.lisp @@ -0,0 +1,19 @@ +(module hub) + + +(defun (set-OOB-instruction---deployment kappa ;; offset + code_size_hi ;; code size hi + code_size_lo ;; code size lo + ) (begin + (eq! (shift misc/OOB_INST kappa) OOB_INST_DEPLOYMENT ) + (eq! (shift (misc_oob_data_1) kappa) code_size_hi) + (eq! (shift (misc_oob_data_2) kappa) code_size_lo) + ;; (eq! (shift (misc_oob_data_3) kappa) ) + ;; (eq! (shift (misc_oob_data_4) kappa) ) + ;; (eq! (shift (misc_oob_data_5) kappa) ) + ;; (eq! (shift (misc_oob_data_6) kappa) ) + ;; (eq! (shift (misc_oob_data_7) kappa) ) ;; max code size exception + ;; (eq! (shift (misc_oob_data_8) kappa) ) + ;; (eq! (shift (misc_oob_data_9) kappa) ) + ;; (eq! (shift (misc_oob_data_10) kappa) ) + )) diff --git a/hub/osaka/constraints/miscellaneous-rows/oob/opcodes/oob_inst_jump.lisp b/hub/osaka/constraints/miscellaneous-rows/oob/opcodes/oob_inst_jump.lisp new file mode 100644 index 000000000..069717f78 --- /dev/null +++ b/hub/osaka/constraints/miscellaneous-rows/oob/opcodes/oob_inst_jump.lisp @@ -0,0 +1,20 @@ +(module hub) + + +(defun (set-OOB-instruction---jump kappa ;; offset + pc_new_hi ;; high part of proposed new program counter + pc_new_lo ;; low part of proposed new program counter + code_size ;; code size of byte code currently executing + ) (begin + (eq! (shift misc/OOB_INST kappa) OOB_INST_JUMP ) + (eq! (shift (misc_oob_data_1) kappa) pc_new_hi) + (eq! (shift (misc_oob_data_2) kappa) pc_new_lo) + ;; (eq! (shift (misc_oob_data_3) kappa) ) + ;; (eq! (shift (misc_oob_data_4) kappa) ) + (eq! (shift (misc_oob_data_5) kappa) code_size) + ;; (eq! (shift (misc_oob_data_6) kappa) ) + ;; (eq! (shift (misc_oob_data_7) kappa) ) + ;; (eq! (shift (misc_oob_data_8) kappa) ) + ;; (eq! (shift (misc_oob_data_9) kappa) ) + ;; (eq! (shift (misc_oob_data_10) kappa) ) + )) diff --git a/hub/osaka/constraints/miscellaneous-rows/oob/opcodes/oob_inst_jumpi.lisp b/hub/osaka/constraints/miscellaneous-rows/oob/opcodes/oob_inst_jumpi.lisp new file mode 100644 index 000000000..598b7cbe1 --- /dev/null +++ b/hub/osaka/constraints/miscellaneous-rows/oob/opcodes/oob_inst_jumpi.lisp @@ -0,0 +1,22 @@ +(module hub) + + +(defun (set-OOB-instruction---jumpi kappa ;; offset + pc_new_hi ;; high part of proposed new program counter + pc_new_lo ;; low part of proposed new program counter + jump_condition_hi ;; high part of jump condition + jump_condition_lo ;; low part of jump condition + code_size ;; code size of byte code currently executing + ) (begin + (eq! (shift misc/OOB_INST kappa) OOB_INST_JUMPI) + (eq! (shift (misc_oob_data_1) kappa) pc_new_hi) + (eq! (shift (misc_oob_data_2) kappa) pc_new_lo) + (eq! (shift (misc_oob_data_3) kappa) jump_condition_hi) + (eq! (shift (misc_oob_data_4) kappa) jump_condition_lo) + (eq! (shift (misc_oob_data_5) kappa) code_size) + ;; (eq! (shift (misc_oob_data_6) kappa) ) + ;; (eq! (shift (misc_oob_data_7) kappa) ) + ;; (eq! (shift (misc_oob_data_8) kappa) ) + ;; (eq! (shift (misc_oob_data_9) kappa) ) + ;; (eq! (shift (misc_oob_data_10) kappa) ) + )) diff --git a/hub/osaka/constraints/miscellaneous-rows/oob/opcodes/oob_inst_rdc.lisp b/hub/osaka/constraints/miscellaneous-rows/oob/opcodes/oob_inst_rdc.lisp new file mode 100644 index 000000000..5480ea7d5 --- /dev/null +++ b/hub/osaka/constraints/miscellaneous-rows/oob/opcodes/oob_inst_rdc.lisp @@ -0,0 +1,22 @@ +(module hub) + + +(defun (set-OOB-instruction---rdc kappa ;; row offset + source_offset_hi ;; offset within call data, high part + source_offset_lo ;; offset within call data, low part + size_hi ;; size of data to copy, high part + size_lo ;; size of data to copy, low part + return_data_size ;; return data size + ) (begin + (eq! (shift misc/OOB_INST kappa) OOB_INST_RDC) + (eq! (shift (misc_oob_data_1) kappa) source_offset_hi) + (eq! (shift (misc_oob_data_2) kappa) source_offset_lo) + (eq! (shift (misc_oob_data_3) kappa) size_hi) + (eq! (shift (misc_oob_data_4) kappa) size_lo) + (eq! (shift (misc_oob_data_5) kappa) return_data_size) + ;; (eq! (shift (misc_oob_data_6) kappa) ) + ;; (eq! (shift (misc_oob_data_7) kappa) ) + ;; (eq! (shift (misc_oob_data_8) kappa) ) + ;; (eq! (shift (misc_oob_data_9) kappa) ) + ;; (eq! (shift (misc_oob_data_10) kappa) ) + )) diff --git a/hub/osaka/constraints/miscellaneous-rows/oob/opcodes/oob_inst_sstore.lisp b/hub/osaka/constraints/miscellaneous-rows/oob/opcodes/oob_inst_sstore.lisp new file mode 100644 index 000000000..63c9167b5 --- /dev/null +++ b/hub/osaka/constraints/miscellaneous-rows/oob/opcodes/oob_inst_sstore.lisp @@ -0,0 +1,18 @@ +(module hub) + + +(defun (set-OOB-instruction---sstore kappa ;; offset + gas_actual ;; GAS_ACTUAL + ) (begin + (eq! (shift misc/OOB_INST kappa) OOB_INST_SSTORE ) + ;; (eq! (shift (misc_oob_data_1) kappa) ) + ;; (eq! (shift (misc_oob_data_2) kappa) ) + ;; (eq! (shift (misc_oob_data_3) kappa) ) + ;; (eq! (shift (misc_oob_data_4) kappa) ) + (eq! (shift (misc_oob_data_5) kappa) gas_actual) + ;; (eq! (shift (misc_oob_data_6) kappa) ) + ;; (eq! (shift (misc_oob_data_7) kappa) ) + ;; (eq! (shift (misc_oob_data_8) kappa) ) + ;; (eq! (shift (misc_oob_data_9) kappa) ) + ;; (eq! (shift (misc_oob_data_10) kappa) ) + )) diff --git a/hub/osaka/constraints/miscellaneous-rows/oob/opcodes/oob_inst_xcall.lisp b/hub/osaka/constraints/miscellaneous-rows/oob/opcodes/oob_inst_xcall.lisp new file mode 100644 index 000000000..7789b0372 --- /dev/null +++ b/hub/osaka/constraints/miscellaneous-rows/oob/opcodes/oob_inst_xcall.lisp @@ -0,0 +1,19 @@ +(module hub) + + +(defun (set-OOB-instruction---xcall kappa ;; offset + value_hi ;; value (high part) + value_lo ;; value (low part, stack argument of CALL-type instruction) + ) (begin + (eq! (shift misc/OOB_INST kappa) OOB_INST_XCALL ) + (eq! (shift (misc_oob_data_1) kappa) value_hi ) + (eq! (shift (misc_oob_data_2) kappa) value_lo ) + ;; (eq! (shift (misc_oob_data_3) kappa) ) + ;; (eq! (shift (misc_oob_data_4) kappa) ) + ;; (eq! (shift (misc_oob_data_5) kappa) ) + ;; (eq! (shift (misc_oob_data_6) kappa) ) + ;; (eq! (shift (misc_oob_data_7) kappa) ) ;; value_is_nonzero + ;; (eq! (shift (misc_oob_data_8) kappa) ) ;; value_is_zero ... I don't remember why I ask for both ... + ;; (eq! (shift (misc_oob_data_9) kappa) ) + ;; (eq! (shift (misc_oob_data_10) kappa) ) + )) diff --git a/hub/osaka/constraints/miscellaneous-rows/oob/opcodes/oob_inst_xcreate.lisp b/hub/osaka/constraints/miscellaneous-rows/oob/opcodes/oob_inst_xcreate.lisp new file mode 100644 index 000000000..4f3d4b490 --- /dev/null +++ b/hub/osaka/constraints/miscellaneous-rows/oob/opcodes/oob_inst_xcreate.lisp @@ -0,0 +1,19 @@ +(module hub) + + +(defun (set-OOB-instruction---xcreate kappa ;; offset + init_code_size_hi ;; high part of initialization code size argument of CREATE(2) + init_code_size_lo ;; low part of initialization code size argument of CREATE(2) + ) (begin + (eq! (shift misc/OOB_INST kappa) OOB_INST_XCREATE ) + (eq! (shift (misc_oob_data_1) kappa) init_code_size_hi ) + (eq! (shift (misc_oob_data_2) kappa) init_code_size_lo ) + ;; (eq! (shift (misc_oob_data_3) kappa) ) + ;; (eq! (shift (misc_oob_data_4) kappa) ) + ;; (eq! (shift (misc_oob_data_5) kappa) ) + ;; (eq! (shift (misc_oob_data_6) kappa) ) + ;; (eq! (shift (misc_oob_data_7) kappa) ) ;; value_is_nonzero + ;; (eq! (shift (misc_oob_data_8) kappa) ) ;; value_is_zero ... I don't remember why I ask for both ... + ;; (eq! (shift (misc_oob_data_9) kappa) ) + ;; (eq! (shift (misc_oob_data_10) kappa) ) + )) diff --git a/hub/osaka/constraints/miscellaneous-rows/oob/precompiles/blake/oob_inst_blake_cds.lisp b/hub/osaka/constraints/miscellaneous-rows/oob/precompiles/blake/oob_inst_blake_cds.lisp new file mode 100644 index 000000000..d14763fdc --- /dev/null +++ b/hub/osaka/constraints/miscellaneous-rows/oob/precompiles/blake/oob_inst_blake_cds.lisp @@ -0,0 +1,19 @@ +(module hub) + + +(defun (set-OOB-instruction---blake-cds kappa ;; offset + cds ;; call data size + r@c ;; return at capacity + ) (begin + (eq! (shift misc/OOB_INST kappa) OOB_INST_BLAKE_CDS ) + ;; (eq! (shift (misc_oob_data_1) kappa) ) + (eq! (shift (misc_oob_data_2) kappa) cds ) + (eq! (shift (misc_oob_data_3) kappa) r@c ) + ;; (eq! (shift (misc_oob_data_4) kappa) ) + ;; (eq! (shift (misc_oob_data_5) kappa) ) + ;; (eq! (shift (misc_oob_data_6) kappa) ) + ;; (eq! (shift (misc_oob_data_7) kappa) ) + ;; (eq! (shift (misc_oob_data_8) kappa) ) + ;; (eq! (shift (misc_oob_data_9) kappa) ) + ;; (eq! (shift (misc_oob_data_10) kappa) ) + )) diff --git a/hub/osaka/constraints/miscellaneous-rows/oob/precompiles/blake/oob_inst_blake_params.lisp b/hub/osaka/constraints/miscellaneous-rows/oob/precompiles/blake/oob_inst_blake_params.lisp new file mode 100644 index 000000000..0f8d5f17f --- /dev/null +++ b/hub/osaka/constraints/miscellaneous-rows/oob/precompiles/blake/oob_inst_blake_params.lisp @@ -0,0 +1,20 @@ +(module hub) + + +(defun (set-OOB-instruction---blake-params kappa ;; offset + call_gas ;; call gas i.e. gas provided to the precompile + blake_r ;; rounds parameter of the call data of BLAKE2f + blake_f ;; f parameter of the call data of BLAKE2f ("final block indicator") + ) (begin + (eq! (shift misc/OOB_INST kappa) OOB_INST_BLAKE_PARAMS ) + (eq! (shift (misc_oob_data_1) kappa) call_gas ) + ;; (eq! (shift (misc_oob_data_2) kappa) ) + ;; (eq! (shift (misc_oob_data_3) kappa) ) + ;; (eq! (shift (misc_oob_data_4) kappa) ) + ;; (eq! (shift (misc_oob_data_5) kappa) ) + (eq! (shift (misc_oob_data_6) kappa) blake_r ) + (eq! (shift (misc_oob_data_7) kappa) blake_f ) + ;; (eq! (shift (misc_oob_data_8) kappa) ) + ;; (eq! (shift (misc_oob_data_9) kappa) ) + ;; (eq! (shift (misc_oob_data_10) kappa) ) + )) diff --git a/hub/osaka/constraints/miscellaneous-rows/oob/precompiles/common/common.lisp b/hub/osaka/constraints/miscellaneous-rows/oob/precompiles/common/common.lisp new file mode 100644 index 000000000..ef650d519 --- /dev/null +++ b/hub/osaka/constraints/miscellaneous-rows/oob/precompiles/common/common.lisp @@ -0,0 +1,22 @@ +(module hub) + + +;; note that the instruction is part of the interface ! +(defun (set-OOB-instruction---common kappa ;; offset + common_precompile_oob_inst ;; relevant OOB instruction + call_gas ;; call gas i.e. gas provided to the precompile + cds ;; call data size + r@c ;; return at capacity + ) (begin + (eq! (shift misc/OOB_INST kappa) common_precompile_oob_inst ) + (eq! (shift (misc_oob_data_1) kappa) call_gas ) + (eq! (shift (misc_oob_data_2) kappa) cds ) + (eq! (shift (misc_oob_data_3) kappa) r@c ) + ;; (eq! (shift (misc_oob_data_4) kappa) ) + ;; (eq! (shift (misc_oob_data_5) kappa) ) + ;; (eq! (shift (misc_oob_data_6) kappa) ) + ;; (eq! (shift (misc_oob_data_7) kappa) ) + ;; (eq! (shift (misc_oob_data_8) kappa) ) + ;; (eq! (shift (misc_oob_data_9) kappa) ) + ;; (eq! (shift (misc_oob_data_10) kappa) ) + )) diff --git a/hub/osaka/constraints/miscellaneous-rows/oob/precompiles/modexp/oob_inst_modexp_cds.lisp b/hub/osaka/constraints/miscellaneous-rows/oob/precompiles/modexp/oob_inst_modexp_cds.lisp new file mode 100644 index 000000000..92de38953 --- /dev/null +++ b/hub/osaka/constraints/miscellaneous-rows/oob/precompiles/modexp/oob_inst_modexp_cds.lisp @@ -0,0 +1,18 @@ +(module hub) + + +(defun (set-OOB-instruction---modexp-cds kappa ;; offset + cds ;; call data size + ) (begin + (eq! (shift misc/OOB_INST kappa) OOB_INST_MODEXP_CDS ) + ;; (eq! (shift (misc_oob_data_1) kappa) ) + (eq! (shift (misc_oob_data_2) kappa) cds ) + ;; (eq! (shift (misc_oob_data_3) kappa) ) + ;; (eq! (shift (misc_oob_data_4) kappa) ) + ;; (eq! (shift (misc_oob_data_5) kappa) ) + ;; (eq! (shift (misc_oob_data_6) kappa) ) + ;; (eq! (shift (misc_oob_data_7) kappa) ) + ;; (eq! (shift (misc_oob_data_8) kappa) ) + ;; (eq! (shift (misc_oob_data_9) kappa) ) + ;; (eq! (shift (misc_oob_data_10) kappa) ) + )) diff --git a/hub/osaka/constraints/miscellaneous-rows/oob/precompiles/modexp/oob_inst_modexp_extract.lisp b/hub/osaka/constraints/miscellaneous-rows/oob/precompiles/modexp/oob_inst_modexp_extract.lisp new file mode 100644 index 000000000..b50442ca2 --- /dev/null +++ b/hub/osaka/constraints/miscellaneous-rows/oob/precompiles/modexp/oob_inst_modexp_extract.lisp @@ -0,0 +1,21 @@ +(module hub) + + +(defun (set-OOB-instruction---modexp-extract kappa ;; offset + cds ;; call data size + bbs_lo ;; low part of bbs (base byte size) + ebs_lo ;; low part of ebs (exponent byte size) + mbs_lo ;; low part of mbs (modulus byte size) + ) (begin + (eq! (shift misc/OOB_INST kappa) OOB_INST_MODEXP_EXTRACT ) + ;; (eq! (shift (misc_oob_data_1) kappa) ) + (eq! (shift (misc_oob_data_2) kappa) cds ) + (eq! (shift (misc_oob_data_3) kappa) bbs_lo ) + (eq! (shift (misc_oob_data_4) kappa) ebs_lo ) + (eq! (shift (misc_oob_data_5) kappa) mbs_lo ) + ;; (eq! (shift (misc_oob_data_6) kappa) ) + ;; (eq! (shift (misc_oob_data_7) kappa) ) + ;; (eq! (shift (misc_oob_data_8) kappa) ) + ;; (eq! (shift (misc_oob_data_9) kappa) ) + ;; (eq! (shift (misc_oob_data_10) kappa) ) + )) diff --git a/hub/osaka/constraints/miscellaneous-rows/oob/precompiles/modexp/oob_inst_modexp_lead.lisp b/hub/osaka/constraints/miscellaneous-rows/oob/precompiles/modexp/oob_inst_modexp_lead.lisp new file mode 100644 index 000000000..53c0222ab --- /dev/null +++ b/hub/osaka/constraints/miscellaneous-rows/oob/precompiles/modexp/oob_inst_modexp_lead.lisp @@ -0,0 +1,20 @@ +(module hub) + + +(defun (set-OOB-instruction---modexp-lead kappa ;; offset + bbs_lo ;; low part of bbs (base byte size) + cds ;; call data size + ebs_lo ;; low part of ebs (exponent byte size) + ) (begin + (eq! (shift misc/OOB_INST kappa) OOB_INST_MODEXP_LEAD ) + (eq! (shift (misc_oob_data_1) kappa) bbs_lo ) + (eq! (shift (misc_oob_data_2) kappa) cds ) + (eq! (shift (misc_oob_data_3) kappa) ebs_lo ) + ;; (eq! (shift (misc_oob_data_4) kappa) ) + ;; (eq! (shift (misc_oob_data_5) kappa) ) + ;; (eq! (shift (misc_oob_data_6) kappa) ) + ;; (eq! (shift (misc_oob_data_7) kappa) ) + ;; (eq! (shift (misc_oob_data_8) kappa) ) + ;; (eq! (shift (misc_oob_data_9) kappa) ) + ;; (eq! (shift (misc_oob_data_10) kappa) ) + )) diff --git a/hub/osaka/constraints/miscellaneous-rows/oob/precompiles/modexp/oob_inst_modexp_pricing.lisp b/hub/osaka/constraints/miscellaneous-rows/oob/precompiles/modexp/oob_inst_modexp_pricing.lisp new file mode 100644 index 000000000..58b6ab81d --- /dev/null +++ b/hub/osaka/constraints/miscellaneous-rows/oob/precompiles/modexp/oob_inst_modexp_pricing.lisp @@ -0,0 +1,21 @@ +(module hub) + + +(defun (set-OOB-instruction---modexp-pricing kappa ;; offset + call_gas ;; call gas i.e. gas provided to the precompile + r@c ;; return at capacity + exponent_log ;; leading (≤) word log of exponent + max_mbs_bbs ;; call data size + ) (begin + (eq! (shift misc/OOB_INST kappa) OOB_INST_MODEXP_PRICING ) + (eq! (shift (misc_oob_data_1) kappa) call_gas ) + ;; (eq! (shift (misc_oob_data_2) kappa) ) + (eq! (shift (misc_oob_data_3) kappa) r@c ) + ;; (eq! (shift (misc_oob_data_4) kappa) ) + ;; (eq! (shift (misc_oob_data_5) kappa) ) + (eq! (shift (misc_oob_data_6) kappa) exponent_log ) + (eq! (shift (misc_oob_data_7) kappa) max_mbs_bbs ) + ;; (eq! (shift (misc_oob_data_8) kappa) ) + ;; (eq! (shift (misc_oob_data_9) kappa) ) + ;; (eq! (shift (misc_oob_data_10) kappa) ) + )) diff --git a/hub/osaka/constraints/miscellaneous-rows/oob/precompiles/modexp/oob_inst_modexp_xbs.lisp b/hub/osaka/constraints/miscellaneous-rows/oob/precompiles/modexp/oob_inst_modexp_xbs.lisp new file mode 100644 index 000000000..57fcb7236 --- /dev/null +++ b/hub/osaka/constraints/miscellaneous-rows/oob/precompiles/modexp/oob_inst_modexp_xbs.lisp @@ -0,0 +1,21 @@ +(module hub) + + +(defun (set-OOB-instruction---modexp-xbs kappa ;; offset + xbs_hi ;; high part of some {b,e,m}bs + xbs_lo ;; low part of some {b,e,m}bs + ybs_lo ;; low part of some {b,e,m}bs + compute_max ;; bit indicating whether to compute max(xbs, ybs) or not + ) (begin + (eq! (shift misc/OOB_INST kappa) OOB_INST_MODEXP_XBS ) + (eq! (shift (misc_oob_data_1) kappa) xbs_hi ) + (eq! (shift (misc_oob_data_2) kappa) xbs_lo ) + (eq! (shift (misc_oob_data_3) kappa) ybs_lo ) + (eq! (shift (misc_oob_data_4) kappa) compute_max ) + ;; (eq! (shift (misc_oob_data_5) kappa) ) + ;; (eq! (shift (misc_oob_data_6) kappa) ) + ;; (eq! (shift (misc_oob_data_7) kappa) ) + ;; (eq! (shift (misc_oob_data_8) kappa) ) + ;; (eq! (shift (misc_oob_data_9) kappa) ) + ;; (eq! (shift (misc_oob_data_10) kappa) ) + )) diff --git a/hub/osaka/constraints/miscellaneous-rows/oob/shorthands.lisp b/hub/osaka/constraints/miscellaneous-rows/oob/shorthands.lisp new file mode 100644 index 000000000..5c9309fd4 --- /dev/null +++ b/hub/osaka/constraints/miscellaneous-rows/oob/shorthands.lisp @@ -0,0 +1,12 @@ +(module hub) + +(defun (misc_oob_data_1) [ misc/OOB_DATA 1 ]) +(defun (misc_oob_data_2) [ misc/OOB_DATA 2 ]) +(defun (misc_oob_data_3) [ misc/OOB_DATA 3 ]) +(defun (misc_oob_data_4) [ misc/OOB_DATA 4 ]) +(defun (misc_oob_data_5) [ misc/OOB_DATA 5 ]) +(defun (misc_oob_data_6) [ misc/OOB_DATA 6 ]) +(defun (misc_oob_data_7) [ misc/OOB_DATA 7 ]) +(defun (misc_oob_data_8) [ misc/OOB_DATA 8 ]) +(defun (misc_oob_data_9) [ misc/OOB_DATA 9 ]) +(defun (misc_oob_data_10) [ misc/OOB_DATA 10 ]) diff --git a/hub/osaka/constraints/miscellaneous-rows/stp.lisp b/hub/osaka/constraints/miscellaneous-rows/stp.lisp new file mode 100644 index 000000000..ea7220c30 --- /dev/null +++ b/hub/osaka/constraints/miscellaneous-rows/stp.lisp @@ -0,0 +1,38 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; 9.5 MISC/STP constraints ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (set-STP-instruction-create rel_offset ;; relative row offset + instruction ;; instruction + value_hi ;; value to transfer, high part + value_lo ;; value to transfer, low part + mxp_gas ;; memory expansion gas + ) + (begin (eq! (shift misc/STP_INSTRUCTION rel_offset) instruction) + (eq! (shift misc/STP_VALUE_HI rel_offset) value_hi) + (eq! (shift misc/STP_VALUE_LO rel_offset) value_lo) + (eq! (shift misc/STP_GAS_MXP rel_offset) mxp_gas))) + + +(defun (set-STP-instruction-call rel_offset ;; relative row offset + instruction ;; instruction + gas_hi ;; max gas allowance argument, high part + gas_lo ;; max gas allowance argument, low part + value_hi ;; value to transfer, high part + value_lo ;; value to transfer, low part + target_exists ;; bit indicating target account existence + target_warmth ;; bit indicating target account warmth + mxp_gas ;; memory expansion gas + ) + (begin (eq! (shift misc/STP_INSTRUCTION rel_offset) instruction) + (eq! (shift misc/STP_GAS_HI rel_offset) gas_hi) + (eq! (shift misc/STP_GAS_LO rel_offset) gas_lo) + (eq! (shift misc/STP_VALUE_HI rel_offset) value_hi) + (eq! (shift misc/STP_VALUE_LO rel_offset) value_lo) + (eq! (shift misc/STP_EXISTS rel_offset) target_exists) + (eq! (shift misc/STP_WARMTH rel_offset) target_warmth) + (eq! (shift misc/STP_GAS_MXP rel_offset) mxp_gas))) diff --git a/hub/osaka/constraints/miscellaneous-rows/stp_mxp_connections.lisp b/hub/osaka/constraints/miscellaneous-rows/stp_mxp_connections.lisp new file mode 100644 index 000000000..71da65e74 --- /dev/null +++ b/hub/osaka/constraints/miscellaneous-rows/stp_mxp_connections.lisp @@ -0,0 +1,13 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; 9.5.1 STP <> MXP connections ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;; optional ... +(defconstraint STP-MXP-connections (:guard (* PEEK_AT_MISCELLANEOUS misc/STP_FLAG)) + (begin + (eq! misc/MXP_FLAG 1) + (eq! misc/STP_GAS_MXP misc/MXP_GAS_MXP))) diff --git a/hub/osaka/constraints/miscellaneous-rows/weighted_misc_flag_sum.lisp b/hub/osaka/constraints/miscellaneous-rows/weighted_misc_flag_sum.lisp new file mode 100644 index 000000000..1ca447443 --- /dev/null +++ b/hub/osaka/constraints/miscellaneous-rows/weighted_misc_flag_sum.lisp @@ -0,0 +1,14 @@ +(module hub) + + +(defun (weighted-MISC-flag-sum rel_offset) (+ (* MISC_WEIGHT_EXP (shift misc/EXP_FLAG rel_offset)) + (* MISC_WEIGHT_MMU (shift misc/MMU_FLAG rel_offset)) + (* MISC_WEIGHT_MXP (shift misc/MXP_FLAG rel_offset)) + (* MISC_WEIGHT_OOB (shift misc/OOB_FLAG rel_offset)) + (* MISC_WEIGHT_STP (shift misc/STP_FLAG rel_offset)))) + +(defun (weighted-MISC-flag-sum-sans-MMU rel_offset) (+ (* MISC_WEIGHT_EXP (shift misc/EXP_FLAG rel_offset)) + ;; (* MISC_WEIGHT_MMU (shift misc/MMU_FLAG rel_offset)) + (* MISC_WEIGHT_MXP (shift misc/MXP_FLAG rel_offset)) + (* MISC_WEIGHT_OOB (shift misc/OOB_FLAG rel_offset)) + (* MISC_WEIGHT_STP (shift misc/STP_FLAG rel_offset)))) diff --git a/hub/osaka/constraints/scenario-rows/generalities.lisp b/hub/osaka/constraints/scenario-rows/generalities.lisp new file mode 100644 index 000000000..8384380b7 --- /dev/null +++ b/hub/osaka/constraints/scenario-rows/generalities.lisp @@ -0,0 +1,67 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; 10.2 SCEN General constraints ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;; (defconstraint scenario-binarities (:perspective scenario) +;; (begin +;; (debug (is-binary CALL_EXCEPTION )) +;; (debug (is-binary CALL_ABORT_WILL_REVERT )) +;; (debug (is-binary CALL_ABORT_WONT_REVERT )) +;; (debug (is-binary CALL_EOA_SUCCESS_CALLER_WILL_REVERT )) +;; (debug (is-binary CALL_EOA_SUCCESS_CALLER_WONT_REVERT )) +;; (debug (is-binary CALL_SMC_FAILURE_CALLER_WILL_REVERT )) +;; (debug (is-binary CALL_SMC_FAILURE_CALLER_WONT_REVERT )) +;; (debug (is-binary CALL_SMC_SUCCESS_CALLER_WILL_REVERT )) +;; (debug (is-binary CALL_SMC_SUCCESS_CALLER_WONT_REVERT )) +;; (debug (is-binary CALL_PRC_FAILURE )) +;; (debug (is-binary CALL_PRC_SUCCESS_CALLER_WILL_REVERT )) +;; (debug (is-binary CALL_PRC_SUCCESS_CALLER_WONT_REVERT )) +;; (debug (is-binary CREATE_EXCEPTION )) +;; (debug (is-binary CREATE_ABORT )) +;; (debug (is-binary CREATE_FAILURE_CONDITION_WILL_REVERT )) +;; (debug (is-binary CREATE_FAILURE_CONDITION_WONT_REVERT )) +;; (debug (is-binary CREATE_NONEMPTY_INIT_CODE_FAILURE_WILL_REVERT )) +;; (debug (is-binary CREATE_NONEMPTY_INIT_CODE_FAILURE_WONT_REVERT )) +;; (debug (is-binary CREATE_NONEMPTY_INIT_CODE_SUCCESS_WILL_REVERT )) +;; (debug (is-binary CREATE_NONEMPTY_INIT_CODE_SUCCESS_WONT_REVERT )) +;; (debug (is-binary CREATE_EMPTY_INIT_CODE_WILL_REVERT )) +;; (debug (is-binary CREATE_EMPTY_INIT_CODE_WONT_REVERT )) +;; (debug (is-binary PRC_ECRECOVER )) +;; (debug (is-binary PRC_SHA2-256 )) +;; (debug (is-binary PRC_RIPEMD-160 )) +;; (debug (is-binary PRC_IDENTITY )) +;; (debug (is-binary PRC_MODEXP )) +;; (debug (is-binary PRC_ECADD )) +;; (debug (is-binary PRC_ECMUL )) +;; (debug (is-binary PRC_ECPAIRING )) +;; (debug (is-binary PRC_BLAKE2f )) +;; (debug (is-binary PRC_SUCCESS_CALLER_WILL_REVERT )) +;; (debug (is-binary PRC_SUCCESS_CALLER_WONT_REVERT )) +;; (debug (is-binary PRC_FAILURE_KNOWN_TO_HUB )) +;; (debug (is-binary PRC_FAILURE_KNOWN_TO_RAM )) +;; (debug (is-binary RETURN_EXCEPTION )) +;; (debug (is-binary RETURN_MESSAGE_CALL_WILL_TOUCH_RAM )) +;; (debug (is-binary RETURN_MESSAGE_CALL_WONT_TOUCH_RAM )) +;; (debug (is-binary RETURN_DEPLOYMENT_EMPTY_CODE_WILL_REVERT )) +;; (debug (is-binary RETURN_DEPLOYMENT_EMPTY_CODE_WONT_REVERT )) +;; (debug (is-binary RETURN_DEPLOYMENT_NONEMPTY_CODE_WILL_REVERT )) +;; (debug (is-binary RETURN_DEPLOYMENT_NONEMPTY_CODE_WONT_REVERT )) +;; )) + +(defconstraint only-one-active-scenario (:perspective scenario) + (is-binary + (+ + (scenario-shorthand---CALL---sum) + (scenario-shorthand---CREATE---sum) + (scenario-shorthand---PRC---sum) + (scenario-shorthand---RETURN---sum) + (scenario-shorthand---SELFDESTRUCT---sum) + ))) + +(defconstraint at-most-one-precompile-address-bit-is-active (:perspective scenario) + (eq! (scenario-shorthand---PRC---full-address-bit-sum) + (scenario-shorthand---PRC---sum))) diff --git a/hub/osaka/constraints/scenario-rows/shorthands/call.lisp b/hub/osaka/constraints/scenario-rows/shorthands/call.lisp new file mode 100644 index 000000000..16e10fc98 --- /dev/null +++ b/hub/osaka/constraints/scenario-rows/shorthands/call.lisp @@ -0,0 +1,348 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; 10.2 SCEN/CALL instruction shorthands ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +;;  CALL/externally_owned_account +(defun (scenario-shorthand---CALL---externally-owned-account) + (+ + ;; scenario/CALL_EXCEPTION + ;; scenario/CALL_ABORT_WILL_REVERT + ;; scenario/CALL_ABORT_WONT_REVERT + scenario/CALL_EOA_SUCCESS_CALLER_WILL_REVERT + scenario/CALL_EOA_SUCCESS_CALLER_WONT_REVERT + ;; scenario/CALL_SMC_FAILURE_CALLER_WILL_REVERT + ;; scenario/CALL_SMC_FAILURE_CALLER_WONT_REVERT + ;; scenario/CALL_SMC_SUCCESS_CALLER_WILL_REVERT + ;; scenario/CALL_SMC_SUCCESS_CALLER_WONT_REVERT + ;; scenario/CALL_PRC_FAILURE + ;; scenario/CALL_PRC_SUCCESS_CALLER_WILL_REVERT + ;; scenario/CALL_PRC_SUCCESS_CALLER_WONT_REVERT + )) + +;;  CALL/smart_contract +(defun (scenario-shorthand---CALL---smart-contract) + (+ + ;; scenario/CALL_EXCEPTION + ;; scenario/CALL_ABORT_WILL_REVERT + ;; scenario/CALL_ABORT_WONT_REVERT + ;; scenario/CALL_EOA_SUCCESS_CALLER_WILL_REVERT + ;; scenario/CALL_EOA_SUCCESS_CALLER_WONT_REVERT + scenario/CALL_SMC_FAILURE_CALLER_WILL_REVERT + scenario/CALL_SMC_FAILURE_CALLER_WONT_REVERT + scenario/CALL_SMC_SUCCESS_CALLER_WILL_REVERT + scenario/CALL_SMC_SUCCESS_CALLER_WONT_REVERT + ;; scenario/CALL_PRC_FAILURE + ;; scenario/CALL_PRC_SUCCESS_CALLER_WILL_REVERT + ;; scenario/CALL_PRC_SUCCESS_CALLER_WONT_REVERT + )) + +;;  CALL/precompile +(defun (scenario-shorthand---CALL---precompile) + (+ + ;; scenario/CALL_EXCEPTION + ;; scenario/CALL_ABORT_WILL_REVERT + ;; scenario/CALL_ABORT_WONT_REVERT + ;; scenario/CALL_EOA_SUCCESS_CALLER_WILL_REVERT + ;; scenario/CALL_EOA_SUCCESS_CALLER_WONT_REVERT + ;; scenario/CALL_SMC_FAILURE_CALLER_WILL_REVERT + ;; scenario/CALL_SMC_FAILURE_CALLER_WONT_REVERT + ;; scenario/CALL_SMC_SUCCESS_CALLER_WILL_REVERT + ;; scenario/CALL_SMC_SUCCESS_CALLER_WONT_REVERT + scenario/CALL_PRC_FAILURE + scenario/CALL_PRC_SUCCESS_CALLER_WILL_REVERT + scenario/CALL_PRC_SUCCESS_CALLER_WONT_REVERT + )) + +;;  CALL/abort +(defun (scenario-shorthand---CALL---abort) + (+ + scenario/CALL_ABORT_WILL_REVERT + scenario/CALL_ABORT_WONT_REVERT + )) + +;;  CALL/entry +(defun (scenario-shorthand---CALL---entry) + (+ + (scenario-shorthand---CALL---externally-owned-account) + (scenario-shorthand---CALL---smart-contract) + (scenario-shorthand---CALL---precompile) + )) + +;;  CALL/unexceptional +(defun (scenario-shorthand---CALL---unexceptional) + (+ + (scenario-shorthand---CALL---abort) + (scenario-shorthand---CALL---entry) + )) + +;;  CALL/sum +(defun (scenario-shorthand---CALL---sum) + (+ + scenario/CALL_EXCEPTION + (scenario-shorthand---CALL---unexceptional) + )) + +;;  CALL/no_precompile +(defun (scenario-shorthand---CALL---no-precompile) + (+ + scenario/CALL_EXCEPTION + (scenario-shorthand---CALL---abort) + (scenario-shorthand---CALL---externally-owned-account) + (scenario-shorthand---CALL---smart-contract) + )) + +;;  CALL/precompile_success +(defun (scenario-shorthand---CALL---precompile-success) + (+ + ;; scenario/CALL_EXCEPTION + ;; scenario/CALL_ABORT_WILL_REVERT + ;; scenario/CALL_ABORT_WONT_REVERT + ;; scenario/CALL_EOA_SUCCESS_CALLER_WILL_REVERT + ;; scenario/CALL_EOA_SUCCESS_CALLER_WONT_REVERT + ;; scenario/CALL_SMC_FAILURE_CALLER_WILL_REVERT + ;; scenario/CALL_SMC_FAILURE_CALLER_WONT_REVERT + ;; scenario/CALL_SMC_SUCCESS_CALLER_WILL_REVERT + ;; scenario/CALL_SMC_SUCCESS_CALLER_WONT_REVERT + ;; scenario/CALL_PRC_FAILURE + scenario/CALL_PRC_SUCCESS_CALLER_WILL_REVERT + scenario/CALL_PRC_SUCCESS_CALLER_WONT_REVERT + )) + +;;  CALL/execution_known_to_revert +(defun (scenario-shorthand---CALL---execution-known-to-revert) + (+ + ;; scenario/CALL_EXCEPTION + ;; scenario/CALL_ABORT_WILL_REVERT + ;; scenario/CALL_ABORT_WONT_REVERT + scenario/CALL_EOA_SUCCESS_CALLER_WILL_REVERT + ;; scenario/CALL_EOA_SUCCESS_CALLER_WONT_REVERT + scenario/CALL_SMC_FAILURE_CALLER_WILL_REVERT + ;; scenario/CALL_SMC_FAILURE_CALLER_WONT_REVERT + scenario/CALL_SMC_SUCCESS_CALLER_WILL_REVERT + ;; scenario/CALL_SMC_SUCCESS_CALLER_WONT_REVERT + ;; scenario/CALL_PRC_FAILURE + scenario/CALL_PRC_SUCCESS_CALLER_WILL_REVERT + ;; scenario/CALL_PRC_SUCCESS_CALLER_WONT_REVERT + )) + +;;  CALL/execution_known_to_not_revert +(defun (scenario-shorthand---CALL---execution-known-to-not-revert) + (+ + ;; scenario/CALL_EXCEPTION + ;; scenario/CALL_ABORT_WILL_REVERT + ;; scenario/CALL_ABORT_WONT_REVERT + ;; scenario/CALL_EOA_SUCCESS_CALLER_WILL_REVERT + scenario/CALL_EOA_SUCCESS_CALLER_WONT_REVERT + ;; scenario/CALL_SMC_FAILURE_CALLER_WILL_REVERT + scenario/CALL_SMC_FAILURE_CALLER_WONT_REVERT + ;; scenario/CALL_SMC_SUCCESS_CALLER_WILL_REVERT + scenario/CALL_SMC_SUCCESS_CALLER_WONT_REVERT + ;; scenario/CALL_PRC_FAILURE + ;; scenario/CALL_PRC_SUCCESS_CALLER_WILL_REVERT + scenario/CALL_PRC_SUCCESS_CALLER_WONT_REVERT + )) + +;;  CALL/success +(defun (scenario-shorthand---CALL---success) + (+ + ;; scenario/CALL_EXCEPTION + ;; scenario/CALL_ABORT_WILL_REVERT + ;; scenario/CALL_ABORT_WONT_REVERT + scenario/CALL_EOA_SUCCESS_CALLER_WILL_REVERT + scenario/CALL_EOA_SUCCESS_CALLER_WONT_REVERT + ;; scenario/CALL_SMC_FAILURE_CALLER_WILL_REVERT + ;; scenario/CALL_SMC_FAILURE_CALLER_WONT_REVERT + scenario/CALL_SMC_SUCCESS_CALLER_WILL_REVERT + scenario/CALL_SMC_SUCCESS_CALLER_WONT_REVERT + ;; scenario/CALL_PRC_FAILURE + scenario/CALL_PRC_SUCCESS_CALLER_WILL_REVERT + scenario/CALL_PRC_SUCCESS_CALLER_WONT_REVERT + )) + +;;  CALL/smc_success +(defun (scenario-shorthand---CALL---smc-success) + (+ + ;; scenario/CALL_EXCEPTION + ;; scenario/CALL_ABORT_WILL_REVERT + ;; scenario/CALL_ABORT_WONT_REVERT + ;; scenario/CALL_EOA_SUCCESS_CALLER_WILL_REVERT + ;; scenario/CALL_EOA_SUCCESS_CALLER_WONT_REVERT + ;; scenario/CALL_SMC_FAILURE_CALLER_WILL_REVERT + ;; scenario/CALL_SMC_FAILURE_CALLER_WONT_REVERT + scenario/CALL_SMC_SUCCESS_CALLER_WILL_REVERT + scenario/CALL_SMC_SUCCESS_CALLER_WONT_REVERT + ;; scenario/CALL_PRC_FAILURE + ;; scenario/CALL_PRC_SUCCESS_CALLER_WILL_REVERT + ;; scenario/CALL_PRC_SUCCESS_CALLER_WONT_REVERT + )) + +;;  CALL/smc_failure +(defun (scenario-shorthand---CALL---smc-failure) + (+ + ;; scenario/CALL_EXCEPTION + ;; scenario/CALL_ABORT_WILL_REVERT + ;; scenario/CALL_ABORT_WONT_REVERT + ;; scenario/CALL_EOA_SUCCESS_CALLER_WILL_REVERT + ;; scenario/CALL_EOA_SUCCESS_CALLER_WONT_REVERT + scenario/CALL_SMC_FAILURE_CALLER_WILL_REVERT + scenario/CALL_SMC_FAILURE_CALLER_WONT_REVERT + ;; scenario/CALL_SMC_SUCCESS_CALLER_WILL_REVERT + ;; scenario/CALL_SMC_SUCCESS_CALLER_WONT_REVERT + ;; scenario/CALL_PRC_FAILURE + ;; scenario/CALL_PRC_SUCCESS_CALLER_WILL_REVERT + ;; scenario/CALL_PRC_SUCCESS_CALLER_WONT_REVERT + )) + +;;  CALL/failure +(defun (scenario-shorthand---CALL---failure) + (+ + (scenario-shorthand---CALL---smc-failure) + ;; scenario/CALL_EXCEPTION + ;; scenario/CALL_ABORT_WILL_REVERT + ;; scenario/CALL_ABORT_WONT_REVERT + ;; scenario/CALL_EOA_SUCCESS_CALLER_WILL_REVERT + ;; scenario/CALL_EOA_SUCCESS_CALLER_WONT_REVERT + ;; scenario/CALL_SMC_FAILURE_CALLER_WILL_REVERT + ;; scenario/CALL_SMC_FAILURE_CALLER_WONT_REVERT + ;; scenario/CALL_SMC_SUCCESS_CALLER_WILL_REVERT + ;; scenario/CALL_SMC_SUCCESS_CALLER_WONT_REVERT + scenario/CALL_PRC_FAILURE + ;; scenario/CALL_PRC_SUCCESS_CALLER_WILL_REVERT + ;; scenario/CALL_PRC_SUCCESS_CALLER_WONT_REVERT + )) + +;;  CALL/no_context_change +(defun (scenario-shorthand---CALL---no-context-change) + (+ + ;; scenario/CALL_EXCEPTION + (scenario-shorthand---CALL---abort) + ;; scenario/CALL_EOA_SUCCESS_CALLER_WILL_REVERT + ;; scenario/CALL_EOA_SUCCESS_CALLER_WONT_REVERT + ;; scenario/CALL_SMC_FAILURE_CALLER_WILL_REVERT + ;; scenario/CALL_SMC_FAILURE_CALLER_WONT_REVERT + ;; scenario/CALL_SMC_SUCCESS_CALLER_WILL_REVERT + ;; scenario/CALL_SMC_SUCCESS_CALLER_WONT_REVERT + ;; scenario/CALL_PRC_FAILURE + ;; scenario/CALL_PRC_SUCCESS_CALLER_WILL_REVERT + ;; scenario/CALL_PRC_SUCCESS_CALLER_WONT_REVERT + (scenario-shorthand---CALL---externally-owned-account) + (scenario-shorthand---CALL---precompile) + )) + +;;  CALL/callee_warmth_update_not_required +(defun (scenario-shorthand---CALL---callee-warmth-update-not-required) scenario/CALL_EXCEPTION) ;; "" + +;;  CALL/callee_warmth_update_required +(defun (scenario-shorthand---CALL---callee-warmth-update-required) + (+ (scenario-shorthand---CALL---abort) + (scenario-shorthand---CALL---entry))) + +;;  CALL/balance_update_not_required +(defun (scenario-shorthand---CALL---balance-update-not-required) + (+ + scenario/CALL_EXCEPTION + (scenario-shorthand---CALL---abort) + ;; scenario/CALL_EOA_SUCCESS_CALLER_WILL_REVERT + ;; scenario/CALL_EOA_SUCCESS_CALLER_WONT_REVERT + ;; scenario/CALL_SMC_FAILURE_CALLER_WILL_REVERT + ;; scenario/CALL_SMC_FAILURE_CALLER_WONT_REVERT + ;; scenario/CALL_SMC_SUCCESS_CALLER_WILL_REVERT + ;; scenario/CALL_SMC_SUCCESS_CALLER_WONT_REVERT + scenario/CALL_PRC_FAILURE + ;; scenario/CALL_PRC_SUCCESS_CALLER_WILL_REVERT + ;; scenario/CALL_PRC_SUCCESS_CALLER_WONT_REVERT + )) + + +;;  CALL/balance_update_required +(defun (scenario-shorthand---CALL---balance-update-required) + (+ + (scenario-shorthand---CALL---externally-owned-account) + (scenario-shorthand---CALL---smart-contract) + (scenario-shorthand---CALL---precompile-success) + ;; scenario/CALL_EXCEPTION + ;; scenario/CALL_ABORT_WILL_REVERT + ;; scenario/CALL_ABORT_WONT_REVERT + ;; scenario/CALL_EOA_SUCCESS_CALLER_WILL_REVERT + ;; scenario/CALL_EOA_SUCCESS_CALLER_WONT_REVERT + ;; scenario/CALL_SMC_FAILURE_CALLER_WILL_REVERT + ;; scenario/CALL_SMC_FAILURE_CALLER_WONT_REVERT + ;; scenario/CALL_SMC_SUCCESS_CALLER_WILL_REVERT + ;; scenario/CALL_SMC_SUCCESS_CALLER_WONT_REVERT + ;; scenario/CALL_PRC_FAILURE + ;; scenario/CALL_PRC_SUCCESS_CALLER_WILL_REVERT + ;; scenario/CALL_PRC_SUCCESS_CALLER_WONT_REVERT + )) + +;;  CALL/requires_both_accounts_twice +(defun (scenario-shorthand---CALL---requires-both-accounts-twice) + (+ + ;; scenario/CALL_EXCEPTION + ;; scenario/CALL_ABORT_WILL_REVERT + ;; scenario/CALL_ABORT_WONT_REVERT + scenario/CALL_EOA_SUCCESS_CALLER_WILL_REVERT + ;; scenario/CALL_EOA_SUCCESS_CALLER_WONT_REVERT + scenario/CALL_SMC_FAILURE_CALLER_WILL_REVERT + scenario/CALL_SMC_FAILURE_CALLER_WONT_REVERT + scenario/CALL_SMC_SUCCESS_CALLER_WILL_REVERT + ;; scenario/CALL_SMC_SUCCESS_CALLER_WONT_REVERT + ;; scenario/CALL_PRC_FAILURE + scenario/CALL_PRC_SUCCESS_CALLER_WILL_REVERT + ;; scenario/CALL_PRC_SUCCESS_CALLER_WONT_REVERT + )) + +;;  CALL/undoes_balance_update_with_failure +(defun (scenario-shorthand---CALL---balance-update-undone-with-callee-failure) + (+ + ;; scenario/CALL_EXCEPTION + ;; scenario/CALL_ABORT_WILL_REVERT + ;; scenario/CALL_ABORT_WONT_REVERT + ;; scenario/CALL_EOA_SUCCESS_CALLER_WILL_REVERT + ;; scenario/CALL_EOA_SUCCESS_CALLER_WONT_REVERT + scenario/CALL_SMC_FAILURE_CALLER_WILL_REVERT + scenario/CALL_SMC_FAILURE_CALLER_WONT_REVERT + ;; scenario/CALL_SMC_SUCCESS_CALLER_WILL_REVERT + ;; scenario/CALL_SMC_SUCCESS_CALLER_WONT_REVERT + ;; scenario/CALL_PRC_FAILURE + ;; scenario/CALL_PRC_SUCCESS_CALLER_WILL_REVERT + ;; scenario/CALL_PRC_SUCCESS_CALLER_WONT_REVERT + )) + +;;  CALL/undoes_balance_update_with_revert +(defun (scenario-shorthand---CALL---balance-update-undone-with-caller-revert) + (+ + ;; scenario/CALL_EXCEPTION + ;; scenario/CALL_ABORT_WILL_REVERT + ;; scenario/CALL_ABORT_WONT_REVERT + scenario/CALL_EOA_SUCCESS_CALLER_WILL_REVERT + ;; scenario/CALL_EOA_SUCCESS_CALLER_WONT_REVERT + ;; scenario/CALL_SMC_FAILURE_CALLER_WILL_REVERT + ;; scenario/CALL_SMC_FAILURE_CALLER_WONT_REVERT + scenario/CALL_SMC_SUCCESS_CALLER_WILL_REVERT + ;; scenario/CALL_SMC_SUCCESS_CALLER_WONT_REVERT + ;; scenario/CALL_PRC_FAILURE + scenario/CALL_PRC_SUCCESS_CALLER_WILL_REVERT + ;; scenario/CALL_PRC_SUCCESS_CALLER_WONT_REVERT + )) + +;; ;;  CALL/ +;; (defun (scenario-shorthand---CALL---) +;; (+ +;; scenario/CALL_EXCEPTION +;; scenario/CALL_ABORT_WILL_REVERT +;; scenario/CALL_ABORT_WONT_REVERT +;; scenario/CALL_EOA_SUCCESS_CALLER_WILL_REVERT +;; scenario/CALL_EOA_SUCCESS_CALLER_WONT_REVERT +;; scenario/CALL_SMC_FAILURE_CALLER_WILL_REVERT +;; scenario/CALL_SMC_FAILURE_CALLER_WONT_REVERT +;; scenario/CALL_SMC_SUCCESS_CALLER_WILL_REVERT +;; scenario/CALL_SMC_SUCCESS_CALLER_WONT_REVERT +;; scenario/CALL_PRC_FAILURE +;; scenario/CALL_PRC_SUCCESS_CALLER_WILL_REVERT +;; scenario/CALL_PRC_SUCCESS_CALLER_WONT_REVERT +;; )) diff --git a/hub/osaka/constraints/scenario-rows/shorthands/create.lisp b/hub/osaka/constraints/scenario-rows/shorthands/create.lisp new file mode 100644 index 000000000..2fb217758 --- /dev/null +++ b/hub/osaka/constraints/scenario-rows/shorthands/create.lisp @@ -0,0 +1,373 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; 10.2 SCEN/CREATE instruction shorthands ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + + + + + +;;  CREATE/not_rebuffed_empty_init_code +(defun (scenario-shorthand---CREATE---not-rebuffed-empty-init-code) + (+ + ;; scenario/CREATE_EXCEPTION + ;; scenario/CREATE_ABORT + ;; scenario/CREATE_FAILURE_CONDITION_WILL_REVERT + ;; scenario/CREATE_FAILURE_CONDITION_WONT_REVERT + scenario/CREATE_EMPTY_INIT_CODE_WILL_REVERT + scenario/CREATE_EMPTY_INIT_CODE_WONT_REVERT + ;; scenario/CREATE_NONEMPTY_INIT_CODE_FAILURE_WILL_REVERT + ;; scenario/CREATE_NONEMPTY_INIT_CODE_FAILURE_WONT_REVERT + ;; scenario/CREATE_NONEMPTY_INIT_CODE_SUCCESS_WILL_REVERT + ;; scenario/CREATE_NONEMPTY_INIT_CODE_SUCCESS_WONT_REVERT + )) + +;;  CREATE/not_rebuffed_nonempty_init_code +(defun (scenario-shorthand---CREATE---not-rebuffed-nonempty-init-code) + (+ + ;; scenario/CREATE_EXCEPTION + ;; scenario/CREATE_ABORT + ;; scenario/CREATE_FAILURE_CONDITION_WILL_REVERT + ;; scenario/CREATE_FAILURE_CONDITION_WONT_REVERT + ;; scenario/CREATE_EMPTY_INIT_CODE_WILL_REVERT + ;; scenario/CREATE_EMPTY_INIT_CODE_WONT_REVERT + scenario/CREATE_NONEMPTY_INIT_CODE_FAILURE_WILL_REVERT + scenario/CREATE_NONEMPTY_INIT_CODE_FAILURE_WONT_REVERT + scenario/CREATE_NONEMPTY_INIT_CODE_SUCCESS_WILL_REVERT + scenario/CREATE_NONEMPTY_INIT_CODE_SUCCESS_WONT_REVERT + )) + +;;  CREATE/not_rebuffed +(defun (scenario-shorthand---CREATE---not-rebuffed) + (+ + (scenario-shorthand---CREATE---not-rebuffed-empty-init-code) + (scenario-shorthand---CREATE---not-rebuffed-nonempty-init-code) + )) + +;;  CREATE/rebuffed +(defun (scenario-shorthand---CREATE---rebuffed) + (+ + scenario/CREATE_EXCEPTION + scenario/CREATE_ABORT + (scenario-shorthand---CREATE---failure-condition) + )) + + + + + + + +;;  CREATE/failure_condition +(defun (scenario-shorthand---CREATE---failure-condition) + (+ + ;; scenario/CREATE_EXCEPTION + ;; scenario/CREATE_ABORT + scenario/CREATE_FAILURE_CONDITION_WILL_REVERT + scenario/CREATE_FAILURE_CONDITION_WONT_REVERT + ;; scenario/CREATE_EMPTY_INIT_CODE_WILL_REVERT + ;; scenario/CREATE_EMPTY_INIT_CODE_WONT_REVERT + ;; scenario/CREATE_NONEMPTY_INIT_CODE_FAILURE_WILL_REVERT + ;; scenario/CREATE_NONEMPTY_INIT_CODE_FAILURE_WONT_REVERT + ;; scenario/CREATE_NONEMPTY_INIT_CODE_SUCCESS_WILL_REVERT + ;; scenario/CREATE_NONEMPTY_INIT_CODE_SUCCESS_WONT_REVERT + )) + +;;  CREATE/unexceptional +(defun (scenario-shorthand---CREATE---unexceptional) + (+ + scenario/CREATE_ABORT + (scenario-shorthand---CREATE---failure-condition) + (scenario-shorthand---CREATE---not-rebuffed) + )) + +;;  CREATE/sum +(defun (scenario-shorthand---CREATE---sum) + (+ + scenario/CREATE_EXCEPTION + (scenario-shorthand---CREATE---unexceptional) + )) + + + + + + + + + + + + +;;  CREATE/compute_deployment_address +(defun (scenario-shorthand---CREATE---compute-deployment-address) + (+ + (scenario-shorthand---CREATE---failure-condition) + (scenario-shorthand---CREATE---not-rebuffed) + )) + +;;  CREATE/load_createe_account +(defun (scenario-shorthand---CREATE---load-createe-account) + (+ + (scenario-shorthand---CREATE---failure-condition) + (scenario-shorthand---CREATE---not-rebuffed) + )) + +;;  CREATE/no_context_change +(defun (scenario-shorthand---CREATE---no-context-change) + (+ + scenario/CREATE_ABORT + (scenario-shorthand---CREATE---failure-condition) + (scenario-shorthand---CREATE---not-rebuffed-empty-init-code) + )) + + + + + + + + + + + + + +;;  CREATE/deployment-success +(defun (scenario-shorthand---CREATE---deployment-success) + (+ + ;; scenario/CREATE_EXCEPTION + ;; scenario/CREATE_ABORT + ;; scenario/CREATE_FAILURE_CONDITION_WILL_REVERT + ;; scenario/CREATE_FAILURE_CONDITION_WONT_REVERT + scenario/CREATE_EMPTY_INIT_CODE_WILL_REVERT + scenario/CREATE_EMPTY_INIT_CODE_WONT_REVERT + ;; scenario/CREATE_NONEMPTY_INIT_CODE_FAILURE_WILL_REVERT + ;; scenario/CREATE_NONEMPTY_INIT_CODE_FAILURE_WONT_REVERT + scenario/CREATE_NONEMPTY_INIT_CODE_SUCCESS_WILL_REVERT + scenario/CREATE_NONEMPTY_INIT_CODE_SUCCESS_WONT_REVERT + )) + +;;  CREATE/deployment_failure +(defun (scenario-shorthand---CREATE---deployment-failure) + (+ + ;; scenario/CREATE_EXCEPTION + ;; scenario/CREATE_ABORT + ;; scenario/CREATE_FAILURE_CONDITION_WILL_REVERT + ;; scenario/CREATE_FAILURE_CONDITION_WONT_REVERT + ;; scenario/CREATE_EMPTY_INIT_CODE_WILL_REVERT + ;; scenario/CREATE_EMPTY_INIT_CODE_WONT_REVERT + scenario/CREATE_NONEMPTY_INIT_CODE_FAILURE_WILL_REVERT + scenario/CREATE_NONEMPTY_INIT_CODE_FAILURE_WONT_REVERT + ;; scenario/CREATE_NONEMPTY_INIT_CODE_SUCCESS_WILL_REVERT + ;; scenario/CREATE_NONEMPTY_INIT_CODE_SUCCESS_WONT_REVERT + )) + + + + + + + + + + + + +;;  CREATE/creator_state_change_will_revert +(defun (scenario-shorthand---CREATE---creator-state-change-will-revert) + (+ + ;; scenario/CREATE_EXCEPTION + ;; scenario/CREATE_ABORT + scenario/CREATE_FAILURE_CONDITION_WILL_REVERT + ;; scenario/CREATE_FAILURE_CONDITION_WONT_REVERT + scenario/CREATE_EMPTY_INIT_CODE_WILL_REVERT + ;; scenario/CREATE_EMPTY_INIT_CODE_WONT_REVERT + scenario/CREATE_NONEMPTY_INIT_CODE_FAILURE_WILL_REVERT + ;; scenario/CREATE_NONEMPTY_INIT_CODE_FAILURE_WONT_REVERT + scenario/CREATE_NONEMPTY_INIT_CODE_SUCCESS_WILL_REVERT + ;; scenario/CREATE_NONEMPTY_INIT_CODE_SUCCESS_WONT_REVERT + )) + +;;  CREATE/creator_state_change_wont_revert +(defun (scenario-shorthand---CREATE---creator-state-change-wont-revert) + (+ + ;; scenario/CREATE_EXCEPTION + ;; scenario/CREATE_ABORT + ;; scenario/CREATE_FAILURE_CONDITION_WILL_REVERT + scenario/CREATE_FAILURE_CONDITION_WONT_REVERT + ;; scenario/CREATE_EMPTY_INIT_CODE_WILL_REVERT + scenario/CREATE_EMPTY_INIT_CODE_WONT_REVERT + ;; scenario/CREATE_NONEMPTY_INIT_CODE_FAILURE_WILL_REVERT + scenario/CREATE_NONEMPTY_INIT_CODE_FAILURE_WONT_REVERT + ;; scenario/CREATE_NONEMPTY_INIT_CODE_SUCCESS_WILL_REVERT + scenario/CREATE_NONEMPTY_INIT_CODE_SUCCESS_WONT_REVERT + )) + +;;  CREATE/creator_state_change +(defun (scenario-shorthand---CREATE---creator-state-change) + (+ + (scenario-shorthand---CREATE---failure-condition) + (scenario-shorthand---CREATE---not-rebuffed) + )) + +;;  CREATE/no_creator_state_change +(defun (scenario-shorthand---CREATE---no-creator-state-change) + (+ + scenario/CREATE_EXCEPTION + scenario/CREATE_ABORT + )) + + + + + + + + + + + + +;;  CREATE/simple_revert +(defun (scenario-shorthand---CREATE---simple-revert) + (+ + ;; scenario/CREATE_EXCEPTION + ;; scenario/CREATE_ABORT + scenario/CREATE_FAILURE_CONDITION_WILL_REVERT + ;; scenario/CREATE_FAILURE_CONDITION_WONT_REVERT + scenario/CREATE_EMPTY_INIT_CODE_WILL_REVERT + ;; scenario/CREATE_EMPTY_INIT_CODE_WONT_REVERT + ;; scenario/CREATE_NONEMPTY_INIT_CODE_FAILURE_WILL_REVERT + ;; scenario/CREATE_NONEMPTY_INIT_CODE_FAILURE_WONT_REVERT + scenario/CREATE_NONEMPTY_INIT_CODE_SUCCESS_WILL_REVERT + ;; scenario/CREATE_NONEMPTY_INIT_CODE_SUCCESS_WONT_REVERT + )) + + +;; ;;  CREATE/execution_will_revert +;; (defun (scenario-shorthand---CREATE---execution-will-revert) +;; (+ +;; ;; scenario/CREATE_EXCEPTION +;; ;; scenario/CREATE_ABORT +;; ;; scenario/CREATE_FAILURE_CONDITION_WILL_REVERT +;; ;; scenario/CREATE_FAILURE_CONDITION_WONT_REVERT +;; scenario/CREATE_EMPTY_INIT_CODE_WILL_REVERT +;; ;; scenario/CREATE_EMPTY_INIT_CODE_WONT_REVERT +;; scenario/CREATE_NONEMPTY_INIT_CODE_FAILURE_WILL_REVERT +;; ;; scenario/CREATE_NONEMPTY_INIT_CODE_FAILURE_WONT_REVERT +;; scenario/CREATE_NONEMPTY_INIT_CODE_SUCCESS_WILL_REVERT +;; ;; scenario/CREATE_NONEMPTY_INIT_CODE_SUCCESS_WONT_REVERT +;; )) +;; +;; ;;  CREATE/execution_wont_revert +;; (defun (scenario-shorthand---CREATE---execution-wont-revert) +;; (+ +;; ;; scenario/CREATE_EXCEPTION +;; ;; scenario/CREATE_ABORT +;; ;; scenario/CREATE_FAILURE_CONDITION_WILL_REVERT +;; ;; scenario/CREATE_FAILURE_CONDITION_WONT_REVERT +;; ;; scenario/CREATE_EMPTY_INIT_CODE_WILL_REVERT +;; scenario/CREATE_EMPTY_INIT_CODE_WONT_REVERT +;; ;; scenario/CREATE_NONEMPTY_INIT_CODE_FAILURE_WILL_REVERT +;; scenario/CREATE_NONEMPTY_INIT_CODE_FAILURE_WONT_REVERT +;; ;; scenario/CREATE_NONEMPTY_INIT_CODE_SUCCESS_WILL_REVERT +;; scenario/CREATE_NONEMPTY_INIT_CODE_SUCCESS_WONT_REVERT +;; )) +;; +;; ;;  CREATE/empty_init_code +;; (defun (scenario-shorthand---CREATE---empty-init-code) +;; (+ +;; ;; scenario/CREATE_EXCEPTION +;; ;; scenario/CREATE_ABORT +;; ;; scenario/CREATE_FAILURE_CONDITION_WILL_REVERT +;; ;; scenario/CREATE_FAILURE_CONDITION_WONT_REVERT +;; scenario/CREATE_EMPTY_INIT_CODE_WILL_REVERT +;; scenario/CREATE_EMPTY_INIT_CODE_WONT_REVERT +;; ;; scenario/CREATE_NONEMPTY_INIT_CODE_FAILURE_WILL_REVERT +;; ;; scenario/CREATE_NONEMPTY_INIT_CODE_FAILURE_WONT_REVERT +;; ;; scenario/CREATE_NONEMPTY_INIT_CODE_SUCCESS_WILL_REVERT +;; ;; scenario/CREATE_NONEMPTY_INIT_CODE_SUCCESS_WONT_REVERT +;; )) +;; +;; ;;  CREATE/nonempty_init_code +;; (defun (scenario-shorthand---CREATE---nonempty-init-code) +;; (+ +;; ;; scenario/CREATE_EXCEPTION +;; ;; scenario/CREATE_ABORT +;; ;; scenario/CREATE_FAILURE_CONDITION_WILL_REVERT +;; ;; scenario/CREATE_FAILURE_CONDITION_WONT_REVERT +;; ;; scenario/CREATE_EMPTY_INIT_CODE_WILL_REVERT +;; ;; scenario/CREATE_EMPTY_INIT_CODE_WONT_REVERT +;; scenario/CREATE_NONEMPTY_INIT_CODE_FAILURE_WILL_REVERT +;; scenario/CREATE_NONEMPTY_INIT_CODE_FAILURE_WONT_REVERT +;; scenario/CREATE_NONEMPTY_INIT_CODE_SUCCESS_WILL_REVERT +;; scenario/CREATE_NONEMPTY_INIT_CODE_SUCCESS_WONT_REVERT +;; )) +;; +;; ;;  CREATE/execution +;; (defun (scenario-shorthand---CREATE---execution) +;; (+ +;; (scenario-shorthand---CREATE---nonempty-init-code) +;; (scenario-shorthand---CREATE---empty-init-code) +;; ;; scenario/CREATE_EXCEPTION +;; ;; scenario/CREATE_ABORT +;; ;; scenario/CREATE_FAILURE_CONDITION_WILL_REVERT +;; ;; scenario/CREATE_FAILURE_CONDITION_WONT_REVERT +;; ;; scenario/CREATE_EMPTY_INIT_CODE_WILL_REVERT +;; ;; scenario/CREATE_EMPTY_INIT_CODE_WONT_REVERT +;; ;; scenario/CREATE_NONEMPTY_INIT_CODE_FAILURE_WILL_REVERT +;; ;; scenario/CREATE_NONEMPTY_INIT_CODE_FAILURE_WONT_REVERT +;; ;; scenario/CREATE_NONEMPTY_INIT_CODE_SUCCESS_WILL_REVERT +;; ;; scenario/CREATE_NONEMPTY_INIT_CODE_SUCCESS_WONT_REVERT +;; )) +;; +;; ;;  CREATE/undo_account_operations +;; (defun (scenario-shorthand---CREATE---undo-account-operations) +;; (+ +;; ;; scenario/CREATE_EXCEPTION +;; ;; scenario/CREATE_ABORT +;; ;; scenario/CREATE_FAILURE_CONDITION_WILL_REVERT +;; ;; scenario/CREATE_FAILURE_CONDITION_WONT_REVERT +;; scenario/CREATE_EMPTY_INIT_CODE_WILL_REVERT +;; ;; scenario/CREATE_EMPTY_INIT_CODE_WONT_REVERT +;; scenario/CREATE_NONEMPTY_INIT_CODE_FAILURE_WILL_REVERT +;; scenario/CREATE_NONEMPTY_INIT_CODE_FAILURE_WONT_REVERT +;; scenario/CREATE_NONEMPTY_INIT_CODE_SUCCESS_WILL_REVERT +;; ;; scenario/CREATE_NONEMPTY_INIT_CODE_SUCCESS_WONT_REVERT +;; )) +;; +;; ;;  CREATE/deployment_success +;; (defun (scenario-shorthand---CREATE---deployment-success) +;; (+ +;; ;; scenario/CREATE_EXCEPTION +;; ;; scenario/CREATE_ABORT +;; ;; scenario/CREATE_FAILURE_CONDITION_WILL_REVERT +;; ;; scenario/CREATE_FAILURE_CONDITION_WONT_REVERT +;; scenario/CREATE_EMPTY_INIT_CODE_WILL_REVERT +;; scenario/CREATE_EMPTY_INIT_CODE_WONT_REVERT +;; ;; scenario/CREATE_NONEMPTY_INIT_CODE_FAILURE_WILL_REVERT +;; ;; scenario/CREATE_NONEMPTY_INIT_CODE_FAILURE_WONT_REVERT +;; scenario/CREATE_NONEMPTY_INIT_CODE_SUCCESS_WILL_REVERT +;; scenario/CREATE_NONEMPTY_INIT_CODE_SUCCESS_WONT_REVERT +;; )) + + +;; ;;  CREATE/ +;; (defun (scenario-shorthand---CREATE---) +;; (+ +;; scenario/CREATE_EXCEPTION +;; scenario/CREATE_ABORT +;; scenario/CREATE_FAILURE_CONDITION_WILL_REVERT +;; scenario/CREATE_FAILURE_CONDITION_WONT_REVERT +;; scenario/CREATE_EMPTY_INIT_CODE_WILL_REVERT +;; scenario/CREATE_EMPTY_INIT_CODE_WONT_REVERT +;; scenario/CREATE_NONEMPTY_INIT_CODE_FAILURE_WILL_REVERT +;; scenario/CREATE_NONEMPTY_INIT_CODE_FAILURE_WONT_REVERT +;; scenario/CREATE_NONEMPTY_INIT_CODE_SUCCESS_WILL_REVERT +;; scenario/CREATE_NONEMPTY_INIT_CODE_SUCCESS_WONT_REVERT +;; )) diff --git a/hub/osaka/constraints/scenario-rows/shorthands/precompile.lisp b/hub/osaka/constraints/scenario-rows/shorthands/precompile.lisp new file mode 100644 index 000000000..bd9f0e141 --- /dev/null +++ b/hub/osaka/constraints/scenario-rows/shorthands/precompile.lisp @@ -0,0 +1,193 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; 10.5 SCEN/PRC instruction shorthands ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;;  PRC/sum +(defun (scenario-shorthand---PRC---common-except-identity-address-bit-sum) + (force-bin (+ scenario/PRC_ECRECOVER + scenario/PRC_SHA2-256 + scenario/PRC_RIPEMD-160 + ;; scenario/PRC_IDENTITY + ;; scenario/PRC_MODEXP + scenario/PRC_ECADD + scenario/PRC_ECMUL + scenario/PRC_ECPAIRING + ;; scenario/PRC_BLAKE2f + ;; scenario/PRC_SUCCESS_CALLER_WILL_REVERT + ;; scenario/PRC_SUCCESS_CALLER_WONT_REVERT + ;; scenario/PRC_FAILURE_KNOWN_TO_HUB + ;; scenario/PRC_FAILURE_KNOWN_TO_RAM + ;; scenario/PRC_POINT_EVALUATION + ;; scenario/PRC_BLS_G1_ADD + ;; scenario/PRC_BLS_G1_MSM + ;; scenario/PRC_BLS_G2_ADD + ;; scenario/PRC_BLS_G2_MSM + ;; scenario/PRC_BLS_PAIRING_CHECK + ;; scenario/PRC_BLS_MAP_FP_TO_G1 + ;; scenario/PRC_BLS_MAP_FP2_TO_G2 + (scenario-shorthand---PRC---common-BLS-address-bit-sum) + ))) + + +;;  PRC/sum +(defun (scenario-shorthand---PRC---common-BLS-address-bit-sum) + (force-bin (+ + ;; scenario/PRC_ECRECOVER + ;; scenario/PRC_SHA2-256 + ;; scenario/PRC_RIPEMD-160 + ;; scenario/PRC_IDENTITY + ;; scenario/PRC_MODEXP + ;; scenario/PRC_ECADD + ;; scenario/PRC_ECMUL + ;; scenario/PRC_ECPAIRING + ;; scenario/PRC_BLAKE2f + ;; scenario/PRC_SUCCESS_CALLER_WILL_REVERT + ;; scenario/PRC_SUCCESS_CALLER_WONT_REVERT + ;; scenario/PRC_FAILURE_KNOWN_TO_HUB + ;; scenario/PRC_FAILURE_KNOWN_TO_RAM + scenario/PRC_POINT_EVALUATION + scenario/PRC_BLS_G1_ADD + scenario/PRC_BLS_G1_MSM + scenario/PRC_BLS_G2_ADD + scenario/PRC_BLS_G2_MSM + scenario/PRC_BLS_PAIRING_CHECK + scenario/PRC_BLS_MAP_FP_TO_G1 + scenario/PRC_BLS_MAP_FP2_TO_G2 + ))) + +(defun (scenario-shorthand---PRC---common-address-bit-sum) + (force-bin (+ (scenario-shorthand---PRC---common-except-identity-address-bit-sum) + scenario/PRC_IDENTITY + ))) + +;;  PRC/sum +(defun (scenario-shorthand---PRC---full-address-bit-sum) + (force-bin (+ (scenario-shorthand---PRC---common-address-bit-sum) + scenario/PRC_MODEXP + scenario/PRC_BLAKE2f + ))) + +;;  PRC/may_only_fail_in_HUB +(defun (scenario-shorthand---PRC---may-only-fail-in-the-HUB) + (force-bin (+ scenario/PRC_ECRECOVER + scenario/PRC_SHA2-256 + scenario/PRC_RIPEMD-160 + scenario/PRC_IDENTITY + ;; scenario/PRC_MODEXP + ;; scenario/PRC_ECADD + ;; scenario/PRC_ECMUL + ;; scenario/PRC_ECPAIRING + ;; scenario/PRC_BLAKE2f + ;; scenario/PRC_SUCCESS_CALLER_WILL_REVERT + ;; scenario/PRC_SUCCESS_CALLER_WONT_REVERT + ;; scenario/PRC_FAILURE_KNOWN_TO_HUB + ;; scenario/PRC_FAILURE_KNOWN_TO_RAM + ))) + +;;  PRC/may_only_fail_in_RAM +(defun (scenario-shorthand---PRC---may-only-fail-in-the-RAM) + (force-bin (+ + ;; scenario/PRC_ECRECOVER + ;; scenario/PRC_SHA2-256 + ;; scenario/PRC_RIPEMD-160 + ;; scenario/PRC_IDENTITY + scenario/PRC_MODEXP + ;; scenario/PRC_ECADD + ;; scenario/PRC_ECMUL + ;; scenario/PRC_ECPAIRING + ;; scenario/PRC_BLAKE2f + ;; scenario/PRC_SUCCESS_CALLER_WILL_REVERT + ;; scenario/PRC_SUCCESS_CALLER_WONT_REVERT + ;; scenario/PRC_FAILURE_KNOWN_TO_HUB + ;; scenario/PRC_FAILURE_KNOWN_TO_RAM + ))) + +;;  PRC/weighted_sum +(defun (scenario-shorthand---PRC---weighted-address-bit-sum) + (+ + (* 1 scenario/PRC_ECRECOVER ) + (* 2 scenario/PRC_SHA2-256 ) + (* 3 scenario/PRC_RIPEMD-160 ) + (* 4 scenario/PRC_IDENTITY ) + (* 5 scenario/PRC_MODEXP ) + (* 6 scenario/PRC_ECADD ) + (* 7 scenario/PRC_ECMUL ) + (* 8 scenario/PRC_ECPAIRING ) + (* 9 scenario/PRC_BLAKE2f ) + (* 10 scenario/PRC_POINT_EVALUATION ) + (* 11 scenario/PRC_BLS_G1_ADD ) + (* 12 scenario/PRC_BLS_G1_MSM ) + (* 13 scenario/PRC_BLS_G2_ADD ) + (* 14 scenario/PRC_BLS_G2_MSM ) + (* 15 scenario/PRC_BLS_PAIRING_CHECK ) + (* 16 scenario/PRC_BLS_MAP_FP_TO_G1 ) + (* 17 scenario/PRC_BLS_MAP_FP2_TO_G2 ) + ;; scenario/PRC_SUCCESS_CALLER_WILL_REVERT + ;; scenario/PRC_SUCCESS_CALLER_WONT_REVERT + ;; scenario/PRC_FAILURE_KNOWN_TO_HUB + ;; scenario/PRC_FAILURE_KNOWN_TO_RAM + )) + +;;  PRC/failure +(defun (scenario-shorthand---PRC---failure) + (force-bin (+ + ;; scenario/PRC_ECRECOVER + ;; scenario/PRC_SHA2-256 + ;; scenario/PRC_RIPEMD-160 + ;; scenario/PRC_IDENTITY + ;; scenario/PRC_MODEXP + ;; scenario/PRC_ECADD + ;; scenario/PRC_ECMUL + ;; scenario/PRC_ECPAIRING + ;; scenario/PRC_BLAKE2f + ;; scenario/PRC_SUCCESS_CALLER_WILL_REVERT + ;; scenario/PRC_SUCCESS_CALLER_WONT_REVERT + scenario/PRC_FAILURE_KNOWN_TO_HUB + scenario/PRC_FAILURE_KNOWN_TO_RAM + ))) + +;;  PRC/success +(defun (scenario-shorthand---PRC---success) + (force-bin (+ + ;; scenario/PRC_ECRECOVER + ;; scenario/PRC_SHA2-256 + ;; scenario/PRC_RIPEMD-160 + ;; scenario/PRC_IDENTITY + ;; scenario/PRC_MODEXP + ;; scenario/PRC_ECADD + ;; scenario/PRC_ECMUL + ;; scenario/PRC_ECPAIRING + ;; scenario/PRC_BLAKE2f + scenario/PRC_SUCCESS_CALLER_WILL_REVERT + scenario/PRC_SUCCESS_CALLER_WONT_REVERT + ;; scenario/PRC_FAILURE_KNOWN_TO_HUB + ;; scenario/PRC_FAILURE_KNOWN_TO_RAM + ))) + +;;  PRC/scenario_sum +(defun (scenario-shorthand---PRC---sum) + (force-bin (+ (scenario-shorthand---PRC---failure) + (scenario-shorthand---PRC---success) + ))) + +;; ;;  PRC/ +;; (defun (scenario-shorthand---PRC---) +;; (+ +;; scenario/PRC_ECRECOVER +;; scenario/PRC_SHA2-256 +;; scenario/PRC_RIPEMD-160 +;; scenario/PRC_IDENTITY +;; scenario/PRC_MODEXP +;; scenario/PRC_ECADD +;; scenario/PRC_ECMUL +;; scenario/PRC_ECPAIRING +;; scenario/PRC_BLAKE2f +;; scenario/PRC_SUCCESS_CALLER_WILL_REVERT +;; scenario/PRC_SUCCESS_CALLER_WONT_REVERT +;; scenario/PRC_FAILURE_KNOWN_TO_HUB +;; scenario/PRC_FAILURE_KNOWN_TO_RAM +;; )) diff --git a/hub/osaka/constraints/scenario-rows/shorthands/return.lisp b/hub/osaka/constraints/scenario-rows/shorthands/return.lisp new file mode 100644 index 000000000..4b5236c95 --- /dev/null +++ b/hub/osaka/constraints/scenario-rows/shorthands/return.lisp @@ -0,0 +1,77 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; 10.2 SCEN/RETURN instruction shorthands ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +;; ;;  RETURN/message_call +(defun (scenario-shorthand---RETURN---message-call) + (+ ;; scenario/RETURN_EXCEPTION + scenario/RETURN_FROM_MESSAGE_CALL_WILL_TOUCH_RAM + scenario/RETURN_FROM_MESSAGE_CALL_WONT_TOUCH_RAM + ;; scenario/RETURN_FROM_DEPLOYMENT_EMPTY_CODE_WILL_REVERT + ;; scenario/RETURN_FROM_DEPLOYMENT_EMPTY_CODE_WONT_REVERT + ;; scenario/RETURN_FROM_DEPLOYMENT_NONEMPTY_CODE_WILL_REVERT + ;; scenario/RETURN_FROM_DEPLOYMENT_NONEMPTY_CODE_WONT_REVERT + )) + +;; ;;  RETURN/empty_deployment +(defun (scenario-shorthand---RETURN---empty-deployment) + (+ ;; scenario/RETURN_EXCEPTION + ;; scenario/RETURN_FROM_MESSAGE_CALL_WILL_TOUCH_RAM + ;; scenario/RETURN_FROM_MESSAGE_CALL_WONT_TOUCH_RAM + scenario/RETURN_FROM_DEPLOYMENT_EMPTY_CODE_WILL_REVERT + scenario/RETURN_FROM_DEPLOYMENT_EMPTY_CODE_WONT_REVERT + ;; scenario/RETURN_FROM_DEPLOYMENT_NONEMPTY_CODE_WILL_REVERT + ;; scenario/RETURN_FROM_DEPLOYMENT_NONEMPTY_CODE_WONT_REVERT + )) + +;; ;;  RETURN/nonempty_deployment +(defun (scenario-shorthand---RETURN---nonempty-deployment) + (+ ;; scenario/RETURN_EXCEPTION + ;; scenario/RETURN_FROM_MESSAGE_CALL_WILL_TOUCH_RAM + ;; scenario/RETURN_FROM_MESSAGE_CALL_WONT_TOUCH_RAM + ;; scenario/RETURN_FROM_DEPLOYMENT_EMPTY_CODE_WILL_REVERT + ;; scenario/RETURN_FROM_DEPLOYMENT_EMPTY_CODE_WONT_REVERT + scenario/RETURN_FROM_DEPLOYMENT_NONEMPTY_CODE_WILL_REVERT + scenario/RETURN_FROM_DEPLOYMENT_NONEMPTY_CODE_WONT_REVERT + )) + +;; ;;  RETURN/deployment +(defun (scenario-shorthand---RETURN---deployment) + (+ (scenario-shorthand---RETURN---empty-deployment) + (scenario-shorthand---RETURN---nonempty-deployment))) + +;; ;;  RETURN/deployment_will_revert +(defun (scenario-shorthand---RETURN---deployment-will-revert) + (+ ;; scenario/RETURN_EXCEPTION + ;; scenario/RETURN_FROM_MESSAGE_CALL_WILL_TOUCH_RAM + ;; scenario/RETURN_FROM_MESSAGE_CALL_WONT_TOUCH_RAM + scenario/RETURN_FROM_DEPLOYMENT_EMPTY_CODE_WILL_REVERT + ;; scenario/RETURN_FROM_DEPLOYMENT_EMPTY_CODE_WONT_REVERT + scenario/RETURN_FROM_DEPLOYMENT_NONEMPTY_CODE_WILL_REVERT + ;; scenario/RETURN_FROM_DEPLOYMENT_NONEMPTY_CODE_WONT_REVERT + )) + +;; ;; NOT A CONSTRAINT +;; (defconstraint BULLSHIT-making-sure-everything-compiles-scenario-shorthand-RETURNs () +;; (begin (vanishes! (scenario-shorthand---RETURN---message-call) ) +;; (vanishes! (scenario-shorthand---RETURN---empty-deployment) ) +;; (vanishes! (scenario-shorthand---RETURN---nonempty-deployment) ) +;; (vanishes! (scenario-shorthand---RETURN---deployment) ) +;; (vanishes! (scenario-shorthand---RETURN---deployment-will-revert) ) +;; (vanishes! (scenario-shorthand---RETURN---unexceptional) ) +;; (vanishes! (scenario-shorthand---RETURN---sum) ))) + +;; ;;  RETURN/unexceptional +(defun (scenario-shorthand---RETURN---unexceptional) + (+ (scenario-shorthand---RETURN---message-call) + (scenario-shorthand---RETURN---deployment))) + +;; ;;  RETURN/sum +(defun (scenario-shorthand---RETURN---sum) + (+ scenario/RETURN_EXCEPTION + (scenario-shorthand---RETURN---unexceptional))) diff --git a/hub/osaka/constraints/scenario-rows/shorthands/selfdestruct.lisp b/hub/osaka/constraints/scenario-rows/shorthands/selfdestruct.lisp new file mode 100644 index 000000000..6d17645cd --- /dev/null +++ b/hub/osaka/constraints/scenario-rows/shorthands/selfdestruct.lisp @@ -0,0 +1,19 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; 10.5 SCEN/PRC instruction shorthands ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;;  SELFDESTRUCT/wont_revert +(defun (scenario-shorthand---SELFDESTRUCT---wont-revert) (+ scenario/SELFDESTRUCT_WONT_REVERT_ALREADY_MARKED + scenario/SELFDESTRUCT_WONT_REVERT_NOT_YET_MARKED)) + +;;  SELFDESTRUCT/unexceptional +(defun (scenario-shorthand---SELFDESTRUCT---unexceptional) (+ scenario/SELFDESTRUCT_WILL_REVERT + (scenario-shorthand---SELFDESTRUCT---wont-revert))) + +;;  SELFDESTRUCT/sum +(defun (scenario-shorthand---SELFDESTRUCT---sum) (+ scenario/SELFDESTRUCT_EXCEPTION + (scenario-shorthand---SELFDESTRUCT---unexceptional))) diff --git a/hub/osaka/constraints/stack-patterns/0-0-stack-pattern.lisp b/hub/osaka/constraints/stack-patterns/0-0-stack-pattern.lisp new file mode 100644 index 000000000..6e1302c8a --- /dev/null +++ b/hub/osaka/constraints/stack-patterns/0-0-stack-pattern.lisp @@ -0,0 +1,22 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; 5 Stack patterns ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; 5.5 (0,0)-StackPattern ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (stack-pattern-0-0) + (begin + (empty-stack-pattern) + (debug (eq! HEIGHT_NEW HEIGHT)))) + diff --git a/hub/osaka/constraints/stack-patterns/0-1-stack-pattern.lisp b/hub/osaka/constraints/stack-patterns/0-1-stack-pattern.lisp new file mode 100644 index 000000000..b81ca7f34 --- /dev/null +++ b/hub/osaka/constraints/stack-patterns/0-1-stack-pattern.lisp @@ -0,0 +1,32 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; 5 Stack patterns ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; 5.8 (0,1)-StackPattern ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (stack-pattern-0-1) + (begin + ;; stack item 1: + (empty-stack-item 1) + ;; stack item 2: + (empty-stack-item 2) + ;; stack item 3: + (empty-stack-item 3) + ;; stack item 4: + (inc-frst-row-stack-item-X-height-by-Y 4 1) + (push-frst-row-stack-item 4) + (set-frst-row-stack-item-stamp 4 0) + ;; height update; + (debug (eq! HEIGHT_NEW (+ HEIGHT 1))))) + diff --git a/hub/osaka/constraints/stack-patterns/1-0-stack-pattern.lisp b/hub/osaka/constraints/stack-patterns/1-0-stack-pattern.lisp new file mode 100644 index 000000000..496b31b37 --- /dev/null +++ b/hub/osaka/constraints/stack-patterns/1-0-stack-pattern.lisp @@ -0,0 +1,32 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; 5 Stack patterns ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; 5.6 (1,0)-StackPattern ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (stack-pattern-1-0) + (begin + ;; stack item 1: + (inc-frst-row-stack-item-X-height-by-Y 1 0) + (pop-frst-row-stack-item 1) + (set-frst-row-stack-item-stamp 1 0) + ;; stack item 2: + (empty-stack-item 2) + ;; stack item 3: + (empty-stack-item 3) + ;; stack item 4: + (empty-stack-item 4) + ;; height update; + (debug (eq! HEIGHT_NEW (- HEIGHT 1))))) + diff --git a/hub/osaka/constraints/stack-patterns/1-1-stack-pattern.lisp b/hub/osaka/constraints/stack-patterns/1-1-stack-pattern.lisp new file mode 100644 index 000000000..38b9b87e6 --- /dev/null +++ b/hub/osaka/constraints/stack-patterns/1-1-stack-pattern.lisp @@ -0,0 +1,34 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; 5 Stack patterns ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; 5.9 (1,1)-StackPattern ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (stack-pattern-1-1) + (begin + ;; stack item 1: + (inc-frst-row-stack-item-X-height-by-Y 1 0) + (pop-frst-row-stack-item 1) + (set-frst-row-stack-item-stamp 1 0) + ;; stack item 2: + (empty-stack-item 2) + ;; stack item 3: + (empty-stack-item 3) + ;; stack item 4: + (inc-frst-row-stack-item-X-height-by-Y 4 0) + (push-frst-row-stack-item 4) + (set-frst-row-stack-item-stamp 4 1) + ;; height update; + (debug (eq! HEIGHT_NEW HEIGHT)))) + diff --git a/hub/osaka/constraints/stack-patterns/2-0-stack-pattern.lisp b/hub/osaka/constraints/stack-patterns/2-0-stack-pattern.lisp new file mode 100644 index 000000000..0d6aab471 --- /dev/null +++ b/hub/osaka/constraints/stack-patterns/2-0-stack-pattern.lisp @@ -0,0 +1,34 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; 5 Stack patterns ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; 5.7 (2,0)-StackPattern ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (stack-pattern-2-0) + (begin + ;; stack item 1: + (inc-frst-row-stack-item-X-height-by-Y 1 0) + (pop-frst-row-stack-item 1) + (set-frst-row-stack-item-stamp 1 0) + ;; stack item 2: + (dec-frst-row-stack-item-X-height-by-Y 2 1) + (pop-frst-row-stack-item 2) + (set-frst-row-stack-item-stamp 2 1) + ;; stack item 3: + (empty-stack-item 3) + ;; stack item 4: + (empty-stack-item 4) + ;; height update; + (debug (eq! HEIGHT_NEW (- HEIGHT 2))))) + diff --git a/hub/osaka/constraints/stack-patterns/2-1-stack-pattern.lisp b/hub/osaka/constraints/stack-patterns/2-1-stack-pattern.lisp new file mode 100644 index 000000000..1b18155fb --- /dev/null +++ b/hub/osaka/constraints/stack-patterns/2-1-stack-pattern.lisp @@ -0,0 +1,36 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; 5 Stack patterns ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; 5.10 (2,1)-StackPattern ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (stack-pattern-2-1) + (begin + ;; stack item 1: + (inc-frst-row-stack-item-X-height-by-Y 1 0) + (pop-frst-row-stack-item 1) + (set-frst-row-stack-item-stamp 1 0) + ;; stack item 2: + (dec-frst-row-stack-item-X-height-by-Y 2 1) + (pop-frst-row-stack-item 2) + (set-frst-row-stack-item-stamp 2 1) + ;; stack item 3: + (empty-stack-item 3) + ;; stack item 4: + (dec-frst-row-stack-item-X-height-by-Y 4 1) + (push-frst-row-stack-item 4) + (set-frst-row-stack-item-stamp 4 2) + ;; height update; + (debug (eq! HEIGHT_NEW (- HEIGHT 1))))) + diff --git a/hub/osaka/constraints/stack-patterns/3-0-stack-pattern.lisp b/hub/osaka/constraints/stack-patterns/3-0-stack-pattern.lisp new file mode 100644 index 000000000..d4b9a2ab2 --- /dev/null +++ b/hub/osaka/constraints/stack-patterns/3-0-stack-pattern.lisp @@ -0,0 +1,35 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; 5 Stack patterns ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; 5.X (3,0)-StackPattern ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (stack-pattern-3-0) + (begin + ;; stack item 1: + (inc-frst-row-stack-item-X-height-by-Y 1 0) + (pop-frst-row-stack-item 1) + (set-frst-row-stack-item-stamp 1 0) + ;; stack item 2: + (dec-frst-row-stack-item-X-height-by-Y 2 1) + (pop-frst-row-stack-item 2) + (set-frst-row-stack-item-stamp 2 1) + ;; stack item 3: + (dec-frst-row-stack-item-X-height-by-Y 3 2) + (pop-frst-row-stack-item 3) + (set-frst-row-stack-item-stamp 3 2) + ;; stack item 4: + (empty-stack-item 4) + ;; height update; + (debug (eq! HEIGHT_NEW (- HEIGHT 2))))) diff --git a/hub/osaka/constraints/stack-patterns/3-1-stack-pattern.lisp b/hub/osaka/constraints/stack-patterns/3-1-stack-pattern.lisp new file mode 100644 index 000000000..9edacff6d --- /dev/null +++ b/hub/osaka/constraints/stack-patterns/3-1-stack-pattern.lisp @@ -0,0 +1,38 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; 5 Stack patterns ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; 5.11 (3,1)-StackPattern ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (stack-pattern-3-1) + (begin + ;; stack item 1: + (inc-frst-row-stack-item-X-height-by-Y 1 0) + (pop-frst-row-stack-item 1) + (set-frst-row-stack-item-stamp 1 0) + ;; stack item 2: + (dec-frst-row-stack-item-X-height-by-Y 2 1) + (pop-frst-row-stack-item 2) + (set-frst-row-stack-item-stamp 2 1) + ;; stack item 3: + (dec-frst-row-stack-item-X-height-by-Y 3 2) + (pop-frst-row-stack-item 3) + (set-frst-row-stack-item-stamp 3 2) + ;; stack item 4: + (dec-frst-row-stack-item-X-height-by-Y 4 2) + (push-frst-row-stack-item 4) + (set-frst-row-stack-item-stamp 4 3) + ;; height update; + (debug (eq! HEIGHT_NEW (- HEIGHT 2))))) + diff --git a/hub/osaka/constraints/stack-patterns/_helpers.lisp b/hub/osaka/constraints/stack-patterns/_helpers.lisp new file mode 100644 index 000000000..d6f7d24d6 --- /dev/null +++ b/hub/osaka/constraints/stack-patterns/_helpers.lisp @@ -0,0 +1,39 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; 5 Stack patterns ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; 5.3 emptyStackItem_k ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (empty-stack-item k) + (begin + (vanishes! [ stack/STACK_ITEM_HEIGHT k ]) + (vanishes! [ stack/STACK_ITEM_POP k ]) + (debug (vanishes! [ stack/STACK_ITEM_VALUE_HI k ])) + (debug (vanishes! [ stack/STACK_ITEM_VALUE_LO k ])) + (vanishes! [ stack/STACK_ITEM_STAMP k ]) + )) + +;; current row +(defun (set-frst-row-stack-item-stamp k offset ) (eq! [ stack/STACK_ITEM_STAMP k ] (+ (* MULTIPLIER___STACK_STAMP HUB_STAMP) offset) )) +(defun (pop-frst-row-stack-item k ) (eq! [ stack/STACK_ITEM_POP k ] 1 )) +(defun (push-frst-row-stack-item k ) (eq! [ stack/STACK_ITEM_POP k ] 0 )) +(defun (inc-frst-row-stack-item-X-height-by-Y k increment) (eq! [ stack/STACK_ITEM_HEIGHT k ] (+ HEIGHT increment) )) +(defun (dec-frst-row-stack-item-X-height-by-Y k decrement) (eq! [ stack/STACK_ITEM_HEIGHT k ] (- HEIGHT decrement) )) ;; "" + +;; next row +(defun (set-scnd-row-stack-item-stamp k offset ) (eq! (next [ stack/STACK_ITEM_STAMP k ]) (+ (* MULTIPLIER___STACK_STAMP HUB_STAMP) offset) )) +(defun (pop-scnd-row-stack-item k ) (eq! (next [ stack/STACK_ITEM_POP k ]) 1 )) +(defun (push-scnd-row-stack-item k ) (eq! (next [ stack/STACK_ITEM_POP k ]) 0 )) +(defun (inc-scnd-row-stack-item-X-height-by-Y k increment) (eq! (next [ stack/STACK_ITEM_HEIGHT k ]) (+ HEIGHT increment) )) +(defun (dec-scnd-row-stack-item-X-height-by-Y k decrement) (eq! (next [ stack/STACK_ITEM_HEIGHT k ]) (- HEIGHT decrement) )) ;; "" + diff --git a/hub/osaka/constraints/stack-patterns/call-stack-pattern.lisp b/hub/osaka/constraints/stack-patterns/call-stack-pattern.lisp new file mode 100644 index 000000000..942468d4f --- /dev/null +++ b/hub/osaka/constraints/stack-patterns/call-stack-pattern.lisp @@ -0,0 +1,57 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; 5 Stack patterns ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; 5.17 callStackPattern[b] ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (call-stack-pattern (b :binary)) + (begin + ;; stack item 1: + (dec-frst-row-stack-item-X-height-by-Y 1 (+ 2 b)) + (pop-frst-row-stack-item 1) + (set-frst-row-stack-item-stamp 1 3) + ;; stack item 2: + (dec-frst-row-stack-item-X-height-by-Y 2 (+ 3 b)) + (pop-frst-row-stack-item 2) + (set-frst-row-stack-item-stamp 2 4) + ;; stack item 3: + (dec-frst-row-stack-item-X-height-by-Y 3 (+ 4 b)) + (pop-frst-row-stack-item 3) + (set-frst-row-stack-item-stamp 3 5) + ;; stack item 4: + (dec-frst-row-stack-item-X-height-by-Y 4 (+ 5 b)) + (pop-frst-row-stack-item 4) + (set-frst-row-stack-item-stamp 4 6) + ;; height update; + (debug (eq! HEIGHT_NEW (- HEIGHT 5 b))) + ;; stack item 5; + (dec-scnd-row-stack-item-X-height-by-Y 1 0) + (pop-scnd-row-stack-item 1) + (set-scnd-row-stack-item-stamp 1 0) + ;; stack item 6; + (dec-scnd-row-stack-item-X-height-by-Y 2 1) + (pop-scnd-row-stack-item 2) + (set-scnd-row-stack-item-stamp 2 1) + ;; stack item 7; + (will-eq! [ stack/STACK_ITEM_HEIGHT 3 ] (* b (- HEIGHT 2))) + (will-eq! [ stack/STACK_ITEM_POP 3 ] b ) + (will-eq! [ stack/STACK_ITEM_STAMP 3 ] (* b (+ (* MULTIPLIER___STACK_STAMP HUB_STAMP) 2))) + ;; stack item 8; + (dec-scnd-row-stack-item-X-height-by-Y 4 (+ 5 b)) + (push-scnd-row-stack-item 4) + (set-scnd-row-stack-item-stamp 4 7) + (vanishes! (next [ stack/STACK_ITEM_VALUE_HI 4 ])) + (is-binary (next [ stack/STACK_ITEM_VALUE_LO 4 ])) + ) + ) diff --git a/hub/osaka/constraints/stack-patterns/copy-stack-pattern.lisp b/hub/osaka/constraints/stack-patterns/copy-stack-pattern.lisp new file mode 100644 index 000000000..2611b9812 --- /dev/null +++ b/hub/osaka/constraints/stack-patterns/copy-stack-pattern.lisp @@ -0,0 +1,39 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; 5 Stack patterns ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; 5.16 copyStackPattern[b] ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (copy-stack-pattern (b :binary)) + (begin + ;; stack item 1: + (dec-frst-row-stack-item-X-height-by-Y 1 b) + (pop-frst-row-stack-item 1) + (set-frst-row-stack-item-stamp 1 1) + ;; stack item 2: + (dec-frst-row-stack-item-X-height-by-Y 2 (+ 2 b)) + (pop-frst-row-stack-item 2) + (set-frst-row-stack-item-stamp 2 2) + ;; stack item 3: + (dec-frst-row-stack-item-X-height-by-Y 3 (+ 1 b)) + (pop-frst-row-stack-item 3) + (set-frst-row-stack-item-stamp 3 3) + ;; stack item 4: + (eq! [ stack/STACK_ITEM_HEIGHT 4 ] (* b HEIGHT)) + (eq! [ stack/STACK_ITEM_POP 4 ] b) + (eq! [ stack/STACK_ITEM_STAMP 4 ] (* b MULTIPLIER___STACK_STAMP HUB_STAMP)) + ;; height update; + (debug (eq! HEIGHT_NEW (- HEIGHT 3 b))) + )) + diff --git a/hub/osaka/constraints/stack-patterns/create-stack-pattern.lisp b/hub/osaka/constraints/stack-patterns/create-stack-pattern.lisp new file mode 100644 index 000000000..1ebceb8a4 --- /dev/null +++ b/hub/osaka/constraints/stack-patterns/create-stack-pattern.lisp @@ -0,0 +1,49 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; 5 Stack patterns ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; 5.18 createStackPattern[b] ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (create-stack-pattern (b :binary)) + (begin + ;; stack item 1: + (dec-frst-row-stack-item-X-height-by-Y 1 1) + (pop-frst-row-stack-item 1) + (set-frst-row-stack-item-stamp 1 1) + ;; stack item 2: + (dec-frst-row-stack-item-X-height-by-Y 2 2) + (pop-frst-row-stack-item 2) + (set-frst-row-stack-item-stamp 2 2) + ;; stack item 3: + (empty-stack-item 3) + ;; stack item 4: + (empty-stack-item 4) + ;; height update; + (debug (eq! HEIGHT_NEW (- HEIGHT 2 b))) + ;; stack item 5; + (next (empty-stack-item 1)) + ;; stack item 6; + (will-eq! [ stack/STACK_ITEM_HEIGHT 2 ] (* b (- HEIGHT 3))) + (will-eq! [ stack/STACK_ITEM_POP 2 ] b) + (will-eq! [ stack/STACK_ITEM_STAMP 2 ] (* b (+ (* MULTIPLIER___STACK_STAMP HUB_STAMP) 3))) + ;; stack item 7; + (dec-scnd-row-stack-item-X-height-by-Y 3 0) + (pop-scnd-row-stack-item 3) + (set-scnd-row-stack-item-stamp 3 0) + ;; stack item 8; + (dec-scnd-row-stack-item-X-height-by-Y 4 (+ 2 b)) + (push-scnd-row-stack-item 4) + (set-scnd-row-stack-item-stamp 4 4) + )) + diff --git a/hub/osaka/constraints/stack-patterns/dup-stack-pattern.lisp b/hub/osaka/constraints/stack-patterns/dup-stack-pattern.lisp new file mode 100644 index 000000000..6ecf6a5d5 --- /dev/null +++ b/hub/osaka/constraints/stack-patterns/dup-stack-pattern.lisp @@ -0,0 +1,40 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; 5 Stack patterns ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; 5.13 dupStackPattern[param] ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (dup-stack-pattern param) + (begin + ;; stack item 1: + (dec-frst-row-stack-item-X-height-by-Y 1 param) + (pop-frst-row-stack-item 1) + (set-frst-row-stack-item-stamp 1 0) + ;; stack item 2: + (dec-frst-row-stack-item-X-height-by-Y 2 param) + (push-frst-row-stack-item 2) + (set-frst-row-stack-item-stamp 2 1) + (eq! [ stack/STACK_ITEM_VALUE_HI 2 ] [ stack/STACK_ITEM_VALUE_HI 1 ]) + (eq! [ stack/STACK_ITEM_VALUE_LO 2 ] [ stack/STACK_ITEM_VALUE_LO 1 ]) + ;; stack item 3: + (empty-stack-item 3) + ;; stack item 4: + (inc-frst-row-stack-item-X-height-by-Y 4 1) + (push-frst-row-stack-item 4) + (set-frst-row-stack-item-stamp 4 2) + (eq! [ stack/STACK_ITEM_VALUE_HI 4 ] [ stack/STACK_ITEM_VALUE_HI 1 ]) + (eq! [ stack/STACK_ITEM_VALUE_LO 4 ] [ stack/STACK_ITEM_VALUE_LO 1 ]) + ;; height update; + (debug (eq! HEIGHT_NEW (+ HEIGHT 1))))) + diff --git a/hub/osaka/constraints/stack-patterns/empty-stack-pattern.lisp b/hub/osaka/constraints/stack-patterns/empty-stack-pattern.lisp new file mode 100644 index 000000000..d8ddf2564 --- /dev/null +++ b/hub/osaka/constraints/stack-patterns/empty-stack-pattern.lisp @@ -0,0 +1,18 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; 5 Stack patterns ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; 5.4 emptyStackPattern ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (empty-stack-pattern) (for k [4] (empty-stack-item k))) ;; "" diff --git a/hub/osaka/constraints/stack-patterns/load-store-stack-pattern.lisp b/hub/osaka/constraints/stack-patterns/load-store-stack-pattern.lisp new file mode 100644 index 000000000..489330c13 --- /dev/null +++ b/hub/osaka/constraints/stack-patterns/load-store-stack-pattern.lisp @@ -0,0 +1,34 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; 5 Stack patterns ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; 5.12 loadStoreStackPattern[b] ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (load-store-stack-pattern (b :binary)) + (begin + ;; stack item 1: + (inc-frst-row-stack-item-X-height-by-Y 1 0) + (pop-frst-row-stack-item 1) + (set-frst-row-stack-item-stamp 1 0) + ;; stack item 2: + (empty-stack-item 2) + ;; stack item 3: + (empty-stack-item 3) + ;; stack item 4: + (dec-frst-row-stack-item-X-height-by-Y 4 b) + (eq! [ stack/STACK_ITEM_POP 4 ] b) + (set-frst-row-stack-item-stamp 4 1) + ;; height update; + (debug (eq! HEIGHT_NEW (- HEIGHT b b))))) + diff --git a/hub/osaka/constraints/stack-patterns/log-stack-pattern.lisp b/hub/osaka/constraints/stack-patterns/log-stack-pattern.lisp new file mode 100644 index 000000000..560a0d05a --- /dev/null +++ b/hub/osaka/constraints/stack-patterns/log-stack-pattern.lisp @@ -0,0 +1,54 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; 5 Stack patterns ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; 5.15 logStackPattern[param, b1, b2, b3, b4] ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (b-sum-1 b1 b2 b3 b4) (+ b1 b2 b3 b4)) +(defun (b-sum-2 b2 b3 b4) (+ b2 b3 b4)) +(defun (b-sum-3 b3 b4) (+ b3 b4)) +(defun (b-sum-4 b4) b4 ) + +(defun (log-stack-pattern param (b1 :binary) (b2 :binary) (b3 :binary) (b4 :binary)) + (begin + ;; stack item 1: + (dec-frst-row-stack-item-X-height-by-Y 1 0) + (pop-frst-row-stack-item 1) + (set-frst-row-stack-item-stamp 1 0) + ;; stack item 2: + (dec-frst-row-stack-item-X-height-by-Y 2 1) + (pop-frst-row-stack-item 2) + (set-frst-row-stack-item-stamp 2 1) + ;; stack item 3: + (empty-stack-item 3) + ;; stack item 4: + (empty-stack-item 4) + ;; height update; + (debug (eq! HEIGHT_NEW (- HEIGHT param 2))) + ;; stack item 5: + (will-eq! [ stack/STACK_ITEM_HEIGHT 1 ] (* (b-sum-1 b1 b2 b3 b4) (- HEIGHT 2))) + (will-eq! [ stack/STACK_ITEM_POP 1 ] (b-sum-1 b1 b2 b3 b4)) + (will-eq! [ stack/STACK_ITEM_STAMP 1 ] (* (b-sum-1 b1 b2 b3 b4) (+ (* MULTIPLIER___STACK_STAMP HUB_STAMP) 2))) + ;; stack item 6: + (will-eq! [ stack/STACK_ITEM_HEIGHT 2 ] (* (b-sum-2 b2 b3 b4) (- HEIGHT 3))) + (will-eq! [ stack/STACK_ITEM_POP 2 ] (b-sum-2 b2 b3 b4)) + (will-eq! [ stack/STACK_ITEM_STAMP 2 ] (* (b-sum-2 b2 b3 b4) (+ (* MULTIPLIER___STACK_STAMP HUB_STAMP) 3))) + ;; stack item 7: + (will-eq! [ stack/STACK_ITEM_HEIGHT 3 ] (* (b-sum-3 b3 b4) (- HEIGHT 4))) + (will-eq! [ stack/STACK_ITEM_POP 3 ] (b-sum-3 b3 b4)) + (will-eq! [ stack/STACK_ITEM_STAMP 3 ] (* (b-sum-3 b3 b4) (+ (* MULTIPLIER___STACK_STAMP HUB_STAMP) 4))) + ;; stack item 8: + (will-eq! [ stack/STACK_ITEM_HEIGHT 4 ] (* (b-sum-4 b4) (- HEIGHT 5))) + (will-eq! [ stack/STACK_ITEM_POP 4 ] (b-sum-4 b4)) + (will-eq! [ stack/STACK_ITEM_STAMP 4 ] (* (b-sum-4 b4) (+ (* MULTIPLIER___STACK_STAMP HUB_STAMP) 5))))) diff --git a/hub/osaka/constraints/stack-patterns/request-hash.lisp b/hub/osaka/constraints/stack-patterns/request-hash.lisp new file mode 100644 index 000000000..ed4682b9e --- /dev/null +++ b/hub/osaka/constraints/stack-patterns/request-hash.lisp @@ -0,0 +1,22 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; 5 Stack patterns ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; 5. requestHash and maybeRequestHash ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defun (maybe-request-hash relative_offset bit) (eq! (shift stack/HASH_INFO_FLAG relative_offset) + bit)) + +(defun (request-hash relative_offset) (maybe-request-hash relative_offset 1)) diff --git a/hub/osaka/constraints/stack-patterns/swap-stack-pattern.lisp b/hub/osaka/constraints/stack-patterns/swap-stack-pattern.lisp new file mode 100644 index 000000000..f61cf21db --- /dev/null +++ b/hub/osaka/constraints/stack-patterns/swap-stack-pattern.lisp @@ -0,0 +1,42 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; 5 Stack patterns ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; 5.14 swapStackPattern[param] ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (swap-stack-pattern param) + (begin + ;; stack item 1: + (dec-frst-row-stack-item-X-height-by-Y 1 param) + (pop-frst-row-stack-item 1) + (set-frst-row-stack-item-stamp 1 0) + ;; stack item 2: + (inc-frst-row-stack-item-X-height-by-Y 2 0) + (pop-frst-row-stack-item 2) + (set-frst-row-stack-item-stamp 2 1) + ;; stack item 3: + (dec-frst-row-stack-item-X-height-by-Y 3 param) + (push-frst-row-stack-item 3) + (set-frst-row-stack-item-stamp 3 2) + (eq! [ stack/STACK_ITEM_VALUE_HI 3 ] [ stack/STACK_ITEM_VALUE_HI 2 ]) + (eq! [ stack/STACK_ITEM_VALUE_LO 3 ] [ stack/STACK_ITEM_VALUE_LO 2 ]) + ;; stack item 4: + (inc-frst-row-stack-item-X-height-by-Y 4 0) + (push-frst-row-stack-item 4) + (set-frst-row-stack-item-stamp 4 3) + (eq! [ stack/STACK_ITEM_VALUE_HI 4 ] [ stack/STACK_ITEM_VALUE_HI 1 ]) + (eq! [ stack/STACK_ITEM_VALUE_LO 4 ] [ stack/STACK_ITEM_VALUE_LO 1 ]) + ;; height update; + (debug (eq! HEIGHT_NEW HEIGHT)))) + diff --git a/hub/osaka/constraints/storage-rows/specialized.lisp b/hub/osaka/constraints/storage-rows/specialized.lisp new file mode 100644 index 000000000..ca0387f69 --- /dev/null +++ b/hub/osaka/constraints/storage-rows/specialized.lisp @@ -0,0 +1,101 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.1 Storage-rows ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.1.5 Specialized constraints ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (storage-reading kappa) + (begin (eq! (shift storage/VALUE_CURR_HI kappa) (shift storage/VALUE_NEXT_HI kappa)) + (eq! (shift storage/VALUE_CURR_LO kappa) (shift storage/VALUE_NEXT_LO kappa)))) + +(defun (storage-turn-on-warmth kappa) + (eq! (shift storage/WARMTH_NEW kappa) 1)) + +(defun (storage-same-warmth kappa) + (eq! (shift storage/WARMTH_NEW kappa) + (shift storage/WARMTH kappa))) + +(defun (storage-same-slot kappa) + (begin (remained-constant! (shift storage/ADDRESS_HI kappa) ) + (remained-constant! (shift storage/ADDRESS_LO kappa) ) + (remained-constant! (shift storage/STORAGE_KEY_LO kappa) ) + (remained-constant! (shift storage/STORAGE_KEY_HI kappa) ) + (remained-constant! (shift storage/DEPLOYMENT_NUMBER kappa) ))) + +(defun (undo-storage-warmth-update kappa) + (begin (shift (was-eq! storage/WARMTH_NEW storage/WARMTH ) kappa) + (shift (was-eq! storage/WARMTH storage/WARMTH_NEW) kappa))) + +(defun (undo-storage-value-update kappa) + (begin (shift (was-eq! storage/VALUE_NEXT_HI storage/VALUE_CURR_HI) kappa) + (shift (was-eq! storage/VALUE_NEXT_LO storage/VALUE_CURR_LO) kappa) + (shift (was-eq! storage/VALUE_CURR_HI storage/VALUE_NEXT_HI) kappa) + (shift (was-eq! storage/VALUE_CURR_LO storage/VALUE_NEXT_LO) kappa))) + +(defun (undo-storage-warmth-and-value-update kappa) + (begin (undo-storage-warmth-update kappa) + (undo-storage-value-update kappa))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.1.5 Binary columns for gas cost ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defconstraint setting-storage-binary-flag-VALUE_ORIG_IS_ZERO (:perspective storage) + (begin + (if-not-zero VALUE_ORIG_HI + (vanishes! VALUE_ORIG_IS_ZERO) + (if-not-zero VALUE_ORIG_LO + (vanishes! VALUE_ORIG_IS_ZERO) + (eq! VALUE_ORIG_IS_ZERO 1))))) + +(defconstraint setting-storage-binary-flag-VALUE_CURR_IS_ZERO (:perspective storage) + (begin + (if-not-zero VALUE_CURR_HI + (vanishes! VALUE_CURR_IS_ZERO) + (if-not-zero VALUE_CURR_LO + (vanishes! VALUE_CURR_IS_ZERO) + (eq! VALUE_CURR_IS_ZERO 1))))) + +(defconstraint setting-storage-binary-flag-VALUE_NEXT_IS_ZERO (:perspective storage) + (begin + (if-not-zero VALUE_NEXT_HI + (vanishes! VALUE_NEXT_IS_ZERO) + (if-not-zero VALUE_NEXT_LO + (vanishes! VALUE_NEXT_IS_ZERO) + (eq! VALUE_NEXT_IS_ZERO 1))))) + +(defconstraint setting-storage-binary-flag-VALUE_CURR_IS_ORIG (:perspective storage) + (begin + (if-not-zero (- VALUE_CURR_HI VALUE_ORIG_HI) + (vanishes! VALUE_CURR_IS_ORIG) + (if-not-zero (- VALUE_CURR_LO VALUE_ORIG_LO) + (vanishes! VALUE_CURR_IS_ORIG) + (eq! VALUE_CURR_IS_ORIG 1))))) + +(defconstraint setting-storage-binary-flag-VALUE_NEXT_IS_CURR (:perspective storage) + (begin + (if-not-zero (- VALUE_NEXT_HI VALUE_CURR_HI) + (vanishes! VALUE_NEXT_IS_CURR) + (if-not-zero (- VALUE_NEXT_LO VALUE_CURR_LO) + (vanishes! VALUE_NEXT_IS_CURR) + (eq! VALUE_NEXT_IS_CURR 1))))) + +(defconstraint setting-storage-binary-flag-VALUE_NEXT_IS_ORIG (:perspective storage) + (begin + (if-not-zero (- VALUE_NEXT_HI VALUE_ORIG_HI) + (vanishes! VALUE_NEXT_IS_ORIG) + (if-not-zero (- VALUE_NEXT_LO VALUE_ORIG_LO) + (vanishes! VALUE_NEXT_IS_ORIG) + (eq! VALUE_NEXT_IS_ORIG 1))))) diff --git a/hub/osaka/constraints/system/block_number/block_number.lisp b/hub/osaka/constraints/system/block_number/block_number.lisp new file mode 100644 index 000000000..b6bf1c3ba --- /dev/null +++ b/hub/osaka/constraints/system/block_number/block_number.lisp @@ -0,0 +1,21 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y The BLK_NUMBER column ;; +;; X.Y.Z BLK_NUMBER constraints ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstraint BLK_NUMBER-constraints---transaction-constancy () + (transaction-constancy BLK_NUMBER)) + +(defconstraint BLK_NUMBER-constraints---initialization (:domain {0}) ;; "" + (vanishes! BLK_NUMBER)) + +(defconstraint BLK_NUMBER-constraints---increments () + (will-inc! BLK_NUMBER (system-block-number---about-to-enter-sysi))) + +(defproperty BLK_NUMBER-constraints---0-1-increments + (has-0-1-increments BLK_NUMBER)) diff --git a/hub/osaka/constraints/system/block_number/shorthands.lisp b/hub/osaka/constraints/system/block_number/shorthands.lisp new file mode 100644 index 000000000..a5d6e5ba1 --- /dev/null +++ b/hub/osaka/constraints/system/block_number/shorthands.lisp @@ -0,0 +1,19 @@ +(module hub) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y The BLK_NUMBER column ;; +;; X.Y.Z Shorthands ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (zero-now-one-next col) (* (- 1 col) (next col))) + +(defun (system-block-number---about-to-enter-sysi) (zero-now-one-next SYSI)) +(defun (system-block-number---about-to-enter-user) (zero-now-one-next USER)) +(defun (system-block-number---about-to-enter-sysf) (zero-now-one-next SYSF)) +(defun (system-block-number---about-to-transition) (+ (system-block-number---about-to-enter-sysi) + (system-block-number---about-to-enter-user) + (system-block-number---about-to-enter-sysf))) + diff --git a/hub/osaka/constraints/system/constancies.lisp b/hub/osaka/constraints/system/constancies.lisp new file mode 100644 index 000000000..3d805bb18 --- /dev/null +++ b/hub/osaka/constraints/system/constancies.lisp @@ -0,0 +1,22 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y Constancy conditions ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +;; the following constraint allows to express stamp constancy for stamps that may only increment by 0 or 1 +(defun (constancy-wrt-0-1-increments-stamp stamp col) + (if-not (did-inc! stamp 1) + (remained-constant! col))) + +;; usecases thereof +(defun (block-constancy col) (constancy-wrt-0-1-increments-stamp BLK_NUMBER col)) +(defun (transaction-constancy col) (constancy-wrt-0-1-increments-stamp TOTL_TXN_NUMBER col)) +(defun (hub-stamp-constancy col) (constancy-wrt-0-1-increments-stamp HUB_STAMP col)) +(defun (stack-row-constancy col) (if-not-zero PEEK_AT_STACK + (if-not-zero COUNTER_TLI + (remained-constant! col)))) +(defun (context-constancy col) (if (remained-constant! CN) (remained-constant! col))) diff --git a/hub/osaka/constraints/system/flags/generalities.lisp b/hub/osaka/constraints/system/flags/generalities.lisp new file mode 100644 index 000000000..5ea60b690 --- /dev/null +++ b/hub/osaka/constraints/system/flags/generalities.lisp @@ -0,0 +1,24 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y System flags ;; +;; X.Y.Z Generalities ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defproperty system-flag-generalities---binary + (is-binary (system-flag-sum))) + +(defconstraint system-flag-generalities---initialization (:domain {0}) ;; "" + (vanishes! (system-flag-sum))) + +(defconstraint system-flag-generalities---monotonicity () + (if-not-zero (system-flag-sum) + (eq! (next (system-flag-sum)) 1))) + +(defconstraint system-flag-generalities---pegging-to-block-number () + (if-not-zero BLK_NUMBER + (eq! (system-flag-sum) 1) + (eq! (system-flag-sum) 0))) + diff --git a/hub/osaka/constraints/system/flags/shorthands.lisp b/hub/osaka/constraints/system/flags/shorthands.lisp new file mode 100644 index 000000000..45cfde923 --- /dev/null +++ b/hub/osaka/constraints/system/flags/shorthands.lisp @@ -0,0 +1,11 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y System flags ;; +;; X.Y.Z Shorthands ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (system-flag-sum) (force-bin (+ SYSI USER SYSF))) +(defun (system-wght-sum) (+ SYSI (* 2 USER) (* 4 SYSF))) diff --git a/hub/osaka/constraints/system/flags/transaction_constancy.lisp b/hub/osaka/constraints/system/flags/transaction_constancy.lisp new file mode 100644 index 000000000..9e6f5fe8d --- /dev/null +++ b/hub/osaka/constraints/system/flags/transaction_constancy.lisp @@ -0,0 +1,11 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y System flags ;; +;; X.Y.Z Transaction constancy ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defconstraint system-flag-generalities---transaction-constancy () + (transaction-constancy (system-wght-sum))) diff --git a/hub/osaka/constraints/system/flags/transitions.lisp b/hub/osaka/constraints/system/flags/transitions.lisp new file mode 100644 index 000000000..a0436ab35 --- /dev/null +++ b/hub/osaka/constraints/system/flags/transitions.lisp @@ -0,0 +1,21 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y System flags ;; +;; X.Y.Z Transitions ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstraint system-flag-generalities---transitions () + (begin + ;; (if-not-zero SYSI (eq! (next (+ SYSI USER )) 1)) ;; <= empty blocks disallowed + (if-not-zero USER (eq! (next (+ USER SYSF)) 1)) + (if-not-zero SYSF (eq! (next (+ SYSI SYSF)) 1)) + )) + + +(defproperty system-flag-generalities---transitions---allow-for-empty-blocks + (if-not-zero SYSI (eq! (next (+ SYSI USER SYSF)) 1)) ;; <= empty blocks OK + ) diff --git a/hub/osaka/constraints/system/hub_stamp/counters.lisp b/hub/osaka/constraints/system/hub_stamp/counters.lisp new file mode 100644 index 000000000..396f12e0e --- /dev/null +++ b/hub/osaka/constraints/system/hub_stamp/counters.lisp @@ -0,0 +1,60 @@ +(module hub) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y The HUB_STAMP column ;; +;; X.Y.Z The TLI, CT_TLI and NSR, CT_NSR columns ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defconstraint system-counters---hub-stamp-constancy-of-TLI-and-NSR () + (begin + (hub-stamp-constancy TLI) + (hub-stamp-constancy NSR))) + +(defconstraint system-counters---automatic-vanishing-constraints-for-max-counters () + (if-zero TX_EXEC + (begin + (vanishes! TLI) + (vanishes! NSR)))) + +(defconstraint system-counters---automatic-vanishing-constraints-for-counters---at-HUB_STAMP-transitions () + (if-not (remained-constant! HUB_STAMP) + (begin + (vanishes! COUNTER_TLI) + (vanishes! COUNTER_NSR)))) + +(defproperty system-counters---automatic-vanishing-constraints-for-counters---outside-of-execution-rows + (if-zero TX_EXEC + (begin + (vanishes! COUNTER_TLI) + (vanishes! COUNTER_NSR)))) + +(defconstraint system-counters---progression-constraints () + (if-not-zero TX_EXEC + (if-not-zero (- COUNTER_TLI TLI) + ;; COUNTER_TLI ≠ TLI + (begin + (will-inc! COUNTER_TLI 1) + (will-remain-constant! COUNTER_NSR) + (vanishes! COUNTER_NSR)) + ;; COUNTER_TLI = TLI + (if-not-zero (- COUNTER_NSR NSR) + ;; COUNTER_NSR ≠ NSR + (begin + (will-remain-constant! COUNTER_TLI) + (will-inc! COUNTER_NSR 1) + ) + ;; COUNTER_NSR = NSR + (will-inc! HUB_STAMP 1) + )))) + +(defconstraint system-counters---pegging-CT_NSR-to-PEEK_AT_STACK () + (if-not-zero TX_EXEC + (if-zero COUNTER_NSR + ;; COUNTER_NSR = 0 + (eq! PEEK_AT_STACK 1) + ;; COUNTER_NSR ≠ 0 + (eq! PEEK_AT_STACK 0) + ))) diff --git a/hub/osaka/constraints/system/hub_stamp/formal.lisp b/hub/osaka/constraints/system/hub_stamp/formal.lisp new file mode 100644 index 000000000..42b9f90ea --- /dev/null +++ b/hub/osaka/constraints/system/hub_stamp/formal.lisp @@ -0,0 +1,26 @@ +(module hub) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y The HUB_STAMP column ;; +;; X.Y.Z Formal properties ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defproperty system-hub-stamp---formal-properties + (begin + (if-not-zero TX_SKIP (did-inc! HUB_STAMP TXN)) + (if-not-zero TX_WARM (did-inc! HUB_STAMP 1)) + (if-not-zero TX_INIT (did-inc! HUB_STAMP TXN)) + (if-not-zero TX_FINL (did-inc! HUB_STAMP TXN)) + (if-not-zero TX_EXEC (did-inc! HUB_STAMP (* (- 1 CT_TLI) PEEK_AT_STACK))) + (if-not (will-remain-constant! BLK_NUMBER) (will-inc! HUB_STAMP 1)) + (if-not (will-remain-constant! TOTL_TXN_NUMBER) (will-inc! HUB_STAMP 1)) + (if-not-zero (+ (zero-now-one-next TX_SKIP) + (zero-now-one-next TX_WARM) + (zero-now-one-next TX_INIT) + (zero-now-one-next TX_FINL) + (zero-now-one-next TX_EXEC)) (will-inc! HUB_STAMP 1)) + )) diff --git a/hub/osaka/constraints/system/hub_stamp/generalities.lisp b/hub/osaka/constraints/system/hub_stamp/generalities.lisp new file mode 100644 index 000000000..0bfd419d6 --- /dev/null +++ b/hub/osaka/constraints/system/hub_stamp/generalities.lisp @@ -0,0 +1,22 @@ +(module hub) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y The HUB_STAMP column ;; +;; X.Y.Z Generalities ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstraint system---hub-stamp---initialization (:domain {0}) ;; "" + (vanishes! HUB_STAMP)) + +(defconstraint system---hub-stamp---0-1-increments () + (has-0-1-increments HUB_STAMP)) + +(defconstraint system---hub-stamp---pegging-to-system-flag-sum () + (if-not-zero HUB_STAMP + (eq! (system-flag-sum) 1) + (eq! (system-flag-sum) 0))) + diff --git a/hub/osaka/constraints/system/hub_stamp/increments.lisp b/hub/osaka/constraints/system/hub_stamp/increments.lisp new file mode 100644 index 000000000..ac3d73caa --- /dev/null +++ b/hub/osaka/constraints/system/hub_stamp/increments.lisp @@ -0,0 +1,25 @@ +(module hub) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y The HUB_STAMP column ;; +;; X.Y.Z Increments ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstraint system---hub-stamp-increments---at-block-transitions () (if-not (will-remain-constant! BLK_NUMBER) (will-inc! HUB_STAMP 1))) +(defconstraint system---hub-stamp-increments---at-the-end-of-TX_SKIP () (if-not-zero TX_SKIP (will-inc! HUB_STAMP CON))) +(defconstraint system---hub-stamp-increments---at-every-step-of-TX_WARM () (if-not-zero TX_WARM (will-inc! HUB_STAMP 1))) +(defconstraint system---hub-stamp-increments---at-the-end-of-TX_INIT () (if-not-zero TX_INIT (will-inc! HUB_STAMP CON))) +(defconstraint system---hub-stamp-increments---at-the-end-of-TX_FINL () (if-not-zero TX_FINL (will-inc! HUB_STAMP CON))) + +(defconstraint system---hub-stamp-increments---when-both-counters-are-maxed-out-in-TX_EXEC () + (if-not-zero TX_EXEC + (begin + (if-not-zero (- CT_TLI TLI) (will-remain-constant! HUB_STAMP)) + (if-not-zero (- CT_NSR NSR) (will-remain-constant! HUB_STAMP)) + (if-eq CT_TLI TLI + (if-eq CT_NSR NSR + (will-inc! HUB_STAMP 1)))))) diff --git a/hub/osaka/constraints/system/phase_flags/binarities.lisp b/hub/osaka/constraints/system/phase_flags/binarities.lisp new file mode 100644 index 000000000..1169cb947 --- /dev/null +++ b/hub/osaka/constraints/system/phase_flags/binarities.lisp @@ -0,0 +1,11 @@ +(module hub) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y Transaction phase flags ;; +;; X.Y.Z Binary constraints ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;; no constraints required due to binary@prove annotations diff --git a/hub/osaka/constraints/system/phase_flags/generalities.lisp b/hub/osaka/constraints/system/phase_flags/generalities.lisp new file mode 100644 index 000000000..884b81c61 --- /dev/null +++ b/hub/osaka/constraints/system/phase_flags/generalities.lisp @@ -0,0 +1,18 @@ +(module hub) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y Transaction phase flags ;; +;; X.Y.Z Generalities ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstraint phase-flags---setting-the-transaction-phase-flag-sum () + (eq! (phase-flag-sum) + (system-flag-sum))) + +(defconstraint phase-flags---weighted-transaction-phase-flag-sum-constancy () + (hub-stamp-constancy (phase-wght-sum))) + diff --git a/hub/osaka/constraints/system/phase_flags/legality.lisp b/hub/osaka/constraints/system/phase_flags/legality.lisp new file mode 100644 index 000000000..ad6eac377 --- /dev/null +++ b/hub/osaka/constraints/system/phase_flags/legality.lisp @@ -0,0 +1,26 @@ +(module hub) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y Transaction phase flags ;; +;; X.Y.Z Legality ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstraint phase-flags---legal-processing-phases---the-SYSI-case () + (if-not-zero SYSI + (eq! 1 TX_SKIP))) + +(defproperty phase-flags---legal-processing-phases---the-USER-case + (if-not-zero USER + (eq! 1 (+ TX_SKIP + TX_WARM + TX_INIT + TX_EXEC + TX_FINL)))) + +(defconstraint phase-flags---legal-processing-phases---the-SYSF-case () + (if-not-zero SYSF + (eq! 1 TX_SKIP))) diff --git a/hub/osaka/constraints/system/phase_flags/shorthands.lisp b/hub/osaka/constraints/system/phase_flags/shorthands.lisp new file mode 100644 index 000000000..16340ebec --- /dev/null +++ b/hub/osaka/constraints/system/phase_flags/shorthands.lisp @@ -0,0 +1,14 @@ +(module hub) + + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y Transaction phase flags ;; +;; X.Y.Z Shorthands ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defun (phase-flag-sum) (force-bin (+ TX_SKIP TX_WARM TX_INIT TX_EXEC TX_FINL))) +(defun (phase-wght-sum) (+ TX_SKIP (* 2 TX_WARM) (* 4 TX_INIT) (* 8 TX_EXEC) (* 16 TX_FINL))) diff --git a/hub/osaka/constraints/system/phase_flags/transition.lisp b/hub/osaka/constraints/system/phase_flags/transition.lisp new file mode 100644 index 000000000..48e0f426a --- /dev/null +++ b/hub/osaka/constraints/system/phase_flags/transition.lisp @@ -0,0 +1,97 @@ +(module hub) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y Transaction phase flags ;; +;; X.Y.Z Transitions ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +; TX_SKIP case +;------------- + +(defconstraint phase-flags---legal-transitions-out-of-TX_SKIP () + (if-not-zero TX_SKIP + (eq! (next (+ TX_SKIP + TX_WARM + TX_INIT)) + 1))) + +(defproperty phase-flags---legal-transitions-out-of-TX_SKIP---formal-consequences + (if-not-zero TX_SKIP + (if-zero CON + ;; CON = 0 + (eq! (next TX_SKIP) 1) + ;; CON = 1 + (eq! (next (+ TX_SKIP + TX_WARM + TX_INIT)) 1)))) + + +; TX_WARM case +;------------- + +(defconstraint phase-flags---legal-transitions-out-of-TX_WARM () + (if-not-zero TX_WARM + (begin + (eq! (next (+ TX_WARM TX_INIT)) 1) + (eq! (next TX_INIT) (next TXN)) + ))) + +(defproperty phase-flags---legal-transitions-out-of-TX_WARM---formal-consequences + (if-not-zero TX_WARM + (if-zero (next TXN) + (eq! (next TX_WARM) 1) + (eq! (next TX_INIT) 1)) + )) + + +; TX_INIT case +;------------- + +(defconstraint phase-flags---legal-transitions-out-of-TX_INIT () + (if-not-zero TX_INIT + (begin + (eq! (next (+ TX_INIT TX_EXEC)) 1) + (eq! (next TX_EXEC) CON) + ))) + + +; TX_EXEC case +;------------- + +(defconstraint phase-flags---legal-transitions-out-of-TX_EXEC () + (if-not-zero TX_EXEC + (begin + (eq! (next (+ TX_EXEC TX_FINL)) 1) + (if-not (will-remain-constant! HUB_STAMP) + (if-not-zero CN_NEW + ;; CN_NEW ≠ 0 + (eq! (next TX_EXEC) 1) + ;; CN_NEW = 0 + (eq! (next TX_FINL) 1))) + ))) + +(defproperty phase-flags---legal-transitions-out-of-TX_EXEC---formal-consequences + (if-not-zero TX_EXEC + (if-not (will-inc! HUB_STAMP 1) + (eq! (next TX_EXEC) 1) + ))) + + +; TX_FINL case +;------------- + +(defconstraint phase-flags---legal-transitions-out-of-TX_FINL () + (if-not-zero TX_FINL + (begin + (eq! (next (+ TX_FINL + TX_SKIP + TX_WARM + TX_INIT)) 1) + (eq! (next (+ TX_SKIP + TX_WARM + TX_INIT)) CON) + ))) + diff --git a/hub/osaka/constraints/system/transaction_numbers/housekeeping.lisp b/hub/osaka/constraints/system/transaction_numbers/housekeeping.lisp new file mode 100644 index 000000000..020053655 --- /dev/null +++ b/hub/osaka/constraints/system/transaction_numbers/housekeeping.lisp @@ -0,0 +1,33 @@ +(module hub) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y The XXX_TXN_NUMBER columns ;; +;; X.Y.Z Housekeeping ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconst ZERO_CONTEXT 0) + + +(defconstraint system-txn-numbers---housekeeping---what-we-call-the-beginning-is-often-the-end (:guard TOTL_TXN_NUMBER) + (will-inc! TOTL_TXN_NUMBER (system-txn-numbers---txn-end))) + +(defproperty system-txn-numbers---housekeeping---and-to-make-an-end-is-to-make-a-beginning + (did-inc! TOTL_TXN_NUMBER (system-txn-numbers---txn-start))) + +(defconstraint system-txn-numbers---housekeeping---the-end-is-not-where-we-start-from () + (vanishes! (* (system-txn-numbers---txn-start) + (system-txn-numbers---txn-end)))) + +(defconstraint system-txn-numbers---housekeeping---the-final-context-row-of-every-transaction () + (if-not-zero (system-txn-numbers---txn-end) + (read-context-data 0 + ZERO_CONTEXT))) + +(defconstraint system-txn-numbers---housekeeping---the-final-row-of-every-trace (:domain {-1}) ;; "" + (begin + (eq! SYSF 1) + (eq! (system-txn-numbers---txn-end) 1))) diff --git a/hub/osaka/constraints/system/transaction_numbers/numbers.lisp b/hub/osaka/constraints/system/transaction_numbers/numbers.lisp new file mode 100644 index 000000000..0db8eb273 --- /dev/null +++ b/hub/osaka/constraints/system/transaction_numbers/numbers.lisp @@ -0,0 +1,44 @@ +(module hub) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y The XXX_TXN_NUMBER columns ;; +;; X.Y.Z Shorthands for transaction end ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defcomputedcolumn (TOTL_TXN_NUMBER :i24) (+ SYSI_TXN_NUMBER + USER_TXN_NUMBER + SYSF_TXN_NUMBER)) + +(defconstraint system-txn-numbers---initialization (:domain {0}) ;; "" + (begin + (vanishes! SYSI_TXN_NUMBER) + (vanishes! USER_TXN_NUMBER) + (vanishes! SYSF_TXN_NUMBER) + )) + +;; TODO: this should be a (defproperty ...) declaration, but the domain seems to be the issue +(defconstraint system-txn-numbers---initialization---TOTL (:domain {0}) ;; "" + (vanishes! TOTL_TXN_NUMBER)) + + +(defconstraint system-txn-numbers---increments () + (begin + (did-inc! SYSI_TXN_NUMBER (system-txn-numbers---sysi-txn-start)) + (did-inc! USER_TXN_NUMBER (system-txn-numbers---user-txn-start)) + (did-inc! SYSF_TXN_NUMBER (system-txn-numbers---sysf-txn-start)) + )) + +(defproperty system-txn-numbers---increments---TOTL + (did-inc! TOTL_TXN_NUMBER (system-txn-numbers---txn-start))) + +(defproperty system-txn-numbers---0-1-increments + (begin + (has-0-1-increments SYSI_TXN_NUMBER) + (has-0-1-increments USER_TXN_NUMBER) + (has-0-1-increments SYSF_TXN_NUMBER) + (has-0-1-increments TOTL_TXN_NUMBER) + )) diff --git a/hub/osaka/constraints/system/transaction_numbers/shorthands_end.lisp b/hub/osaka/constraints/system/transaction_numbers/shorthands_end.lisp new file mode 100644 index 000000000..f4a0108ab --- /dev/null +++ b/hub/osaka/constraints/system/transaction_numbers/shorthands_end.lisp @@ -0,0 +1,21 @@ +(module hub) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y The XXX_TXN_NUMBER columns ;; +;; X.Y.Z Shorthands for transaction end ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defun (system-txn-numbers---sysi-txn-end) (* SYSI TX_SKIP CON)) +(defun (system-txn-numbers---sysf-txn-end) (* SYSF TX_SKIP CON)) +(defun (system-txn-numbers---user-txn-end) (* USER (+ TX_SKIP + TX_FINL) CON)) + +(defun (system-txn-numbers---txn-end) (+ (system-txn-numbers---sysi-txn-end) + (system-txn-numbers---user-txn-end) + (system-txn-numbers---sysf-txn-end) + )) + diff --git a/hub/osaka/constraints/system/transaction_numbers/shorthands_start.lisp b/hub/osaka/constraints/system/transaction_numbers/shorthands_start.lisp new file mode 100644 index 000000000..dbb305eff --- /dev/null +++ b/hub/osaka/constraints/system/transaction_numbers/shorthands_start.lisp @@ -0,0 +1,21 @@ +(module hub) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y The XXX_TXN_NUMBER columns ;; +;; X.Y.Z Shorthands for transaction start ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defun (system-txn-numbers---sysi-txn-start) (* SYSI TX_SKIP TXN)) +(defun (system-txn-numbers---sysf-txn-start) (* SYSF TX_SKIP TXN)) +(defun (system-txn-numbers---user-txn-start) (* USER (+ (* TX_SKIP TXN) + (* (- 1 (prev TX_WARM)) TX_WARM) + (* (- 1 (prev TX_WARM)) + (- 1 (prev TX_INIT)) TX_INIT)))) +(defun (system-txn-numbers---txn-start) (+ (system-txn-numbers---sysi-txn-start) + (system-txn-numbers---user-txn-start) + (system-txn-numbers---sysf-txn-start) + )) diff --git a/hub/osaka/constraints/transient-rows/specialized.lisp b/hub/osaka/constraints/transient-rows/specialized.lisp new file mode 100644 index 000000000..5bf941585 --- /dev/null +++ b/hub/osaka/constraints/transient-rows/specialized.lisp @@ -0,0 +1,40 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ;;;; +;;;; X.Y Transient-rows ;;;; +;;;; ;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.Z Specialized constraints ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;; no value change on the row with relative row offset "relof" +(defun (transient-storage-reading relof) + (begin (eq! (shift transient/VALUE_CURR_HI relof) (shift transient/VALUE_NEXT_HI relof)) + (eq! (shift transient/VALUE_CURR_LO relof) (shift transient/VALUE_NEXT_LO relof)))) + +;; identify address and key of some +;; current row offset ("curof") with that of some +;; reference row offset ("refof") +(defun (transient-storage-same-slot curof refof) + (begin (eq! (shift transient/ADDRESS_HI curof ) (shift transient/ADDRESS_HI refof )) + (eq! (shift transient/ADDRESS_LO curof ) (shift transient/ADDRESS_LO refof )) + (eq! (shift transient/STORAGE_KEY_LO curof ) (shift transient/STORAGE_KEY_LO refof )) + (eq! (shift transient/STORAGE_KEY_HI curof ) (shift transient/STORAGE_KEY_HI refof )) + )) + +;; undoes the change in +;; new/curr values at relative doing offset ("reldo") by doing the opposite switch +;; curr/new values at relative undoing offset ("reluo") +(defun (transient-storage-undoing-value-update reluo reldo) + (begin (eq! (shift transient/VALUE_CURR_HI reluo ) (shift transient/VALUE_NEXT_HI reldo )) + (eq! (shift transient/VALUE_CURR_LO reluo ) (shift transient/VALUE_NEXT_LO reldo )) + (eq! (shift transient/VALUE_NEXT_HI reluo ) (shift transient/VALUE_CURR_HI reldo )) + (eq! (shift transient/VALUE_NEXT_LO reluo ) (shift transient/VALUE_CURR_LO reldo )) + )) diff --git a/hub/osaka/constraints/tx_finl/peeking.lisp b/hub/osaka/constraints/tx_finl/peeking.lisp new file mode 100644 index 000000000..a872e7d7c --- /dev/null +++ b/hub/osaka/constraints/tx_finl/peeking.lisp @@ -0,0 +1,19 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X TX_FINL phase ;; +;; X.Y Introduction ;; +;; X.Y Setting the peeking flags ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstraint tx-finl---setting-peeking-flags + (:guard (tx-finl---standard-precondition)) + (eq! tx-finl---NSR + (+ (shift PEEK_AT_TRANSACTION tx-finl---row-offset---TXN) + (shift PEEK_AT_ACCOUNT tx-finl---row-offset---ACC---sender-gas-refund) + (shift PEEK_AT_ACCOUNT tx-finl---row-offset---ACC---coinbase-reward) + (shift PEEK_AT_CONTEXT tx-finl---row-offset---CON---final-zero-context) + ))) diff --git a/hub/osaka/constraints/tx_finl/rows/acc_coinbase_reward.lisp b/hub/osaka/constraints/tx_finl/rows/acc_coinbase_reward.lisp new file mode 100644 index 000000000..f52749ab5 --- /dev/null +++ b/hub/osaka/constraints/tx_finl/rows/acc_coinbase_reward.lisp @@ -0,0 +1,28 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X TX_FINL phase ;; +;; X.Y Common constraints ;; +;; X.Y.Z Coinbase reward ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstraint tx-finl---account-row---coinbase-reward + (:guard (tx-finl---standard-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (begin + (account-trim-address tx-finl---row-offset---ACC---coinbase-reward ;; row offset + (tx-finl---coinbase-address-hi) ;; high part of raw, potentially untrimmed address + (tx-finl---coinbase-address-lo)) ;; low part of raw, potentially untrimmed address + ;; (eq! (shift account/ADDRESS_HI tx-finl---row-offset---ACC---coinbase-reward) (tx-finl---coinbase-address-hi)) + ;; (eq! (shift account/ADDRESS_LO tx-finl---row-offset---ACC---coinbase-reward) (tx-finl---coinbase-address-lo)) + (account-increment-balance-by tx-finl---row-offset---ACC---coinbase-reward (tx-finl---coinbase-reward)) + (account-same-nonce tx-finl---row-offset---ACC---coinbase-reward) + (account-same-code tx-finl---row-offset---ACC---coinbase-reward) + (account-same-deployment-number-and-status tx-finl---row-offset---ACC---coinbase-reward) + (account-same-warmth tx-finl---row-offset---ACC---coinbase-reward) + (account-same-marked-for-deletion tx-finl---row-offset---ACC---coinbase-reward) + (DOM-SUB-stamps---standard tx-finl---row-offset---ACC---coinbase-reward + 1))) diff --git a/hub/osaka/constraints/tx_finl/rows/acc_sender_gas_refund.lisp b/hub/osaka/constraints/tx_finl/rows/acc_sender_gas_refund.lisp new file mode 100644 index 000000000..071635cc0 --- /dev/null +++ b/hub/osaka/constraints/tx_finl/rows/acc_sender_gas_refund.lisp @@ -0,0 +1,25 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X TX_FINL phase ;; +;; X.Y Common constraints ;; +;; X.Y.Z Sender gas refund ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstraint tx-finl---account-row---sender-gas-refund + (:guard (tx-finl---standard-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (begin + (eq! (shift account/ADDRESS_HI tx-finl---row-offset---ACC---sender-gas-refund) (tx-finl---sender-address-hi)) + (eq! (shift account/ADDRESS_LO tx-finl---row-offset---ACC---sender-gas-refund) (tx-finl---sender-address-lo)) + (account-increment-balance-by tx-finl---row-offset---ACC---sender-gas-refund (tx-finl---sender-gas-refund)) + (account-same-nonce tx-finl---row-offset---ACC---sender-gas-refund) + (account-same-code tx-finl---row-offset---ACC---sender-gas-refund) + (account-same-deployment-number-and-status tx-finl---row-offset---ACC---sender-gas-refund) + (account-same-warmth tx-finl---row-offset---ACC---sender-gas-refund) + (account-same-marked-for-deletion tx-finl---row-offset---ACC---sender-gas-refund) + (DOM-SUB-stamps---standard tx-finl---row-offset---ACC---sender-gas-refund + 0))) diff --git a/hub/osaka/constraints/tx_finl/rows/transaction.lisp b/hub/osaka/constraints/tx_finl/rows/transaction.lisp new file mode 100644 index 000000000..fb16ae583 --- /dev/null +++ b/hub/osaka/constraints/tx_finl/rows/transaction.lisp @@ -0,0 +1,17 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X TX_FINL phase ;; +;; X.Y Common constraints ;; +;; X.Y.Z Transaction row ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defconstraint tx-finl---transaction-row---justifying-TXN_DATA-predictions + (:guard (tx-finl---standard-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (begin + (eq! (shift transaction/STATUS_CODE tx-finl---row-offset---TXN) (tx-finl---transaction-success)) + (eq! (shift transaction/REFUND_COUNTER_INFINITY tx-finl---row-offset---TXN) (shift REFUND_COUNTER_NEW tx-finl---row-offset---row-preceding-the-finl-phase)) + (eq! (shift transaction/GAS_LEFTOVER tx-finl---row-offset---TXN) (shift GAS_NEXT tx-finl---row-offset---row-preceding-the-finl-phase)))) diff --git a/hub/osaka/constraints/tx_finl/shorthands.lisp b/hub/osaka/constraints/tx_finl/shorthands.lisp new file mode 100644 index 000000000..8be8ff37a --- /dev/null +++ b/hub/osaka/constraints/tx_finl/shorthands.lisp @@ -0,0 +1,36 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X TX_FINL phase ;; +;; X.Y Introduction ;; +;; X.Y Shorthands ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defconst + tx-finl---row-offset---row-preceding-the-finl-phase -1 + tx-finl---row-offset---TXN 0 + tx-finl---row-offset---ACC---sender-gas-refund 1 + tx-finl---row-offset---ACC---coinbase-reward 2 + tx-finl---row-offset---CON---final-zero-context 3 + tx-finl---NSR 4 + ) + + + +(defun (tx-finl---standard-precondition) (* (shift TX_EXEC tx-finl---row-offset---row-preceding-the-finl-phase) TX_FINL)) +(defun (tx-finl---transaction-success) (- 1 (shift CONTEXT_WILL_REVERT tx-finl---row-offset---row-preceding-the-finl-phase))) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defun (tx-finl---sender-address-hi) (shift transaction/FROM_ADDRESS_HI tx-finl---row-offset---TXN)) +(defun (tx-finl---sender-address-lo) (shift transaction/FROM_ADDRESS_LO tx-finl---row-offset---TXN)) +(defun (tx-finl---coinbase-address-hi) (shift transaction/COINBASE_ADDRESS_HI tx-finl---row-offset---TXN)) +(defun (tx-finl---coinbase-address-lo) (shift transaction/COINBASE_ADDRESS_LO tx-finl---row-offset---TXN)) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defun (tx-finl---effective-gas-price) (shift transaction/GAS_PRICE tx-finl---row-offset---TXN)) +(defun (tx-finl---effective-gas-refund) (shift transaction/REFUND_EFFECTIVE tx-finl---row-offset---TXN)) +(defun (tx-finl---sender-gas-refund) (* (tx-finl---effective-gas-price) (tx-finl---effective-gas-refund))) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defun (tx-finl---priority-fee-per-gas) (shift transaction/PRIORITY_FEE_PER_GAS tx-finl---row-offset---TXN)) +(defun (tx-finl---gas-limit) (shift transaction/GAS_LIMIT tx-finl---row-offset---TXN)) +(defun (tx-finl---coinbase-reward) (* (- (tx-finl---gas-limit) (tx-finl---effective-gas-refund)) (tx-finl---priority-fee-per-gas))) diff --git a/hub/osaka/constraints/tx_init/peeking.lisp b/hub/osaka/constraints/tx_init/peeking.lisp new file mode 100644 index 000000000..3f2eb751b --- /dev/null +++ b/hub/osaka/constraints/tx_init/peeking.lisp @@ -0,0 +1,61 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X TX_INIT phase ;; +;; X.Y Setting the peeking flags ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defconstraint tx-init---setting-peeking-flags---unconditionally-set-the-first-few-peeking-flags + (:guard (tx-init---standard-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (eq! (+ (shift PEEK_AT_TRANSACTION tx-init---row-offset---TXN) + (shift PEEK_AT_MISCELLANEOUS tx-init---row-offset---MISC) + (shift PEEK_AT_ACCOUNT tx-init---row-offset---ACC---coinbase-warming) + ) + 3)) + +(defconstraint tx-init---setting-peeking-flags---transaction-failure + (:guard (tx-init---standard-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-not-zero (tx-init---transaction-failure-prediction) + (eq! (+ (shift PEEK_AT_TRANSACTION tx-init---row-offset---TXN ) + (shift PEEK_AT_MISCELLANEOUS tx-init---row-offset---MISC ) + (shift PEEK_AT_ACCOUNT tx-init---row-offset---ACC---coinbase-warming ) + (shift PEEK_AT_ACCOUNT tx-init---row-offset---ACC---sender-pay-for-gas ) + (shift PEEK_AT_ACCOUNT tx-init---row-offset---ACC---sender-value-transfer ) + (shift PEEK_AT_ACCOUNT tx-init---row-offset---ACC---recipient-value-reception ) + (shift PEEK_AT_ACCOUNT tx-init---row-offset---ACC---sender-value-transfer---undoing ) + (shift PEEK_AT_ACCOUNT tx-init---row-offset---ACC---recipient-value-reception---undoing ) + (shift PEEK_AT_CONTEXT tx-init---row-offset---CON---context-initialization-row---failure )) + 9))) + +(defconstraint tx-init---setting-peeking-flags---transaction-success + (:guard (tx-init---standard-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-not-zero (tx-init---transaction-success-prediction) + (eq! (+ (shift PEEK_AT_TRANSACTION tx-init---row-offset---TXN ) + (shift PEEK_AT_MISCELLANEOUS tx-init---row-offset---MISC ) + (shift PEEK_AT_ACCOUNT tx-init---row-offset---ACC---coinbase-warming ) + (shift PEEK_AT_ACCOUNT tx-init---row-offset---ACC---sender-pay-for-gas ) + (shift PEEK_AT_ACCOUNT tx-init---row-offset---ACC---sender-value-transfer ) + (shift PEEK_AT_ACCOUNT tx-init---row-offset---ACC---recipient-value-reception ) + (shift PEEK_AT_CONTEXT tx-init---row-offset---CON---context-initialization-row---success )) + 7))) + +(defconstraint tx-init---justifying-predictions---transaction-failure + (:guard (tx-init---standard-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-not-zero (tx-init---transaction-failure-prediction) + (begin + (eq! (tx-init---transaction-failure-prediction) (shift CONTEXT_WILL_REVERT tx-init---row-offset---first-execution-phase-row---failure)) + (eq! (tx-init---transaction-end-stamp) (shift CONTEXT_REVERT_STAMP tx-init---row-offset---first-execution-phase-row---failure))))) + +(defconstraint tx-init---justifying-predictions---transaction-success + (:guard (tx-init---standard-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-not-zero (tx-init---transaction-success-prediction) + (begin + (eq! (tx-init---transaction-failure-prediction) (shift CONTEXT_WILL_REVERT tx-init---row-offset---first-execution-phase-row---success)) + (eq! (tx-init---transaction-end-stamp) (shift CONTEXT_REVERT_STAMP tx-init---row-offset---first-execution-phase-row---success))))) diff --git a/hub/osaka/constraints/tx_init/rows/acc_coinbase_warm.lisp b/hub/osaka/constraints/tx_init/rows/acc_coinbase_warm.lisp new file mode 100644 index 000000000..f3b387baf --- /dev/null +++ b/hub/osaka/constraints/tx_init/rows/acc_coinbase_warm.lisp @@ -0,0 +1,26 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X TX_INIT phase ;; +;; X.Y Common constraints ;; +;; X.Y.Z Coinbase warm ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstraint tx-init---account-row---coinbase-warm + (:guard (tx-init---standard-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (begin + (eq! (shift account/ADDRESS_HI tx-init---row-offset---ACC---coinbase-warming) (tx-init---coinbase-address-hi)) + (eq! (shift account/ADDRESS_LO tx-init---row-offset---ACC---coinbase-warming) (tx-init---coinbase-address-lo)) + (account-trim-address tx-init---row-offset---ACC---coinbase-warming (tx-init---coinbase-address-hi) (tx-init---coinbase-address-lo)) + (account-same-balance tx-init---row-offset---ACC---coinbase-warming) + (account-same-nonce tx-init---row-offset---ACC---coinbase-warming) + (account-same-code tx-init---row-offset---ACC---coinbase-warming) + (account-same-deployment-number-and-status tx-init---row-offset---ACC---coinbase-warming) + (account-turn-on-warmth tx-init---row-offset---ACC---coinbase-warming) + (account-same-marked-for-deletion tx-init---row-offset---ACC---coinbase-warming) + (DOM-SUB-stamps---standard tx-init---row-offset---ACC---coinbase-warming + 0))) diff --git a/hub/osaka/constraints/tx_init/rows/acc_recipient_value_transfer.lisp b/hub/osaka/constraints/tx_init/rows/acc_recipient_value_transfer.lisp new file mode 100644 index 000000000..269a1a73c --- /dev/null +++ b/hub/osaka/constraints/tx_init/rows/acc_recipient_value_transfer.lisp @@ -0,0 +1,76 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X TX_INIT phase ;; +;; X.Y Common constraints ;; +;; X.Y.Z Recipient accepts value transfer ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstraint tx-init---account-row---recipient-value-reception + (:guard (tx-init---standard-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (begin + (eq! (shift account/ADDRESS_HI tx-init---row-offset---ACC---recipient-value-reception) (tx-init---recipient-address-hi)) + (eq! (shift account/ADDRESS_LO tx-init---row-offset---ACC---recipient-value-reception) (tx-init---recipient-address-lo)) + (account-trim-address tx-init---row-offset---ACC---recipient-value-reception + (tx-init---recipient-address-hi) + (tx-init---recipient-address-lo)) + (account-increment-balance-by tx-init---row-offset---ACC---recipient-value-reception (tx-init---value)) + ;; (account-same-nonce tx-init---row-offset---ACC---recipient-value-reception) + ;; (account-same-code tx-init---row-offset---ACC---recipient-value-reception) + ;; (account-same-deployment-number-and-status tx-init---row-offset---ACC---recipient-value-reception) + (account-turn-on-warmth tx-init---row-offset---ACC---recipient-value-reception) + (account-same-marked-for-deletion tx-init---row-offset---ACC---recipient-value-reception) + (account-retrieve-code-fragment-index tx-init---row-offset---ACC---recipient-value-reception) + (account-isnt-precompile tx-init---row-offset---ACC---recipient-value-reception) + (DOM-SUB-stamps---standard tx-init---row-offset---ACC---recipient-value-reception + 3))) + +(defconstraint tx-init---account-row---recipient-value-reception---message-call + (:guard (tx-init---standard-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-not-zero (tx-init---is-message-call) + (begin + (account-same-nonce tx-init---row-offset---ACC---recipient-value-reception) + (account-same-code tx-init---row-offset---ACC---recipient-value-reception) + (account-same-deployment-number-and-status tx-init---row-offset---ACC---recipient-value-reception)))) + +(defconstraint tx-init---account-row---recipient-value-reception---deployment---nonce + (:guard (tx-init---standard-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-not-zero (tx-init---is-deployment) + (begin + (account-increment-nonce tx-init---row-offset---ACC---recipient-value-reception) + (vanishes! (shift account/NONCE tx-init---row-offset---ACC---recipient-value-reception)) + ))) + +(defconstraint tx-init---account-row---recipient-value-reception---deployment---code + (:guard (tx-init---standard-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-not-zero (tx-init---is-deployment) + (begin + ;; current code + (vanishes! (shift account/HAS_CODE tx-init---row-offset---ACC---recipient-value-reception)) + (debug (eq! (shift account/CODE_HASH_HI tx-init---row-offset---ACC---recipient-value-reception) EMPTY_KECCAK_HI)) + (debug (eq! (shift account/CODE_HASH_LO tx-init---row-offset---ACC---recipient-value-reception) EMPTY_KECCAK_LO)) + (vanishes! (shift account/CODE_SIZE tx-init---row-offset---ACC---recipient-value-reception)) + ;; updated code + (vanishes! (shift account/HAS_CODE_NEW tx-init---row-offset---ACC---recipient-value-reception)) + (debug (eq! (shift account/CODE_HASH_HI_NEW tx-init---row-offset---ACC---recipient-value-reception) EMPTY_KECCAK_HI)) + (debug (eq! (shift account/CODE_HASH_LO_NEW tx-init---row-offset---ACC---recipient-value-reception) EMPTY_KECCAK_LO)) + (eq! (shift account/CODE_SIZE_NEW tx-init---row-offset---ACC---recipient-value-reception) + (tx-init---init-code-size))))) + +(defconstraint tx-init---account-row---recipient-value-reception---deployment---deployment-number-and-status + (:guard (tx-init---standard-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-not-zero (tx-init---is-deployment) + (begin + ;; deployment + (account-increment-deployment-number tx-init---row-offset---ACC---recipient-value-reception) + (eq! (shift account/DEPLOYMENT_STATUS tx-init---row-offset---ACC---recipient-value-reception) 0) + (eq! (shift account/DEPLOYMENT_STATUS_NEW tx-init---row-offset---ACC---recipient-value-reception) 1)))) + diff --git a/hub/osaka/constraints/tx_init/rows/acc_sender_gas_payment.lisp b/hub/osaka/constraints/tx_init/rows/acc_sender_gas_payment.lisp new file mode 100644 index 000000000..a6b125194 --- /dev/null +++ b/hub/osaka/constraints/tx_init/rows/acc_sender_gas_payment.lisp @@ -0,0 +1,34 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X TX_INIT phase ;; +;; X.Y Common constraints ;; +;; X.Y.Z Sender pays for gas_cost ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstraint tx-init---account-row---sender-pays-for-gas + (:guard (tx-init---standard-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (begin + (eq! (shift account/ADDRESS_HI tx-init---row-offset---ACC---sender-pay-for-gas) (tx-init---sender-address-hi)) + (eq! (shift account/ADDRESS_LO tx-init---row-offset---ACC---sender-pay-for-gas) (tx-init---sender-address-lo)) + (account-trim-address tx-init---row-offset---ACC---sender-pay-for-gas + (tx-init---sender-address-hi) + (tx-init---sender-address-lo)) + (account-decrement-balance-by tx-init---row-offset---ACC---sender-pay-for-gas (tx-init---gas-cost)) + (account-increment-nonce tx-init---row-offset---ACC---sender-pay-for-gas) + (account-same-code tx-init---row-offset---ACC---sender-pay-for-gas) + (account-same-deployment-number-and-status tx-init---row-offset---ACC---sender-pay-for-gas) + (account-turn-on-warmth tx-init---row-offset---ACC---sender-pay-for-gas) + (account-same-marked-for-deletion tx-init---row-offset---ACC---sender-pay-for-gas) + (account-isnt-precompile tx-init---row-offset---ACC---sender-pay-for-gas) + (DOM-SUB-stamps---standard tx-init---row-offset---ACC---sender-pay-for-gas + 1))) + +(defconstraint tx-init---EIP-3607---reject-transactions-from-senders-with-deployed-code + (:guard (tx-init---standard-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (vanishes! (shift account/HAS_CODE tx-init---row-offset---ACC---sender-pay-for-gas))) diff --git a/hub/osaka/constraints/tx_init/rows/acc_sender_value_transfer.lisp b/hub/osaka/constraints/tx_init/rows/acc_sender_value_transfer.lisp new file mode 100644 index 000000000..2330067f6 --- /dev/null +++ b/hub/osaka/constraints/tx_init/rows/acc_sender_value_transfer.lisp @@ -0,0 +1,25 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X TX_INIT phase ;; +;; X.Y Common constraints ;; +;; X.Y.Z Transaction row ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defconstraint tx-init---account-row---sender-value-transfer + (:guard (tx-init---standard-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (begin + (account-same-address-as tx-init---row-offset---ACC---sender-value-transfer + tx-init---row-offset---ACC---sender-pay-for-gas) + (account-decrement-balance-by tx-init---row-offset---ACC---sender-value-transfer (tx-init---value)) + (account-same-nonce tx-init---row-offset---ACC---sender-value-transfer) + (account-same-code tx-init---row-offset---ACC---sender-value-transfer) + (account-same-deployment-number-and-status tx-init---row-offset---ACC---sender-value-transfer) + (account-same-warmth tx-init---row-offset---ACC---sender-value-transfer) + (account-same-marked-for-deletion tx-init---row-offset---ACC---sender-value-transfer) + (account-isnt-precompile tx-init---row-offset---ACC---sender-value-transfer) + (DOM-SUB-stamps---standard tx-init---row-offset---ACC---sender-value-transfer + 2))) diff --git a/hub/osaka/constraints/tx_init/rows/acc_undo_recipient_value_reception.lisp b/hub/osaka/constraints/tx_init/rows/acc_undo_recipient_value_reception.lisp new file mode 100644 index 000000000..ef6e890af --- /dev/null +++ b/hub/osaka/constraints/tx_init/rows/acc_undo_recipient_value_reception.lisp @@ -0,0 +1,25 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X TX_INIT phase ;; +;; X.Y Common constraints ;; +;; X.Y.Z Undoing recipient account value reception ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defconstraint tx-init---account-row---recipient-value-reception---undoing-row + (:guard (tx-init---standard-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-not-zero (tx-init---transaction-failure-prediction) + (begin + (account-same-address-as tx-init---row-offset---ACC---recipient-value-reception---undoing tx-init---row-offset---ACC---recipient-value-reception) + (account-undo-balance-update tx-init---row-offset---ACC---recipient-value-reception---undoing tx-init---row-offset---ACC---recipient-value-reception) + (account-undo-nonce-update tx-init---row-offset---ACC---recipient-value-reception---undoing tx-init---row-offset---ACC---recipient-value-reception) + (account-undo-code-update tx-init---row-offset---ACC---recipient-value-reception---undoing tx-init---row-offset---ACC---recipient-value-reception) + (account-same-warmth tx-init---row-offset---ACC---recipient-value-reception---undoing) + (account-undo-deployment-status-update tx-init---row-offset---ACC---recipient-value-reception---undoing tx-init---row-offset---ACC---recipient-value-reception) + (account-same-marked-for-deletion tx-init---row-offset---ACC---recipient-value-reception---undoing) + (DOM-SUB-stamps---revert-with-child tx-init---row-offset---ACC---recipient-value-reception---undoing + 5 + (tx-init---transaction-end-stamp))))) diff --git a/hub/osaka/constraints/tx_init/rows/acc_undo_sender_value_transfer.lisp b/hub/osaka/constraints/tx_init/rows/acc_undo_sender_value_transfer.lisp new file mode 100644 index 000000000..26d85b3cf --- /dev/null +++ b/hub/osaka/constraints/tx_init/rows/acc_undo_sender_value_transfer.lisp @@ -0,0 +1,26 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X TX_INIT phase ;; +;; X.Y Common constraints ;; +;; X.Y.Z Undoing sender account value transfer ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defconstraint tx-init---account-row---sender-value-transfer---undoing-row + (:guard (tx-init---standard-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-not-zero (tx-init---transaction-failure-prediction) + (begin + (account-same-address-as tx-init---row-offset---ACC---sender-value-transfer---undoing tx-init---row-offset---ACC---sender-value-transfer) + (account-undo-balance-update tx-init---row-offset---ACC---sender-value-transfer---undoing tx-init---row-offset---ACC---sender-value-transfer) + (account-same-nonce tx-init---row-offset---ACC---sender-value-transfer---undoing) + (account-same-code tx-init---row-offset---ACC---sender-value-transfer---undoing) + (account-same-deployment-number-and-status tx-init---row-offset---ACC---sender-value-transfer---undoing) + (account-same-warmth tx-init---row-offset---ACC---sender-value-transfer---undoing) + (account-same-marked-for-deletion tx-init---row-offset---ACC---sender-value-transfer---undoing) + (account-isnt-precompile tx-init---row-offset---ACC---sender-value-transfer---undoing) + (DOM-SUB-stamps---revert-with-child tx-init---row-offset---ACC---sender-value-transfer---undoing + 4 + (tx-init---transaction-end-stamp))))) diff --git a/hub/osaka/constraints/tx_init/rows/con_initialization.lisp b/hub/osaka/constraints/tx_init/rows/con_initialization.lisp new file mode 100644 index 000000000..d64ead53e --- /dev/null +++ b/hub/osaka/constraints/tx_init/rows/con_initialization.lisp @@ -0,0 +1,50 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X TX_INIT phase ;; +;; X.Y Common constraints ;; +;; X.Y.Z Transaction row ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (tx-init---initialize-execution-context row-offset) + (begin (initialize-context row-offset + CONTEXT_NUMBER_NEW ;; context number + 0 ;; call stack depth + 1 ;; is root + 0 ;; is static + (tx-init---recipient-address-hi) ;; account address high + (tx-init---recipient-address-lo) ;; account address low + (shift account/DEPLOYMENT_NUMBER_NEW tx-init---row-offset---ACC---recipient-value-reception) ;; account deployment number + (tx-init---recipient-address-hi) ;; byte code address high + (tx-init---recipient-address-lo) ;; byte code address low + (shift account/DEPLOYMENT_NUMBER_NEW tx-init---row-offset---ACC---recipient-value-reception) ;; byte code deployment number + (shift account/DEPLOYMENT_STATUS_NEW tx-init---row-offset---ACC---recipient-value-reception) ;; byte code deployment status + (shift account/CODE_FRAGMENT_INDEX tx-init---row-offset---ACC---recipient-value-reception) ;; byte code code fragment index + (tx-init---sender-address-hi) ;; caller address high + (tx-init---sender-address-lo) ;; caller address low + (tx-init---value) ;; call value + (tx-init---call-data-context-number) ;; caller context + 0 ;; call data offset + (tx-init---call-data-size) ;; call data size + 0 ;; return at offset + 0 ;; return at capacity + ))) + +(defconstraint tx-init---initializing-execution-context---failure + (:guard (tx-init---standard-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-not-zero (tx-init---transaction-failure-prediction) + (tx-init---initialize-execution-context tx-init---row-offset---CON---context-initialization-row---failure))) + +(defconstraint tx-init---initializing-execution-context---success + (:guard (tx-init---standard-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-not-zero (tx-init---transaction-success-prediction) + (tx-init---initialize-execution-context tx-init---row-offset---CON---context-initialization-row---success))) + +(defconstraint tx-init---CONTEXT_NUMBER_NEW-sanity-check + (:guard (tx-init---standard-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (eq! CONTEXT_NUMBER_NEW (+ 1 HUB_STAMP))) diff --git a/hub/osaka/constraints/tx_init/rows/first_execution_row_parameters.lisp b/hub/osaka/constraints/tx_init/rows/first_execution_row_parameters.lisp new file mode 100644 index 000000000..d2a1162da --- /dev/null +++ b/hub/osaka/constraints/tx_init/rows/first_execution_row_parameters.lisp @@ -0,0 +1,31 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X TX_INIT phase ;; +;; X.Y Common constraints ;; +;; X.Y.Z First row of execution ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defconstraint tx-init---setting-parameters-on-the-first-row-of-new-context---failure + (:guard (tx-init---standard-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-not-zero (tx-init---transaction-failure-prediction) + (first-row-of-new-context + tx-init---row-offset---first-execution-phase-row---failure ;; row offset + 0 ;; next caller context number + (shift account/CODE_FRAGMENT_INDEX tx-init---row-offset---ACC---recipient-value-reception) ;; next CFI + (shift transaction/GAS_INITIALLY_AVAILABLE tx-init---row-offset---TXN) ;; initially available gas + ))) + +(defconstraint tx-init---setting-parameters-on-the-first-row-of-new-context---success + (:guard (tx-init---standard-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-not-zero (tx-init---transaction-success-prediction) + (first-row-of-new-context + tx-init---row-offset---first-execution-phase-row---success ;; row offset + 0 ;; next caller context number + (shift account/CODE_FRAGMENT_INDEX tx-init---row-offset---ACC---recipient-value-reception) ;; next CFI + (shift transaction/GAS_INITIALLY_AVAILABLE tx-init---row-offset---TXN) ;; initially available gas + ))) diff --git a/hub/osaka/constraints/tx_init/rows/miscellaneous.lisp b/hub/osaka/constraints/tx_init/rows/miscellaneous.lisp new file mode 100644 index 000000000..4ffcf545d --- /dev/null +++ b/hub/osaka/constraints/tx_init/rows/miscellaneous.lisp @@ -0,0 +1,37 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X TX_INIT phase ;; +;; X.Y Common constraints ;; +;; X.Y.Z Miscellaneous row ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstraint tx-init---setting-miscellaneous-row-flags + (:guard (tx-init---standard-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (eq! (weighted-MISC-flag-sum tx-init---row-offset---MISC) + (* MISC_WEIGHT_MMU (shift transaction/COPY_TXCD tx-init---row-offset---TXN)))) + +(defconstraint tx-init---copying-transaction-call-data + (:guard (tx-init---standard-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-not-zero (shift misc/MMU_FLAG tx-init---row-offset---MISC) + (set-MMU-instruction---exo-to-ram-transplants tx-init---row-offset---MISC ;; offset + USER_TXN_NUMBER ;; source ID + (tx-init---call-data-context-number) ;; target ID + ;; aux_id ;; auxiliary ID + ;; src_offset_hi ;; source offset high + ;; src_offset_lo ;; source offset low + ;; tgt_offset_lo ;; target offset low + (tx-init---call-data-size) ;; size + ;; ref_offset ;; reference offset + ;; ref_size ;; reference size + ;; success_bit ;; success bit + ;; limb_1 ;; limb 1 + ;; limb_2 ;; limb 2 + EXO_SUM_WEIGHT_TXCD ;; weighted exogenous module flag sum + RLP_TXN_PHASE_DATA ;; phase + ))) diff --git a/hub/osaka/constraints/tx_init/rows/transaction.lisp b/hub/osaka/constraints/tx_init/rows/transaction.lisp new file mode 100644 index 000000000..278cc89bf --- /dev/null +++ b/hub/osaka/constraints/tx_init/rows/transaction.lisp @@ -0,0 +1,37 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X TX_INIT phase ;; +;; X.Y Common constraints ;; +;; X.Y.Z Transaction row ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defconstraint tx-init---transaction-row---partially-justifying-requires-evm-execution + (:guard (tx-init---standard-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (begin + (eq! 1 (shift transaction/REQUIRES_EVM_EXECUTION tx-init---row-offset---TXN)) + (if-not-zero (tx-init---is-message-call) + (eq! 1 (shift account/HAS_CODE tx-init---row-offset---ACC---recipient-value-reception))) + (if-not-zero (tx-init---is-deployment) + (is-not-zero! (tx-init---init-code-size))))) + +(defconstraint tx-init---transaction-row---justifying-initial-balance + (:guard (tx-init---standard-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (eq! (shift account/BALANCE tx-init---row-offset---ACC---sender-pay-for-gas) + (shift transaction/INITIAL_BALANCE tx-init---row-offset---TXN))) + +(defconstraint tx-init---transaction-row---justifying-status-code + (:guard (tx-init---standard-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (eq! (shift transaction/STATUS_CODE tx-init---row-offset---TXN) + (tx-init---transaction-success-prediction))) + +(defconstraint tx-init---transaction-row---justifying-nonce + (:guard (tx-init---standard-precondition)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (eq! (shift transaction/NONCE tx-init---row-offset---TXN) + (shift account/NONCE tx-init---row-offset---ACC---sender-pay-for-gas))) diff --git a/hub/osaka/constraints/tx_init/shorthands.lisp b/hub/osaka/constraints/tx_init/shorthands.lisp new file mode 100644 index 000000000..97cd2b94c --- /dev/null +++ b/hub/osaka/constraints/tx_init/shorthands.lisp @@ -0,0 +1,49 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X TX_INIT phase ;; +;; X.Y Introduction ;; +;; X.Y Shorthands ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defconst + tx-init---row-offset---row-preceding-the-init-phase -1 + tx-init---row-offset---TXN 0 + tx-init---row-offset---MISC 1 + tx-init---row-offset---ACC---coinbase-warming 2 + tx-init---row-offset---ACC---sender-pay-for-gas 3 + tx-init---row-offset---ACC---sender-value-transfer 4 + tx-init---row-offset---ACC---recipient-value-reception 5 + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + tx-init---row-offset---CON---context-initialization-row---success 6 + tx-init---row-offset---first-execution-phase-row---success 7 + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + tx-init---row-offset---ACC---sender-value-transfer---undoing 6 + tx-init---row-offset---ACC---recipient-value-reception---undoing 7 + tx-init---row-offset---CON---context-initialization-row---failure 8 + tx-init---row-offset---first-execution-phase-row---failure 9 + ) + + + +(defun (tx-init---standard-precondition) (* (shift (- 1 TX_INIT) tx-init---row-offset---row-preceding-the-init-phase) TX_INIT)) +(defun (tx-init---transaction-failure-prediction) (shift misc/CCSR_FLAG tx-init---row-offset---MISC)) +(defun (tx-init---transaction-success-prediction) (- 1 (tx-init---transaction-failure-prediction))) +(defun (tx-init---transaction-end-stamp) (shift misc/CCRS_STAMP tx-init---row-offset---MISC)) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defun (tx-init---sender-address-hi) (shift transaction/FROM_ADDRESS_HI tx-init---row-offset---TXN)) +(defun (tx-init---sender-address-lo) (shift transaction/FROM_ADDRESS_LO tx-init---row-offset---TXN)) +(defun (tx-init---recipient-address-hi) (shift transaction/TO_ADDRESS_HI tx-init---row-offset---TXN)) +(defun (tx-init---recipient-address-lo) (shift transaction/TO_ADDRESS_LO tx-init---row-offset---TXN)) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defun (tx-init---is-deployment) (shift transaction/IS_DEPLOYMENT tx-init---row-offset---TXN)) +(defun (tx-init---is-message-call) (- 1 (tx-init---is-deployment))) +(defun (tx-init---gas-cost) (shift (* transaction/GAS_LIMIT transaction/GAS_PRICE) tx-init---row-offset---TXN)) +(defun (tx-init---value) (shift transaction/VALUE tx-init---row-offset---TXN)) +(defun (tx-init---call-data-context-number) (* HUB_STAMP (shift transaction/COPY_TXCD tx-init---row-offset---TXN))) +(defun (tx-init---call-data-size) (shift transaction/CALL_DATA_SIZE tx-init---row-offset---TXN)) +(defun (tx-init---init-code-size) (shift transaction/INIT_CODE_SIZE tx-init---row-offset---TXN)) +(defun (tx-init---coinbase-address-hi) (shift transaction/COINBASE_ADDRESS_HI tx-init---row-offset---TXN)) +(defun (tx-init---coinbase-address-lo) (shift transaction/COINBASE_ADDRESS_LO tx-init---row-offset---TXN)) diff --git a/hub/osaka/constraints/tx_prewarm/constraints.lisp b/hub/osaka/constraints/tx_prewarm/constraints.lisp new file mode 100644 index 000000000..2880af1cd --- /dev/null +++ b/hub/osaka/constraints/tx_prewarm/constraints.lisp @@ -0,0 +1,52 @@ +(module hub) + +;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.1 Introduction ;; +;; X.2 Constraints ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstraint prewarming-phase---peeking-into-either-account-or-storage (:guard TX_WARM) + (eq! (+ PEEK_AT_ACCOUNT PEEK_AT_STORAGE) 1)) + +(defconstraint prewarming-phase---trivial-dom-sub-stamps (:guard TX_WARM) + (DOM-SUB-stamps---standard 0 + 0)) + +(defconstraint prewarming-phase---first-prewarming-row-peeks-into-account (:guard TX_WARM) + (if-zero (prev TX_WARM) + (eq! PEEK_AT_ACCOUNT 1))) + +(defconstraint prewarming-phase---perpetuating-address-and-deployment-number-for-storage-rows (:guard (* TX_WARM (prev TX_WARM) PEEK_AT_STORAGE)) + (begin + (if-not-zero (prev PEEK_AT_ACCOUNT) + (begin + (eq! storage/ADDRESS_HI (prev account/ADDRESS_HI)) + (eq! storage/ADDRESS_LO (prev account/ADDRESS_LO)) + (eq! storage/DEPLOYMENT_NUMBER (prev account/DEPLOYMENT_NUMBER)))) + (if-not-zero (prev PEEK_AT_STORAGE) + (begin + (remained-constant! storage/ADDRESS_HI) + (remained-constant! storage/ADDRESS_LO) + (remained-constant! storage/DEPLOYMENT_NUMBER))))) + +(defconstraint prewarming-phase---turn-on-warmth-on-account-rows (:guard TX_WARM) + (if-not-zero PEEK_AT_ACCOUNT + (begin + (account-same-balance 0) + (account-same-nonce 0) + (account-same-code 0) + (account-same-deployment-number-and-status 0) + (account-turn-on-warmth 0) + (account-same-marked-for-deletion 0) + (debug (account-trim-address 0 + account/ADDRESS_HI + account/ADDRESS_LO))))) + +(defconstraint prewarming-phase---turn-on-warmth-on-storage-rows (:guard TX_WARM) + (if-not-zero PEEK_AT_STORAGE + (begin + (storage-reading 0) + (storage-turn-on-warmth 0)))) diff --git a/hub/osaka/constraints/tx_skip/noop/peeking_flags.lisp b/hub/osaka/constraints/tx_skip/noop/peeking_flags.lisp new file mode 100644 index 000000000..6d312b0ad --- /dev/null +++ b/hub/osaka/constraints/tx_skip/noop/peeking_flags.lisp @@ -0,0 +1,28 @@ +(module hub) + + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X Transactions which skip evm execution ;; +;; X.Y The NOOP-transaction case ;; +;; X.Y.Z Setting the peeking flags ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstraint tx-skip---NOOP---setting-peeking-flags + (:guard (tx-skip---precondition---NOOP)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (eq! (+ (shift PEEK_AT_TRANSACTION tx-skip---NOOP---row-offset---TXN ) + (shift PEEK_AT_CONTEXT tx-skip---NOOP---row-offset---CON---final-zero-context )) + tx-skip---NOOP---NSR)) + + +(defproperty tx-skip---NOOP---sanity-checks + (if-not-zero (tx-skip---precondition---NOOP) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (begin + (eq! TX_SKIP 1) + (eq! PEEK_AT_TRANSACTION 1) + ))) diff --git a/hub/osaka/constraints/tx_skip/noop/shorthands.lisp b/hub/osaka/constraints/tx_skip/noop/shorthands.lisp new file mode 100644 index 000000000..addd1d30e --- /dev/null +++ b/hub/osaka/constraints/tx_skip/noop/shorthands.lisp @@ -0,0 +1,26 @@ +(module hub) + + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X Transactions which skip evm execution ;; +;; X.Y The NOOP-transaction case ;; +;; X.Y.Z Shorthands ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + + +(defconst + tx-skip---NOOP---row-offset---TXN 0 + tx-skip---NOOP---row-offset---CON---final-zero-context 1 + tx-skip---NOOP---NSR 2 + ) + + +(defun (tx-skip---precondition---NOOP) (* (- TOTL_TXN_NUMBER (prev TOTL_TXN_NUMBER)) + (+ SYSI SYSF) + transaction/NOOP + )) + diff --git a/hub/osaka/constraints/tx_skip/sysf/introduction.lisp b/hub/osaka/constraints/tx_skip/sysf/introduction.lisp new file mode 100644 index 000000000..7554924ca --- /dev/null +++ b/hub/osaka/constraints/tx_skip/sysf/introduction.lisp @@ -0,0 +1,19 @@ +(module hub) + + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X Transactions which skip evm execution ;; +;; X.Y The SYSF-transaction case ;; +;; X.Y.Z Generalities ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstraint tx-skip---SYSF---generalities () + (if-not-zero (tx-skip---precondition---SYSF) + (begin + (eq! TX_SKIP 1) + (eq! transaction/NOOP 1)))) + diff --git a/hub/osaka/constraints/tx_skip/sysf/peeking_flags.lisp b/hub/osaka/constraints/tx_skip/sysf/peeking_flags.lisp new file mode 100644 index 000000000..3889ceb70 --- /dev/null +++ b/hub/osaka/constraints/tx_skip/sysf/peeking_flags.lisp @@ -0,0 +1,20 @@ +(module hub) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X Transactions which skip evm execution ;; +;; X.Y The SYSF-transaction case ;; +;; X.Y.Z Setting the peeking flags ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstraint tx-skip---SYSF---setting-the-peeking-flags () + (if-not-zero (tx-skip---precondition---SYSF) + (eq! (+ (shift TXN ROFF___TX_SKIP___NOOP___TRANSACTION_ROW ) + (shift CON ROFF___TX_SKIP___NOOP___ZERO_CONTEXT_ROW ) + ) + NSR___TX_SKIP___NOOP + ))) + diff --git a/hub/osaka/constraints/tx_skip/sysf/shorthands.lisp b/hub/osaka/constraints/tx_skip/sysf/shorthands.lisp new file mode 100644 index 000000000..526758f1a --- /dev/null +++ b/hub/osaka/constraints/tx_skip/sysf/shorthands.lisp @@ -0,0 +1,22 @@ +(module hub) + + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X Transactions which skip evm execution ;; +;; X.Y The SYSF-transaction case ;; +;; X.Y.Z Shorthands ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (tx-skip---precondition---SYSF) (* (- TOTL_TXN_NUMBER (prev TOTL_TXN_NUMBER)) + SYSF + )) + +(defconst + ROFF___TX_SKIP___NOOP___TRANSACTION_ROW 0 + ROFF___TX_SKIP___NOOP___ZERO_CONTEXT_ROW 1 + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + NSR___TX_SKIP___NOOP 2 + ) diff --git a/hub/osaka/constraints/tx_skip/sysi/eip-2935/peeking_flags.lisp b/hub/osaka/constraints/tx_skip/sysi/eip-2935/peeking_flags.lisp new file mode 100644 index 000000000..4eab25050 --- /dev/null +++ b/hub/osaka/constraints/tx_skip/sysi/eip-2935/peeking_flags.lisp @@ -0,0 +1,41 @@ +(module hub) + + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X Transactions which skip evm execution ;; +;; X.Y The SYSI-transaction case ;; +;; X.Y.Z EIP-2935 transactions ;; +;; X.Y.Z.T Peeking flag setting ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstraint tx-skip---SYSI-2935---setting-the-peeking-flags-that-hold-unconditionally + (:guard (tx-skip---precondition---SYSI-2935)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (eq! (+ (shift PEEK_AT_TRANSACTION ROFF---tx-skip---SYSI-2935---TXN ) + (shift PEEK_AT_ACCOUNT ROFF---tx-skip---SYSI-2935---ACC---loading-the-block-hash-history-account )) + NSR---tx-skip---SYSI-2935---unconditional)) + + +(defconstraint tx-skip---SYSI-2935---setting-the-exact-peeking-flags---trivial-case + (:guard (tx-skip---precondition---SYSI-2935)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-not-zero (tx-skip---SYSI-2935---sys-txn-is-trivial) + (eq! (+ (shift PEEK_AT_TRANSACTION ROFF---tx-skip---SYSI-2935---TXN ) + (shift PEEK_AT_ACCOUNT ROFF---tx-skip---SYSI-2935---ACC---loading-the-block-hash-history-account ) + (shift PEEK_AT_CONTEXT ROFF---tx-skip---SYSI-2935---CON---final-zero-context---trivial-case )) + NSR---tx-skip---SYSI-2935---trivial-case))) + + +(defconstraint tx-skip---SYSI-2935---setting-the-exact-peeking-flags---nontrivial-case + (:guard (tx-skip---precondition---SYSI-2935)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-not-zero (tx-skip---SYSI-2935---sys-txn-is-nontrivial) + (eq! (+ (shift PEEK_AT_TRANSACTION ROFF---tx-skip---SYSI-2935---TXN ) + (shift PEEK_AT_ACCOUNT ROFF---tx-skip---SYSI-2935---ACC---loading-the-block-hash-history-account ) + (shift PEEK_AT_STORAGE ROFF---tx-skip---SYSI-2935---STO---storing-the-previous-block-hash ) + (shift PEEK_AT_CONTEXT ROFF---tx-skip---SYSI-2935---CON---final-zero-context---nontrivial-case )) + NSR---tx-skip---SYSI-2935---nontrivial-case))) diff --git a/hub/osaka/constraints/tx_skip/sysi/eip-2935/rows/_context_final_zero_context___nontrivial_case.lisp b/hub/osaka/constraints/tx_skip/sysi/eip-2935/rows/_context_final_zero_context___nontrivial_case.lisp new file mode 100644 index 000000000..3f5a19b87 --- /dev/null +++ b/hub/osaka/constraints/tx_skip/sysi/eip-2935/rows/_context_final_zero_context___nontrivial_case.lisp @@ -0,0 +1,14 @@ +(module hub) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X Transactions which skip evm execution ;; +;; X.Y The SYSI-transaction case ;; +;; X.Y.Z EIP-2935 transactions ;; +;; X.Y.Z.T Transaction processing ;; +;; X.Y.Z.T.U Final context row ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;; ràf diff --git a/hub/osaka/constraints/tx_skip/sysi/eip-2935/rows/_context_final_zero_context___trivial_case.lisp b/hub/osaka/constraints/tx_skip/sysi/eip-2935/rows/_context_final_zero_context___trivial_case.lisp new file mode 100644 index 000000000..3f5a19b87 --- /dev/null +++ b/hub/osaka/constraints/tx_skip/sysi/eip-2935/rows/_context_final_zero_context___trivial_case.lisp @@ -0,0 +1,14 @@ +(module hub) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X Transactions which skip evm execution ;; +;; X.Y The SYSI-transaction case ;; +;; X.Y.Z EIP-2935 transactions ;; +;; X.Y.Z.T Transaction processing ;; +;; X.Y.Z.T.U Final context row ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;; ràf diff --git a/hub/osaka/constraints/tx_skip/sysi/eip-2935/rows/_transaction.lisp b/hub/osaka/constraints/tx_skip/sysi/eip-2935/rows/_transaction.lisp new file mode 100644 index 000000000..ae74d4f1d --- /dev/null +++ b/hub/osaka/constraints/tx_skip/sysi/eip-2935/rows/_transaction.lisp @@ -0,0 +1,14 @@ +(module hub) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X Transactions which skip evm execution ;; +;; X.Y The SYSI-transaction case ;; +;; X.Y.Z EIP-2935 transactions ;; +;; X.Y.Z.T Transaction processing ;; +;; X.Y.Z.T.U Transaction row ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;; ràf diff --git a/hub/osaka/constraints/tx_skip/sysi/eip-2935/rows/account_load_the_block_hash_smart_contract.lisp b/hub/osaka/constraints/tx_skip/sysi/eip-2935/rows/account_load_the_block_hash_smart_contract.lisp new file mode 100644 index 000000000..5ce11586a --- /dev/null +++ b/hub/osaka/constraints/tx_skip/sysi/eip-2935/rows/account_load_the_block_hash_smart_contract.lisp @@ -0,0 +1,31 @@ +(module hub) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X Transactions which skip evm execution ;; +;; X.Y The SYSI-transaction case ;; +;; X.Y.Z EIP-2935 transactions ;; +;; X.Y.Z.T Transaction processing ;; +;; X.Y.Z.T.U Load the block hash smart contract ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstraint tx-skip---SYSI-2935---loading-the-block-hash-history-system-smart-contract + (:guard (tx-skip---precondition---SYSI-2935)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (begin + (account-trim-address ROFF---tx-skip---SYSI-2935---ACC---loading-the-block-hash-history-account ;; row offset + HISTORY_STORAGE_ADDRESS_HI ;; high part of raw, potentially untrimmed address + HISTORY_STORAGE_ADDRESS_LO) ;; low part of raw, potentially untrimmed address + (eq! (shift account/ADDRESS_HI ROFF---tx-skip---SYSI-2935---ACC---loading-the-block-hash-history-account) HISTORY_STORAGE_ADDRESS_HI) + (eq! (shift account/ADDRESS_LO ROFF---tx-skip---SYSI-2935---ACC---loading-the-block-hash-history-account) HISTORY_STORAGE_ADDRESS_LO) + (account-same-balance ROFF---tx-skip---SYSI-2935---ACC---loading-the-block-hash-history-account) + (account-same-nonce ROFF---tx-skip---SYSI-2935---ACC---loading-the-block-hash-history-account) + (account-same-code ROFF---tx-skip---SYSI-2935---ACC---loading-the-block-hash-history-account) + (account-same-deployment-number-and-status ROFF---tx-skip---SYSI-2935---ACC---loading-the-block-hash-history-account) + (account-same-warmth ROFF---tx-skip---SYSI-2935---ACC---loading-the-block-hash-history-account) + (account-same-marked-for-deletion ROFF---tx-skip---SYSI-2935---ACC---loading-the-block-hash-history-account) + (DOM-SUB-stamps---standard ROFF---tx-skip---SYSI-2935---ACC---loading-the-block-hash-history-account + ROFF---tx-skip---SYSI-2935---ACC---loading-the-block-hash-history-account))) diff --git a/hub/osaka/constraints/tx_skip/sysi/eip-2935/rows/storage_store_block_hash_in_state.lisp b/hub/osaka/constraints/tx_skip/sysi/eip-2935/rows/storage_store_block_hash_in_state.lisp new file mode 100644 index 000000000..4c10bb912 --- /dev/null +++ b/hub/osaka/constraints/tx_skip/sysi/eip-2935/rows/storage_store_block_hash_in_state.lisp @@ -0,0 +1,31 @@ +(module hub) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X Transactions which skip evm execution ;; +;; X.Y The SYSI-transaction case ;; +;; X.Y.Z EIP-2935 transactions ;; +;; X.Y.Z.T Transaction processing ;; +;; X.Y.Z.T.U Store block hash in state ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstraint tx-skip---SYSI-2935---storing-the-previous-block-hash-in-state + (:guard (tx-skip---precondition---SYSI-2935)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-not-zero (tx-skip---SYSI-2935---sys-txn-is-nontrivial) + (begin + (eq! (shift storage/ADDRESS_HI ROFF---tx-skip---SYSI-2935---STO---storing-the-previous-block-hash) HISTORY_STORAGE_ADDRESS_HI) + (eq! (shift storage/ADDRESS_LO ROFF---tx-skip---SYSI-2935---STO---storing-the-previous-block-hash) HISTORY_STORAGE_ADDRESS_LO) + (eq! (shift storage/DEPLOYMENT_NUMBER ROFF---tx-skip---SYSI-2935---STO---storing-the-previous-block-hash) (shift account/DEPLOYMENT_NUMBER ROFF---tx-skip---SYSI-2935---ACC---loading-the-block-hash-history-account)) + (eq! (shift storage/STORAGE_KEY_HI ROFF---tx-skip---SYSI-2935---STO---storing-the-previous-block-hash) 0) + (eq! (shift storage/STORAGE_KEY_LO ROFF---tx-skip---SYSI-2935---STO---storing-the-previous-block-hash) (tx-skip---SYSI-2935---prev-block-number-mod-8191)) + (eq! (shift storage/VALUE_NEXT_HI ROFF---tx-skip---SYSI-2935---STO---storing-the-previous-block-hash) (tx-skip---SYSI-2935---prev-block-hash-hi)) + (eq! (shift storage/VALUE_NEXT_LO ROFF---tx-skip---SYSI-2935---STO---storing-the-previous-block-hash) (tx-skip---SYSI-2935---prev-block-hash-lo)) + (storage-same-warmth ROFF---tx-skip---SYSI-2935---STO---storing-the-previous-block-hash) + (DOM-SUB-stamps---standard ROFF---tx-skip---SYSI-2935---STO---storing-the-previous-block-hash ;; kappa + ROFF---tx-skip---SYSI-2935---STO---storing-the-previous-block-hash)) ;; c + )) + diff --git a/hub/osaka/constraints/tx_skip/sysi/eip-2935/shorthands.lisp b/hub/osaka/constraints/tx_skip/sysi/eip-2935/shorthands.lisp new file mode 100644 index 000000000..c38adc2a5 --- /dev/null +++ b/hub/osaka/constraints/tx_skip/sysi/eip-2935/shorthands.lisp @@ -0,0 +1,48 @@ +(module hub) + + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X Transactions which skip evm execution ;; +;; X.Y The SYSI-transaction case ;; +;; X.Y.Z EIP-2935 transactions ;; +;; X.Y.Z.T Shorthands ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + + +(defconst + ROFF---tx-skip---SYSI-2935---TXN 0 + ROFF---tx-skip---SYSI-2935---ACC---loading-the-block-hash-history-account 1 + ROFF---tx-skip---SYSI-2935---STO---storing-the-previous-block-hash 2 + ROFF---tx-skip---SYSI-2935---CON---final-zero-context---nontrivial-case 3 + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ROFF---tx-skip---SYSI-2935---CON---final-zero-context---trivial-case 2 + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + NSR---tx-skip---SYSI-2935---unconditional 2 + NSR---tx-skip---SYSI-2935---trivial-case 3 + NSR---tx-skip---SYSI-2935---nontrivial-case 4 + ) + + +(defun (tx-skip---SYSI-2935---sys-smc-has-code) (shift account/HAS_CODE ROFF---tx-skip---SYSI-2935---ACC---loading-the-block-hash-history-account)) ;; "" +;; we don't need "prev-block-number" itself +(defun (tx-skip---SYSI-2935---prev-block-number-mod-8191) (shift transaction/SYST_TXN_DATA_2 ROFF---tx-skip---SYSI-2935---TXN)) ;; "" +(defun (tx-skip---SYSI-2935---prev-block-hash-hi) (shift transaction/SYST_TXN_DATA_3 ROFF---tx-skip---SYSI-2935---TXN)) ;; "" +(defun (tx-skip---SYSI-2935---prev-block-hash-lo) (shift transaction/SYST_TXN_DATA_4 ROFF---tx-skip---SYSI-2935---TXN)) ;; "" +(defun (tx-skip---SYSI-2935---current-block-is-genesis) (shift transaction/SYST_TXN_DATA_5 ROFF---tx-skip---SYSI-2935---TXN)) ;; "" +(defun (tx-skip---SYSI-2935---current-block-isnt-genesis) (force-bin (- 1 (tx-skip---SYSI-2935---current-block-is-genesis)))) + + +(defun (tx-skip---SYSI-2935---sys-txn-is-nontrivial) (force-bin (* (tx-skip---SYSI-2935---sys-smc-has-code) + (tx-skip---SYSI-2935---current-block-isnt-genesis)))) +(defun (tx-skip---SYSI-2935---sys-txn-is-trivial) (force-bin (- 1 (tx-skip---SYSI-2935---sys-txn-is-nontrivial)))) + + +(defun (tx-skip---precondition---SYSI-2935) (force-bin (* (- TOTL_TXN_NUMBER (prev TOTL_TXN_NUMBER)) + SYSI + TX_SKIP + (shift transaction/EIP_2935 ROFF---tx-skip---SYSI-2935---TXN) + ))) diff --git a/hub/osaka/constraints/tx_skip/sysi/eip-4788/peeking_flags.lisp b/hub/osaka/constraints/tx_skip/sysi/eip-4788/peeking_flags.lisp new file mode 100644 index 000000000..0ac9ac364 --- /dev/null +++ b/hub/osaka/constraints/tx_skip/sysi/eip-4788/peeking_flags.lisp @@ -0,0 +1,42 @@ +(module hub) + + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X Transactions which skip evm execution ;; +;; X.Y The SYSI-transaction case ;; +;; X.Y.Z EIP-4788 transactions ;; +;; X.Y.Z.T Peeking flag setting ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstraint tx-skip---SYSI-4788---setting-peeking-flags-that-hold-unconditionally + (:guard (tx-skip---precondition---SYSI-4788)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (eq! (+ (shift PEEK_AT_TRANSACTION ROFF---tx-skip---SYSI-4788---TXN ) + (shift PEEK_AT_ACCOUNT ROFF---tx-skip---SYSI-4788---ACC---loading-the-beacon-root-account )) + NSR---tx-skip---SYSI-4788---unconditional)) + + +(defconstraint tx-skip---SYSI-4788---setting-the-exact-peeking-flags---trivial-case + (:guard (tx-skip---precondition---SYSI-4788)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-not-zero (tx-skip---SYSI-4788---sys-txn-is-trivial) + (eq! (+ (shift PEEK_AT_TRANSACTION ROFF---tx-skip---SYSI-4788---TXN ) + (shift PEEK_AT_ACCOUNT ROFF---tx-skip---SYSI-4788---ACC---loading-the-beacon-root-account ) + (shift PEEK_AT_CONTEXT ROFF---tx-skip---SYSI-4788---CON---final-zero-context---trivial-case )) + NSR---tx-skip---SYSI-4788---trivial-case))) + + +(defconstraint tx-skip---SYSI-4788---setting-the-exact-peeking-flags---nontrivial-case + (:guard (tx-skip---precondition---SYSI-4788)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-not-zero (tx-skip---SYSI-4788---sys-txn-is-nontrivial) + (eq! (+ (shift PEEK_AT_TRANSACTION ROFF---tx-skip---SYSI-4788---TXN ) + (shift PEEK_AT_ACCOUNT ROFF---tx-skip---SYSI-4788---ACC---loading-the-beacon-root-account ) + (shift PEEK_AT_STORAGE ROFF---tx-skip---SYSI-4788---STO---storing-the-time-stamp ) + (shift PEEK_AT_STORAGE ROFF---tx-skip---SYSI-4788---STO---storing-the-beacon-root ) + (shift PEEK_AT_CONTEXT ROFF---tx-skip---SYSI-4788---CON---final-zero-context---nontrivial-case )) + NSR---tx-skip---SYSI-4788---nontrivial-case))) diff --git a/hub/osaka/constraints/tx_skip/sysi/eip-4788/rows/_context_final_zero_context___nontrivial_case.lisp b/hub/osaka/constraints/tx_skip/sysi/eip-4788/rows/_context_final_zero_context___nontrivial_case.lisp new file mode 100644 index 000000000..0018dedf7 --- /dev/null +++ b/hub/osaka/constraints/tx_skip/sysi/eip-4788/rows/_context_final_zero_context___nontrivial_case.lisp @@ -0,0 +1,14 @@ +(module hub) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X Transactions which skip evm execution ;; +;; X.Y The SYSI-transaction case ;; +;; X.Y.Z EIP-4788 transactions ;; +;; X.Y.Z.T Transaction processing ;; +;; X.Y.Z.T.U Final context row (nontrivial case) ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;; ràf diff --git a/hub/osaka/constraints/tx_skip/sysi/eip-4788/rows/_context_final_zero_context___trivial_case.lisp b/hub/osaka/constraints/tx_skip/sysi/eip-4788/rows/_context_final_zero_context___trivial_case.lisp new file mode 100644 index 000000000..ebff59f67 --- /dev/null +++ b/hub/osaka/constraints/tx_skip/sysi/eip-4788/rows/_context_final_zero_context___trivial_case.lisp @@ -0,0 +1,15 @@ +(module hub) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X Transactions which skip evm execution ;; +;; X.Y The SYSI-transaction case ;; +;; X.Y.Z EIP-4788 transactions ;; +;; X.Y.Z.T Transaction processing ;; +;; X.Y.Z.T.U Final context row (nontrivial case) ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;; ràf + diff --git a/hub/osaka/constraints/tx_skip/sysi/eip-4788/rows/_transaction.lisp b/hub/osaka/constraints/tx_skip/sysi/eip-4788/rows/_transaction.lisp new file mode 100644 index 000000000..f5455ab31 --- /dev/null +++ b/hub/osaka/constraints/tx_skip/sysi/eip-4788/rows/_transaction.lisp @@ -0,0 +1,14 @@ +(module hub) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X Transactions which skip evm execution ;; +;; X.Y The SYSI-transaction case ;; +;; X.Y.Z EIP-4788 transactions ;; +;; X.Y.Z.T Transaction processing ;; +;; X.Y.Z.T.U Transaction row ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;; ràf diff --git a/hub/osaka/constraints/tx_skip/sysi/eip-4788/rows/account_load_the_beacon_root_smart_contract.lisp b/hub/osaka/constraints/tx_skip/sysi/eip-4788/rows/account_load_the_beacon_root_smart_contract.lisp new file mode 100644 index 000000000..05590240a --- /dev/null +++ b/hub/osaka/constraints/tx_skip/sysi/eip-4788/rows/account_load_the_beacon_root_smart_contract.lisp @@ -0,0 +1,34 @@ +(module hub) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X Transactions which skip evm execution ;; +;; X.Y The SYSI-transaction case ;; +;; X.Y.Z EIP-4788 transactions ;; +;; X.Y.Z.T Transaction processing ;; +;; X.Y.Z.T.U Beacon root smart contract loading ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +;; ràf: sanity checks +;; ràf: transaction row + +(defconstraint tx-skip---SYSI-4788---loading-the-beacon-root-system-smart-contract + (:guard (tx-skip---precondition---SYSI-4788)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (begin + (account-trim-address ROFF---tx-skip---SYSI-4788---ACC---loading-the-beacon-root-account ;; row offset + BEACON_ROOTS_ADDRESS_HI ;; high part of raw, potentially untrimmed address + BEACON_ROOTS_ADDRESS_LO) ;; low part of raw, potentially untrimmed address + (eq! (shift account/ADDRESS_HI ROFF---tx-skip---SYSI-4788---ACC---loading-the-beacon-root-account) BEACON_ROOTS_ADDRESS_HI) + (eq! (shift account/ADDRESS_LO ROFF---tx-skip---SYSI-4788---ACC---loading-the-beacon-root-account) BEACON_ROOTS_ADDRESS_LO) + (account-same-balance ROFF---tx-skip---SYSI-4788---ACC---loading-the-beacon-root-account) + (account-same-nonce ROFF---tx-skip---SYSI-4788---ACC---loading-the-beacon-root-account) + (account-same-code ROFF---tx-skip---SYSI-4788---ACC---loading-the-beacon-root-account) + (account-same-deployment-number-and-status ROFF---tx-skip---SYSI-4788---ACC---loading-the-beacon-root-account) + (account-same-warmth ROFF---tx-skip---SYSI-4788---ACC---loading-the-beacon-root-account) + (account-same-marked-for-deletion ROFF---tx-skip---SYSI-4788---ACC---loading-the-beacon-root-account) + (DOM-SUB-stamps---standard ROFF---tx-skip---SYSI-4788---ACC---loading-the-beacon-root-account + ROFF---tx-skip---SYSI-4788---ACC---loading-the-beacon-root-account))) diff --git a/hub/osaka/constraints/tx_skip/sysi/eip-4788/rows/storage_store_beacon_root.lisp b/hub/osaka/constraints/tx_skip/sysi/eip-4788/rows/storage_store_beacon_root.lisp new file mode 100644 index 000000000..5e2c2f8f3 --- /dev/null +++ b/hub/osaka/constraints/tx_skip/sysi/eip-4788/rows/storage_store_beacon_root.lisp @@ -0,0 +1,31 @@ +(module hub) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X Transactions which skip evm execution ;; +;; X.Y The SYSI-transaction case ;; +;; X.Y.Z EIP-4788 transactions ;; +;; X.Y.Z.T Transaction processing ;; +;; X.Y.Z.T.U Storing the beacon root in the state ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstraint tx-skip---SYSI-4788---storing-the-beacon-root-in-the-state + (:guard (tx-skip---precondition---SYSI-4788)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-not-zero (tx-skip---SYSI-4788---sys-txn-is-nontrivial) + (begin + (eq! (shift storage/ADDRESS_HI ROFF---tx-skip---SYSI-4788---STO---storing-the-beacon-root) BEACON_ROOTS_ADDRESS_HI) + (eq! (shift storage/ADDRESS_LO ROFF---tx-skip---SYSI-4788---STO---storing-the-beacon-root) BEACON_ROOTS_ADDRESS_LO) + (eq! (shift storage/DEPLOYMENT_NUMBER ROFF---tx-skip---SYSI-4788---STO---storing-the-beacon-root) (shift account/DEPLOYMENT_NUMBER ROFF---tx-skip---SYSI-4788---ACC---loading-the-beacon-root-account)) + (eq! (shift storage/STORAGE_KEY_HI ROFF---tx-skip---SYSI-4788---STO---storing-the-beacon-root) 0) + (eq! (shift storage/STORAGE_KEY_LO ROFF---tx-skip---SYSI-4788---STO---storing-the-beacon-root) (+ (tx-skip---SYSI-4788---timestamp-mod-8191) HISTORY_BUFFER_LENGTH)) + (eq! (shift storage/VALUE_NEXT_HI ROFF---tx-skip---SYSI-4788---STO---storing-the-beacon-root) (tx-skip---SYSI-4788---beacon-root-hi)) + (eq! (shift storage/VALUE_NEXT_LO ROFF---tx-skip---SYSI-4788---STO---storing-the-beacon-root) (tx-skip---SYSI-4788---beacon-root-lo)) + (storage-same-warmth ROFF---tx-skip---SYSI-4788---STO---storing-the-beacon-root) + (DOM-SUB-stamps---standard ROFF---tx-skip---SYSI-4788---STO---storing-the-beacon-root ;; kappa + ROFF---tx-skip---SYSI-4788---STO---storing-the-beacon-root) ;; c + ))) + diff --git a/hub/osaka/constraints/tx_skip/sysi/eip-4788/rows/storage_store_timestamp.lisp b/hub/osaka/constraints/tx_skip/sysi/eip-4788/rows/storage_store_timestamp.lisp new file mode 100644 index 000000000..856923eee --- /dev/null +++ b/hub/osaka/constraints/tx_skip/sysi/eip-4788/rows/storage_store_timestamp.lisp @@ -0,0 +1,31 @@ +(module hub) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X Transactions which skip evm execution ;; +;; X.Y The SYSI-transaction case ;; +;; X.Y.Z EIP-4788 transactions ;; +;; X.Y.Z.T Transaction processing ;; +;; X.Y.Z.T.U Storing the timestamp in the state ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstraint tx-skip---SYSI-4788---storing-the-timestamp-in-the-state + (:guard (tx-skip---precondition---SYSI-4788)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-not-zero (tx-skip---SYSI-4788---sys-txn-is-nontrivial) + (begin + (eq! (shift storage/ADDRESS_HI ROFF---tx-skip---SYSI-4788---STO---storing-the-time-stamp) BEACON_ROOTS_ADDRESS_HI) + (eq! (shift storage/ADDRESS_LO ROFF---tx-skip---SYSI-4788---STO---storing-the-time-stamp) BEACON_ROOTS_ADDRESS_LO) + (eq! (shift storage/DEPLOYMENT_NUMBER ROFF---tx-skip---SYSI-4788---STO---storing-the-time-stamp) (shift account/DEPLOYMENT_NUMBER ROFF---tx-skip---SYSI-4788---ACC---loading-the-beacon-root-account)) + (eq! (shift storage/STORAGE_KEY_HI ROFF---tx-skip---SYSI-4788---STO---storing-the-time-stamp) 0) + (eq! (shift storage/STORAGE_KEY_LO ROFF---tx-skip---SYSI-4788---STO---storing-the-time-stamp) (tx-skip---SYSI-4788---timestamp-mod-8191)) + (eq! (shift storage/VALUE_NEXT_HI ROFF---tx-skip---SYSI-4788---STO---storing-the-time-stamp) 0) + (eq! (shift storage/VALUE_NEXT_LO ROFF---tx-skip---SYSI-4788---STO---storing-the-time-stamp) (tx-skip---SYSI-4788---timestamp)) + (storage-same-warmth ROFF---tx-skip---SYSI-4788---STO---storing-the-time-stamp) + (DOM-SUB-stamps---standard ROFF---tx-skip---SYSI-4788---STO---storing-the-time-stamp ;; kappa + ROFF---tx-skip---SYSI-4788---STO---storing-the-time-stamp)) ;; c + )) + diff --git a/hub/osaka/constraints/tx_skip/sysi/eip-4788/shorthands.lisp b/hub/osaka/constraints/tx_skip/sysi/eip-4788/shorthands.lisp new file mode 100644 index 000000000..6a055760e --- /dev/null +++ b/hub/osaka/constraints/tx_skip/sysi/eip-4788/shorthands.lisp @@ -0,0 +1,48 @@ +(module hub) + + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X Transactions which skip evm execution ;; +;; X.Y The SYSI-transaction case ;; +;; X.Y.Z EIP-4788 transactions ;; +;; X.Y.Z.T Shorthands ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + + +(defconst + ROFF---tx-skip---SYSI-4788---TXN 0 + ROFF---tx-skip---SYSI-4788---ACC---loading-the-beacon-root-account 1 + ROFF---tx-skip---SYSI-4788---STO---storing-the-time-stamp 2 + ROFF---tx-skip---SYSI-4788---STO---storing-the-beacon-root 3 + ROFF---tx-skip---SYSI-4788---CON---final-zero-context---nontrivial-case 4 + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ROFF---tx-skip---SYSI-4788---CON---final-zero-context---trivial-case 2 + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + NSR---tx-skip---SYSI-4788---unconditional 2 + NSR---tx-skip---SYSI-4788---trivial-case 3 + NSR---tx-skip---SYSI-4788---nontrivial-case 5 + ) + +(defun (tx-skip---SYSI-4788---sys-smc-has-code) (shift account/HAS_CODE ROFF---tx-skip---SYSI-4788---ACC---loading-the-beacon-root-account)) ;; "" +(defun (tx-skip---SYSI-4788---timestamp) (shift transaction/SYST_TXN_DATA_1 ROFF---tx-skip---SYSI-4788---TXN)) ;; "" +(defun (tx-skip---SYSI-4788---timestamp-mod-8191) (shift transaction/SYST_TXN_DATA_2 ROFF---tx-skip---SYSI-4788---TXN)) ;; "" +(defun (tx-skip---SYSI-4788---beacon-root-hi) (shift transaction/SYST_TXN_DATA_3 ROFF---tx-skip---SYSI-4788---TXN)) ;; "" +(defun (tx-skip---SYSI-4788---beacon-root-lo) (shift transaction/SYST_TXN_DATA_4 ROFF---tx-skip---SYSI-4788---TXN)) ;; "" +(defun (tx-skip---SYSI-4788---current-block-is-genesis) (shift transaction/SYST_TXN_DATA_5 ROFF---tx-skip---SYSI-4788---TXN)) ;; "" +(defun (tx-skip---SYSI-4788---current-block-isnt-genesis) (force-bin (- 1 (tx-skip---SYSI-4788---current-block-is-genesis)))) + + +(defun (tx-skip---SYSI-4788---sys-txn-is-nontrivial) (force-bin (* (tx-skip---SYSI-4788---sys-smc-has-code) + (tx-skip---SYSI-4788---current-block-isnt-genesis)))) +(defun (tx-skip---SYSI-4788---sys-txn-is-trivial) (force-bin (- 1 (tx-skip---SYSI-4788---sys-txn-is-nontrivial)))) + + +(defun (tx-skip---precondition---SYSI-4788) (force-bin (* (- TOTL_TXN_NUMBER (prev TOTL_TXN_NUMBER)) + SYSI + TX_SKIP + (shift transaction/EIP_4788 ROFF---tx-skip---SYSI-4788---TXN) + ))) diff --git a/hub/osaka/constraints/tx_skip/user/peeking_flags.lisp b/hub/osaka/constraints/tx_skip/user/peeking_flags.lisp new file mode 100644 index 000000000..8b0e5c4d8 --- /dev/null +++ b/hub/osaka/constraints/tx_skip/user/peeking_flags.lisp @@ -0,0 +1,23 @@ +(module hub) + + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X Transactions which skip evm execution ;; +;; X.Y The USER-transaction case ;; +;; X.Y.Z Peeking flag setting ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstraint tx-skip---USER---setting-the-peeking-flags + (:guard (tx-skip---precondition---USER)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (eq! (+ (shift PEEK_AT_TRANSACTION tx-skip---USER---row-offset---TXN ) + (shift PEEK_AT_ACCOUNT tx-skip---USER---row-offset---ACC---sender ) + (shift PEEK_AT_ACCOUNT tx-skip---USER---row-offset---ACC---recipient ) + (shift PEEK_AT_ACCOUNT tx-skip---USER---row-offset---ACC---coinbase ) + (shift PEEK_AT_CONTEXT tx-skip---USER---row-offset---CON---final-zero-context )) + tx-skip---USER---NSR)) + diff --git a/hub/osaka/constraints/tx_skip/user/rows/_context_final_zero_context.lisp b/hub/osaka/constraints/tx_skip/user/rows/_context_final_zero_context.lisp new file mode 100644 index 000000000..6b0dd2eb8 --- /dev/null +++ b/hub/osaka/constraints/tx_skip/user/rows/_context_final_zero_context.lisp @@ -0,0 +1,13 @@ +(module hub) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X Transactions which skip evm execution ;; +;; X.Y The USER-transaction case ;; +;; X.Y.Z Transaction processing ;; +;; X.Y.Z.T Final context row ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;; ràf diff --git a/hub/osaka/constraints/tx_skip/user/rows/account_coinbase.lisp b/hub/osaka/constraints/tx_skip/user/rows/account_coinbase.lisp new file mode 100644 index 000000000..6d252f1cf --- /dev/null +++ b/hub/osaka/constraints/tx_skip/user/rows/account_coinbase.lisp @@ -0,0 +1,30 @@ +(module hub) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X Transactions which skip evm execution ;; +;; X.Y The USER-transaction case ;; +;; X.Y.Z Transaction processing ;; +;; X.Y.Z.T Final context row ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defun (tx-skip---coinbase-fee) (shift (* transaction/PRIORITY_FEE_PER_GAS (- transaction/GAS_LIMIT transaction/REFUND_EFFECTIVE)) + tx-skip---USER---row-offset---TXN)) + +(defconstraint tx-skip---setting-coinbase-account-row + (:guard (tx-skip---precondition---USER)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (begin + (eq! (shift account/ADDRESS_HI tx-skip---USER---row-offset---ACC---coinbase) (shift transaction/COINBASE_ADDRESS_HI tx-skip---USER---row-offset---TXN)) + (eq! (shift account/ADDRESS_LO tx-skip---USER---row-offset---ACC---coinbase) (shift transaction/COINBASE_ADDRESS_LO tx-skip---USER---row-offset---TXN)) + (account-increment-balance-by tx-skip---USER---row-offset---ACC---coinbase (tx-skip---coinbase-fee)) + (account-same-nonce tx-skip---USER---row-offset---ACC---coinbase) + (account-same-code tx-skip---USER---row-offset---ACC---coinbase) + (account-same-deployment-number-and-status tx-skip---USER---row-offset---ACC---coinbase) + (account-same-warmth tx-skip---USER---row-offset---ACC---coinbase) + (account-same-marked-for-deletion tx-skip---USER---row-offset---ACC---coinbase) + (DOM-SUB-stamps---standard tx-skip---USER---row-offset---ACC---coinbase + tx-skip---USER---row-offset---ACC---coinbase))) diff --git a/hub/osaka/constraints/tx_skip/user/rows/account_recipient.lisp b/hub/osaka/constraints/tx_skip/user/rows/account_recipient.lisp new file mode 100644 index 000000000..59cf7168d --- /dev/null +++ b/hub/osaka/constraints/tx_skip/user/rows/account_recipient.lisp @@ -0,0 +1,83 @@ +(module hub) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X Transactions which skip evm execution ;; +;; X.Y The USER-transaction case ;; +;; X.Y.Z Transaction processing ;; +;; X.Y.Z.T Final context row ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstraint tx-skip---USER---setting-recipient-account-row + (:guard (tx-skip---precondition---USER)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (begin (eq! (shift account/ADDRESS_HI tx-skip---USER---row-offset---ACC---recipient) (shift transaction/TO_ADDRESS_HI tx-skip---USER---row-offset---TXN)) + (eq! (shift account/ADDRESS_LO tx-skip---USER---row-offset---ACC---recipient) (shift transaction/TO_ADDRESS_LO tx-skip---USER---row-offset---TXN)) + (account-increment-balance-by tx-skip---USER---row-offset---ACC---recipient (shift transaction/VALUE tx-skip---USER---row-offset---TXN)) + ;; (account-increment-nonce tx-skip---USER---row-offset---ACC---recipient) + ;; (account-same-code tx-skip---USER---row-offset---ACC---recipient) + ;; (account-same-deployment-number-and-status tx-skip---USER---row-offset---ACC---recipient) + (account-same-warmth tx-skip---USER---row-offset---ACC---recipient) + (account-same-marked-for-deletion tx-skip---USER---row-offset---ACC---recipient) + (account-isnt-precompile tx-skip---USER---row-offset---ACC---recipient) + (DOM-SUB-stamps---standard tx-skip---USER---row-offset---ACC---recipient + tx-skip---USER---row-offset---ACC---recipient))) + +(defconstraint tx-skip---USER---recipient-account-row---trivial-message-calls---nonce-code-and-deployment-status + (:guard (tx-skip---precondition---USER)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-zero (tx-skip---USER---is-deployment) + ;; deployment ≡ 0 i.e. pure transfers + (begin (account-same-nonce tx-skip---USER---row-offset---ACC---recipient) + (account-same-code tx-skip---USER---row-offset---ACC---recipient) + (account-same-deployment-number-and-status tx-skip---USER---row-offset---ACC---recipient)))) + +(defconstraint tx-skip---USER---recipient-account-row---trivial-deployments---nonce + (:guard (tx-skip---precondition---USER)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-not-zero (tx-skip---USER---is-deployment) + ;; deployment ≡ 1 i.e. trivial deployments + (begin ;; nonce + (account-increment-nonce tx-skip---USER---row-offset---ACC---recipient) + (vanishes! (shift account/NONCE tx-skip---USER---row-offset---ACC---recipient))))) + +(defconstraint tx-skip---USER---recipient-account-row---trivial-deployments---code + (:guard (tx-skip---precondition---USER)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-not-zero (tx-skip---USER---is-deployment) + ;; deployment ≡ 1 i.e. trivial deployments + (begin ;; code + ;; current code + (vanishes! (shift account/HAS_CODE tx-skip---USER---row-offset---ACC---recipient)) + (debug (eq! (shift account/CODE_HASH_HI tx-skip---USER---row-offset---ACC---recipient) EMPTY_KECCAK_HI)) + (debug (eq! (shift account/CODE_HASH_LO tx-skip---USER---row-offset---ACC---recipient) EMPTY_KECCAK_LO)) + (vanishes! (shift account/CODE_SIZE tx-skip---USER---row-offset---ACC---recipient)) + ;; updated code + (vanishes! (shift account/HAS_CODE_NEW tx-skip---USER---row-offset---ACC---recipient)) + (debug (eq! (shift account/CODE_HASH_HI_NEW tx-skip---USER---row-offset---ACC---recipient) EMPTY_KECCAK_HI)) + (debug (eq! (shift account/CODE_HASH_LO_NEW tx-skip---USER---row-offset---ACC---recipient) EMPTY_KECCAK_LO)) + (eq! (shift account/CODE_SIZE_NEW tx-skip---USER---row-offset---ACC---recipient) + (shift transaction/INIT_CODE_SIZE tx-skip---USER---row-offset---TXN)) + (debug (vanishes! (shift account/CODE_SIZE_NEW tx-skip---USER---row-offset---ACC---recipient)))))) + +(defconstraint tx-skip---USER---recipient-account-row---trivial-deployments---deployment-status-and-number + (:guard (tx-skip---precondition---USER)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-not-zero (tx-skip---USER---is-deployment) + ;; deployment ≡ 1 i.e. trivial deployments + (begin ;; deployment + (account-increment-deployment-number tx-skip---USER---row-offset---ACC---recipient) + (debug (eq! (shift account/DEPLOYMENT_STATUS tx-skip---USER---row-offset---ACC---recipient) 0)) + (eq! (shift account/DEPLOYMENT_STATUS_NEW tx-skip---USER---row-offset---ACC---recipient) 0)))) + +(defconstraint tx-skip---USER---recipient-is-no-precompile + (:guard (tx-skip---precondition---USER)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-zero (tx-skip---USER---is-deployment) + ;; deployment ≡ 0 i.e. pure transfer + (account-trim-address tx-skip---USER---row-offset---ACC---recipient + (shift transaction/TO_ADDRESS_HI tx-skip---USER---row-offset---TXN) + (shift transaction/TO_ADDRESS_LO tx-skip---USER---row-offset---TXN)))) diff --git a/hub/osaka/constraints/tx_skip/user/rows/account_sender.lisp b/hub/osaka/constraints/tx_skip/user/rows/account_sender.lisp new file mode 100644 index 000000000..67972932b --- /dev/null +++ b/hub/osaka/constraints/tx_skip/user/rows/account_sender.lisp @@ -0,0 +1,45 @@ +(module hub) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X Transactions which skip evm execution ;; +;; X.Y The USER-transaction case ;; +;; X.Y.Z Transaction processing ;; +;; X.Y.Z.T Sender account row ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + + +(defconstraint tx-skip---setting-sender-account-row + (:guard (tx-skip---precondition---USER)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (begin + (eq! (shift account/ADDRESS_HI tx-skip---USER---row-offset---ACC---sender) + (shift transaction/FROM_ADDRESS_HI tx-skip---USER---row-offset---TXN)) + (eq! (shift account/ADDRESS_LO tx-skip---USER---row-offset---ACC---sender) + (shift transaction/FROM_ADDRESS_LO tx-skip---USER---row-offset---TXN)) + (account-decrement-balance-by tx-skip---USER---row-offset---ACC---sender (tx-skip---USER---wei-cost-for-sender)) + (account-increment-nonce tx-skip---USER---row-offset---ACC---sender) + (account-same-code tx-skip---USER---row-offset---ACC---sender) + (account-same-deployment-number-and-status tx-skip---USER---row-offset---ACC---sender) + (account-same-warmth tx-skip---USER---row-offset---ACC---sender) + (account-same-marked-for-deletion tx-skip---USER---row-offset---ACC---sender) + (account-isnt-precompile tx-skip---USER---row-offset---ACC---sender) + (DOM-SUB-stamps---standard tx-skip---USER---row-offset---ACC---sender + tx-skip---USER---row-offset---ACC---sender))) + + + +(defun (tx-skip---USER---wei-cost-for-sender) (shift (+ transaction/VALUE + (* transaction/GAS_PRICE + (- transaction/GAS_LIMIT transaction/REFUND_EFFECTIVE))) + tx-skip---USER---row-offset---TXN)) + + + +(defconstraint tx-skip---USER---reject-transactions-from-senders-with-deployed-code---EIP-3607 + (:guard (tx-skip---precondition---USER)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (vanishes! (shift account/HAS_CODE tx-skip---USER---row-offset---ACC---sender))) diff --git a/hub/osaka/constraints/tx_skip/user/rows/transaction.lisp b/hub/osaka/constraints/tx_skip/user/rows/transaction.lisp new file mode 100644 index 000000000..171e76229 --- /dev/null +++ b/hub/osaka/constraints/tx_skip/user/rows/transaction.lisp @@ -0,0 +1,53 @@ +(module hub) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X Transactions which skip evm execution ;; +;; X.Y The USER-transaction case ;; +;; X.Y.Z Transaction processing ;; +;; X.Y.Z.T Transaction row ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstraint tx-skip---TXN-row---partially-justifying-requires-evm-execution + (:guard (tx-skip---precondition---USER)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (begin + (vanishes! (shift transaction/REQUIRES_EVM_EXECUTION tx-skip---USER---row-offset---TXN)) + (if-zero (tx-skip---USER---is-deployment) + (vanishes! (shift account/HAS_CODE tx-skip---USER---row-offset---ACC---recipient)) + (vanishes! (shift transaction/INIT_CODE_SIZE tx-skip---USER---row-offset---TXN))))) + +(defconstraint tx-skip---TXN-row---justifying-total-accrued-refunds + (:guard (tx-skip---precondition---USER)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (vanishes! (shift transaction/REFUND_COUNTER_INFINITY tx-skip---USER---row-offset---TXN))) + +(defconstraint tx-skip---TXN-row---justifying-initial-balance + (:guard (tx-skip---precondition---USER)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (eq! (shift account/BALANCE tx-skip---USER---row-offset---ACC---sender) + (shift transaction/INITIAL_BALANCE tx-skip---USER---row-offset---TXN))) + +(defconstraint tx-skip---TXN-row---justifying-status-code + (:guard (tx-skip---precondition---USER)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (eq! (shift transaction/STATUS_CODE tx-skip---USER---row-offset---TXN) 1)) + +;; NOTE: this constraint will be false starting with PRAGUE +;; specifically EIP-7702 (account delegation) +;; modify for Prague-v2 +(defconstraint tx-skip---TXN-row---justifying-nonce + (:guard (tx-skip---precondition---USER)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (eq! (shift transaction/NONCE tx-skip---USER---row-offset---TXN) + (shift account/NONCE tx-skip---USER---row-offset---ACC---sender))) + +(defconstraint tx-skip---TXN-row---justifying-left-over-gas + (:guard (tx-skip---precondition---USER)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (eq! (shift transaction/GAS_LEFTOVER tx-skip---USER---row-offset---TXN) + (shift transaction/GAS_INITIALLY_AVAILABLE tx-skip---USER---row-offset---TXN))) + diff --git a/hub/osaka/constraints/tx_skip/user/shorthands.lisp b/hub/osaka/constraints/tx_skip/user/shorthands.lisp new file mode 100644 index 000000000..d5d81428e --- /dev/null +++ b/hub/osaka/constraints/tx_skip/user/shorthands.lisp @@ -0,0 +1,31 @@ +(module hub) + + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X Transactions which skip evm execution ;; +;; X.Y The USER-transaction case ;; +;; X.Y.Z Shorthands ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + + +(defconst + tx-skip---USER---row-offset---TXN 0 + tx-skip---USER---row-offset---ACC---sender 1 + tx-skip---USER---row-offset---ACC---recipient 2 + tx-skip---USER---row-offset---ACC---coinbase 3 + tx-skip---USER---row-offset---CON---final-zero-context 4 + tx-skip---USER---NSR 5 + ) + + +(defun (tx-skip---USER---is-deployment) (force-bin (shift transaction/IS_DEPLOYMENT tx-skip---USER---row-offset---TXN))) + + +(defun (tx-skip---precondition---USER) (* (- TOTL_TXN_NUMBER (prev TOTL_TXN_NUMBER)) + USER + TX_SKIP + )) diff --git a/hub/osaka/lookups/helpers.lisp b/hub/osaka/lookups/helpers.lisp new file mode 100644 index 000000000..6dea71d15 --- /dev/null +++ b/hub/osaka/lookups/helpers.lisp @@ -0,0 +1,3 @@ +(defun (unexceptional-stack-row) + (* hub.PEEK_AT_STACK + (- 1 hub.XAHOY))) diff --git a/hub/osaka/lookups/hub_into_add.lisp b/hub/osaka/lookups/hub_into_add.lisp new file mode 100644 index 000000000..a20ca0fd7 --- /dev/null +++ b/hub/osaka/lookups/hub_into_add.lisp @@ -0,0 +1,23 @@ +(defun (hub-into-add-activation-flag) + (* (unexceptional-stack-row) hub.stack/ADD_FLAG)) + +(defclookup + hub-into-add + ;; target columns + ( + add.ARG_1 + add.ARG_2 + add.RES + add.INST + ) + ;; source selector + (hub-into-add-activation-flag) + ;; source columns + ( + (:: [hub.stack/STACK_ITEM_VALUE_HI 1] [hub.stack/STACK_ITEM_VALUE_LO 1]) ;; arg1 + (:: [hub.stack/STACK_ITEM_VALUE_HI 2] [hub.stack/STACK_ITEM_VALUE_LO 2]) ;; arg2 + (:: [hub.stack/STACK_ITEM_VALUE_HI 4] [hub.stack/STACK_ITEM_VALUE_LO 4]) ;; result + hub.stack/INSTRUCTION ;; instruction + )) + + diff --git a/hub/osaka/lookups/hub_into_bin.lisp b/hub/osaka/lookups/hub_into_bin.lisp new file mode 100644 index 000000000..14a21fca5 --- /dev/null +++ b/hub/osaka/lookups/hub_into_bin.lisp @@ -0,0 +1,28 @@ +(defun (hub-into-bin-activation-flag) + (* (unexceptional-stack-row) + hub.stack/BIN_FLAG)) + +(defclookup hub-into-bin + ;; target columns + ( + bin.ARG_1_HI + bin.ARG_1_LO + bin.ARG_2_HI + bin.ARG_2_LO + bin.RES_HI + bin.RES_LO + bin.INST + ) + ;; source selector + (hub-into-bin-activation-flag) + ;; source columns + ( + [hub.stack/STACK_ITEM_VALUE_HI 1] + [hub.stack/STACK_ITEM_VALUE_LO 1] + [hub.stack/STACK_ITEM_VALUE_HI 2] + [hub.stack/STACK_ITEM_VALUE_LO 2] + [hub.stack/STACK_ITEM_VALUE_HI 4] + [hub.stack/STACK_ITEM_VALUE_LO 4] + hub.stack/INSTRUCTION + ) +) diff --git a/hub/osaka/lookups/hub_into_block_data.lisp b/hub/osaka/lookups/hub_into_block_data.lisp new file mode 100644 index 000000000..f60760696 --- /dev/null +++ b/hub/osaka/lookups/hub_into_block_data.lisp @@ -0,0 +1,24 @@ +(defun (hub-into-block-data-trigger) (* hub.PEEK_AT_STACK + (- 1 hub.XAHOY) + hub.stack/BTC_FLAG + [hub.stack/DEC_FLAG 2])) + +(defclookup + (hub-into-blockdata :unchecked) + ;; target columns + ( + blockdata.REL_BLOCK + blockdata.INST + blockdata.DATA_HI + blockdata.DATA_LO + ) + ;; source selector + (hub-into-block-data-trigger) + ;; source columns + ( + hub.BLK_NUMBER + hub.stack/INSTRUCTION + [hub.stack/STACK_ITEM_VALUE_HI 4] + [hub.stack/STACK_ITEM_VALUE_LO 4] + ) +) diff --git a/hub/osaka/lookups/hub_into_block_hash.lisp b/hub/osaka/lookups/hub_into_block_hash.lisp new file mode 100644 index 000000000..d45aa21d6 --- /dev/null +++ b/hub/osaka/lookups/hub_into_block_hash.lisp @@ -0,0 +1,25 @@ +(defun (hub-into-block-hash-trigger) + (* hub.PEEK_AT_STACK (- 1 hub.XAHOY) hub.stack/BTC_FLAG [hub.stack/DEC_FLAG 1])) + +(defclookup + (hub-into-blockhash :unchecked) + ;; target columns + ( + blockhash.macro/REL_BLOCK + blockhash.macro/BLOCKHASH_ARG_HI + blockhash.macro/BLOCKHASH_ARG_LO + blockhash.macro/BLOCKHASH_RES_HI + blockhash.macro/BLOCKHASH_RES_LO + ) + ;; source selector + (hub-into-block-hash-trigger) + ;; source columns + ( + hub.BLK_NUMBER + [hub.stack/STACK_ITEM_VALUE_HI 1] + [hub.stack/STACK_ITEM_VALUE_LO 1] + [hub.stack/STACK_ITEM_VALUE_HI 4] + [hub.stack/STACK_ITEM_VALUE_LO 4] + )) + + diff --git a/hub/osaka/lookups/hub_into_exp.lisp b/hub/osaka/lookups/hub_into_exp.lisp new file mode 100644 index 000000000..193aee168 --- /dev/null +++ b/hub/osaka/lookups/hub_into_exp.lisp @@ -0,0 +1,32 @@ +(defun (hub-into-exp-trigger) + (* hub.PEEK_AT_MISCELLANEOUS + hub.misc/EXP_FLAG)) + +;; Cast any value into a u6 +(defun ((force-u6 :u6 :force) X) X) + +(defclookup hub-into-exp + ;; target columns + ( + exp.INST + exp.ARG + exp.CDS + exp.EBS + exp.RES + ) + ;; source selector + (hub-into-exp-trigger) + ;; source columns + ( + ;; pseudo instruction + hub.misc/EXP_INST + ;; primary argument + (:: [hub.misc/EXP_DATA 1] [hub.misc/EXP_DATA 2]) + ;; precondition: 1 <= CDS <= 32 + (force-u6 [hub.misc/EXP_DATA 3]) + ;; precondition: 1 <= EBS <= 32 + (force-u6 [hub.misc/EXP_DATA 4]) + ;; result + [hub.misc/EXP_DATA 5] + ) +) diff --git a/hub/osaka/lookups/hub_into_ext.lisp b/hub/osaka/lookups/hub_into_ext.lisp new file mode 100644 index 000000000..e06628e87 --- /dev/null +++ b/hub/osaka/lookups/hub_into_ext.lisp @@ -0,0 +1,32 @@ +(defun (hub-into-ext-activation-flag) + (* (unexceptional-stack-row) + hub.stack/EXT_FLAG)) + +(defclookup hub-into-ext + ;; target columns + ( + ext.ARG_1_HI + ext.ARG_1_LO + ext.ARG_2_HI + ext.ARG_2_LO + ext.ARG_3_HI + ext.ARG_3_LO + ext.RES_HI + ext.RES_LO + ext.INST + ) + ;; source selector + (hub-into-ext-activation-flag) + ;; source columns + ( + [hub.stack/STACK_ITEM_VALUE_HI 1] + [hub.stack/STACK_ITEM_VALUE_LO 1] + [hub.stack/STACK_ITEM_VALUE_HI 2] + [hub.stack/STACK_ITEM_VALUE_LO 2] + [hub.stack/STACK_ITEM_VALUE_HI 3] + [hub.stack/STACK_ITEM_VALUE_LO 3] + [hub.stack/STACK_ITEM_VALUE_HI 4] + [hub.stack/STACK_ITEM_VALUE_LO 4] + hub.stack/INSTRUCTION + ) +) diff --git a/hub/osaka/lookups/hub_into_gas.lisp b/hub/osaka/lookups/hub_into_gas.lisp new file mode 100644 index 000000000..026f6750d --- /dev/null +++ b/hub/osaka/lookups/hub_into_gas.lisp @@ -0,0 +1,20 @@ +(defun (hub-into-gas-trigger) (* hub.PEEK_AT_STACK hub.CMC)) + +(defclookup hub-into-gas + ;; target columns + ( + gas.GAS_ACTUAL + gas.GAS_COST + gas.XAHOY + gas.OOGX + ) + ;; source selector + (hub-into-gas-trigger) + ;; source columns + ( + hub.GAS_ACTUAL + hub.GAS_COST + hub.XAHOY + hub.stack/OOGX + ) +) diff --git a/hub/osaka/lookups/hub_into_hub.lisp b/hub/osaka/lookups/hub_into_hub.lisp new file mode 100644 index 000000000..bd508c328 --- /dev/null +++ b/hub/osaka/lookups/hub_into_hub.lisp @@ -0,0 +1,30 @@ +(defun (hub-into-hub-source-selector) hub.scp_PEEK_AT_STORAGE) +(defun (hub-into-hub-target-selector) hub.acp_PEEK_AT_ACCOUNT) ;; "" + +(defclookup hub-into-hub---FIRST-FINAL-in-block-deployment-number-coherence + ;; target selector + (hub-into-hub-target-selector) + ;; target columns + ( + hub.acp_ADDRESS_HI + hub.acp_ADDRESS_LO + hub.acp_BLK_NUMBER + hub.acp_DEPLOYMENT_NUMBER_FIRST_IN_BLOCK + hub.acp_DEPLOYMENT_NUMBER_FINAL_IN_BLOCK + hub.acp_EXISTS_FIRST_IN_BLOCK + hub.acp_EXISTS_FINAL_IN_BLOCK + ) + ;; source selector + (hub-into-hub-source-selector) + ;; source columns + ( + hub.scp_ADDRESS_HI + hub.scp_ADDRESS_LO + hub.scp_BLK_NUMBER + hub.scp_DEPLOYMENT_NUMBER_FIRST_IN_BLOCK + hub.scp_DEPLOYMENT_NUMBER_FINAL_IN_BLOCK + hub.scp_EXISTS_FIRST_IN_BLOCK + hub.scp_EXISTS_FINAL_IN_BLOCK + ) +) + diff --git a/hub/osaka/lookups/hub_into_instruction_decoder.lisp b/hub/osaka/lookups/hub_into_instruction_decoder.lisp new file mode 100644 index 000000000..9f818f627 --- /dev/null +++ b/hub/osaka/lookups/hub_into_instruction_decoder.lisp @@ -0,0 +1,90 @@ +(defun (hub-into-instruction-decoder-trigger) hub.PEEK_AT_STACK) + +(defclookup hub-into-instdecoder + ;; target columns + ( + instdecoder.OPCODE + instdecoder.STATIC_GAS + instdecoder.TWO_LINE_INSTRUCTION + instdecoder.FLAG_1 + instdecoder.FLAG_2 + instdecoder.FLAG_3 + instdecoder.FLAG_4 + instdecoder.MXP_FLAG + instdecoder.STATIC_FLAG + instdecoder.ALPHA + instdecoder.DELTA + ;; + instdecoder.FAMILY_ACCOUNT + instdecoder.FAMILY_ADD + instdecoder.FAMILY_BIN + instdecoder.FAMILY_BATCH + instdecoder.FAMILY_CALL + instdecoder.FAMILY_CONTEXT + instdecoder.FAMILY_COPY + instdecoder.FAMILY_MCOPY + instdecoder.FAMILY_CREATE + instdecoder.FAMILY_DUP + instdecoder.FAMILY_EXT + instdecoder.FAMILY_HALT + instdecoder.FAMILY_INVALID + instdecoder.FAMILY_JUMP + instdecoder.FAMILY_KEC + instdecoder.FAMILY_LOG + instdecoder.FAMILY_MACHINE_STATE + instdecoder.FAMILY_MOD + instdecoder.FAMILY_MUL + instdecoder.FAMILY_PUSH_POP + instdecoder.FAMILY_SHF + instdecoder.FAMILY_STACK_RAM + instdecoder.FAMILY_STORAGE + instdecoder.FAMILY_TRANSIENT + instdecoder.FAMILY_SWAP + instdecoder.FAMILY_TRANSACTION + instdecoder.FAMILY_WCP + ) + ;; source selector + (hub-into-instruction-decoder-trigger) + ;; source columns + ( + hub.stack/INSTRUCTION + hub.stack/STATIC_GAS + hub.TWO_LINE_INSTRUCTION + [hub.stack/DEC_FLAG 1] + [hub.stack/DEC_FLAG 2] + [hub.stack/DEC_FLAG 3] + [hub.stack/DEC_FLAG 4] + hub.stack/MXP_FLAG + hub.stack/STATIC_FLAG + hub.stack/ALPHA + hub.stack/DELTA + ;; + hub.stack/ACC_FLAG + hub.stack/ADD_FLAG + hub.stack/BIN_FLAG + hub.stack/BTC_FLAG + hub.stack/CALL_FLAG + hub.stack/CON_FLAG + hub.stack/COPY_FLAG + hub.stack/MCOPY_FLAG + hub.stack/CREATE_FLAG + hub.stack/DUP_FLAG + hub.stack/EXT_FLAG + hub.stack/HALT_FLAG + hub.stack/INVALID_FLAG + hub.stack/JUMP_FLAG + hub.stack/KEC_FLAG + hub.stack/LOG_FLAG + hub.stack/MACHINE_STATE_FLAG + hub.stack/MOD_FLAG + hub.stack/MUL_FLAG + hub.stack/PUSHPOP_FLAG + hub.stack/SHF_FLAG + hub.stack/STACKRAM_FLAG + hub.stack/STO_FLAG + hub.stack/TRANS_FLAG + hub.stack/SWAP_FLAG + hub.stack/TXN_FLAG + hub.stack/WCP_FLAG + ) +) diff --git a/hub/osaka/lookups/hub_into_log_info.lisp b/hub/osaka/lookups/hub_into_log_info.lisp new file mode 100644 index 000000000..e2ca8da39 --- /dev/null +++ b/hub/osaka/lookups/hub_into_log_info.lisp @@ -0,0 +1,43 @@ +(defun (hub-into-log-info-trigger) + (* hub.PEEK_AT_STACK hub.stack/LOG_INFO_FLAG (- 1 hub.CT_TLI))) + +(defclookup + (hub-into-loginfo :unchecked) + ;; target columns + ( + loginfo.ABS_TXN_NUM + loginfo.ABS_LOG_NUM + loginfo.INST + loginfo.ADDR_HI + loginfo.ADDR_LO + [loginfo.TOPIC_HI 1] + [loginfo.TOPIC_LO 1] + [loginfo.TOPIC_HI 2] + [loginfo.TOPIC_LO 2] + [loginfo.TOPIC_HI 3] + [loginfo.TOPIC_LO 3] + [loginfo.TOPIC_HI 4] + [loginfo.TOPIC_LO 4] + loginfo.DATA_SIZE + ) + ;; source selector + (hub-into-log-info-trigger) + ;; source columns + ( + hub.USER_TXN_NUMBER + hub.LOG_INFO_STAMP + hub.stack/INSTRUCTION + (shift hub.context/ACCOUNT_ADDRESS_HI 2) + (shift hub.context/ACCOUNT_ADDRESS_LO 2) + (next [hub.stack/STACK_ITEM_VALUE_HI 1]) + (next [hub.stack/STACK_ITEM_VALUE_LO 1]) + (next [hub.stack/STACK_ITEM_VALUE_HI 2]) + (next [hub.stack/STACK_ITEM_VALUE_LO 2]) + (next [hub.stack/STACK_ITEM_VALUE_HI 3]) + (next [hub.stack/STACK_ITEM_VALUE_LO 3]) + (next [hub.stack/STACK_ITEM_VALUE_HI 4]) + (next [hub.stack/STACK_ITEM_VALUE_LO 4]) + [hub.stack/STACK_ITEM_VALUE_LO 2] + )) + + diff --git a/hub/osaka/lookups/hub_into_mmu.lisp b/hub/osaka/lookups/hub_into_mmu.lisp new file mode 100644 index 000000000..7d2439f7d --- /dev/null +++ b/hub/osaka/lookups/hub_into_mmu.lisp @@ -0,0 +1,49 @@ +(defun (hub-into-mmu-trigger) + (* hub.PEEK_AT_MISCELLANEOUS hub.misc/MMU_FLAG)) + +(defclookup + (hub-into-mmu :unchecked) + ;; target columns + ( + mmu.MACRO + mmu.STAMP + mmu.macro/INST + mmu.macro/SRC_ID + mmu.macro/TGT_ID + mmu.macro/AUX_ID + mmu.macro/SRC_OFFSET_LO + mmu.macro/SRC_OFFSET_HI + mmu.macro/TGT_OFFSET_LO + mmu.macro/SIZE + mmu.macro/REF_OFFSET + mmu.macro/REF_SIZE + mmu.macro/SUCCESS_BIT + mmu.macro/LIMB_1 + mmu.macro/LIMB_2 + mmu.macro/PHASE + mmu.macro/EXO_SUM + ) + ;; source selector + (hub-into-mmu-trigger) + ;; source columns + ( + 1 + hub.MMU_STAMP + hub.misc/MMU_INST + hub.misc/MMU_SRC_ID + hub.misc/MMU_TGT_ID + hub.misc/MMU_AUX_ID + hub.misc/MMU_SRC_OFFSET_LO + hub.misc/MMU_SRC_OFFSET_HI + hub.misc/MMU_TGT_OFFSET_LO + hub.misc/MMU_SIZE + hub.misc/MMU_REF_OFFSET + hub.misc/MMU_REF_SIZE + hub.misc/MMU_SUCCESS_BIT + hub.misc/MMU_LIMB_1 + hub.misc/MMU_LIMB_2 + hub.misc/MMU_PHASE + hub.misc/MMU_EXO_SUM + )) + + diff --git a/hub/osaka/lookups/hub_into_mod.lisp b/hub/osaka/lookups/hub_into_mod.lisp new file mode 100644 index 000000000..3dd6ecb9d --- /dev/null +++ b/hub/osaka/lookups/hub_into_mod.lisp @@ -0,0 +1,28 @@ +(defun (hub-into-mod-activation-flag) + (* (unexceptional-stack-row) + hub.stack/MOD_FLAG)) + +(defclookup hub-into-mod + ;; target columns + ( + mod.ARG_1_HI + mod.ARG_1_LO + mod.ARG_2_HI + mod.ARG_2_LO + mod.RES_HI + mod.RES_LO + mod.INST + ) + ;; source selector + (hub-into-mod-activation-flag) + ;; source columns + ( + [hub.stack/STACK_ITEM_VALUE_HI 1] ;; arg1 + [hub.stack/STACK_ITEM_VALUE_LO 1] + [hub.stack/STACK_ITEM_VALUE_HI 2] ;; arg2 + [hub.stack/STACK_ITEM_VALUE_LO 2] + [hub.stack/STACK_ITEM_VALUE_HI 4] ;; res + [hub.stack/STACK_ITEM_VALUE_LO 4] + hub.stack/INSTRUCTION + ) +) diff --git a/hub/osaka/lookups/hub_into_mul.lisp b/hub/osaka/lookups/hub_into_mul.lisp new file mode 100644 index 000000000..31010da1e --- /dev/null +++ b/hub/osaka/lookups/hub_into_mul.lisp @@ -0,0 +1,28 @@ +(defun (hub-into-mul-activation-flag) + (* (unexceptional-stack-row) + hub.stack/MUL_FLAG)) + +(defclookup hub-into-mul + ;; target columns + ( + mul.ARG_1_HI + mul.ARG_1_LO + mul.ARG_2_HI + mul.ARG_2_LO + mul.RES_HI + mul.RES_LO + mul.INST + ) + ;; source selector + (hub-into-mul-activation-flag) + ;; source columns + ( + [hub.stack/STACK_ITEM_VALUE_HI 1] ;; arg1 + [hub.stack/STACK_ITEM_VALUE_LO 1] + [hub.stack/STACK_ITEM_VALUE_HI 2] ;; arg2 + [hub.stack/STACK_ITEM_VALUE_LO 2] + [hub.stack/STACK_ITEM_VALUE_HI 4] ;; res + [hub.stack/STACK_ITEM_VALUE_LO 4] + hub.stack/INSTRUCTION + ) +) diff --git a/hub/osaka/lookups/hub_into_mxp.lisp b/hub/osaka/lookups/hub_into_mxp.lisp new file mode 100644 index 000000000..a94cead9e --- /dev/null +++ b/hub/osaka/lookups/hub_into_mxp.lisp @@ -0,0 +1,49 @@ +(defun (hub-into-mxp-trigger) + (* hub.PEEK_AT_MISCELLANEOUS hub.misc/MXP_FLAG)) + +(defclookup + (hub-into-mxp :unchecked) + ;; target columns + ( + mxp.MACRO + mxp.MXP_STAMP + mxp.CN + mxp.macro/INST + mxp.macro/DEPLOYING + mxp.macro/OFFSET_1_HI + mxp.macro/OFFSET_1_LO + mxp.macro/OFFSET_2_HI + mxp.macro/OFFSET_2_LO + mxp.macro/SIZE_1_HI + mxp.macro/SIZE_1_LO + mxp.macro/SIZE_2_HI + mxp.macro/SIZE_2_LO + mxp.macro/RES + mxp.macro/MXPX + mxp.macro/GAS_MXP + mxp.macro/S1NZNOMXPX + mxp.macro/S2NZNOMXPX + ) + ;; source selector + (hub-into-mxp-trigger) + ;; source columns + ( + 1 + hub.MXP_STAMP + hub.CONTEXT_NUMBER + hub.misc/MXP_INST + hub.misc/MXP_DEPLOYS + hub.misc/MXP_OFFSET_1_HI + hub.misc/MXP_OFFSET_1_LO + hub.misc/MXP_OFFSET_2_HI + hub.misc/MXP_OFFSET_2_LO + hub.misc/MXP_SIZE_1_HI + hub.misc/MXP_SIZE_1_LO + hub.misc/MXP_SIZE_2_HI + hub.misc/MXP_SIZE_2_LO + hub.misc/MXP_WORDS + hub.misc/MXP_MXPX + hub.misc/MXP_GAS_MXP + hub.misc/MXP_SIZE_1_NONZERO_NO_MXPX + hub.misc/MXP_SIZE_2_NONZERO_NO_MXPX + )) diff --git a/hub/osaka/lookups/hub_into_oob.lisp b/hub/osaka/lookups/hub_into_oob.lisp new file mode 100644 index 000000000..1fa2d5ede --- /dev/null +++ b/hub/osaka/lookups/hub_into_oob.lisp @@ -0,0 +1,36 @@ +(defun (hub-into-oob-trigger) + (* hub.PEEK_AT_MISCELLANEOUS + hub.misc/OOB_FLAG)) + +(defclookup hub-into-oob + ;; target columns + ( + oob.OOB_INST + [oob.DATA 1] + [oob.DATA 2] + [oob.DATA 3] + [oob.DATA 4] + [oob.DATA 5] + [oob.DATA 6] + [oob.DATA 7] + [oob.DATA 8] + [oob.DATA 9] + [oob.DATA 10] + ) + ;; source selector + (hub-into-oob-trigger) + ;; source columns + ( + hub.misc/OOB_INST + [hub.misc/OOB_DATA 1] + [hub.misc/OOB_DATA 2] + [hub.misc/OOB_DATA 3] + [hub.misc/OOB_DATA 4] + [hub.misc/OOB_DATA 5] + [hub.misc/OOB_DATA 6] + [hub.misc/OOB_DATA 7] + [hub.misc/OOB_DATA 8] + [hub.misc/OOB_DATA 9] + [hub.misc/OOB_DATA 10] + ) +) diff --git a/hub/osaka/lookups/hub_into_rlp_addr.lisp b/hub/osaka/lookups/hub_into_rlp_addr.lisp new file mode 100644 index 000000000..bb2acc778 --- /dev/null +++ b/hub/osaka/lookups/hub_into_rlp_addr.lisp @@ -0,0 +1,35 @@ +(defun (hub-into-rlp-addr-trigger) + (* hub.PEEK_AT_ACCOUNT + hub.account/RLPADDR_FLAG)) + +;; +(defclookup hub-into-rlpaddr + ;; target columns + ( + rlpaddr.RECIPE + rlpaddr.ADDR_HI + rlpaddr.ADDR_LO + rlpaddr.NONCE + rlpaddr.DEP_ADDR_HI + rlpaddr.DEP_ADDR_LO + rlpaddr.SALT_HI + rlpaddr.SALT_LO + rlpaddr.KEC_HI + rlpaddr.KEC_LO + ) + ;; source selector + (hub-into-rlp-addr-trigger) + ;; source columns + ( + hub.account/RLPADDR_RECIPE + hub.account/ADDRESS_HI + hub.account/ADDRESS_LO + hub.account/NONCE + hub.account/RLPADDR_DEP_ADDR_HI + hub.account/RLPADDR_DEP_ADDR_LO + hub.account/RLPADDR_SALT_HI + hub.account/RLPADDR_SALT_LO + hub.account/RLPADDR_KEC_HI + hub.account/RLPADDR_KEC_LO + ) +) diff --git a/hub/osaka/lookups/hub_into_rlp_txn.lisp b/hub/osaka/lookups/hub_into_rlp_txn.lisp new file mode 100644 index 000000000..0a2cc521a --- /dev/null +++ b/hub/osaka/lookups/hub_into_rlp_txn.lisp @@ -0,0 +1,37 @@ +(defun (hub-into-rlp-txn-src-selector) hub.TX_WARM) + +(defun (prewarming-phase-address-hi) (+ (* hub.PEEK_AT_ACCOUNT hub.account/ADDRESS_HI) (* hub.PEEK_AT_STORAGE hub.storage/ADDRESS_HI))) +(defun (prewarming-phase-address-lo) (+ (* hub.PEEK_AT_ACCOUNT hub.account/ADDRESS_LO) (* hub.PEEK_AT_STORAGE hub.storage/ADDRESS_LO))) +(defun (prewarming-phase-storage-key-hi) (* hub.PEEK_AT_STORAGE hub.storage/STORAGE_KEY_HI)) +(defun (prewarming-phase-storage-key-lo) (* hub.PEEK_AT_STORAGE hub.storage/STORAGE_KEY_LO)) + +(defun (hub-into-rlp-txn-tgt-selector) (sel-rlp-txn-into-hub)) + +(defclookup + (hub-into-rlptxn :unchecked) + + ;; target selector + (hub-into-rlp-txn-tgt-selector) + ;; target columns + ( + rlptxn.USER_TXN_NUMBER + rlptxn.IS_ACCESS_LIST_ADDRESS + rlptxn.IS_ACCESS_LIST_STORAGE_KEY + (rlptxn---access-list---address-hi) + (rlptxn---access-list---address-lo) + (* rlptxn.cmp/EXO_DATA_1 rlptxn.IS_ACCESS_LIST_STORAGE_KEY) + (* rlptxn.cmp/EXO_DATA_2 rlptxn.IS_ACCESS_LIST_STORAGE_KEY) + ) + ;; source selector + (hub-into-rlp-txn-src-selector) + ;; source columns + ( + hub.USER_TXN_NUMBER + hub.PEEK_AT_ACCOUNT + hub.PEEK_AT_STORAGE + + (prewarming-phase-address-hi) + (prewarming-phase-address-lo) + (prewarming-phase-storage-key-hi) + (prewarming-phase-storage-key-lo) + )) diff --git a/hub/osaka/lookups/hub_into_rom_instruction_fetching.lisp b/hub/osaka/lookups/hub_into_rom_instruction_fetching.lisp new file mode 100644 index 000000000..4c91ba50b --- /dev/null +++ b/hub/osaka/lookups/hub_into_rom_instruction_fetching.lisp @@ -0,0 +1,22 @@ +(defun (hub-into-rom-instruction-fetching-trigger) hub.PEEK_AT_STACK) + +(defclookup hub-into-rom-instruction-fetching + ;; target columns + ( + rom.CFI + rom.PC + rom.OPCODE + rom.PUSH_VALUE_HI + rom.PUSH_VALUE_LO + ) + ;; source selector + (hub-into-rom-instruction-fetching-trigger) + ;; source columns + ( + hub.CFI + hub.PC + hub.stack/INSTRUCTION + hub.stack/PUSH_VALUE_HI + hub.stack/PUSH_VALUE_LO + ) +) diff --git a/hub/osaka/lookups/hub_into_rom_jump_destination_vetting.lisp b/hub/osaka/lookups/hub_into_rom_jump_destination_vetting.lisp new file mode 100644 index 000000000..5e06474c7 --- /dev/null +++ b/hub/osaka/lookups/hub_into_rom_jump_destination_vetting.lisp @@ -0,0 +1,21 @@ +(defun (hub-into-rom-jump-destination-vetting-trigger) + (* hub.PEEK_AT_STACK + hub.stack/JUMP_DESTINATION_VETTING_REQUIRED)) + +(defclookup + (hub-into-rom-jump-destination-vetting :unchecked) + ;; target columns + ( + rom.CFI + rom.PC + rom.IS_JUMPDEST + ) + ;; source selector + (hub-into-rom-jump-destination-vetting-trigger) + ;; source columns + ( + hub.CFI + [hub.stack/STACK_ITEM_VALUE_LO 1] + (- 1 hub.stack/JUMPX) + ) +) diff --git a/hub/osaka/lookups/hub_into_rom_lex.lisp b/hub/osaka/lookups/hub_into_rom_lex.lisp new file mode 100644 index 000000000..1c29559de --- /dev/null +++ b/hub/osaka/lookups/hub_into_rom_lex.lisp @@ -0,0 +1,32 @@ +(defun (hub-into-rom-lex-trigger) + (* hub.PEEK_AT_ACCOUNT + hub.account/ROMLEX_FLAG)) + + +(defclookup + (hub-into-romlex :unchecked) + ;; target columns + ( + romlex.CODE_FRAGMENT_INDEX + romlex.CODE_SIZE + romlex.ADDRESS_HI + romlex.ADDRESS_LO + romlex.DEPLOYMENT_NUMBER + romlex.DEPLOYMENT_STATUS + romlex.CODE_HASH_HI + romlex.CODE_HASH_LO + ) + ;; source selector + (hub-into-rom-lex-trigger) + ;; source columns + ( + hub.account/CODE_FRAGMENT_INDEX + hub.account/CODE_SIZE_NEW + hub.account/ADDRESS_HI + hub.account/ADDRESS_LO + hub.account/DEPLOYMENT_NUMBER_NEW + hub.account/DEPLOYMENT_STATUS_NEW + hub.account/CODE_HASH_HI_NEW + hub.account/CODE_HASH_LO_NEW + ) +) diff --git a/hub/osaka/lookups/hub_into_shakira.lisp b/hub/osaka/lookups/hub_into_shakira.lisp new file mode 100644 index 000000000..062202c92 --- /dev/null +++ b/hub/osaka/lookups/hub_into_shakira.lisp @@ -0,0 +1,26 @@ +(defun (hub-into-shakira-trigger) + (* + hub.PEEK_AT_STACK + hub.stack/HASH_INFO_FLAG)) + +(defclookup + (hub-into-shakiradata :unchecked) + ;; target columns + ( + shakiradata.PHASE + shakiradata.ID + shakiradata.INDEX + (shift shakiradata.LIMB -1) + shakiradata.LIMB + ) + ;; source selector + (hub-into-shakira-trigger) + ;; source columns + ( + PHASE_KECCAK_RESULT + (+ 1 hub.HUB_STAMP) + 1 + hub.stack/HASH_INFO_KECCAK_HI + hub.stack/HASH_INFO_KECCAK_LO + ) +) diff --git a/hub/osaka/lookups/hub_into_shf.lisp b/hub/osaka/lookups/hub_into_shf.lisp new file mode 100644 index 000000000..a0c43e48b --- /dev/null +++ b/hub/osaka/lookups/hub_into_shf.lisp @@ -0,0 +1,22 @@ +(defun (hub-into-shf-activation-flag) + (* (unexceptional-stack-row) + hub.stack/SHF_FLAG)) + +(defclookup hub-into-shf + ;; target columns + ( + shf.ARG_1 + shf.ARG_2 + shf.RES + shf.INST + ) + ;; source selector + (hub-into-shf-activation-flag) + ;; source columns + ( + (:: [hub.stack/STACK_ITEM_VALUE_HI 1] [hub.stack/STACK_ITEM_VALUE_LO 1]) ;; arg1 + (:: [hub.stack/STACK_ITEM_VALUE_HI 2] [hub.stack/STACK_ITEM_VALUE_LO 2]) ;; arg2 + (:: [hub.stack/STACK_ITEM_VALUE_HI 4] [hub.stack/STACK_ITEM_VALUE_LO 4]) ;; result + hub.stack/INSTRUCTION + ) +) diff --git a/hub/osaka/lookups/hub_into_stp.lisp b/hub/osaka/lookups/hub_into_stp.lisp new file mode 100644 index 000000000..41ae8b676 --- /dev/null +++ b/hub/osaka/lookups/hub_into_stp.lisp @@ -0,0 +1,38 @@ +(defun (hub-into-stp-trigger) + (* hub.PEEK_AT_MISCELLANEOUS hub.misc/STP_FLAG)) + +(defclookup + hub-into-stp + ;; target columns + ( + stp.INST + stp.GAS + stp.VALUE + stp.EXISTS + stp.WARM + stp.OOGX + stp.GAS_ACTUAL + stp.GAS_UPFRONT + stp.GAS_MXP + stp.GAS_OOP + stp.GAS_STIPEND + ) + ;; source selector + (hub-into-stp-trigger) + ;; source columns + ( + hub.misc/STP_INSTRUCTION + (:: hub.misc/STP_GAS_HI hub.misc/STP_GAS_LO) + (:: hub.misc/STP_VALUE_HI hub.misc/STP_VALUE_LO) + hub.misc/STP_EXISTS + hub.misc/STP_WARMTH + hub.misc/STP_OOGX + hub.GAS_ACTUAL + hub.misc/STP_GAS_UPFRONT_GAS_COST + hub.misc/STP_GAS_MXP + hub.misc/STP_GAS_PAID_OUT_OF_POCKET + hub.misc/STP_GAS_STIPEND + ) + ) + + diff --git a/hub/osaka/lookups/hub_into_trm.lisp b/hub/osaka/lookups/hub_into_trm.lisp new file mode 100644 index 000000000..abc1470ef --- /dev/null +++ b/hub/osaka/lookups/hub_into_trm.lisp @@ -0,0 +1,20 @@ +(defun (hub-into-trm-trigger) + (* hub.PEEK_AT_ACCOUNT + hub.account/TRM_FLAG)) + +(defclookup hub-into-trm + ;; target columns + ( + trm.RAW_ADDRESS + trm.ADDRESS_HI + trm.IS_PRECOMPILE + ) + ;; source selector + (hub-into-trm-trigger) + ;; source columns + ( + (:: hub.account/TRM_RAW_ADDRESS_HI hub.account/ADDRESS_LO) + hub.account/ADDRESS_HI + hub.account/IS_PRECOMPILE + ) +) diff --git a/hub/osaka/lookups/hub_into_txn_data.lisp b/hub/osaka/lookups/hub_into_txn_data.lisp new file mode 100644 index 000000000..473c43a6a --- /dev/null +++ b/hub/osaka/lookups/hub_into_txn_data.lisp @@ -0,0 +1,94 @@ +(defun ((txn-data---priority-fee-per-gas :force :i64)) (* txndata.HUB txndata.USER (- txndata.hub/GAS_PRICE txndata.hub/btc_BASEFEE))) + +;; "" + +(defclookup (hub-into-txndata :unchecked) + ;; target selector + txndata.HUB + ;; target columns + ( + txndata.BLK_NUMBER + txndata.TOTL_TXN_NUMBER + ;; addresses + (* txndata.USER txndata.hub/FROM_ADDRESS_HI ) + (* txndata.USER txndata.hub/FROM_ADDRESS_LO ) + (* txndata.USER txndata.hub/TO_ADDRESS_HI ) + (* txndata.USER txndata.hub/TO_ADDRESS_LO ) + (* txndata.USER txndata.hub/btc_COINBASE_ADDRESS_HI ) + (* txndata.USER txndata.hub/btc_COINBASE_ADDRESS_LO ) + ;; transaction parameters + (* txndata.USER txndata.hub/NONCE ) + (* txndata.USER txndata.hub/VALUE ) + (* txndata.USER txndata.hub/IS_DEPLOYMENT ) + (* txndata.USER txndata.hub/HAS_EIP_1559_GAS_SEMANTICS ) + (* txndata.USER txndata.hub/GAS_PRICE ) + (* txndata.USER txndata.hub/GAS_LIMIT ) + (txn-data---priority-fee-per-gas) + (* txndata.USER txndata.hub/btc_BASEFEE ) + (* txndata.USER txndata.hub/CALL_DATA_SIZE ) + (* txndata.USER txndata.hub/INIT_CODE_SIZE ) + ;; start of transaction data + (* txndata.USER txndata.hub/GAS_INITIALLY_AVAILABLE ) + (* txndata.USER txndata.hub/INIT_BALANCE ) + (* txndata.USER txndata.hub/REQUIRES_EVM_EXECUTION ) + (* txndata.USER txndata.hub/COPY_TXCD ) + ;; end of transaction data + (* txndata.USER txndata.hub/STATUS_CODE ) + (* txndata.USER txndata.hub/GAS_LEFTOVER ) + (* txndata.USER txndata.hub/REFUND_COUNTER_FINAL ) + (* txndata.USER txndata.hub/REFUND_EFFECTIVE ) + ;; system transaction stuff + txndata.hub/NOOP + txndata.hub/EIP_4788 + txndata.hub/EIP_2935 + txndata.hub/SYST_TXN_DATA_1 + txndata.hub/SYST_TXN_DATA_2 + txndata.hub/SYST_TXN_DATA_3 + txndata.hub/SYST_TXN_DATA_4 + txndata.hub/SYST_TXN_DATA_5 + + ) + ;; source selector + hub.PEEK_AT_TRANSACTION + ;; source columns + ( + hub.BLK_NUMBER + hub.TOTL_TXN_NUMBER + (* hub.USER hub.transaction/FROM_ADDRESS_HI ) + (* hub.USER hub.transaction/FROM_ADDRESS_LO ) + (* hub.USER hub.transaction/TO_ADDRESS_HI ) + (* hub.USER hub.transaction/TO_ADDRESS_LO ) + (* hub.USER hub.transaction/COINBASE_ADDRESS_HI ) + (* hub.USER hub.transaction/COINBASE_ADDRESS_LO ) + ;; + (* hub.USER hub.transaction/NONCE ) + (* hub.USER hub.transaction/VALUE ) + (* hub.USER hub.transaction/IS_DEPLOYMENT ) + (* hub.USER hub.transaction/IS_TYPE2 ) + (* hub.USER hub.transaction/GAS_PRICE ) + (* hub.USER hub.transaction/GAS_LIMIT ) + (* hub.USER hub.transaction/PRIORITY_FEE_PER_GAS ) + (* hub.USER hub.transaction/BASEFEE ) + (* hub.USER hub.transaction/CALL_DATA_SIZE ) + (* hub.USER hub.transaction/INIT_CODE_SIZE ) + ;; + (* hub.USER hub.transaction/GAS_INITIALLY_AVAILABLE ) + (* hub.USER hub.transaction/INITIAL_BALANCE ) + (* hub.USER hub.transaction/REQUIRES_EVM_EXECUTION ) + (* hub.USER hub.transaction/COPY_TXCD ) + ;; + (* hub.USER hub.transaction/STATUS_CODE ) + (* hub.USER hub.transaction/GAS_LEFTOVER ) + (* hub.USER hub.transaction/REFUND_COUNTER_INFINITY ) + (* hub.USER hub.transaction/REFUND_EFFECTIVE ) + ;; + hub.transaction/NOOP + hub.transaction/EIP_4788 + hub.transaction/EIP_2935 + hub.transaction/SYST_TXN_DATA_1 + hub.transaction/SYST_TXN_DATA_2 + hub.transaction/SYST_TXN_DATA_3 + hub.transaction/SYST_TXN_DATA_4 + hub.transaction/SYST_TXN_DATA_5 + ) +) diff --git a/hub/osaka/lookups/hub_into_wcp.lisp b/hub/osaka/lookups/hub_into_wcp.lisp new file mode 100644 index 000000000..bc9bec730 --- /dev/null +++ b/hub/osaka/lookups/hub_into_wcp.lisp @@ -0,0 +1,27 @@ +(defun (hub-into-wcp-activation-flag) + (* (unexceptional-stack-row) + hub.stack/WCP_FLAG)) + +(defclookup + (hub-into-wcp :unchecked) + ;; target columns + ( + wcp.ARG_1_HI + wcp.ARG_1_LO + wcp.ARG_2_HI + wcp.ARG_2_LO + wcp.RESULT + wcp.INST + ) + ;; source selector + (hub-into-wcp-activation-flag) + ;; source columns + ( + [hub.stack/STACK_ITEM_VALUE_HI 1] + [hub.stack/STACK_ITEM_VALUE_LO 1] + [hub.stack/STACK_ITEM_VALUE_HI 2] + [hub.stack/STACK_ITEM_VALUE_LO 2] + [hub.stack/STACK_ITEM_VALUE_LO 4] + hub.stack/INSTRUCTION + ) +) diff --git a/hub/osaka/lookups/hub_into_wcp_for_stack_overflow.lisp b/hub/osaka/lookups/hub_into_wcp_for_stack_overflow.lisp new file mode 100644 index 000000000..0b88a047c --- /dev/null +++ b/hub/osaka/lookups/hub_into_wcp_for_stack_overflow.lisp @@ -0,0 +1,29 @@ +(defun (hub-into-wcp-for-sox-activation-flag) + (* hub.PEEK_AT_STACK (- 1 hub.stack/SUX))) + +(defun ((projected-height :i16 :force)) + (* (- (+ hub.HEIGHT hub.stack/ALPHA) hub.stack/DELTA) + (- 1 hub.stack/SUX))) + +(defclookup + hub-into-wcp-for-sox + ;; target columns + ( + wcp.INST + wcp.ARG_1_HI + wcp.ARG_1_LO + wcp.ARG_2_HI + wcp.ARG_2_LO + wcp.RESULT + ) + ;; source selector + (hub-into-wcp-for-sox-activation-flag) + ;; source columns + ( + EVM_INST_GT + 0 + (projected-height) + 0 + 1024 + hub.stack/SOX + )) diff --git a/hub/osaka/lookups/hub_into_wcp_for_stack_underflow.lisp b/hub/osaka/lookups/hub_into_wcp_for_stack_underflow.lisp new file mode 100644 index 000000000..8a44b31d5 --- /dev/null +++ b/hub/osaka/lookups/hub_into_wcp_for_stack_underflow.lisp @@ -0,0 +1,24 @@ +(defun (hub-into-wcp-for-sux-activation-flag) hub.PEEK_AT_STACK) + +(defclookup hub-into-wcp-for-sux + ;; target columns + ( + wcp.INST + wcp.ARG_1_HI + wcp.ARG_1_LO + wcp.ARG_2_HI + wcp.ARG_2_LO + wcp.RESULT + ) + ;; source columns + (hub-into-wcp-for-sux-activation-flag) + ;; source columns + ( + EVM_INST_LT + 0 + hub.HEIGHT + 0 + hub.stack/DELTA + hub.stack/SUX + ) +) diff --git a/hub/osaka/lookups/template b/hub/osaka/lookups/template new file mode 100644 index 000000000..1af24af92 --- /dev/null +++ b/hub/osaka/lookups/template @@ -0,0 +1,13 @@ +(defun (hub-into-xxx-trigger) ) + +(deflookup hub-into-xxx + ;; target columns + ( + xxx. + ) + ;; source columns + ( + (* hub. (hub-into-xxx-trigger)) + ) +) + diff --git a/mmu/columns.lisp b/mmu/london/columns.lisp similarity index 100% rename from mmu/columns.lisp rename to mmu/london/columns.lisp diff --git a/mmu/constants.lisp b/mmu/london/constants.lisp similarity index 100% rename from mmu/constants.lisp rename to mmu/london/constants.lisp diff --git a/mmu/constraints.lisp b/mmu/london/constraints.lisp similarity index 100% rename from mmu/constraints.lisp rename to mmu/london/constraints.lisp diff --git a/mmu/instructions/any_to_ram_with_padding/common.lisp b/mmu/london/instructions/any_to_ram_with_padding/common.lisp similarity index 100% rename from mmu/instructions/any_to_ram_with_padding/common.lisp rename to mmu/london/instructions/any_to_ram_with_padding/common.lisp diff --git a/mmu/instructions/any_to_ram_with_padding/pure_padding.lisp b/mmu/london/instructions/any_to_ram_with_padding/pure_padding.lisp similarity index 100% rename from mmu/instructions/any_to_ram_with_padding/pure_padding.lisp rename to mmu/london/instructions/any_to_ram_with_padding/pure_padding.lisp diff --git a/mmu/instructions/any_to_ram_with_padding/some_data.lisp b/mmu/london/instructions/any_to_ram_with_padding/some_data.lisp similarity index 100% rename from mmu/instructions/any_to_ram_with_padding/some_data.lisp rename to mmu/london/instructions/any_to_ram_with_padding/some_data.lisp diff --git a/mmu/instructions/blake.lisp b/mmu/london/instructions/blake.lisp similarity index 100% rename from mmu/instructions/blake.lisp rename to mmu/london/instructions/blake.lisp diff --git a/mmu/instructions/exo_to_ram_transplant.lisp b/mmu/london/instructions/exo_to_ram_transplant.lisp similarity index 100% rename from mmu/instructions/exo_to_ram_transplant.lisp rename to mmu/london/instructions/exo_to_ram_transplant.lisp diff --git a/mmu/instructions/invalid_code_prefix.lisp b/mmu/london/instructions/invalid_code_prefix.lisp similarity index 100% rename from mmu/instructions/invalid_code_prefix.lisp rename to mmu/london/instructions/invalid_code_prefix.lisp diff --git a/mmu/instructions/mload.lisp b/mmu/london/instructions/mload.lisp similarity index 100% rename from mmu/instructions/mload.lisp rename to mmu/london/instructions/mload.lisp diff --git a/mmu/instructions/modexp_data.lisp b/mmu/london/instructions/modexp_data.lisp similarity index 100% rename from mmu/instructions/modexp_data.lisp rename to mmu/london/instructions/modexp_data.lisp diff --git a/mmu/instructions/modexp_zero.lisp b/mmu/london/instructions/modexp_zero.lisp similarity index 100% rename from mmu/instructions/modexp_zero.lisp rename to mmu/london/instructions/modexp_zero.lisp diff --git a/mmu/instructions/mstore.lisp b/mmu/london/instructions/mstore.lisp similarity index 100% rename from mmu/instructions/mstore.lisp rename to mmu/london/instructions/mstore.lisp diff --git a/mmu/instructions/mstore8.lisp b/mmu/london/instructions/mstore8.lisp similarity index 100% rename from mmu/instructions/mstore8.lisp rename to mmu/london/instructions/mstore8.lisp diff --git a/mmu/instructions/ram_to_exo_with_padding.lisp b/mmu/london/instructions/ram_to_exo_with_padding.lisp similarity index 100% rename from mmu/instructions/ram_to_exo_with_padding.lisp rename to mmu/london/instructions/ram_to_exo_with_padding.lisp diff --git a/mmu/instructions/ram_to_ram_sans_padding.lisp b/mmu/london/instructions/ram_to_ram_sans_padding.lisp similarity index 100% rename from mmu/instructions/ram_to_ram_sans_padding.lisp rename to mmu/london/instructions/ram_to_ram_sans_padding.lisp diff --git a/mmu/instructions/right_padded_word_extraction.lisp b/mmu/london/instructions/right_padded_word_extraction.lisp similarity index 100% rename from mmu/instructions/right_padded_word_extraction.lisp rename to mmu/london/instructions/right_padded_word_extraction.lisp diff --git a/mmu/lookups/mmu_into_euc.lisp b/mmu/london/lookups/mmu_into_euc.lisp similarity index 100% rename from mmu/lookups/mmu_into_euc.lisp rename to mmu/london/lookups/mmu_into_euc.lisp diff --git a/mmu/lookups/mmu_into_mmio.lisp b/mmu/london/lookups/mmu_into_mmio.lisp similarity index 100% rename from mmu/lookups/mmu_into_mmio.lisp rename to mmu/london/lookups/mmu_into_mmio.lisp diff --git a/mmu/lookups/mmu_into_wcp.lisp b/mmu/london/lookups/mmu_into_wcp.lisp similarity index 100% rename from mmu/lookups/mmu_into_wcp.lisp rename to mmu/london/lookups/mmu_into_wcp.lisp diff --git a/mmu/osaka/columns.lisp b/mmu/osaka/columns.lisp new file mode 100644 index 000000000..70c5efc00 --- /dev/null +++ b/mmu/osaka/columns.lisp @@ -0,0 +1,101 @@ +(module mmu) + +(defcolumns + ;; shared columns + (STAMP :i32 :display :dec) + (MMIO_STAMP :i32 :display :dec) + ;; perspective selector + (MACRO :binary@prove) + (PRPRC :binary@prove) + (MICRO :binary@prove) + ;; OUTPUT OF THE PREPROCESSING + (TOT :i32 :display :dec) + (TOTLZ :i32 :display :dec) + (TOTNT :i32 :display :dec) + (TOTRZ :i32 :display :dec) + (OUT :i64 :array [5]) + (BIN :binary :array [5]) + ;; MMU INSTRUCTION FLAG + (IS_MLOAD :binary@prove) + (IS_MSTORE :binary@prove) + (IS_MSTORE8 :binary@prove) + (IS_INVALID_CODE_PREFIX :binary@prove) + (IS_RIGHT_PADDED_WORD_EXTRACTION :binary@prove) + (IS_RAM_TO_EXO_WITH_PADDING :binary@prove) + (IS_EXO_TO_RAM_TRANSPLANTS :binary@prove) + (IS_RAM_TO_RAM_SANS_PADDING :binary@prove) + (IS_ANY_TO_RAM_WITH_PADDING_SOME_DATA :binary@prove) + (IS_ANY_TO_RAM_WITH_PADDING_PURE_PADDING :binary@prove) + (IS_MODEXP_ZERO :binary@prove) + (IS_MODEXP_DATA :binary@prove) + (IS_BLAKE :binary@prove) + ;; USED ONLY IN MICRO ROW BUT ARE SHARED + (LZRO :binary@prove) + (NT_ONLY :binary@prove) + (NT_FIRST :binary@prove) + (NT_MDDL :binary@prove) + (NT_LAST :binary@prove) + (RZ_ONLY :binary@prove) + (RZ_FIRST :binary@prove) + (RZ_MDDL :binary@prove) + (RZ_LAST :binary@prove)) + +(defperspective macro + + ;; selector + MACRO + ((INST :i16 :display :hex) + (SRC_ID :i64) + (TGT_ID :i64) + (AUX_ID :i64) + (SRC_OFFSET_HI :i128) + (SRC_OFFSET_LO :i128) + (TGT_OFFSET_LO :i64) + (SIZE :i64) + (REF_OFFSET :i64) + (REF_SIZE :i64) + (SUCCESS_BIT :binary) + (LIMB_1 :i128) + (LIMB_2 :i128) + (PHASE :i32) + (EXO_SUM :i32))) + +(defperspective prprc + + ;; selector + PRPRC + ((CT :i16) + (EUC_FLAG :binary) + (EUC_A :i64) + (EUC_B :i64) + (EUC_QUOT :i64) + (EUC_REM :i64) + (EUC_CEIL :i64) + (WCP_FLAG :binary) + (WCP_ARG_1_HI :i128) + (WCP_ARG_1_LO :i128) + (WCP_ARG_2_LO :i128) + (WCP_RES :binary) + (WCP_INST :byte :display :opcode))) + +(defperspective micro + + ;; selector + MICRO + ((INST :i16 :display :hex) + (SIZE :byte :display :dec) + (SLO :i64 :display :dec) + (SBO :byte :display :dec) + (TLO :i64 :display :dec) + (TBO :byte :display :dec) + (LIMB :i128) + (CN_S :i64 :display :dec) + (CN_T :i64 :display :dec) + (SUCCESS_BIT :binary) + (EXO_SUM :i32) + (PHASE :i32) + (EXO_ID :i32) + (KEC_ID :i32) + (TOTAL_SIZE :i64 :display :dec))) + + diff --git a/mmu/osaka/constants.lisp b/mmu/osaka/constants.lisp new file mode 100644 index 000000000..e4886e2e8 --- /dev/null +++ b/mmu/osaka/constants.lisp @@ -0,0 +1,60 @@ +(module mmu) + +(defconst + ;; + ;; MMU NB OF PP ROWS + ;; + NB_PP_ROWS_MLOAD 1 + NB_PP_ROWS_MSTORE 1 + NB_PP_ROWS_MSTORE8 1 + NB_PP_ROWS_INVALID_CODE_PREFIX 1 + NB_PP_ROWS_RIGHT_PADDED_WORD_EXTRACTION 5 + NB_PP_ROWS_RAM_TO_EXO_WITH_PADDING 4 + NB_PP_ROWS_EXO_TO_RAM_TRANSPLANTS 1 + NB_PP_ROWS_RAM_TO_RAM_SANS_PADDING 5 + NB_PP_ROWS_ANY_TO_RAM_WITH_PADDING_PURE_PADDING 4 + NB_PP_ROWS_ANY_TO_RAM_WITH_PADDING_SOME_DATA 10 + NB_PP_ROWS_MODEXP_ZERO 1 + NB_PP_ROWS_MODEXP_DATA 6 + NB_PP_ROWS_BLAKE 2 + ;; + ;; MMU NB OF PP ROWS + 1 + ;; + NB_PP_ROWS_MLOAD_PO (+ NB_PP_ROWS_MLOAD 1) + NB_PP_ROWS_MSTORE_PO (+ NB_PP_ROWS_MSTORE 1) + NB_PP_ROWS_MSTORE8_PO (+ NB_PP_ROWS_MSTORE8 1) + NB_PP_ROWS_INVALID_CODE_PREFIX_PO (+ NB_PP_ROWS_INVALID_CODE_PREFIX 1) + NB_PP_ROWS_RIGHT_PADDED_WORD_EXTRACTION_PO (+ NB_PP_ROWS_RIGHT_PADDED_WORD_EXTRACTION 1) + NB_PP_ROWS_RAM_TO_EXO_WITH_PADDING_PO (+ NB_PP_ROWS_RAM_TO_EXO_WITH_PADDING 1) + NB_PP_ROWS_EXO_TO_RAM_TRANSPLANTS_PO (+ NB_PP_ROWS_EXO_TO_RAM_TRANSPLANTS 1) + NB_PP_ROWS_RAM_TO_RAM_SANS_PADDING_PO (+ NB_PP_ROWS_RAM_TO_RAM_SANS_PADDING 1) + NB_PP_ROWS_ANY_TO_RAM_WITH_PADDING_PURE_PADDING_PO (+ NB_PP_ROWS_ANY_TO_RAM_WITH_PADDING_PURE_PADDING 1) + NB_PP_ROWS_ANY_TO_RAM_WITH_PADDING_SOME_DATA_PO (+ NB_PP_ROWS_ANY_TO_RAM_WITH_PADDING_SOME_DATA 1) + NB_PP_ROWS_MODEXP_ZERO_PO (+ NB_PP_ROWS_MODEXP_ZERO 1) + NB_PP_ROWS_MODEXP_DATA_PO (+ NB_PP_ROWS_MODEXP_DATA 1) + NB_PP_ROWS_BLAKE_PO (+ NB_PP_ROWS_BLAKE 1) + ;; + ;; MMU NB OF PP ROWS + 2 + ;; + NB_PP_ROWS_MLOAD_PT (+ NB_PP_ROWS_MLOAD 2) + NB_PP_ROWS_MSTORE_PT (+ NB_PP_ROWS_MSTORE 2) + NB_PP_ROWS_RIGHT_PADDED_WORD_EXTRACTION_PT (+ NB_PP_ROWS_RIGHT_PADDED_WORD_EXTRACTION 2) + NB_PP_ROWS_BLAKE_PT (+ NB_PP_ROWS_BLAKE 2) + ;; + ;; MMU NB OF micro-processing rows + ;; + NB_MICRO_ROWS_TOT_MLOAD 2 + NB_MICRO_ROWS_TOT_MSTORE 2 + NB_MICRO_ROWS_TOT_MSTORE_EIGHT 1 + NB_MICRO_ROWS_TOT_INVALID_CODE_PREFIX 1 + NB_MICRO_ROWS_TOT_RIGHT_PADDED_WORD_EXTRACTION 2 + ;;NB_MICRO_ROWS_TOT_RAM_TO_EXO_WITH_PADDING variable + ;;NB_MICRO_ROWS_TOT_EXO_TO_RAM_TANSPLANTS variable + ;;NB_MICRO_ROWS_TOT_RAM_TO_RAM_SANS_PADDING variable + ;;NB_MICRO_ROWS_TOT_ANY_TO_RAM_WITH_PADDING_PURE_PADDING variable + ;;NB_MICRO_ROWS_TOT_ANY_TO_RAM_WITH_PADDING_SOME_DATA variable + NB_MICRO_ROWS_TOT_MODEXP_ZERO 32 + NB_MICRO_ROWS_TOT_MODEXP_DATA 32 + NB_MICRO_ROWS_TOT_BLAKE 2) + + diff --git a/mmu/osaka/constraints.lisp b/mmu/osaka/constraints.lisp new file mode 100644 index 000000000..eb7c92a42 --- /dev/null +++ b/mmu/osaka/constraints.lisp @@ -0,0 +1,280 @@ +(module mmu) + +(defun (flag-sum) + (+ MACRO PRPRC MICRO)) + +(defconstraint perspective-flag () + (begin (debug (is-binary (flag-sum))) + (if-zero STAMP + (vanishes! (flag-sum)) + (eq! (flag-sum) 1)))) + +;; +;; Heartbeat +;; +(defconstraint first-row (:domain {0}) + (vanishes! STAMP)) ;; "" + +(defconstraint no-macrostamp-no-microstamp () + (if-zero STAMP + (vanishes! MMIO_STAMP))) + +(defconstraint mmu-stamp-evolution () + (did-inc! STAMP MACRO)) + +(defconstraint mmio-stamp-evolution () + (did-inc! MMIO_STAMP MICRO)) + +(defconstraint prprc-after-macro (:guard MACRO) + (eq! (next PRPRC) 1)) + +(defconstraint after-prprc (:guard PRPRC) + (begin (debug (eq! (+ (next PRPRC) (next MICRO)) + 1)) + (if-zero prprc/CT + (will-eq! MICRO 1) + (begin (will-dec! prprc/CT 1) + (will-eq! PRPRC 1))))) + +(defconstraint tot-nb-of-micro-inst () + (eq! TOT (+ TOTLZ TOTNT TOTRZ))) + +(defconstraint after-micro (:guard MICRO) + (begin (debug (eq! (+ (next MICRO) (next MACRO)) + 1)) + (did-dec! TOT 1) + (if-zero TOT + (begin (will-eq! MACRO 1) + (debug (vanishes! TOTLZ)) + (debug (vanishes! TOTNT)) + (debug (vanishes! TOTRZ))) + (will-eq! MICRO 1)) + (if-zero (prev TOTLZ) + (vanishes! TOTLZ) + (did-dec! TOTLZ 1)) + (if-zero (prev TOTNT) + (vanishes! TOTNT) + (did-dec! (+ TOTLZ TOTNT) 1)))) + +(defconstraint last-row (:domain {-1}) ;; "" + (if-not-zero STAMP + (begin (eq! MICRO 1) + (vanishes! TOT)))) + +;; +;; Constancies +;; +(defun (prprc-constant X) + (if-eq PRPRC 1 (remained-constant! X))) + +(defconstraint prprc-constancies () + (begin (prprc-constant TOT) + (debug (prprc-constant TOTLZ)) + (debug (prprc-constant TOTNT)) + (debug (prprc-constant TOTRZ)))) + +(defun (stamp-decrementing X) + (if-not-zero (- STAMP + (+ (prev STAMP) 1)) + (or! (remained-constant! X) (did-dec! X 1)))) + +(defconstraint stamp-decrementings () + (begin (stamp-decrementing TOT) + (stamp-decrementing TOTLZ) + (stamp-decrementing TOTNT) + (stamp-decrementing TOTRZ))) + +(defun (stamp-constant X) + (if-not-zero (- STAMP + (+ (prev STAMP) 1)) + (remained-constant! X))) + +(defconstraint stamp-constancies () + (begin (for i [5] (stamp-constant [OUT i])) + (for i [5] (stamp-constant [BIN i])) + (stamp-constant (bin-flag-sum)))) ;; "" + +(defun (micro-instruction-writing-constant X) + (if-eq MICRO 1 + (if-eq (prev MICRO) 1 (remained-constant! X)))) + +(defconstraint mmio-row-constancies () + (begin (micro-instruction-writing-constant micro/CN_S) + (micro-instruction-writing-constant micro/CN_T) + (micro-instruction-writing-constant micro/SUCCESS_BIT) + (micro-instruction-writing-constant micro/EXO_SUM) + (micro-instruction-writing-constant micro/PHASE) + (micro-instruction-writing-constant micro/EXO_ID) + (micro-instruction-writing-constant micro/KEC_ID) + (micro-instruction-writing-constant micro/TOTAL_SIZE))) + +;; +;; Instruction Decoding +;; +(defun (bin-flag-sum) + (+ (* 1 IS_MLOAD) + (* 2 IS_MSTORE) + (* 3 IS_MSTORE8) + (* 4 IS_INVALID_CODE_PREFIX) + (* 5 IS_RIGHT_PADDED_WORD_EXTRACTION) + (* 6 IS_RAM_TO_EXO_WITH_PADDING) + (* 7 IS_EXO_TO_RAM_TRANSPLANTS) + (* 8 IS_RAM_TO_RAM_SANS_PADDING) + (* 9 IS_ANY_TO_RAM_WITH_PADDING_SOME_DATA) + (* 10 IS_ANY_TO_RAM_WITH_PADDING_PURE_PADDING) + (* 11 IS_MODEXP_ZERO) + (* 12 IS_MODEXP_DATA) + (* 13 IS_BLAKE))) + +(defun (is-any-to-ram-with-padding) + (force-bin (+ IS_ANY_TO_RAM_WITH_PADDING_SOME_DATA + IS_ANY_TO_RAM_WITH_PADDING_PURE_PADDING))) + +(defun (inst-flag-sum) + (force-bin (+ IS_MLOAD + IS_MSTORE + IS_MSTORE8 + IS_INVALID_CODE_PREFIX + IS_RIGHT_PADDED_WORD_EXTRACTION + IS_RAM_TO_EXO_WITH_PADDING + IS_EXO_TO_RAM_TRANSPLANTS + IS_RAM_TO_RAM_SANS_PADDING + (is-any-to-ram-with-padding) + IS_MODEXP_ZERO + IS_MODEXP_DATA + IS_BLAKE))) + +(defun (weight-flag-sum) + (+ (* MMU_INST_MLOAD IS_MLOAD) + (* MMU_INST_MSTORE IS_MSTORE) + (* MMU_INST_MSTORE8 IS_MSTORE8) + (* MMU_INST_INVALID_CODE_PREFIX IS_INVALID_CODE_PREFIX) + (* MMU_INST_RIGHT_PADDED_WORD_EXTRACTION IS_RIGHT_PADDED_WORD_EXTRACTION) + (* MMU_INST_RAM_TO_EXO_WITH_PADDING IS_RAM_TO_EXO_WITH_PADDING) + (* MMU_INST_EXO_TO_RAM_TRANSPLANTS IS_EXO_TO_RAM_TRANSPLANTS) + (* MMU_INST_RAM_TO_RAM_SANS_PADDING IS_RAM_TO_RAM_SANS_PADDING) + (* MMU_INST_ANY_TO_RAM_WITH_PADDING (is-any-to-ram-with-padding)) + (* MMU_INST_MODEXP_ZERO IS_MODEXP_ZERO) + (* MMU_INST_MODEXP_DATA IS_MODEXP_DATA) + (* MMU_INST_BLAKE IS_BLAKE))) + +(defconstraint inst-flag-is-one () + (eq! (inst-flag-sum) (flag-sum))) + +(defconstraint set-inst-flag (:guard MACRO) + (eq! (weight-flag-sum) macro/INST)) + +;; +;; Micro Instruction writing row types +;; + +(defun (ntrv-row) (force-bin (+ NT_ONLY NT_FIRST NT_MDDL NT_LAST))) +(defun (rzro-row) (force-bin (+ RZ_ONLY RZ_FIRST RZ_MDDL RZ_LAST))) +(defun (zero-row) (force-bin (+ LZRO (rzro-row)))) + +(defconstraint sum-row-flag () + (eq! (+ LZRO (ntrv-row) (rzro-row)) MICRO)) + +(defconstraint left-zero-decrements () + (if-eq LZRO 1 (did-dec! TOTLZ 1))) + +(defconstraint nt-decrements () + (if-eq (ntrv-row) 1 (did-dec! TOTNT 1))) + +(defconstraint right-zero-decrements () + (if-eq (rzro-row) 1 (did-dec! TOTRZ 1))) + +(defconstraint is-nt-only-row (:guard NT_ONLY) + (begin (vanishes! (prev (ntrv-row))) + (vanishes! TOTNT))) + +(defconstraint is-nt-first-row (:guard NT_FIRST) + (begin (vanishes! (prev (ntrv-row))) + (eq! (~ TOTNT) 1))) + +(defconstraint is-nt-middle-row (:guard NT_MDDL) + (begin (eq! (prev (ntrv-row)) 1) + (eq! (~ TOTNT) 1))) + +(defconstraint is-nt-last-row (:guard NT_LAST) + (begin (eq! (prev (ntrv-row)) 1) + (vanishes! TOTNT))) + +(defconstraint is-rz-only-row (:guard RZ_ONLY) + (begin (vanishes! (prev (rzro-row))) + (vanishes! TOTRZ))) + +(defconstraint is-rz-first-row (:guard RZ_FIRST) + (begin (vanishes! (prev (rzro-row))) + (eq! (~ TOTRZ) 1))) + +(defconstraint is-rz-middle-row (:guard RZ_MDDL) + (begin (eq! (prev (rzro-row)) 1) + (eq! (~ TOTRZ) 1))) + +(defconstraint is-rz-last-row (:guard RZ_LAST) + (begin (eq! (prev (rzro-row)) 1) + (vanishes! TOTRZ))) + +;; +;; Setting nb of preprocessing rows +;; +(defconstraint set-prprc-ct-init (:guard MACRO) + (eq! (next prprc/CT) + (+ (* (- NB_PP_ROWS_MLOAD 1) IS_MLOAD) + (* (- NB_PP_ROWS_MSTORE 1) IS_MSTORE) + (* (- NB_PP_ROWS_MSTORE8 1) IS_MSTORE8) + (* (- NB_PP_ROWS_INVALID_CODE_PREFIX 1) IS_INVALID_CODE_PREFIX) + (* (- NB_PP_ROWS_RIGHT_PADDED_WORD_EXTRACTION 1) IS_RIGHT_PADDED_WORD_EXTRACTION) + (* (- NB_PP_ROWS_RAM_TO_EXO_WITH_PADDING 1) IS_RAM_TO_EXO_WITH_PADDING) + (* (- NB_PP_ROWS_EXO_TO_RAM_TRANSPLANTS 1) IS_EXO_TO_RAM_TRANSPLANTS) + (* (- NB_PP_ROWS_RAM_TO_RAM_SANS_PADDING 1) IS_RAM_TO_RAM_SANS_PADDING) + (* (- NB_PP_ROWS_ANY_TO_RAM_WITH_PADDING_SOME_DATA 1) IS_ANY_TO_RAM_WITH_PADDING_SOME_DATA) + (* (- NB_PP_ROWS_ANY_TO_RAM_WITH_PADDING_PURE_PADDING 1) IS_ANY_TO_RAM_WITH_PADDING_PURE_PADDING) + (* (- NB_PP_ROWS_MODEXP_ZERO 1) IS_MODEXP_ZERO) + (* (- NB_PP_ROWS_MODEXP_DATA 1) IS_MODEXP_DATA) + (* (- NB_PP_ROWS_BLAKE 1) IS_BLAKE)))) + +;; +;; Utilities +;; +(defun (callToEuc row_offset + dividend + divisor) + (begin (eq! (shift prprc/EUC_FLAG row_offset) 1) + (eq! (shift prprc/EUC_A row_offset) dividend) + (eq! (shift prprc/EUC_B row_offset) divisor))) + +(defun (callToLt row_offset + arg1hi + arg1lo + arg2lo) + (begin (eq! (shift prprc/WCP_FLAG row_offset) 1) + (eq! (shift prprc/WCP_INST row_offset) EVM_INST_LT) + (eq! (shift prprc/WCP_ARG_1_HI row_offset) arg1hi) + (eq! (shift prprc/WCP_ARG_1_LO row_offset) arg1lo) + (eq! (shift prprc/WCP_ARG_2_LO row_offset) arg2lo))) + +(defun (callToEq row_offset + arg1hi + arg1lo + arg2lo) + (begin (eq! (shift prprc/WCP_FLAG row_offset) 1) + (eq! (shift prprc/WCP_INST row_offset) EVM_INST_EQ) + (eq! (shift prprc/WCP_ARG_1_HI row_offset) arg1hi) + (eq! (shift prprc/WCP_ARG_1_LO row_offset) arg1lo) + (eq! (shift prprc/WCP_ARG_2_LO row_offset) arg2lo))) + +(defun (callToIszero row_offset + arg1hi + arg1lo) + (begin (eq! (shift prprc/WCP_FLAG row_offset) 1) + (eq! (shift prprc/WCP_INST row_offset) EVM_INST_ISZERO) + (eq! (shift prprc/WCP_ARG_1_HI row_offset) arg1hi) + (eq! (shift prprc/WCP_ARG_1_LO row_offset) arg1lo) + (debug (vanishes! (shift prprc/WCP_ARG_2_LO row_offset))))) + +(defun (standard-progression C) + (eq! C + (* (prev MICRO) + (+ (prev C) 1)))) diff --git a/mmu/osaka/instructions/any_to_ram_with_padding/common.lisp b/mmu/osaka/instructions/any_to_ram_with_padding/common.lisp new file mode 100644 index 000000000..1660adcbe --- /dev/null +++ b/mmu/osaka/instructions/any_to_ram_with_padding/common.lisp @@ -0,0 +1,62 @@ +(module mmu) + +;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; MMU Instructions ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; ;; +;;;;;;;;;;;;;;;;;;;;;;;; ANY_TO_RAM_WITH_PADDING ;; +;;;;;;;;;;;;;;;;;;;;;;;; ;; +;;;;;;;;;;;;;;;;;;;;;;;; common constraints ;; +;;;;;;;;;;;;;;;;;;;;;;;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (any-to-ram-with-padding---min-tgt-offset) macro/TGT_OFFSET_LO) +(defun (any-to-ram-with-padding---max-tgt-offset) (+ macro/TGT_OFFSET_LO (- macro/SIZE 1))) +(defun (any-to-ram-with-padding---pure-padd) (force-bin (- 1 (next prprc/WCP_RES)))) +(defun (any-to-ram-with-padding---min-tlo) (next prprc/EUC_QUOT)) +(defun (any-to-ram-with-padding---min-tbo) (next prprc/EUC_REM)) +(defun (any-to-ram-with-padding---max-src-offset-or-zero) (* (- 1 (any-to-ram-with-padding---pure-padd)) + (+ macro/SRC_OFFSET_LO (- macro/SIZE 1)))) +(defun (any-to-ram-with-padding---mixed) (force-bin (* (- 1 (any-to-ram-with-padding---pure-padd)) + (- 1 (shift prprc/WCP_RES 2))))) +(defun (any-to-ram-with-padding---pure-data) (force-bin (* (- 1 (any-to-ram-with-padding---pure-padd)) (shift prprc/WCP_RES 2)))) +(defun (any-to-ram-with-padding---max-tlo) (shift prprc/EUC_QUOT 2)) +(defun (any-to-ram-with-padding---max-tbo) (shift prprc/EUC_REM 2)) +(defun (any-to-ram-with-padding---trsf-size) (+ (* (any-to-ram-with-padding---mixed) (- macro/REF_SIZE macro/SRC_OFFSET_LO)) + (* (any-to-ram-with-padding---pure-data) macro/SIZE))) +(defun (any-to-ram-with-padding---padd-size) (+ (* (any-to-ram-with-padding---pure-padd) macro/SIZE) + (* (any-to-ram-with-padding---mixed) + (- macro/SIZE (- macro/REF_SIZE macro/SRC_OFFSET_LO))))) ;; "" + +(defconstraint any-to-ram-with-padding---common---1st-preprocessing-row (:guard (* MACRO (is-any-to-ram-with-padding))) + (begin + ;; preprocessing row n°1 + (callToLt 1 + macro/SRC_OFFSET_HI + macro/SRC_OFFSET_LO + macro/REF_SIZE) + (callToEuc 1 + (any-to-ram-with-padding---min-tgt-offset) + LLARGE))) + +(defconstraint any-to-ram-with-padding---common---2nd-preprocessing-row (:guard (* MACRO (is-any-to-ram-with-padding))) + (begin + ;; preprocessing row n°2 + (callToLt 2 + 0 + (any-to-ram-with-padding---max-src-offset-or-zero) + macro/REF_SIZE) + (callToEuc 2 + (any-to-ram-with-padding---max-tgt-offset) + LLARGE))) + +(defconstraint any-to-ram-with-padding---common---justifing-the-pure-padding-vs-some-data-flag (:guard (* MACRO (is-any-to-ram-with-padding))) + (begin + ;; justifyng the flag + (eq! IS_ANY_TO_RAM_WITH_PADDING_PURE_PADDING (any-to-ram-with-padding---pure-padd)) + (eq! IS_ANY_TO_RAM_WITH_PADDING_SOME_DATA (+ (any-to-ram-with-padding---mixed) (any-to-ram-with-padding---pure-data))))) diff --git a/mmu/osaka/instructions/any_to_ram_with_padding/pure_padding.lisp b/mmu/osaka/instructions/any_to_ram_with_padding/pure_padding.lisp new file mode 100644 index 000000000..2aaec016d --- /dev/null +++ b/mmu/osaka/instructions/any_to_ram_with_padding/pure_padding.lisp @@ -0,0 +1,96 @@ +(module mmu) + +;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; MMU Instructions ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; ;; +;;;;;;;;;;;;;;;;;;;;;;;; ANY_TO_RAM_WITH_PADDING ;; +;;;;;;;;;;;;;;;;;;;;;;;; ;; +;;;;;;;;;;;;;;;;;;;;;;;; pure padding case ;; +;;;;;;;;;;;;;;;;;;;;;;;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defun (any-to-ram-with-padding---pure-padding---last-padding-is-full) [BIN 1]) +(defun (any-to-ram-with-padding---pure-padding---last-padding-size) [OUT 1]) ;; "" +(defun (any-to-ram-with-padding---pure-padding---totrz-is-one) (shift prprc/WCP_RES 3)) +(defun (any-to-ram-with-padding---pure-padding---first-padding-is-full) (shift prprc/WCP_RES 4)) +(defun (any-to-ram-with-padding---pure-padding---only-padding-is-full) (* (any-to-ram-with-padding---pure-padding---first-padding-is-full) (any-to-ram-with-padding---pure-padding---last-padding-is-full))) +(defun (any-to-ram-with-padding---pure-padding---first-padding-size) (- LLARGE (any-to-ram-with-padding---min-tbo))) +(defun (any-to-ram-with-padding---pure-padding---only-padding-size) (any-to-ram-with-padding---padd-size)) + +(defconstraint any-to-ram-with-padding---pure-padding---setting-the-TOTs (:guard (* MACRO IS_ANY_TO_RAM_WITH_PADDING_PURE_PADDING)) + (begin + ;; setting number of rows + (vanishes! TOTLZ) + (vanishes! TOTNT) + (eq! TOTRZ (+ (- (any-to-ram-with-padding---max-tlo) (any-to-ram-with-padding---min-tlo)) 1)))) + +(defconstraint any-to-ram-with-padding---pure-padding---3rd-preprocessing-row (:guard (* MACRO IS_ANY_TO_RAM_WITH_PADDING_PURE_PADDING)) + ;; preprocessing row n°3 + (callToEq 3 + 0 + TOTRZ + 1)) + +(defconstraint any-to-ram-with-padding---pure-padding---4th-preprocessing-row (:guard (* MACRO IS_ANY_TO_RAM_WITH_PADDING_PURE_PADDING)) + (begin + ;; preprocessing row n°4 + (callToIszero 4 + 0 + (any-to-ram-with-padding---min-tbo)) + (callToEuc 4 + (+ 1 (any-to-ram-with-padding---max-tbo)) + LLARGE) + (eq! (any-to-ram-with-padding---pure-padding---last-padding-is-full) (* (- 1 (any-to-ram-with-padding---pure-padding---totrz-is-one)) (shift prprc/EUC_QUOT 4))) + (eq! (any-to-ram-with-padding---pure-padding---last-padding-size) (* (- 1 (any-to-ram-with-padding---pure-padding---totrz-is-one)) (+ 1 (any-to-ram-with-padding---max-tbo)))))) + +(defconstraint any-to-ram-with-padding---pure-padding---setting-micro-instruction-constant-values (:guard (* MACRO IS_ANY_TO_RAM_WITH_PADDING_PURE_PADDING)) + ;; mmio constant values + (eq! (shift micro/CN_T NB_PP_ROWS_ANY_TO_RAM_WITH_PADDING_PURE_PADDING_PO) macro/TGT_ID)) + +(defconstraint any-to-ram-with-padding---pure-padding---initializing-tlo-tbo (:guard (* MACRO IS_ANY_TO_RAM_WITH_PADDING_PURE_PADDING)) + (begin + ;; first and only common mmio + (eq! (shift micro/TLO NB_PP_ROWS_ANY_TO_RAM_WITH_PADDING_PURE_PADDING_PO) (any-to-ram-with-padding---min-tlo)) + (eq! (shift micro/TBO NB_PP_ROWS_ANY_TO_RAM_WITH_PADDING_PURE_PADDING_PO) (any-to-ram-with-padding---min-tbo)))) + +(defconstraint any-to-ram-with-padding---pure-padding---FIRST-and-ONLY-micro-instruction-writing (:guard (* MACRO IS_ANY_TO_RAM_WITH_PADDING_PURE_PADDING)) + (if-zero (any-to-ram-with-padding---pure-padding---totrz-is-one) + ;; first mmio instruction + (begin (if-zero (any-to-ram-with-padding---pure-padding---first-padding-is-full) + (eq! (shift micro/INST NB_PP_ROWS_ANY_TO_RAM_WITH_PADDING_PURE_PADDING_PO) + MMIO_INST_RAM_EXCISION) + (eq! (shift micro/INST NB_PP_ROWS_ANY_TO_RAM_WITH_PADDING_PURE_PADDING_PO) + MMIO_INST_RAM_VANISHES)) + (eq! (shift micro/SIZE NB_PP_ROWS_ANY_TO_RAM_WITH_PADDING_PURE_PADDING_PO) + (any-to-ram-with-padding---pure-padding---first-padding-size))) + ;; only mmio instruction + (begin (if-zero (any-to-ram-with-padding---pure-padding---only-padding-is-full) + (eq! (shift micro/INST NB_PP_ROWS_ANY_TO_RAM_WITH_PADDING_PURE_PADDING_PO) + MMIO_INST_RAM_EXCISION) + (eq! (shift micro/INST NB_PP_ROWS_ANY_TO_RAM_WITH_PADDING_PURE_PADDING_PO) + MMIO_INST_RAM_VANISHES)) + (eq! (shift micro/SIZE NB_PP_ROWS_ANY_TO_RAM_WITH_PADDING_PURE_PADDING_PO) + (any-to-ram-with-padding---pure-padding---only-padding-size))))) + +(defconstraint any-to-ram-with-padding---pure-padding---paying-forward (:guard IS_ANY_TO_RAM_WITH_PADDING_PURE_PADDING) + (if-eq (force-bin (+ RZ_MDDL RZ_LAST)) 1 + (begin (did-inc! micro/TLO 1) + (vanishes! micro/TBO)))) + +(defconstraint any-to-ram-with-padding---pure-padding---MDDL-and-LAST-micro-instruction-writing (:guard IS_ANY_TO_RAM_WITH_PADDING_PURE_PADDING) + (begin + ;; middle mmio instructions + (if-eq RZ_MDDL 1 (eq! micro/INST MMIO_INST_RAM_VANISHES)) + ;; last mmio instruction + (if-eq RZ_LAST 1 + (begin (if-zero (any-to-ram-with-padding---pure-padding---last-padding-is-full) + (eq! micro/INST MMIO_INST_RAM_EXCISION) + (eq! micro/INST MMIO_INST_RAM_VANISHES)) + (eq! micro/SIZE (any-to-ram-with-padding---pure-padding---last-padding-size)))))) diff --git a/mmu/osaka/instructions/any_to_ram_with_padding/some_data.lisp b/mmu/osaka/instructions/any_to_ram_with_padding/some_data.lisp new file mode 100644 index 000000000..e6b756456 --- /dev/null +++ b/mmu/osaka/instructions/any_to_ram_with_padding/some_data.lisp @@ -0,0 +1,234 @@ +(module mmu) + +;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; MMU Instructions ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; ;; +;;;;;;;;;;;;;;;;;;;;;;;; ANY_TO_RAM_WITH_PADDING ;; +;;;;;;;;;;;;;;;;;;;;;;;; ;; +;;;;;;;;;;;;;;;;;;;;;;;; some data case ;; +;;;;;;;;;;;;;;;;;;;;;;;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defun (any-to-ram-with-padding---some-data---tlo-increment-after-first-dt) [BIN 1]) +(defun (any-to-ram-with-padding---some-data---aligned) [BIN 2]) +(defun (any-to-ram-with-padding---some-data---middle-tbo) [OUT 1]) +(defun (any-to-ram-with-padding---some-data---last-dt-single-target) [BIN 3]) +(defun (any-to-ram-with-padding---some-data---last-dt-size) [OUT 2]) +(defun (any-to-ram-with-padding---some-data---tlo-increment-at-transition) [BIN 4]) +(defun (any-to-ram-with-padding---some-data---first-pbo) [OUT 3]) +(defun (any-to-ram-with-padding---some-data---first-padding-size) [OUT 4]) +(defun (any-to-ram-with-padding---some-data---last-padding-size) [OUT 5]) +(defun (any-to-ram-with-padding---some-data---data-src-is-ram) [BIN 5]) +(defun (any-to-ram-with-padding---some-data---totnt-is-one) (shift prprc/WCP_RES 4)) +(defun (any-to-ram-with-padding---some-data---only-dt-size) (any-to-ram-with-padding---trsf-size)) +(defun (any-to-ram-with-padding---some-data---first-dt-size) (- LLARGE (any-to-ram-with-padding---some-data---min-sbo))) +(defun (any-to-ram-with-padding---some-data---min-src-offset) (+ macro/SRC_OFFSET_LO macro/REF_OFFSET)) +(defun (any-to-ram-with-padding---some-data---min-slo) (shift prprc/EUC_QUOT 5)) +(defun (any-to-ram-with-padding---some-data---min-sbo) (shift prprc/EUC_REM 5)) +(defun (any-to-ram-with-padding---some-data---max-src-offset) (+ (any-to-ram-with-padding---some-data---min-src-offset) (- (any-to-ram-with-padding---trsf-size) 1))) +(defun (any-to-ram-with-padding---some-data---max-slo) (shift prprc/EUC_QUOT 6)) +(defun (any-to-ram-with-padding---some-data---max-sbo) (shift prprc/EUC_REM 6)) +(defun (any-to-ram-with-padding---some-data---only-dt-single-target) (force-bin (- 1 (shift prprc/EUC_QUOT 7)))) +(defun (any-to-ram-with-padding---some-data---only-dt-maxes-out-target) (shift prprc/WCP_RES 7)) +(defun (any-to-ram-with-padding---some-data---first-dt-single-target) (force-bin (- 1 (shift prprc/EUC_QUOT 8)))) +(defun (any-to-ram-with-padding---some-data---first-dt-maxes-out-target) (shift prprc/WCP_RES 8)) +(defun (any-to-ram-with-padding---some-data---last-dt-maxes-out-target) (shift prprc/WCP_RES 9)) +(defun (any-to-ram-with-padding---some-data---first-padding-offset) (+ (any-to-ram-with-padding---min-tgt-offset) (any-to-ram-with-padding---trsf-size))) +(defun (any-to-ram-with-padding---some-data---first-plo) (shift prprc/EUC_QUOT 10)) +(defun (any-to-ram-with-padding---some-data---last-plo) (any-to-ram-with-padding---max-tlo)) +(defun (any-to-ram-with-padding---some-data---last-pbo) (any-to-ram-with-padding---max-tbo)) +(defun (any-to-ram-with-padding---some-data---totrz-is-one) (shift prprc/WCP_RES 10)) +(defun (any-to-ram-with-padding---some-data---micro-cns) (* (any-to-ram-with-padding---some-data---data-src-is-ram) macro/SRC_ID)) +(defun (any-to-ram-with-padding---some-data---micro-id1) (* (- 1 (any-to-ram-with-padding---some-data---data-src-is-ram)) macro/SRC_ID)) ;; "" + +(defconstraint any-to-ram-with-padding---some-data---3rd-preprocessing-row (:guard (* MACRO IS_ANY_TO_RAM_WITH_PADDING_SOME_DATA)) + (begin + ;; preprocessing row n°3 + (callToIszero 3 0 macro/EXO_SUM) + (eq! (any-to-ram-with-padding---some-data---data-src-is-ram) (shift prprc/WCP_RES 3)))) + +(defconstraint any-to-ram-with-padding---some-data---setting-TOTLZ-and-TOTNT (:guard (* MACRO IS_ANY_TO_RAM_WITH_PADDING_SOME_DATA)) + (begin + ;; setting nb of rows + (vanishes! TOTLZ) + (eq! TOTNT + (+ (- (any-to-ram-with-padding---some-data---max-slo) (any-to-ram-with-padding---some-data---min-slo)) 1)))) + +(defconstraint any-to-ram-with-padding---some-data---4th-preprocessing-row (:guard (* MACRO IS_ANY_TO_RAM_WITH_PADDING_SOME_DATA)) + (begin + ;; preprocessing row n°4 + (callToEq 4 0 TOTNT 1) + (eq! (any-to-ram-with-padding---some-data---last-dt-size) (+ (any-to-ram-with-padding---some-data---max-sbo) 1)))) + +(defconstraint any-to-ram-with-padding---some-data---5th-preprocessing-row (:guard (* MACRO IS_ANY_TO_RAM_WITH_PADDING_SOME_DATA)) + (begin + ;; preprocessing row n°5 + (callToEuc 5 (any-to-ram-with-padding---some-data---min-src-offset) LLARGE) + (callToEq 5 0 (any-to-ram-with-padding---min-tbo) (any-to-ram-with-padding---some-data---min-sbo)) + (eq! (any-to-ram-with-padding---some-data---aligned) (shift prprc/WCP_RES 5)))) + +(defconstraint any-to-ram-with-padding---some-data---6th-preprocessing-row (:guard (* MACRO IS_ANY_TO_RAM_WITH_PADDING_SOME_DATA)) + ;; preprocessing row n°6 + (callToEuc 6 (any-to-ram-with-padding---some-data---max-src-offset) LLARGE)) + +(defconstraint any-to-ram-with-padding---some-data---7th-preprocessing-row (:guard (* MACRO IS_ANY_TO_RAM_WITH_PADDING_SOME_DATA)) + ;; preprocessing row n°7 + (if-eq (any-to-ram-with-padding---some-data---totnt-is-one) 1 + (begin (callToEuc 7 + (+ (any-to-ram-with-padding---min-tbo) (- (any-to-ram-with-padding---some-data---only-dt-size) 1)) + LLARGE) + (callToEq 7 0 (shift prprc/EUC_REM 7) LLARGEMO)))) + +(defconstraint any-to-ram-with-padding---some-data---8th-preprocessing-row (:guard (* MACRO IS_ANY_TO_RAM_WITH_PADDING_SOME_DATA)) + ;; preprocessing row n°8 + (if-zero (any-to-ram-with-padding---some-data---totnt-is-one) + (begin (callToEuc 8 + (+ (any-to-ram-with-padding---min-tbo) (- (any-to-ram-with-padding---some-data---first-dt-size) 1)) + LLARGE) + (callToEq 8 0 (shift prprc/EUC_REM 8) LLARGEMO) + (if-zero (any-to-ram-with-padding---some-data---first-dt-maxes-out-target) + (eq! (any-to-ram-with-padding---some-data---middle-tbo) + (+ 1 (shift prprc/EUC_REM 8))) + (vanishes! (any-to-ram-with-padding---some-data---middle-tbo)))))) + +(defconstraint any-to-ram-with-padding---some-data---9th-preprocessing-row (:guard (* MACRO IS_ANY_TO_RAM_WITH_PADDING_SOME_DATA)) + ;; preprocessing row n°9 + (if-zero (any-to-ram-with-padding---some-data---totnt-is-one) + (begin (callToEuc 9 + (+ (any-to-ram-with-padding---some-data---middle-tbo) + (- (any-to-ram-with-padding---some-data---last-dt-size) 1)) + LLARGE) + (callToEq 9 0 (shift prprc/EUC_REM 9) LLARGEMO) + (eq! (any-to-ram-with-padding---some-data---last-dt-single-target) + (- 1 (shift prprc/EUC_QUOT 9))) + (eq! (any-to-ram-with-padding---some-data---last-dt-maxes-out-target) (shift prprc/WCP_RES 9)) + (if-not-zero (any-to-ram-with-padding---some-data---totnt-is-one) + (vanishes! (any-to-ram-with-padding---some-data---tlo-increment-after-first-dt)) + (if-zero (any-to-ram-with-padding---some-data---first-dt-single-target) + (eq! (any-to-ram-with-padding---some-data---tlo-increment-after-first-dt) 1) + (eq! (any-to-ram-with-padding---some-data---tlo-increment-after-first-dt) + (any-to-ram-with-padding---some-data---first-dt-maxes-out-target))))))) + +(defconstraint any-to-ram-with-padding---some-data---justifying-tlo-increments-at-transition (:guard (* MACRO IS_ANY_TO_RAM_WITH_PADDING_SOME_DATA)) + ;; justifying tlo_increments_at_transition + (if-eq-else (any-to-ram-with-padding---some-data---totnt-is-one) 1 + (if-zero (any-to-ram-with-padding---some-data---only-dt-single-target) + (eq! (any-to-ram-with-padding---some-data---tlo-increment-at-transition) 1) + (eq! (any-to-ram-with-padding---some-data---tlo-increment-at-transition) + (any-to-ram-with-padding---some-data---only-dt-maxes-out-target))) + (if-zero (any-to-ram-with-padding---some-data---last-dt-single-target) + (eq! (any-to-ram-with-padding---some-data---tlo-increment-at-transition) 1) + (eq! (any-to-ram-with-padding---some-data---tlo-increment-at-transition) + (any-to-ram-with-padding---some-data---last-dt-maxes-out-target))))) + +(defconstraint any-to-ram-with-padding---some-data---10th-preprocessing-row (:guard (* MACRO IS_ANY_TO_RAM_WITH_PADDING_SOME_DATA)) + (begin + ;; preprocessing row n°10 + (callToEq 10 0 TOTRZ 1) + (callToEuc 10 (any-to-ram-with-padding---some-data---first-padding-offset) LLARGE) + (if-eq (any-to-ram-with-padding---pure-data) 1 (vanishes! TOTRZ)) + (if-eq (any-to-ram-with-padding---mixed) 1 + (eq! TOTRZ + (+ (- (any-to-ram-with-padding---some-data---last-plo) (any-to-ram-with-padding---some-data---first-plo)) 1))) + (eq! (any-to-ram-with-padding---some-data---first-pbo) + (* (any-to-ram-with-padding---mixed) (shift prprc/EUC_REM 10))) + (if-eq-else (any-to-ram-with-padding---some-data---totrz-is-one) 1 + (eq! (any-to-ram-with-padding---some-data---first-padding-size) (any-to-ram-with-padding---padd-size)) + (begin (eq! (any-to-ram-with-padding---some-data---first-padding-size) + (* (any-to-ram-with-padding---mixed) (- LLARGE (any-to-ram-with-padding---some-data---first-pbo)))) + (eq! (any-to-ram-with-padding---some-data---last-padding-size) + (* (any-to-ram-with-padding---mixed) (+ 1 (any-to-ram-with-padding---some-data---last-pbo)))))))) + +(defconstraint any-to-ram-with-padding---some-data---setting-micro-instruction-constant-values (:guard (* MACRO IS_ANY_TO_RAM_WITH_PADDING_SOME_DATA)) + (begin + ;; initialisation + (eq! (shift micro/CN_S NB_PP_ROWS_ANY_TO_RAM_WITH_PADDING_SOME_DATA_PO) (any-to-ram-with-padding---some-data---micro-cns)) + (eq! (shift micro/CN_T NB_PP_ROWS_ANY_TO_RAM_WITH_PADDING_SOME_DATA_PO) macro/TGT_ID) + (eq! (shift micro/EXO_SUM NB_PP_ROWS_ANY_TO_RAM_WITH_PADDING_SOME_DATA_PO) macro/EXO_SUM) + (eq! (shift micro/EXO_ID NB_PP_ROWS_ANY_TO_RAM_WITH_PADDING_SOME_DATA_PO) (any-to-ram-with-padding---some-data---micro-id1)) + (eq! (shift micro/TOTAL_SIZE NB_PP_ROWS_ANY_TO_RAM_WITH_PADDING_SOME_DATA_PO) macro/REF_SIZE))) + +(defconstraint any-to-ram-with-padding---some-data---initializing-SLO-SBO-TLO-TBO (:guard (* MACRO IS_ANY_TO_RAM_WITH_PADDING_SOME_DATA)) + (begin + ;; FIRST and ONLY mmio inst shared values + (eq! (shift micro/SLO NB_PP_ROWS_ANY_TO_RAM_WITH_PADDING_SOME_DATA_PO) (any-to-ram-with-padding---some-data---min-slo)) + (eq! (shift micro/SBO NB_PP_ROWS_ANY_TO_RAM_WITH_PADDING_SOME_DATA_PO) (any-to-ram-with-padding---some-data---min-sbo)) + (eq! (shift micro/TLO NB_PP_ROWS_ANY_TO_RAM_WITH_PADDING_SOME_DATA_PO) (any-to-ram-with-padding---min-tlo)) + (eq! (shift micro/TBO NB_PP_ROWS_ANY_TO_RAM_WITH_PADDING_SOME_DATA_PO) (any-to-ram-with-padding---min-tbo)))) + +(defconstraint any-to-ram-with-padding---some-data---ONLY-and-FIRST-micro-instruction-writing (:guard (* MACRO IS_ANY_TO_RAM_WITH_PADDING_SOME_DATA)) + (begin + (if-eq-else (any-to-ram-with-padding---some-data---totnt-is-one) 1 + ;; ONLY mmio inst + (begin (if-eq-else (any-to-ram-with-padding---some-data---data-src-is-ram) 1 + (if-zero (any-to-ram-with-padding---some-data---only-dt-single-target) + (eq! (shift micro/INST NB_PP_ROWS_ANY_TO_RAM_WITH_PADDING_SOME_DATA_PO) MMIO_INST_RAM_TO_RAM_TWO_TARGET) + (eq! (shift micro/INST NB_PP_ROWS_ANY_TO_RAM_WITH_PADDING_SOME_DATA_PO) MMIO_INST_RAM_TO_RAM_PARTIAL)) + (if-zero (any-to-ram-with-padding---some-data---only-dt-single-target) + (eq! (shift micro/INST NB_PP_ROWS_ANY_TO_RAM_WITH_PADDING_SOME_DATA_PO) MMIO_INST_LIMB_TO_RAM_TWO_TARGET) + (eq! (shift micro/INST NB_PP_ROWS_ANY_TO_RAM_WITH_PADDING_SOME_DATA_PO) MMIO_INST_LIMB_TO_RAM_ONE_TARGET))) + (eq! (shift micro/SIZE NB_PP_ROWS_ANY_TO_RAM_WITH_PADDING_SOME_DATA_PO) + (any-to-ram-with-padding---some-data---only-dt-size))) + ;; FIRST mmio inst + (begin (if-eq-else (any-to-ram-with-padding---some-data---data-src-is-ram) 1 + (if-zero (any-to-ram-with-padding---some-data---first-dt-single-target) + (eq! (shift micro/INST NB_PP_ROWS_ANY_TO_RAM_WITH_PADDING_SOME_DATA_PO) MMIO_INST_RAM_TO_RAM_TWO_TARGET) + (eq! (shift micro/INST NB_PP_ROWS_ANY_TO_RAM_WITH_PADDING_SOME_DATA_PO) MMIO_INST_RAM_TO_RAM_PARTIAL)) + (if-zero (any-to-ram-with-padding---some-data---first-dt-single-target) + (eq! (shift micro/INST NB_PP_ROWS_ANY_TO_RAM_WITH_PADDING_SOME_DATA_PO) MMIO_INST_LIMB_TO_RAM_TWO_TARGET) + (eq! (shift micro/INST NB_PP_ROWS_ANY_TO_RAM_WITH_PADDING_SOME_DATA_PO) MMIO_INST_LIMB_TO_RAM_ONE_TARGET))) + (eq! (shift micro/SIZE NB_PP_ROWS_ANY_TO_RAM_WITH_PADDING_SOME_DATA_PO) + (any-to-ram-with-padding---some-data---first-dt-size)))))) + +(defconstraint any-to-ram-with-padding---some-data---paying-forward-after-FIRST (:guard IS_ANY_TO_RAM_WITH_PADDING_SOME_DATA) + (if-eq NT_FIRST 1 + (begin (will-inc! micro/SLO 1) + (vanishes! (next micro/SBO)) + (if-zero (any-to-ram-with-padding---some-data---tlo-increment-after-first-dt) + (will-remain-constant! micro/TLO) + (will-inc! micro/TLO 1)) + (will-eq! micro/TBO (any-to-ram-with-padding---some-data---middle-tbo))))) + +(defconstraint any-to-ram-with-padding---some-data---MDDL-and-LAST-micro-instruction-writing (:guard IS_ANY_TO_RAM_WITH_PADDING_SOME_DATA) + (begin + (if-eq NT_MDDL 1 + (begin (if-eq-else (any-to-ram-with-padding---some-data---data-src-is-ram) 1 + (if-zero (any-to-ram-with-padding---some-data---aligned) + (eq! micro/INST MMIO_INST_RAM_TO_RAM_TWO_TARGET) + (eq! micro/INST MMIO_INST_RAM_TO_RAM_TRANSPLANT)) + (if-zero (any-to-ram-with-padding---some-data---aligned) + (eq! micro/INST MMIO_INST_LIMB_TO_RAM_TWO_TARGET) + (eq! micro/INST MMIO_INST_LIMB_TO_RAM_TRANSPLANT))) + (eq! micro/SIZE LLARGE) + (will-inc! micro/SLO 1) + (vanishes! (next micro/SBO)) + (will-inc! micro/TLO 1) + (will-eq! micro/TBO (any-to-ram-with-padding---some-data---middle-tbo)))) + (if-eq NT_LAST 1 + (begin (if-eq-else (any-to-ram-with-padding---some-data---data-src-is-ram) 1 + (if-zero (any-to-ram-with-padding---some-data---last-dt-single-target) + (eq! micro/INST MMIO_INST_RAM_TO_RAM_TWO_TARGET) + (eq! micro/INST MMIO_INST_RAM_TO_RAM_PARTIAL)) + (if-zero (any-to-ram-with-padding---some-data---last-dt-single-target) + (eq! micro/INST MMIO_INST_LIMB_TO_RAM_TWO_TARGET) + (eq! micro/INST MMIO_INST_LIMB_TO_RAM_ONE_TARGET))) + (eq! micro/SIZE (any-to-ram-with-padding---some-data---last-dt-size)))) + (if-eq (force-bin (+ RZ_FIRST RZ_ONLY)) 1 + (begin (eq! micro/INST MMIO_INST_RAM_EXCISION) + (eq! micro/SIZE (any-to-ram-with-padding---some-data---first-padding-size)) + (did-inc! micro/TLO (any-to-ram-with-padding---some-data---tlo-increment-at-transition)) + (eq! micro/TBO (any-to-ram-with-padding---some-data---first-pbo)))) + (if-eq (force-bin (+ RZ_FIRST RZ_MDDL)) 1 + (begin (will-inc! micro/TLO 1) + (vanishes! (next micro/TBO)))) + (if-eq RZ_MDDL 1 (eq! micro/INST MMIO_INST_RAM_VANISHES)) + (if-eq RZ_LAST 1 + (begin (eq! micro/INST MMIO_INST_RAM_EXCISION) + (eq! micro/SIZE (any-to-ram-with-padding---some-data---last-padding-size)))))) diff --git a/mmu/osaka/instructions/blake.lisp b/mmu/osaka/instructions/blake.lisp new file mode 100644 index 000000000..6d3521144 --- /dev/null +++ b/mmu/osaka/instructions/blake.lisp @@ -0,0 +1,81 @@ +(module mmu) + +;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; MMU Instructions ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; ;; +;;;;;;;;;;;;;;;;;;;;;;;; BLAKE ;; +;;;;;;;;;;;;;;;;;;;;;;;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (blake---cdo) macro/SRC_OFFSET_LO) +(defun (blake---success-bit) macro/SUCCESS_BIT) +(defun (blake---r-prediction) macro/LIMB_1) +(defun (blake---f-prediction) macro/LIMB_2) +(defun (blake---slo-r) (next prprc/EUC_QUOT)) +(defun (blake---sbo-r) (next prprc/EUC_REM)) +(defun (blake---r-single-source) (next prprc/WCP_RES)) +(defun (blake---slo-f) (shift prprc/EUC_QUOT 2)) +(defun (blake---sbo-f) (shift prprc/EUC_REM 2)) ;; "" + +(defconstraint blake---setting-the-TOTs (:guard (* MACRO IS_BLAKE)) + (begin + ;; setting nb of mmio instruction + (vanishes! TOTLZ) + (eq! TOTNT 2) + (vanishes! TOTRZ))) + +(defconstraint blake---1st-processing-row (:guard (* MACRO IS_BLAKE)) + (begin + ;; preprocessing row n°1 + (callToEuc 1 + (blake---cdo) + LLARGE) + (callToLt 1 + 0 + (+ (blake---sbo-r) (- 4 1)) + LLARGE))) + +(defconstraint blake---2nd-processing-row (:guard (* MACRO IS_BLAKE)) + ;; preprocessing row n°2 + (callToEuc 2 + (+ (blake---cdo) (- PRECOMPILE_CALL_DATA_SIZE___BLAKE2F 1)) + LLARGE)) + +(defconstraint blake---setting-micro-instruction-constant-values (:guard (* MACRO IS_BLAKE)) + (begin + ;; mmio constant values + (eq! (shift micro/CN_S NB_PP_ROWS_BLAKE_PO) macro/SRC_ID) + (eq! (shift micro/SUCCESS_BIT NB_PP_ROWS_BLAKE_PO) (blake---success-bit)) + (eq! (shift micro/EXO_SUM NB_PP_ROWS_BLAKE_PO) (* (blake---success-bit) EXO_SUM_WEIGHT_BLAKEMODEXP)) + (eq! (shift micro/PHASE NB_PP_ROWS_BLAKE_PO) (* (blake---success-bit) PHASE_BLAKE_PARAMS)) + (eq! (shift micro/EXO_ID NB_PP_ROWS_BLAKE_PO) (* (blake---success-bit) macro/TGT_ID)))) + +(defconstraint blake---1st-micro-instruction-writing (:guard (* MACRO IS_BLAKE)) + (begin + ;; first mmio inst + (if-zero (blake---r-single-source) + (eq! (shift micro/INST NB_PP_ROWS_BLAKE_PO) MMIO_INST_RAM_TO_LIMB_TWO_SOURCE) + (eq! (shift micro/INST NB_PP_ROWS_BLAKE_PO) MMIO_INST_RAM_TO_LIMB_ONE_SOURCE)) + (eq! (shift micro/SIZE NB_PP_ROWS_BLAKE_PO) 4) + (eq! (shift micro/SLO NB_PP_ROWS_BLAKE_PO) (blake---slo-r)) + (eq! (shift micro/SBO NB_PP_ROWS_BLAKE_PO) (blake---sbo-r)) + (vanishes! (shift micro/TLO NB_PP_ROWS_BLAKE_PO)) + (eq! (shift micro/TBO NB_PP_ROWS_BLAKE_PO) (- LLARGE 4)) + (eq! (shift micro/LIMB NB_PP_ROWS_BLAKE_PO) (blake---r-prediction)))) + +(defconstraint blake--2nd-micro-instruction-writing (:guard (* MACRO IS_BLAKE)) + (begin + ;; second mmio inst + (eq! (shift micro/INST NB_PP_ROWS_BLAKE_PT) MMIO_INST_RAM_TO_LIMB_ONE_SOURCE) + (eq! (shift micro/SIZE NB_PP_ROWS_BLAKE_PT) 1) + (eq! (shift micro/SLO NB_PP_ROWS_BLAKE_PT) (blake---slo-f)) + (eq! (shift micro/SBO NB_PP_ROWS_BLAKE_PT) (blake---sbo-f)) + (eq! (shift micro/TLO NB_PP_ROWS_BLAKE_PT) 1) + (eq! (shift micro/TBO NB_PP_ROWS_BLAKE_PT) (- LLARGE 1)) + (eq! (shift micro/LIMB NB_PP_ROWS_BLAKE_PT) (blake---f-prediction)))) diff --git a/mmu/osaka/instructions/exo_to_ram_transplant.lisp b/mmu/osaka/instructions/exo_to_ram_transplant.lisp new file mode 100644 index 000000000..c4c670761 --- /dev/null +++ b/mmu/osaka/instructions/exo_to_ram_transplant.lisp @@ -0,0 +1,40 @@ +(module mmu) + +;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; MMU Instructions ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; ;; +;;;;;;;;;;;;;;;;;;;;;;;; EXO_TO_RAM_TRANSPLANTS ;; +;;;;;;;;;;;;;;;;;;;;;;;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defconstraint exo-to-ram-transplant---preprocessing (:guard (* IS_EXO_TO_RAM_TRANSPLANTS MACRO)) + ;; setting prprc row n°1 + (callToEuc 1 + macro/SIZE + LLARGE)) + +(defconstraint exo-to-ram-transplant---setting-the-TOTs (:guard (* IS_EXO_TO_RAM_TRANSPLANTS MACRO)) + (begin + ;; setting nb of rows + (vanishes! TOTLZ) + (eq! TOTNT (next prprc/EUC_CEIL)) + (vanishes! TOTRZ))) + +(defconstraint exo-to-ram-transplant---setting-micro-instruction-constant-values (:guard (* IS_EXO_TO_RAM_TRANSPLANTS MACRO)) + (begin + ;; setting mmio constant values + (eq! (shift micro/CN_T NB_PP_ROWS_EXO_TO_RAM_TRANSPLANTS_PO) macro/TGT_ID) + (eq! (shift micro/EXO_SUM NB_PP_ROWS_EXO_TO_RAM_TRANSPLANTS_PO) macro/EXO_SUM) + (eq! (shift micro/PHASE NB_PP_ROWS_EXO_TO_RAM_TRANSPLANTS_PO) macro/PHASE) + (eq! (shift micro/EXO_ID NB_PP_ROWS_EXO_TO_RAM_TRANSPLANTS_PO) macro/SRC_ID))) + +(defconstraint exo-to-ram-transplant---micro-instruction-writing (:guard (* IS_EXO_TO_RAM_TRANSPLANTS MICRO)) + (begin (standard-progression micro/SLO) + (standard-progression micro/TLO) + (eq! micro/INST MMIO_INST_LIMB_TO_RAM_TRANSPLANT))) diff --git a/mmu/osaka/instructions/invalid_code_prefix.lisp b/mmu/osaka/instructions/invalid_code_prefix.lisp new file mode 100644 index 000000000..c987adef5 --- /dev/null +++ b/mmu/osaka/instructions/invalid_code_prefix.lisp @@ -0,0 +1,51 @@ +(module mmu) + +;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; MMU Instructions ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; ;; +;;;;;;;;;;;;;;;;;;;;;;;; INVALID_CODE_PREFIX ;; +;;;;;;;;;;;;;;;;;;;;;;;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (invalid-code-prefix---slo) (next prprc/EUC_QUOT)) +(defun (invalid-code-prefix---sbo) (next prprc/EUC_REM)) + +(defconstraint invalid-code-prefix---setting-the-TOTs (:guard (* MACRO IS_INVALID_CODE_PREFIX)) + (begin + (vanishes! TOTLZ) + (eq! TOTNT NB_MICRO_ROWS_TOT_INVALID_CODE_PREFIX) + (vanishes! TOTRZ))) + +(defconstraint invalid-code-prefix---pre-processing (:guard (* MACRO IS_INVALID_CODE_PREFIX)) + (begin ;; setting tot nb of mmio inst + ;; setting prprc row n°1 + (callToEuc 1 + macro/SRC_OFFSET_LO + LLARGE) + (callToEq 1 + 0 + (shift micro/LIMB NB_PP_ROWS_INVALID_CODE_PREFIX_PO) + EIP_3541_MARKER))) + +(defconstraint invalid-code-prefix---setting-the-success-bit (:guard (* MACRO IS_INVALID_CODE_PREFIX)) + (begin ;; setting tot nb of mmio inst + ;; setting the success bit + (eq! macro/SUCCESS_BIT + (next prprc/WCP_RES)))) + +(defconstraint invalid-code-prefix---micro-instruction-writing (:guard (* MACRO IS_INVALID_CODE_PREFIX)) + (begin ;; setting tot nb of mmio inst + ;; setting first mmio inst + (eq! (shift micro/INST NB_PP_ROWS_INVALID_CODE_PREFIX_PO) MMIO_INST_RAM_TO_LIMB_ONE_SOURCE) + (eq! (shift micro/SIZE NB_PP_ROWS_INVALID_CODE_PREFIX_PO) 1) + (eq! (shift micro/SLO NB_PP_ROWS_INVALID_CODE_PREFIX_PO) (invalid-code-prefix---slo)) + (eq! (shift micro/SBO NB_PP_ROWS_INVALID_CODE_PREFIX_PO) (invalid-code-prefix---sbo)) + (eq! (shift micro/TBO NB_PP_ROWS_INVALID_CODE_PREFIX_PO) LLARGEMO) + (vanishes! (shift micro/EXO_SUM NB_PP_ROWS_INVALID_CODE_PREFIX_PO)) + (eq! (shift micro/CN_S NB_PP_ROWS_INVALID_CODE_PREFIX_PO) macro/SRC_ID))) diff --git a/mmu/osaka/instructions/mload.lisp b/mmu/osaka/instructions/mload.lisp new file mode 100644 index 000000000..edabf1113 --- /dev/null +++ b/mmu/osaka/instructions/mload.lisp @@ -0,0 +1,60 @@ +(module mmu) + +;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; MMU Instructions ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; ;; +;;;;;;;;;;;;;;;;;;;;;;;; MLOAD ;; +;;;;;;;;;;;;;;;;;;;;;;;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (mload---aligned) (next prprc/WCP_RES)) +(defun (mload---slo) (next prprc/EUC_QUOT)) +(defun (mload---sbo) (next prprc/EUC_REM)) + +(defconstraint mload---setting-the-TOTs (:guard (* MACRO IS_MLOAD)) + (begin + (vanishes! TOTLZ) + (eq! TOTNT NB_MICRO_ROWS_TOT_MLOAD) + (vanishes! TOTRZ))) + +(defconstraint mload---pre-processing (:guard (* MACRO IS_MLOAD)) + (begin + (callToEuc 1 + macro/SRC_OFFSET_LO + LLARGE) + (callToIszero 1 + 0 + (mload---sbo)))) + +(defconstraint mload---setting-micro-instruction-constant-values (:guard (* MACRO IS_MLOAD)) + (begin + (eq! (shift micro/CN_S NB_PP_ROWS_MLOAD_PO) macro/SRC_ID) + (vanishes! (shift micro/EXO_SUM NB_PP_ROWS_MLOAD_PO)))) + +(defconstraint mload---1st-micro-instruction-writing (:guard (* MACRO IS_MLOAD)) + (begin + (if-zero (mload---aligned) + (eq! (shift micro/INST NB_PP_ROWS_MLOAD_PO) MMIO_INST_RAM_TO_LIMB_TWO_SOURCE) + (eq! (shift micro/INST NB_PP_ROWS_MLOAD_PO) MMIO_INST_RAM_TO_LIMB_TRANSPLANT)) + (eq! (shift micro/SIZE NB_PP_ROWS_MLOAD_PO) LLARGE) + (eq! (shift micro/SLO NB_PP_ROWS_MLOAD_PO) (mload---slo)) + (eq! (shift micro/SBO NB_PP_ROWS_MLOAD_PO) (mload---sbo)) + (vanishes! (shift micro/TBO NB_PP_ROWS_MLOAD_PO)) + (eq! (shift micro/LIMB NB_PP_ROWS_MLOAD_PO) macro/LIMB_1))) + +(defconstraint mload---2nd-micro-instruction-writing (:guard (* MACRO IS_MLOAD)) + (begin + (if-zero (mload---aligned) + (eq! (shift micro/INST NB_PP_ROWS_MLOAD_PT) MMIO_INST_RAM_TO_LIMB_TWO_SOURCE) + (eq! (shift micro/INST NB_PP_ROWS_MLOAD_PT) MMIO_INST_RAM_TO_LIMB_TRANSPLANT)) + (eq! (shift micro/SIZE NB_PP_ROWS_MLOAD_PT) LLARGE) + (eq! (shift micro/SLO NB_PP_ROWS_MLOAD_PT) (+ (mload---slo) 1)) + (eq! (shift micro/SBO NB_PP_ROWS_MLOAD_PT) (mload---sbo)) + (vanishes! (shift micro/TBO NB_PP_ROWS_MLOAD_PT)) + (eq! (shift micro/LIMB NB_PP_ROWS_MLOAD_PT) macro/LIMB_2))) diff --git a/mmu/osaka/instructions/modexp_data.lisp b/mmu/osaka/instructions/modexp_data.lisp new file mode 100644 index 000000000..8029feb98 --- /dev/null +++ b/mmu/osaka/instructions/modexp_data.lisp @@ -0,0 +1,164 @@ +(module mmu) + +;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; MMU Instructions ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; ;; +;;;;;;;;;;;;;;;;;;;;;;;; MODEXP_DATA ;; +;;;;;;;;;;;;;;;;;;;;;;;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (modexp-data---initial-tbo) [OUT 1]) +(defun (modexp-data---initial-slo) [OUT 2]) +(defun (modexp-data---initial-sbo) [OUT 3]) +(defun (modexp-data---first-limb-bytesize) [OUT 4]) +(defun (modexp-data---last-limb-bytesize) [OUT 5]) +(defun (modexp-data---first-limb-single-source) [BIN 1]) +(defun (modexp-data---aligned) [BIN 2]) +(defun (modexp-data---last-limb-single-source) [BIN 3]) +(defun (modexp-data---src-id) macro/SRC_ID) +(defun (modexp-data---tgt-id) macro/TGT_ID) +(defun (modexp-data---src-offset) macro/SRC_OFFSET_LO) +(defun (modexp-data---size) macro/SIZE) +(defun (modexp-data---cdo) macro/REF_OFFSET) +(defun (modexp-data---cds) macro/REF_SIZE) +(defun (modexp-data---exo-sum) macro/EXO_SUM) +(defun (modexp-data---phase) macro/PHASE) +(defun (modexp-data---param-byte-size) (modexp-data---size)) +(defun (modexp-data---param-offset) (+ (modexp-data---cdo) (modexp-data---src-offset))) +(defun (modexp-data---leftover-data-size) (- (modexp-data---cds) (modexp-data---src-offset))) +(defun (modexp-data---num-left-padding-bytes) (- 512 (modexp-data---param-byte-size))) +(defun (modexp-data---data-runs-out) (shift prprc/WCP_RES 2)) +(defun (modexp-data---num-right-padding-bytes) (* (- (modexp-data---param-byte-size) (modexp-data---leftover-data-size)) (modexp-data---data-runs-out))) +(defun (modexp-data---right-padding-remainder) (shift prprc/EUC_REM 2)) +(defun (modexp-data---totnt-is-one) (shift prprc/WCP_RES 3)) +(defun (modexp-data---middle-sbo) (shift prprc/EUC_REM 6)) ;; "" + + +(defconstraint modexp-data---setting-TOT (:guard (* MACRO IS_MODEXP_DATA)) + ;; Setting total number of mmio inst + (eq! TOT NB_MICRO_ROWS_TOT_MODEXP_DATA)) + +(defconstraint modexp-data---1st-preprocessing-row (:guard (* MACRO IS_MODEXP_DATA)) + (begin + ;; preprocessing row n°1 + (callToEuc 1 + (modexp-data---num-left-padding-bytes) + LLARGE) + (eq! (modexp-data---initial-tbo) (next prprc/EUC_REM)) + (eq! TOTLZ (next prprc/EUC_QUOT)))) + +(defconstraint modexp-data---2nd-preprocessing-row (:guard (* MACRO IS_MODEXP_DATA)) + (begin + ;; preprocessing row n°2 + (callToLt 2 + 0 + (modexp-data---leftover-data-size) + (modexp-data---param-byte-size)) + (callToEuc 2 + (modexp-data---num-right-padding-bytes) + LLARGE) + (eq! TOTRZ (shift prprc/EUC_QUOT 2)) + (debug (eq! TOTNT (- 32 (+ TOTLZ TOTRZ)))))) + +(defconstraint modexp-data---3rd-preprocessing-row (:guard (* MACRO IS_MODEXP_DATA)) + (begin + ;; preprocessing row n°3 + (callToEq 3 + 0 + TOTNT + 1) + (callToEuc 3 + (modexp-data---param-offset) + LLARGE) + (eq! (modexp-data---initial-slo) (shift prprc/EUC_QUOT 3)) + (eq! (modexp-data---initial-sbo) (shift prprc/EUC_REM 3)) + (if-zero (modexp-data---totnt-is-one) + (eq! (modexp-data---first-limb-bytesize) (- LLARGE (modexp-data---initial-tbo))) + (if-zero (modexp-data---data-runs-out) + (eq! (modexp-data---first-limb-bytesize) (modexp-data---param-byte-size)) + (eq! (modexp-data---first-limb-bytesize) (modexp-data---leftover-data-size)))) + (if-zero (modexp-data---data-runs-out) + (eq! (modexp-data---last-limb-bytesize) LLARGE) + (eq! (modexp-data---last-limb-bytesize) (- LLARGE (modexp-data---right-padding-remainder)))))) + +(defconstraint modexp-data---4th-preprocessing-row (:guard (* MACRO IS_MODEXP_DATA)) + (begin + ;; preprocessing row n°4 + (callToLt 4 + 0 + (+ (modexp-data---initial-sbo) (- (modexp-data---first-limb-bytesize) 1)) + LLARGE) + (eq! (modexp-data---first-limb-single-source) (shift prprc/WCP_RES 4)))) + +(defconstraint modexp-data---5th-preprocessing-row (:guard (* MACRO IS_MODEXP_DATA)) + (begin + ;; preprocessing row n°5 + (callToEq 5 + 0 + (modexp-data---initial-sbo) + (modexp-data---initial-tbo)) + (eq! (modexp-data---aligned) (shift prprc/WCP_RES 5)))) + +(defconstraint modexp-data---6th-preprocessing-row (:guard (* MACRO IS_MODEXP_DATA)) + (begin + ;; preprocessing row n°6 + (if-eq-else (modexp-data---aligned) 1 + (eq! (modexp-data---last-limb-single-source) (modexp-data---aligned)) + (begin (callToEuc 6 + (+ (modexp-data---initial-sbo) (modexp-data---first-limb-bytesize)) + LLARGE) + (callToLt 6 + 0 + (+ (modexp-data---middle-sbo) (- (modexp-data---last-limb-bytesize) 1)) + LLARGE) + (eq! (modexp-data---last-limb-single-source) (shift prprc/WCP_RES 6)))))) + +(defconstraint modexp-data---setting-micro-instruction-constant-values (:guard (* MACRO IS_MODEXP_DATA)) + (begin + ;; setting mmio constant values + (eq! (shift micro/CN_S NB_PP_ROWS_MODEXP_DATA_PO) (modexp-data---src-id)) + (eq! (shift micro/EXO_SUM NB_PP_ROWS_MODEXP_DATA_PO) EXO_SUM_WEIGHT_BLAKEMODEXP) + (eq! (shift micro/PHASE NB_PP_ROWS_MODEXP_DATA_PO) (modexp-data---phase)) + (eq! (shift micro/EXO_ID NB_PP_ROWS_MODEXP_DATA_PO) (modexp-data---tgt-id)))) + +(defconstraint modexp-data---mmio-instruction-writting (:guard IS_MODEXP_DATA) + (begin (if-eq MICRO 1 (standard-progression micro/TLO)) + (if-eq (zero-row) 1 (eq! micro/INST MMIO_INST_LIMB_VANISHES)) + (if-eq (force-bin (+ NT_ONLY NT_FIRST)) 1 + (begin (if-zero (modexp-data---first-limb-single-source) + (eq! micro/INST MMIO_INST_RAM_TO_LIMB_TWO_SOURCE) + (eq! micro/INST MMIO_INST_RAM_TO_LIMB_ONE_SOURCE)) + (eq! micro/SIZE (modexp-data---first-limb-bytesize)) + (eq! micro/SLO (modexp-data---initial-slo)) + (eq! micro/SBO (modexp-data---initial-sbo)) + (eq! micro/TBO (modexp-data---initial-tbo)))) + (if-eq NT_FIRST 1 + (begin (if-eq-else (modexp-data---aligned) 1 + (will-inc! micro/SLO 1) + (if-zero (modexp-data---first-limb-single-source) + (begin (will-inc! micro/SLO 1) + (will-eq! micro/SBO + (- (+ micro/SBO micro/SIZE) LLARGE))) + (begin (will-remain-constant! micro/SLO) + (will-eq! micro/SBO (+ micro/SBO micro/SIZE))))) + (vanishes! (next micro/TBO)))) + (if-eq NT_MDDL 1 + (begin (if-zero (modexp-data---aligned) + (eq! micro/INST MMIO_INST_RAM_TO_LIMB_TWO_SOURCE) + (eq! micro/INST MMIO_INST_RAM_TO_LIMB_TRANSPLANT)) + (eq! micro/SIZE LLARGE) + (will-inc! micro/SLO 1) + (will-remain-constant! micro/SBO) + (will-remain-constant! micro/TBO))) + (if-eq NT_LAST 1 + (begin (if-zero (modexp-data---last-limb-single-source) + (eq! micro/INST MMIO_INST_RAM_TO_LIMB_TWO_SOURCE) + (eq! micro/INST MMIO_INST_RAM_TO_LIMB_ONE_SOURCE)) + (eq! micro/SIZE (modexp-data---last-limb-bytesize)))))) + diff --git a/mmu/osaka/instructions/modexp_zero.lisp b/mmu/osaka/instructions/modexp_zero.lisp new file mode 100644 index 000000000..dec3c0c96 --- /dev/null +++ b/mmu/osaka/instructions/modexp_zero.lisp @@ -0,0 +1,32 @@ +(module mmu) + +;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; MMU Instructions ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; ;; +;;;;;;;;;;;;;;;;;;;;;;;; MODEXP_ZERO ;; +;;;;;;;;;;;;;;;;;;;;;;;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defconstraint modexp-zero---setting-the-TOTs (:guard (* MACRO IS_MODEXP_ZERO)) + (begin + (vanishes! TOTLZ) + (eq! TOTNT NB_MICRO_ROWS_TOT_MODEXP_ZERO) + (vanishes! TOTRZ))) + +(defconstraint modexp-zero---setting-micro-instruction-constant-values (:guard (* MACRO IS_MODEXP_ZERO)) + (begin + (eq! (shift micro/EXO_SUM NB_PP_ROWS_MODEXP_ZERO_PO) EXO_SUM_WEIGHT_BLAKEMODEXP) + (eq! (shift micro/PHASE NB_PP_ROWS_MODEXP_ZERO_PO) macro/PHASE) + (eq! (shift micro/EXO_ID NB_PP_ROWS_MODEXP_ZERO_PO) macro/TGT_ID))) + +(defconstraint modexp-zero---mmio-instruction-writting (:guard (* MICRO IS_MODEXP_ZERO)) + (begin + (standard-progression micro/TLO) + (eq! micro/INST MMIO_INST_LIMB_VANISHES))) + diff --git a/mmu/osaka/instructions/mstore.lisp b/mmu/osaka/instructions/mstore.lisp new file mode 100644 index 000000000..e60b1b5d0 --- /dev/null +++ b/mmu/osaka/instructions/mstore.lisp @@ -0,0 +1,57 @@ +(module mmu) + +;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; MMU Instructions ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;; + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; ;; +;;;;;;;;;;;;;;;;;;;;;;;; MSTORE ;; +;;;;;;;;;;;;;;;;;;;;;;;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (mstore---aligned) (next prprc/WCP_RES)) +(defun (mstore---tlo) (next prprc/EUC_QUOT)) +(defun (mstore---tbo) (next prprc/EUC_REM)) + +(defconstraint mstore---setting-the-TOTs (:guard (* MACRO IS_MSTORE)) + (begin + (vanishes! TOTLZ) + (eq! TOTNT NB_MICRO_ROWS_TOT_MSTORE) + (vanishes! TOTRZ))) + +(defconstraint mstore---pre-processing (:guard (* MACRO IS_MSTORE)) + (begin + (callToEuc 1 + macro/TGT_OFFSET_LO + LLARGE) + (callToIszero 1 + 0 + (mstore---tbo)))) + +(defconstraint mstore---setting-micro-instruction-constant-values (:guard (* MACRO IS_MSTORE)) + (begin + (eq! (shift micro/CN_T NB_PP_ROWS_MSTORE_PO) macro/TGT_ID) + (vanishes! (shift micro/EXO_SUM NB_PP_ROWS_MSTORE_PO)))) + +(defconstraint mstore---1st-micro-instruction-writing (:guard (* MACRO IS_MSTORE)) + (begin + (if-zero (mstore---aligned) + (eq! (shift micro/INST NB_PP_ROWS_MSTORE_PO) MMIO_INST_LIMB_TO_RAM_TWO_TARGET) + (eq! (shift micro/INST NB_PP_ROWS_MSTORE_PO) MMIO_INST_LIMB_TO_RAM_TRANSPLANT)) + (eq! (shift micro/SIZE NB_PP_ROWS_MSTORE_PO) LLARGE) + (eq! (shift micro/TLO NB_PP_ROWS_MSTORE_PO) (mstore---tlo)) + (eq! (shift micro/TBO NB_PP_ROWS_MSTORE_PO) (mstore---tbo)) + (eq! (shift micro/LIMB NB_PP_ROWS_MSTORE_PO) macro/LIMB_1))) + +(defconstraint mstore---2nd-micro-instruction-writing (:guard (* MACRO IS_MSTORE)) + (begin + (if-zero (mstore---aligned) + (eq! (shift micro/INST NB_PP_ROWS_MSTORE_PT) MMIO_INST_LIMB_TO_RAM_TWO_TARGET) + (eq! (shift micro/INST NB_PP_ROWS_MSTORE_PT) MMIO_INST_LIMB_TO_RAM_TRANSPLANT)) + (eq! (shift micro/SIZE NB_PP_ROWS_MSTORE_PT) LLARGE) + (eq! (shift micro/TLO NB_PP_ROWS_MSTORE_PT) (+ (mstore---tlo) 1)) + (eq! (shift micro/TBO NB_PP_ROWS_MSTORE_PT) (mstore---tbo)) + (eq! (shift micro/LIMB NB_PP_ROWS_MSTORE_PT) macro/LIMB_2))) diff --git a/mmu/osaka/instructions/mstore8.lisp b/mmu/osaka/instructions/mstore8.lisp new file mode 100644 index 000000000..ac71732e6 --- /dev/null +++ b/mmu/osaka/instructions/mstore8.lisp @@ -0,0 +1,38 @@ +(module mmu) + +;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; MMU Instructions ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; ;; +;;;;;;;;;;;;;;;;;;;;;;;; MSTORE8 ;; +;;;;;;;;;;;;;;;;;;;;;;;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (mstore8---tlo) (next prprc/EUC_QUOT)) +(defun (mstore8---tbo) (next prprc/EUC_REM)) + +(defconstraint mstore8---setting-the-TOTs (:guard (* MACRO IS_MSTORE8)) + (begin + (vanishes! TOTLZ) + (eq! TOTNT NB_MICRO_ROWS_TOT_MSTORE_EIGHT) + (vanishes! TOTRZ))) + +(defconstraint mstore8---pre-processing (:guard (* MACRO IS_MSTORE8)) + (begin + (callToEuc 1 macro/TGT_OFFSET_LO LLARGE))) + +(defconstraint mstore8---micro-instruction-writing (:guard (* MACRO IS_MSTORE8)) + (begin + (eq! (shift micro/INST NB_PP_ROWS_MSTORE8_PO) MMIO_INST_LIMB_TO_RAM_ONE_TARGET) + (eq! (shift micro/SIZE NB_PP_ROWS_MSTORE8_PO) 1) + (eq! (shift micro/SBO NB_PP_ROWS_MSTORE8_PO) LLARGEMO) + (eq! (shift micro/TLO NB_PP_ROWS_MSTORE8_PO) (mstore8---tlo)) + (eq! (shift micro/TBO NB_PP_ROWS_MSTORE8_PO) (mstore8---tbo)) + (eq! (shift micro/LIMB NB_PP_ROWS_MSTORE8_PO) macro/LIMB_2) + (eq! (shift micro/CN_T NB_PP_ROWS_MSTORE8_PO) macro/TGT_ID) + (vanishes! (shift micro/EXO_SUM NB_PP_ROWS_MSTORE8_PO)))) diff --git a/mmu/osaka/instructions/ram_to_exo_with_padding.lisp b/mmu/osaka/instructions/ram_to_exo_with_padding.lisp new file mode 100644 index 000000000..6d31946c1 --- /dev/null +++ b/mmu/osaka/instructions/ram_to_exo_with_padding.lisp @@ -0,0 +1,138 @@ +(module mmu) + +;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; MMU Instructions ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;; + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; ;; +;;;;;;;;;;;;;;;;;;;;;;;; RAM_TO_EXO_WITH_PADDING ;; +;;;;;;;;;;;;;;;;;;;;;;;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (ram-to-exo-with-padding---aligned) (next prprc/WCP_RES)) +(defun (ram-to-exo-with-padding---initial-slo) (next prprc/EUC_QUOT)) +(defun (ram-to-exo-with-padding---initial-sbo) (next prprc/EUC_REM)) +(defun (ram-to-exo-with-padding---has-right-padding) (shift prprc/WCP_RES 2)) +(defun (ram-to-exo-with-padding---padding-size) (* (ram-to-exo-with-padding---has-right-padding) (- macro/REF_SIZE macro/SIZE))) +(defun (ram-to-exo-with-padding---extraction-size) (+ (* (ram-to-exo-with-padding---has-right-padding) macro/SIZE) + (* (- 1 (ram-to-exo-with-padding---has-right-padding)) macro/REF_SIZE))) +(defun (ram-to-exo-with-padding---last-limb-is-full) (shift prprc/WCP_RES 3)) +(defun (ram-to-exo-with-padding---last-limb-byte-size) (+ (* (ram-to-exo-with-padding---last-limb-is-full) LLARGE) + (* (- 1 (ram-to-exo-with-padding---last-limb-is-full)) (shift prprc/EUC_REM 3)))) +(defun (ram-to-exo-with-padding---last-limb-single-source) (shift prprc/WCP_RES 4)) + +(defconstraint ram-to-exo-with-padding---setting-TOTLZ (:guard (* MACRO IS_RAM_TO_EXO_WITH_PADDING)) + ;; setting nb of LEFT ZEROS rows + (vanishes! TOTLZ)) + +(defconstraint ram-to-exo-with-padding---transferring-results-to-BIN-and-OUT-columns (:guard (* MACRO IS_RAM_TO_EXO_WITH_PADDING)) + (begin + ;; setting bins and out + (eq! [BIN 1] (ram-to-exo-with-padding---aligned)) + (eq! [OUT 1] (ram-to-exo-with-padding---last-limb-byte-size)) + (eq! [BIN 2] (ram-to-exo-with-padding---last-limb-single-source)) + (eq! [BIN 3] (ram-to-exo-with-padding---last-limb-is-full)))) ;; " " + +(defconstraint ram-to-exo-with-padding---1st-preprocessing-row (:guard (* MACRO IS_RAM_TO_EXO_WITH_PADDING)) + (begin + ;; setting prprc row n°1 + (callToEuc 1 + macro/SRC_OFFSET_LO + LLARGE) + (callToIszero 1 + 0 + (ram-to-exo-with-padding---initial-sbo)))) + +(defconstraint ram-to-exo-with-padding---2nd-preprocessing-row (:guard (* MACRO IS_RAM_TO_EXO_WITH_PADDING)) + (begin + ;; setting prprc row n°2 + (callToLt 2 + 0 + macro/SIZE + macro/REF_SIZE) + (callToEuc 2 + (ram-to-exo-with-padding---padding-size) + LLARGE) + (eq! TOTRZ (shift prprc/EUC_QUOT 2)))) + +(defconstraint ram-to-exo-with-padding---3rd-preprocessing-row (:guard (* MACRO IS_RAM_TO_EXO_WITH_PADDING)) + (begin + ;; setting prprc row n°3 + (callToIszero 3 + 0 + (shift prprc/EUC_REM 3)) + (callToEuc 3 + (ram-to-exo-with-padding---extraction-size) + LLARGE) + (eq! TOTNT (shift prprc/EUC_CEIL 3)))) + +(defconstraint ram-to-exo-with-padding---4th-preprocessing-row (:guard (* MACRO IS_RAM_TO_EXO_WITH_PADDING)) + (begin + ;; setting prprc row n°4 + (callToLt 4 + 0 + (+ (ram-to-exo-with-padding---initial-sbo) (- (ram-to-exo-with-padding---last-limb-byte-size) 1)) + LLARGE))) + +(defconstraint ram-to-exo-with-padding---preprocessing (:guard (* MACRO IS_RAM_TO_EXO_WITH_PADDING)) + (begin + ;; setting mmio constant values + (eq! (shift micro/CN_S NB_PP_ROWS_RAM_TO_EXO_WITH_PADDING_PO) macro/SRC_ID) + (eq! (shift micro/SUCCESS_BIT NB_PP_ROWS_RAM_TO_EXO_WITH_PADDING_PO) macro/SUCCESS_BIT) + (eq! (shift micro/EXO_SUM NB_PP_ROWS_RAM_TO_EXO_WITH_PADDING_PO) macro/EXO_SUM) + (eq! (shift micro/PHASE NB_PP_ROWS_RAM_TO_EXO_WITH_PADDING_PO) macro/PHASE) + (eq! (shift micro/EXO_ID NB_PP_ROWS_RAM_TO_EXO_WITH_PADDING_PO) macro/TGT_ID) + (eq! (shift micro/KEC_ID NB_PP_ROWS_RAM_TO_EXO_WITH_PADDING_PO) macro/AUX_ID) + (eq! (shift micro/TOTAL_SIZE NB_PP_ROWS_RAM_TO_EXO_WITH_PADDING_PO) macro/REF_SIZE))) + +(defconstraint ram-to-exo-with-padding---std-progression (:guard (* IS_RAM_TO_EXO_WITH_PADDING MICRO)) + (begin + (standard-progression micro/TLO) + (vanishes! micro/TBO))) + +(defconstraint ram-to-exo-with-padding---first-row (:guard (* IS_RAM_TO_EXO_WITH_PADDING NT_FIRST)) + (begin + (if-zero [BIN 1] + (eq! micro/INST MMIO_INST_RAM_TO_LIMB_TWO_SOURCE) + (eq! micro/INST MMIO_INST_RAM_TO_LIMB_TRANSPLANT)) + (eq! micro/SIZE LLARGE) + (eq! micro/SLO + (shift (ram-to-exo-with-padding---initial-slo) (- 0 NB_PP_ROWS_RAM_TO_EXO_WITH_PADDING_PO))) + (eq! micro/SBO + (shift (ram-to-exo-with-padding---initial-sbo) (- 0 NB_PP_ROWS_RAM_TO_EXO_WITH_PADDING_PO))))) + +(defconstraint ram-to-exo-with-padding---middle (:guard (* IS_RAM_TO_EXO_WITH_PADDING NT_MDDL)) + (begin + (if-zero [BIN 1] + (eq! micro/INST MMIO_INST_RAM_TO_LIMB_TWO_SOURCE) + (eq! micro/INST MMIO_INST_RAM_TO_LIMB_TRANSPLANT)) + (eq! micro/SIZE LLARGE) + (did-inc! micro/SLO 1) + (remained-constant! micro/SBO))) + +(defconstraint ram-to-exo-with-padding---last (:guard (* IS_RAM_TO_EXO_WITH_PADDING NT_LAST)) + (begin + (did-inc! micro/SLO 1) + (remained-constant! micro/SBO))) + +(defconstraint ram-to-exo-with-padding---only (:guard (* IS_RAM_TO_EXO_WITH_PADDING NT_ONLY)) + (begin + (eq! micro/SLO + (shift (ram-to-exo-with-padding---initial-slo) (- 0 NB_PP_ROWS_RAM_TO_EXO_WITH_PADDING_PO))) + (eq! micro/SBO + (shift (ram-to-exo-with-padding---initial-sbo) (- 0 NB_PP_ROWS_RAM_TO_EXO_WITH_PADDING_PO))))) + +(defconstraint ram-to-exo-with-padding---last-or-only-common (:guard (* IS_RAM_TO_EXO_WITH_PADDING (force-bin (+ NT_LAST NT_ONLY)))) + (begin + (eq! micro/SIZE [OUT 1]) + (if-zero [BIN 2] + (eq! micro/INST MMIO_INST_RAM_TO_LIMB_TWO_SOURCE) + (if-zero [BIN 3] + (eq! micro/INST MMIO_INST_RAM_TO_LIMB_ONE_SOURCE) + (eq! micro/INST MMIO_INST_RAM_TO_LIMB_TRANSPLANT))))) + +(defconstraint ram-to-exo-with-padding---right-zeroes (:guard (* IS_RAM_TO_EXO_WITH_PADDING (rzro-row))) + (eq! micro/INST MMIO_INST_LIMB_VANISHES)) diff --git a/mmu/osaka/instructions/ram_to_ram_sans_padding.lisp b/mmu/osaka/instructions/ram_to_ram_sans_padding.lisp new file mode 100644 index 000000000..2a5761f84 --- /dev/null +++ b/mmu/osaka/instructions/ram_to_ram_sans_padding.lisp @@ -0,0 +1,176 @@ +(module mmu) + +;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; MMU Instructions ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; ;; +;;;;;;;;;;;;;;;;;;;;;;;; RAM_TO_RAM_SANS_PADDING ;; +;;;;;;;;;;;;;;;;;;;;;;;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (ram-to-ram-sans-padding---last-limb-byte-size) [OUT 1]) +(defun (ram-to-ram-sans-padding---middle-sbo) [OUT 2]) +(defun (ram-to-ram-sans-padding---aligned) [BIN 1]) +(defun (ram-to-ram-sans-padding---last-limb-single-source) [BIN 2]) +(defun (ram-to-ram-sans-padding---initial-slo-increment) [BIN 3]) +(defun (ram-to-ram-sans-padding---last-limb-is-fast) [BIN 4]) +(defun (ram-to-ram-sans-padding---rdo) macro/SRC_OFFSET_LO) +(defun (ram-to-ram-sans-padding---rds) macro/SIZE) +(defun (ram-to-ram-sans-padding---rato) macro/REF_OFFSET) +(defun (ram-to-ram-sans-padding---ratc) macro/REF_SIZE) +(defun (ram-to-ram-sans-padding---initial-slo) (next prprc/EUC_QUOT)) +(defun (ram-to-ram-sans-padding---initial-sbo) (next prprc/EUC_REM)) +(defun (ram-to-ram-sans-padding---initial-cmp) (next prprc/WCP_RES)) +(defun (ram-to-ram-sans-padding---initial-real-size) (+ (* (ram-to-ram-sans-padding---initial-cmp) (ram-to-ram-sans-padding---ratc)) + (* (- 1 (ram-to-ram-sans-padding---initial-cmp)) (ram-to-ram-sans-padding---rds)))) +(defun (ram-to-ram-sans-padding---initial-tlo) (shift prprc/EUC_QUOT 2)) +(defun (ram-to-ram-sans-padding---initial-tbo) (shift prprc/EUC_REM 2)) +(defun (ram-to-ram-sans-padding---final-tlo) (shift prprc/EUC_QUOT 3)) +(defun (ram-to-ram-sans-padding---totnt-is-one) (shift prprc/WCP_RES 3)) +(defun (ram-to-ram-sans-padding---first-limb-byte-size) (+ (* (ram-to-ram-sans-padding---totnt-is-one) (ram-to-ram-sans-padding---initial-real-size)) + (* (- 1 (ram-to-ram-sans-padding---totnt-is-one)) (- LLARGE (ram-to-ram-sans-padding---initial-tbo))))) +(defun (ram-to-ram-sans-padding---first-limb-single-source) (shift prprc/WCP_RES 4)) +(defun (ram-to-ram-sans-padding---init-tbo-is-zero) (shift prprc/WCP_RES 5)) +(defun (ram-to-ram-sans-padding---last-limb-is-full) (force-bin (shift prprc/EUC_QUOT 5))) +(defun (ram-to-ram-sans-padding---first-limb-is-fast) (force-bin (* (ram-to-ram-sans-padding---aligned) (ram-to-ram-sans-padding---init-tbo-is-zero)))) ;;"" + +(defconstraint ram-to-ram-sans-padding---setting-some-TOTs (:guard (* MACRO IS_RAM_TO_RAM_SANS_PADDING)) + (begin + ;; set nb of rows + (vanishes! TOTLZ) + (vanishes! TOTRZ))) + +(defconstraint ram-to-ram-sans-padding---1st-preprocessing-row (:guard (* MACRO IS_RAM_TO_RAM_SANS_PADDING)) + (begin + ;; preprocessing row n°1 + (callToEuc 1 + (ram-to-ram-sans-padding---rdo) + LLARGE) + (callToLt 1 + 0 + (ram-to-ram-sans-padding---ratc) + (ram-to-ram-sans-padding---rds)))) + +(defconstraint ram-to-ram-sans-padding---2nd-preprocessing-row (:guard (* MACRO IS_RAM_TO_RAM_SANS_PADDING)) + (begin + ;; preprocessing row n°2 + (callToEuc 2 + (ram-to-ram-sans-padding---rato) + LLARGE) + (callToEq 2 + 0 + (ram-to-ram-sans-padding---initial-sbo) + (ram-to-ram-sans-padding---initial-tbo)) + (eq! (ram-to-ram-sans-padding---aligned) (shift prprc/WCP_RES 2)))) + +(defconstraint ram-to-ram-sans-padding---3rd-preprocessing-row (:guard (* MACRO IS_RAM_TO_RAM_SANS_PADDING)) + (begin + ;; preprocessing row n°3 + (callToEuc 3 + (+ (ram-to-ram-sans-padding---rato) (- (ram-to-ram-sans-padding---initial-real-size) 1)) + LLARGE) + (callToEq 3 + 0 + TOTNT + 1) + (eq! TOTNT + (+ (- (ram-to-ram-sans-padding---final-tlo) (ram-to-ram-sans-padding---initial-tlo)) 1)) + (if-zero (ram-to-ram-sans-padding---totnt-is-one) + (eq! (ram-to-ram-sans-padding---last-limb-byte-size) + (+ 1 (shift prprc/EUC_REM 3))) + (eq! (ram-to-ram-sans-padding---last-limb-byte-size) (ram-to-ram-sans-padding---initial-real-size))))) + +(defconstraint ram-to-ram-sans-padding---4th-preprocessing-row (:guard (* MACRO IS_RAM_TO_RAM_SANS_PADDING)) + (begin + ;; preprocessing row n°4 + (callToLt 4 + 0 + (+ (ram-to-ram-sans-padding---initial-sbo) (- (ram-to-ram-sans-padding---first-limb-byte-size) 1)) + LLARGE) + (callToEuc 4 + (+ (ram-to-ram-sans-padding---middle-sbo) (- (ram-to-ram-sans-padding---last-limb-byte-size) 1)) + LLARGE) + (if-zero (ram-to-ram-sans-padding---aligned) + (if-eq-else (ram-to-ram-sans-padding---first-limb-single-source) 1 + (eq! (ram-to-ram-sans-padding---middle-sbo) + (+ (ram-to-ram-sans-padding---initial-sbo) + (ram-to-ram-sans-padding---first-limb-byte-size))) + (eq! (ram-to-ram-sans-padding---middle-sbo) + (- (+ (ram-to-ram-sans-padding---initial-sbo) + (ram-to-ram-sans-padding---first-limb-byte-size)) + LLARGE)))) + (if-eq-else (ram-to-ram-sans-padding---totnt-is-one) 1 + (eq! (ram-to-ram-sans-padding---last-limb-single-source) + (ram-to-ram-sans-padding---first-limb-single-source)) + (eq! (ram-to-ram-sans-padding---last-limb-single-source) + (force-bin (- 1 (shift prprc/EUC_QUOT 4))))) + (if-eq-else (ram-to-ram-sans-padding---aligned) 1 + (eq! (ram-to-ram-sans-padding---initial-slo-increment) 1) + (eq! (ram-to-ram-sans-padding---initial-slo-increment) + (- 1 (ram-to-ram-sans-padding---first-limb-single-source)))))) + +(defconstraint ram-to-ram-sans-padding---5th-preprocessing-row (:guard (* MACRO IS_RAM_TO_RAM_SANS_PADDING)) + (begin + ;; preprocessing row n°5 + (callToIszero 5 + 0 + (ram-to-ram-sans-padding---initial-tbo)) + (callToEuc 5 + (ram-to-ram-sans-padding---last-limb-byte-size) + LLARGE) + (eq! (ram-to-ram-sans-padding---last-limb-is-fast) + (* (ram-to-ram-sans-padding---aligned) (ram-to-ram-sans-padding---last-limb-is-full))))) + +(defconstraint ram-to-ram-sans-padding---constant-mmio-values (:guard (* MACRO IS_RAM_TO_RAM_SANS_PADDING)) + (begin (eq! (shift micro/CN_S NB_PP_ROWS_RAM_TO_RAM_SANS_PADDING_PO) macro/SRC_ID) + (eq! (shift micro/CN_T NB_PP_ROWS_RAM_TO_RAM_SANS_PADDING_PO) macro/TGT_ID))) + +(defconstraint ram-to-ram-sans-padding---first-mmio-values (:guard (* MACRO IS_RAM_TO_RAM_SANS_PADDING)) + (begin (eq! (shift micro/SIZE NB_PP_ROWS_RAM_TO_RAM_SANS_PADDING_PO) + (ram-to-ram-sans-padding---first-limb-byte-size)) + (eq! (shift micro/SLO NB_PP_ROWS_RAM_TO_RAM_SANS_PADDING_PO) (ram-to-ram-sans-padding---initial-slo)) + (eq! (shift micro/SBO NB_PP_ROWS_RAM_TO_RAM_SANS_PADDING_PO) (ram-to-ram-sans-padding---initial-sbo)) + (eq! (shift micro/TLO NB_PP_ROWS_RAM_TO_RAM_SANS_PADDING_PO) (ram-to-ram-sans-padding---initial-tlo)) + (eq! (shift micro/TBO NB_PP_ROWS_RAM_TO_RAM_SANS_PADDING_PO) (ram-to-ram-sans-padding---initial-tbo)))) + +(defconstraint ram-to-ram-sans-padding---mmio-instruction-writting (:guard IS_RAM_TO_RAM_SANS_PADDING) + (begin (if-eq (force-bin (+ NT_FIRST NT_MDDL)) 1 + (will-inc! micro/TLO 1)) + (if-eq NT_FIRST 1 + (eq! (next micro/SLO) (+ micro/SLO (ram-to-ram-sans-padding---initial-slo-increment)))) + (if-eq NT_MDDL 1 (will-inc! micro/SLO 1)) + (if-eq NT_ONLY 1 + (if-zero (ram-to-ram-sans-padding---last-limb-is-fast) + (if-zero (ram-to-ram-sans-padding---last-limb-single-source) + (eq! micro/INST MMIO_INST_RAM_TO_RAM_TWO_SOURCE) + (eq! micro/INST MMIO_INST_RAM_TO_RAM_PARTIAL)) + (eq! micro/INST MMIO_INST_RAM_TO_RAM_TRANSPLANT))) + (if-eq NT_FIRST 1 + (if-zero (shift (ram-to-ram-sans-padding---first-limb-is-fast) + (- 0 NB_PP_ROWS_RAM_TO_RAM_SANS_PADDING_PO)) + (if-zero (shift (ram-to-ram-sans-padding---first-limb-single-source) + (- 0 NB_PP_ROWS_RAM_TO_RAM_SANS_PADDING_PO)) + (eq! micro/INST MMIO_INST_RAM_TO_RAM_TWO_SOURCE) + (eq! micro/INST MMIO_INST_RAM_TO_RAM_PARTIAL)) + (eq! micro/INST MMIO_INST_RAM_TO_RAM_TRANSPLANT))) + (if-eq NT_MDDL 1 + (begin (if-eq-else (ram-to-ram-sans-padding---aligned) 1 + (eq! micro/INST MMIO_INST_RAM_TO_RAM_TRANSPLANT) + (eq! micro/INST MMIO_INST_RAM_TO_RAM_TWO_SOURCE)) + (eq! micro/SIZE LLARGE) + (eq! micro/SBO (ram-to-ram-sans-padding---middle-sbo)) + (vanishes! micro/TBO))) + (if-eq NT_LAST 1 + (begin (if-eq-else (ram-to-ram-sans-padding---last-limb-is-fast) 1 + (eq! micro/INST MMIO_INST_RAM_TO_RAM_TRANSPLANT) + (if-zero (ram-to-ram-sans-padding---last-limb-single-source) + (eq! micro/INST MMIO_INST_RAM_TO_RAM_TWO_SOURCE) + (eq! micro/INST MMIO_INST_RAM_TO_RAM_PARTIAL))) + (eq! micro/SIZE (ram-to-ram-sans-padding---last-limb-byte-size)) + (eq! micro/SBO (ram-to-ram-sans-padding---middle-sbo)) + (vanishes! micro/TBO))))) diff --git a/mmu/osaka/instructions/right_padded_word_extraction.lisp b/mmu/osaka/instructions/right_padded_word_extraction.lisp new file mode 100644 index 000000000..614dfa117 --- /dev/null +++ b/mmu/osaka/instructions/right_padded_word_extraction.lisp @@ -0,0 +1,120 @@ +(module mmu) + +;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; MMU Instructions ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;; ;; +;;;;;;;;;;;;;;;;;;;;;;;; RIGHT_PADDED_WORD_EXTRACTION ;; +;;;;;;;;;;;;;;;;;;;;;;;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (right-padded-word-extraction---second-limb-padded) (force-bin (- 1 (next prprc/WCP_RES)))) +(defun (right-padded-word-extraction---extract-size) (+ (* (right-padded-word-extraction---second-limb-padded) (- macro/REF_SIZE macro/SRC_OFFSET_LO)) + (* (- 1 (right-padded-word-extraction---second-limb-padded)) WORD_SIZE))) +(defun (right-padded-word-extraction---first-limb-padded) (shift prprc/WCP_RES 2)) +(defun (right-padded-word-extraction---second-limb-byte-size) (+ (* (- 1 (right-padded-word-extraction---second-limb-padded)) LLARGE) + (* (right-padded-word-extraction---second-limb-padded) + (+ (* (- 1 (right-padded-word-extraction---first-limb-padded)) + (- (right-padded-word-extraction---extract-size) LLARGE)) + (* (right-padded-word-extraction---first-limb-padded) 0))))) +(defun (right-padded-word-extraction---first-limb-byte-size) (+ (* (- 1 (right-padded-word-extraction---first-limb-padded)) LLARGE) + (* (right-padded-word-extraction---first-limb-padded) (right-padded-word-extraction---extract-size)))) +(defun (right-padded-word-extraction---first-limb-is-full) (force-bin (shift prprc/EUC_QUOT 2))) +(defun (right-padded-word-extraction---aligned) (next prprc/WCP_RES)) +(defun (right-padded-word-extraction---slo) (shift prprc/EUC_QUOT 3)) +(defun (right-padded-word-extraction---sbo) (shift prprc/EUC_REM 3)) +(defun (right-padded-word-extraction---first-limb-single-source) (shift prprc/WCP_RES 3)) +(defun (right-padded-word-extraction---second-limb-single-source) (shift prprc/WCP_RES 4)) +(defun (right-padded-word-extraction---second-limb-void) (shift prprc/WCP_RES 5)) + +(defconstraint right-padded-word-extraction---setting-the-TOTs (:guard (* MACRO IS_RIGHT_PADDED_WORD_EXTRACTION)) + (begin + (vanishes! TOTLZ) + (eq! TOTNT NB_MICRO_ROWS_TOT_RIGHT_PADDED_WORD_EXTRACTION) + (vanishes! TOTRZ))) + +(defconstraint right-padded-word-extraction---1st-pre-processing-row (:guard (* MACRO IS_RIGHT_PADDED_WORD_EXTRACTION)) + (begin + ;; setting prprc row n°1 + (callToLt 1 + 0 + (+ macro/SRC_OFFSET_LO WORD_SIZE) + macro/REF_SIZE))) + +(defconstraint right-padded-word-extraction---2nd-pre-processing-row (:guard (* MACRO IS_RIGHT_PADDED_WORD_EXTRACTION)) + (begin + ;; setting prprc row n°2 + (callToLt 2 + 0 + (right-padded-word-extraction---extract-size) + LLARGE) + (callToEuc 2 + (right-padded-word-extraction---first-limb-byte-size) + LLARGE))) + +(defconstraint right-padded-word-extraction---3rd-pre-processing-row (:guard (* MACRO IS_RIGHT_PADDED_WORD_EXTRACTION)) + (begin + ;; setting prprc row n°3 + (callToEuc 3 + (+ macro/SRC_OFFSET_LO macro/REF_OFFSET) + LLARGE) + (callToLt 3 + 0 + (+ (right-padded-word-extraction---sbo) (right-padded-word-extraction---first-limb-byte-size)) + LLARGEPO))) + +(defconstraint right-padded-word-extraction---4th-pre-processing-row (:guard (* MACRO IS_RIGHT_PADDED_WORD_EXTRACTION)) + (begin + ;; setting prprc row n°4 + (callToLt 4 + 0 + (+ (right-padded-word-extraction---sbo) (right-padded-word-extraction---second-limb-byte-size)) + LLARGEPO))) + +(defconstraint right-padded-word-extraction---5th-pre-processing-row (:guard (* MACRO IS_RIGHT_PADDED_WORD_EXTRACTION)) + (begin + ;; setting prprc row n°5 + (callToIszero 5 + 0 + (right-padded-word-extraction---second-limb-byte-size)))) + +(defconstraint right-padded-word-extraction---setting-micro-instruction-constant-values (:guard (* MACRO IS_RIGHT_PADDED_WORD_EXTRACTION)) + (begin + (eq! (shift micro/CN_S NB_PP_ROWS_RIGHT_PADDED_WORD_EXTRACTION_PO) macro/SRC_ID) + (vanishes! (shift micro/EXO_SUM NB_PP_ROWS_RIGHT_PADDED_WORD_EXTRACTION_PO)))) + +(defconstraint right-padded-word-extraction---1st-micro-instruction-writing (:guard (* MACRO IS_RIGHT_PADDED_WORD_EXTRACTION)) + (begin + ;; setting first mmio inst + (if-zero (right-padded-word-extraction---first-limb-single-source) + (eq! (shift micro/INST NB_PP_ROWS_RIGHT_PADDED_WORD_EXTRACTION_PO) MMIO_INST_RAM_TO_LIMB_TWO_SOURCE) + (if-zero (right-padded-word-extraction---first-limb-is-full) + (eq! (shift micro/INST NB_PP_ROWS_RIGHT_PADDED_WORD_EXTRACTION_PO) MMIO_INST_RAM_TO_LIMB_ONE_SOURCE) + (eq! (shift micro/INST NB_PP_ROWS_RIGHT_PADDED_WORD_EXTRACTION_PO) MMIO_INST_RAM_TO_LIMB_TRANSPLANT))) + (eq! (shift micro/SIZE NB_PP_ROWS_RIGHT_PADDED_WORD_EXTRACTION_PO) (right-padded-word-extraction---first-limb-byte-size)) + (eq! (shift micro/SLO NB_PP_ROWS_RIGHT_PADDED_WORD_EXTRACTION_PO) (right-padded-word-extraction---slo)) + (eq! (shift micro/SBO NB_PP_ROWS_RIGHT_PADDED_WORD_EXTRACTION_PO) (right-padded-word-extraction---sbo)) + (vanishes! (shift micro/TBO NB_PP_ROWS_RIGHT_PADDED_WORD_EXTRACTION_PO)) + (eq! (shift micro/LIMB NB_PP_ROWS_RIGHT_PADDED_WORD_EXTRACTION_PO) macro/LIMB_1))) + +(defconstraint right-padded-word-extraction---2nd-micro-instruction-writing (:guard (* MACRO IS_RIGHT_PADDED_WORD_EXTRACTION)) + (begin + ;; setting second mmio inst + (if-eq-else (right-padded-word-extraction---second-limb-void) 1 + (begin (eq! (shift micro/INST NB_PP_ROWS_RIGHT_PADDED_WORD_EXTRACTION_PT) MMIO_INST_LIMB_VANISHES) + (vanishes! macro/LIMB_2)) + (if-eq-else (right-padded-word-extraction---second-limb-single-source) 1 + (if-zero (right-padded-word-extraction---second-limb-padded) + (eq! (shift micro/INST NB_PP_ROWS_RIGHT_PADDED_WORD_EXTRACTION_PT) MMIO_INST_RAM_TO_LIMB_TRANSPLANT) + (eq! (shift micro/INST NB_PP_ROWS_RIGHT_PADDED_WORD_EXTRACTION_PT) MMIO_INST_RAM_TO_LIMB_ONE_SOURCE)) + (eq! (shift micro/INST NB_PP_ROWS_RIGHT_PADDED_WORD_EXTRACTION_PT) MMIO_INST_RAM_TO_LIMB_TWO_SOURCE))) + (eq! (shift micro/SIZE NB_PP_ROWS_RIGHT_PADDED_WORD_EXTRACTION_PT) (right-padded-word-extraction---second-limb-byte-size)) + (eq! (shift micro/SLO NB_PP_ROWS_RIGHT_PADDED_WORD_EXTRACTION_PT) (+ (right-padded-word-extraction---slo) 1)) + (eq! (shift micro/SBO NB_PP_ROWS_RIGHT_PADDED_WORD_EXTRACTION_PT) (right-padded-word-extraction---sbo)) + (vanishes! (shift micro/TBO NB_PP_ROWS_RIGHT_PADDED_WORD_EXTRACTION_PT)) + (eq! (shift micro/LIMB NB_PP_ROWS_RIGHT_PADDED_WORD_EXTRACTION_PT) macro/LIMB_2))) diff --git a/mmu/osaka/lookups/mmu_into_euc.lisp b/mmu/osaka/lookups/mmu_into_euc.lisp new file mode 100644 index 000000000..6023e4620 --- /dev/null +++ b/mmu/osaka/lookups/mmu_into_euc.lisp @@ -0,0 +1,27 @@ +(defun (mmu-to-euc-selector) + (* mmu.PRPRC mmu.prprc/EUC_FLAG)) + +(defclookup + mmu-into-euc + ;;target columns + ( + euc.DIVIDEND + euc.DIVISOR + euc.QUOTIENT + euc.REMAINDER + euc.CEIL + euc.DONE + ) + ;; source selector + (mmu-to-euc-selector) + ;; source columns + ( + mmu.prprc/EUC_A + mmu.prprc/EUC_B + mmu.prprc/EUC_QUOT + mmu.prprc/EUC_REM + mmu.prprc/EUC_CEIL + 1 + )) + + diff --git a/mmu/osaka/lookups/mmu_into_mmio.lisp b/mmu/osaka/lookups/mmu_into_mmio.lisp new file mode 100644 index 000000000..d45ea794e --- /dev/null +++ b/mmu/osaka/lookups/mmu_into_mmio.lisp @@ -0,0 +1,12 @@ +(deflookup + mmu-into-mmio + ;reference columns + ( + mmio.MMIO_STAMP + ) + ;source columns + ( + mmu.MMIO_STAMP + )) + + diff --git a/mmu/osaka/lookups/mmu_into_wcp.lisp b/mmu/osaka/lookups/mmu_into_wcp.lisp new file mode 100644 index 000000000..8dbf6e695 --- /dev/null +++ b/mmu/osaka/lookups/mmu_into_wcp.lisp @@ -0,0 +1,27 @@ +(defun (mmu-to-wcp-selector) + (* mmu.PRPRC mmu.prprc/WCP_FLAG)) + +(defclookup + mmu-into-wcp + ;; target columns + ( + wcp.ARG_1_HI + wcp.ARG_1_LO + wcp.ARG_2_HI + wcp.ARG_2_LO + wcp.RES + wcp.INST + ) + ;; source selector + (mmu-to-wcp-selector) + ;; source columns + ( + mmu.prprc/WCP_ARG_1_HI + mmu.prprc/WCP_ARG_1_LO + 0 + mmu.prprc/WCP_ARG_2_LO + mmu.prprc/WCP_RES + mmu.prprc/WCP_INST + )) + + diff --git a/oob/osaka/binarities.lisp b/oob/osaka/binarities.lisp new file mode 100644 index 000000000..c4fd244b7 --- /dev/null +++ b/oob/osaka/binarities.lisp @@ -0,0 +1,13 @@ +(module oob) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; 2.2 binary constraints ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defconstraint wcp-add-mod-are-exclusive () + (is-binary (lookup-sum 0))) + +;; others are done with binary@prove in columns.lisp diff --git a/oob/osaka/columns.lisp b/oob/osaka/columns.lisp new file mode 100644 index 000000000..3baa4747e --- /dev/null +++ b/oob/osaka/columns.lisp @@ -0,0 +1,49 @@ +(module oob) + +(defcolumns + (STAMP :i32) + (CT :i3) + (CT_MAX :i3) + (DATA :i128 :array [10]) + (OOB_INST :i16) + (IS_JUMP :binary@prove) + (IS_JUMPI :binary@prove) + (IS_RDC :binary@prove) + (IS_CDL :binary@prove) + (IS_XCALL :binary@prove) + (IS_CALL :binary@prove) + (IS_XCREATE :binary@prove) + (IS_CREATE :binary@prove) + (IS_SSTORE :binary@prove) + (IS_DEPLOYMENT :binary@prove) + (IS_ECRECOVER :binary@prove) + (IS_SHA2 :binary@prove) + (IS_RIPEMD :binary@prove) + (IS_IDENTITY :binary@prove) + (IS_ECADD :binary@prove) + (IS_ECMUL :binary@prove) + (IS_ECPAIRING :binary@prove) + (IS_BLAKE2F_CDS :binary@prove) + (IS_BLAKE2F_PARAMS :binary@prove) + (IS_MODEXP_CDS :binary@prove) + (IS_MODEXP_XBS :binary@prove) + (IS_MODEXP_LEAD :binary@prove) + (IS_MODEXP_PRICING :binary@prove) + (IS_MODEXP_EXTRACT :binary@prove) + (IS_POINT_EVALUATION :binary@prove) + (IS_BLS_G1_ADD :binary@prove) + (IS_BLS_G1_MSM :binary@prove) + (IS_BLS_G2_ADD :binary@prove) + (IS_BLS_G2_MSM :binary@prove) + (IS_BLS_PAIRING_CHECK :binary@prove) + (IS_BLS_MAP_FP_TO_G1 :binary@prove) + (IS_BLS_MAP_FP2_TO_G2 :binary@prove) + (WCP_FLAG :binary@prove) + (ADD_FLAG :binary@prove) + (MOD_FLAG :binary@prove) + (BLS_REF_TABLE_FLAG :binary@prove) + (OUTGOING_INST :byte :display :opcode) + (OUTGOING_DATA :i128 :array [4]) + (OUTGOING_RES_LO :i128)) + + diff --git a/oob/osaka/constancies.lisp b/oob/osaka/constancies.lisp new file mode 100644 index 000000000..b28ac81b3 --- /dev/null +++ b/oob/osaka/constancies.lisp @@ -0,0 +1,14 @@ +(module oob) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; Constancy constraints ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defconstraint counter-constancy () + (begin (counter-constancy CT STAMP) + (debug (counter-constancy CT CT_MAX)) + (for i [10] (counter-constancy CT [DATA i])) + (counter-constancy CT OOB_INST))) diff --git a/oob/osaka/constants.lisp b/oob/osaka/constants.lisp new file mode 100644 index 000000000..7bc5cc7bc --- /dev/null +++ b/oob/osaka/constants.lisp @@ -0,0 +1,38 @@ +(module oob) + +(defconst + CT_MAX_JUMP 0 + CT_MAX_JUMPI 1 + CT_MAX_RDC 2 + CT_MAX_CDL 0 + CT_MAX_XCALL 0 + CT_MAX_CALL 2 + CT_MAX_XCREATE 0 + CT_MAX_CREATE 4 + CT_MAX_SSTORE 0 + CT_MAX_DEPLOYMENT 0 + CT_MAX_ECRECOVER 2 + CT_MAX_SHA2 3 + CT_MAX_RIPEMD 3 + CT_MAX_IDENTITY 3 + CT_MAX_ECADD 2 + CT_MAX_ECMUL 2 + CT_MAX_ECPAIRING 4 + CT_MAX_BLAKE2F_CDS 1 + CT_MAX_BLAKE2F_PARAMS 1 + CT_MAX_MODEXP_CDS 2 + CT_MAX_MODEXP_XBS 2 + CT_MAX_MODEXP_LEAD 3 + CT_MAX_MODEXP_PRICING 5 + CT_MAX_MODEXP_EXTRACT 3 + CT_MAX_POINT_EVALUATION 3 + CT_MAX_BLS_G1_ADD 3 + CT_MAX_BLS_G1_MSM 6 + CT_MAX_BLS_G2_ADD 3 + CT_MAX_BLS_G2_MSM 6 + CT_MAX_BLS_PAIRING_CHECK 4 + CT_MAX_BLS_MAP_FP_TO_G1 3 + CT_MAX_BLS_MAP_FP2_TO_G2 3 + G_QUADDIVISOR 3) + + diff --git a/oob/osaka/decoding.lisp b/oob/osaka/decoding.lisp new file mode 100644 index 000000000..f90123684 --- /dev/null +++ b/oob/osaka/decoding.lisp @@ -0,0 +1,19 @@ +(module oob) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; 2.3 instruction decoding ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defconstraint flag-sum-vanishes () + (if-zero STAMP + (vanishes! (flag-sum)))) + +(defconstraint flag-sum-equal-one () + (if-not-zero STAMP + (eq! (flag-sum) 1))) + +(defconstraint decoding () + (eq! OOB_INST (wght-sum))) diff --git a/oob/osaka/heartbeat.lisp b/oob/osaka/heartbeat.lisp new file mode 100644 index 000000000..585d60b37 --- /dev/null +++ b/oob/osaka/heartbeat.lisp @@ -0,0 +1,34 @@ +(module oob) + + +;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; 2.5 heartbeat ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;; + +(defconstraint first-row (:domain {0}) + (vanishes! STAMP)) + +(defconstraint padding-vanishing () + (if-zero STAMP + (begin (vanishes! CT) + (vanishes! (+ (lookup-sum 0) (flag-sum)))))) + +(defconstraint stamp-increments () + (or! (remained-constant! STAMP) (did-inc! STAMP 1))) + +(defconstraint counter-reset () + (if-not (remained-constant! STAMP) + (vanishes! CT))) + +(defconstraint ct-max () + (eq! CT_MAX (maxct-sum))) + +(defconstraint non-trivial-instruction-counter-cycle () + (if-not-zero STAMP + (if-eq-else CT CT_MAX (will-inc! STAMP 1) (will-inc! CT 1)))) + +(defconstraint final-row (:domain {-1}) + (if-not-zero STAMP + (eq! CT CT_MAX))) diff --git a/oob/osaka/lookups/oob-into-add.lisp b/oob/osaka/lookups/oob-into-add.lisp new file mode 100644 index 000000000..ce036d520 --- /dev/null +++ b/oob/osaka/lookups/oob-into-add.lisp @@ -0,0 +1,23 @@ +(defun (oob-into-add-activation-flag) + oob.ADD_FLAG) + +(defclookup + oob-into-add + ;; target columns + ( + add.ARG_1 + add.ARG_2 + add.RES + add.INST + ) + ;; source selector + (oob-into-add-activation-flag) + ;; source columns + ( + (:: [oob.OUTGOING_DATA 1] [oob.OUTGOING_DATA 2]) + (:: [oob.OUTGOING_DATA 3] [oob.OUTGOING_DATA 4]) + (:: (next [oob.OUTGOING_DATA 1]) (next [oob.OUTGOING_DATA 2])) + oob.OUTGOING_INST + )) + + diff --git a/oob/osaka/lookups/oob-into-blsreftable.lisp b/oob/osaka/lookups/oob-into-blsreftable.lisp new file mode 100644 index 000000000..20af8643a --- /dev/null +++ b/oob/osaka/lookups/oob-into-blsreftable.lisp @@ -0,0 +1,20 @@ +(defun (oob-into-bls-ref-table-activation-flag) + oob.BLS_REF_TABLE_FLAG) + +(defclookup + (oob-into-bls-ref-table :unchecked) + ;; target columns + ( + blsreftable.PRC_NAME + blsreftable.NUM_INPUTS + blsreftable.DISCOUNT + ) + ;; source selector + (oob-into-bls-ref-table-activation-flag) + ;; source columns + ( + oob.OUTGOING_INST + [oob.OUTGOING_DATA 1] + oob.OUTGOING_RES_LO + )) + diff --git a/oob/osaka/lookups/oob-into-mod.lisp b/oob/osaka/lookups/oob-into-mod.lisp new file mode 100644 index 000000000..f39654d4c --- /dev/null +++ b/oob/osaka/lookups/oob-into-mod.lisp @@ -0,0 +1,29 @@ +(defun (oob-into-mod-activation-flag) + oob.MOD_FLAG) + +(defclookup + oob-into-mod + ;; target columns + ( + mod.ARG_1_HI + mod.ARG_1_LO + mod.ARG_2_HI + mod.ARG_2_LO + mod.RES_HI + mod.RES_LO + mod.INST + ) + ;; source selector + (oob-into-mod-activation-flag) + ;; source columns + ( + [oob.OUTGOING_DATA 1] + [oob.OUTGOING_DATA 2] + [oob.OUTGOING_DATA 3] + [oob.OUTGOING_DATA 4] + 0 + oob.OUTGOING_RES_LO + oob.OUTGOING_INST + )) + + diff --git a/oob/osaka/lookups/oob-into-wcp.lisp b/oob/osaka/lookups/oob-into-wcp.lisp new file mode 100644 index 000000000..449df6d26 --- /dev/null +++ b/oob/osaka/lookups/oob-into-wcp.lisp @@ -0,0 +1,27 @@ +(defun (oob-into-wcp-activation-flag) + oob.WCP_FLAG) + +(defclookup + (oob-into-wcp :unchecked) + ;; target columns + ( + wcp.ARGUMENT_1_HI + wcp.ARGUMENT_1_LO + wcp.ARGUMENT_2_HI + wcp.ARGUMENT_2_LO + wcp.RESULT + wcp.INST + ) + ;; source selector + (oob-into-wcp-activation-flag) + ;; source columns + ( + [oob.OUTGOING_DATA 1] + [oob.OUTGOING_DATA 2] + [oob.OUTGOING_DATA 3] + [oob.OUTGOING_DATA 4] + oob.OUTGOING_RES_LO + oob.OUTGOING_INST + )) + + diff --git a/oob/osaka/opcodes/call.lisp b/oob/osaka/opcodes/call.lisp new file mode 100644 index 000000000..dca166b66 --- /dev/null +++ b/oob/osaka/opcodes/call.lisp @@ -0,0 +1,35 @@ +(module oob) + + +;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; OOB_INST_CALL ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;; + +(defun (call---standard-precondition) IS_CALL) +(defun (call---value-hi) [DATA 1]) +(defun (call---value-lo) [DATA 2]) +(defun (call---balance) [DATA 3]) +(defun (call---call-stack-depth) [DATA 6]) +(defun (call---value-is-nonzero) [DATA 7]) +(defun (call---aborting-condition) [DATA 8]) +(defun (call---insufficient-balance-abort) OUTGOING_RES_LO) +(defun (call---call-stack-depth-abort) (- 1 (next OUTGOING_RES_LO))) +(defun (call---value-is-zero) (shift OUTGOING_RES_LO 2)) + +(defconstraint call---compare-balance-against-value (:guard (* (assumption---fresh-new-stamp) (call---standard-precondition))) + (call-to-LT 0 0 (call---balance) (call---value-hi) (call---value-lo))) + +(defconstraint call---compare-call-stack-depth-against-1024 (:guard (* (assumption---fresh-new-stamp) (call---standard-precondition))) + (call-to-LT 1 0 (call---call-stack-depth) 0 1024)) + +(defconstraint call---check-value-is-zero (:guard (* (assumption---fresh-new-stamp) (call---standard-precondition))) + (call-to-ISZERO 2 (call---value-hi) (call---value-lo))) + +(defconstraint call---justify-hub-predictions (:guard (* (assumption---fresh-new-stamp) (call---standard-precondition))) + (begin (eq! (call---value-is-nonzero) (- 1 (call---value-is-zero))) + (eq! (call---aborting-condition) + (+ (call---insufficient-balance-abort) + (* (- 1 (call---insufficient-balance-abort)) (call---call-stack-depth-abort)))))) + diff --git a/oob/osaka/opcodes/cdl.lisp b/oob/osaka/opcodes/cdl.lisp new file mode 100644 index 000000000..4323b5a72 --- /dev/null +++ b/oob/osaka/opcodes/cdl.lisp @@ -0,0 +1,23 @@ +(module oob) + + +;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; OOB_INST_CDL ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;; + +;; Note. We use cdl as a shorthand for CALLDATALOAD + +(defun (cdl---standard-precondition) IS_CDL) +(defun (cdl---offset-hi) [DATA 1]) +(defun (cdl---offset-lo) [DATA 2]) +(defun (cdl---cds) [DATA 5]) +(defun (cdl---cdl-out-of-bounds) [DATA 7]) +(defun (cdl---touches-ram) OUTGOING_RES_LO) + +(defconstraint cdl---compare-offset-against-cds (:guard (* (assumption---fresh-new-stamp) (cdl---standard-precondition))) + (call-to-LT 0 (cdl---offset-hi) (cdl---offset-lo) 0 (cdl---cds))) + +(defconstraint cdl---justify-hub-predictions (:guard (* (assumption---fresh-new-stamp) (cdl---standard-precondition))) + (eq! (cdl---cdl-out-of-bounds) (- 1 (cdl---touches-ram)))) diff --git a/oob/osaka/opcodes/create.lisp b/oob/osaka/opcodes/create.lisp new file mode 100644 index 000000000..7787666d1 --- /dev/null +++ b/oob/osaka/opcodes/create.lisp @@ -0,0 +1,95 @@ +(module oob) + + +;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; OOB_INST_CREATE ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (create---standard-precondition) IS_CREATE) +(defun (create---value-hi) [DATA 1]) +(defun (create---value-lo) [DATA 2]) +(defun (create---balance) [DATA 3]) +(defun (create---nonce) [DATA 4]) +(defun (create---has-code) [DATA 5]) +(defun (create---call-stack-depth) [DATA 6]) +(defun (create---aborting-condition) [DATA 7]) +(defun (create---failure-condition) [DATA 8]) +(defun (create---creator-nonce) [DATA 9]) +(defun (create---init-code-size) [DATA 10]) ;; "" + + +(defconstraint create---compare-balance-against-value + (:guard (* (assumption---fresh-new-stamp) (create---standard-precondition))) + (call-to-LT 0 + 0 + (create---balance) + (create---value-hi) + (create---value-lo))) + +(defun (create---insufficient-balance-abort) (shift OUTGOING_RES_LO 0)) + + + +(defconstraint create---compare-call-stack-depth-against-1024 + (:guard (* (assumption---fresh-new-stamp) (create---standard-precondition))) + (call-to-LT 1 + 0 + (create---call-stack-depth) + 0 + 1024)) + +(defun (create---stack-depth-abort) (- 1 (shift OUTGOING_RES_LO 1))) + + + +(defconstraint create---check-nonce-is-zero + (:guard (* (assumption---fresh-new-stamp) (create---standard-precondition))) + (call-to-ISZERO 2 + 0 + (create---nonce))) + +(defun (create---nonzero-nonce) (- 1 (shift OUTGOING_RES_LO 2))) + + + +(defconstraint create---compare-creator-nonce-against-max-nonce + (:guard (* (assumption---fresh-new-stamp) (create---standard-precondition))) + (call-to-LT 3 + 0 + (create---creator-nonce) + 0 + EIP2681_MAX_NONCE)) + +(defun (create---creator-nonce-abort) (- 1 (shift OUTGOING_RES_LO 3))) + + + +(defconstraint create---compare-init-code-size-to-MAX_INIT_CODE_SIZE + (:guard (* (assumption---fresh-new-stamp) (create---standard-precondition))) + (call-to-LT 4 + 0 + MAX_INIT_CODE_SIZE + 0 + (create---init-code-size) + )) + +(defun (create---init-code-size-exceeds-max-init-code-size) (shift OUTGOING_RES_LO 4)) + + + +(defun (create---aborting-conditions-sum) (+ (create---insufficient-balance-abort) + (create---stack-depth-abort) + (create---creator-nonce-abort))) + +(defconstraint create---justify-hub-predictions + (:guard (* (assumption---fresh-new-stamp) (create---standard-precondition))) + (begin (vanishes! (create---init-code-size-exceeds-max-init-code-size)) + (if-zero (create---aborting-conditions-sum) + (eq! (create---aborting-condition) 0) + (eq! (create---aborting-condition) 1)) + (eq! (create---failure-condition) + (* (- 1 (create---aborting-condition)) + (+ (create---has-code) + (* (- 1 (create---has-code)) (create---nonzero-nonce))))))) diff --git a/oob/osaka/opcodes/deployment.lisp b/oob/osaka/opcodes/deployment.lisp new file mode 100644 index 000000000..7ce081011 --- /dev/null +++ b/oob/osaka/opcodes/deployment.lisp @@ -0,0 +1,22 @@ +(module oob) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; OOB_INST_DEPLOYMENT ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;; Note. Here "DEPLOYMENT" refers to the execution of the RETURN opcode in a deployment context + +(defun (deployment---standard-precondition) IS_DEPLOYMENT) +(defun (deployment---code-size-hi) [DATA 1]) +(defun (deployment---code-size-lo) [DATA 2]) +(defun (deployment---max-code-size-exception) [DATA 7]) +(defun (deployment---exceeds-max-code-size) OUTGOING_RES_LO) + +(defconstraint deployment---compare-max-code-size-against-code-size (:guard (* (assumption---fresh-new-stamp) (deployment---standard-precondition))) + (call-to-LT 0 0 MAX_CODE_SIZE (deployment---code-size-hi) (deployment---code-size-lo))) + +(defconstraint deployment---justify-hub-predictions (:guard (* (assumption---fresh-new-stamp) (deployment---standard-precondition))) + (eq! (deployment---max-code-size-exception) (deployment---exceeds-max-code-size))) diff --git a/oob/osaka/opcodes/jump.lisp b/oob/osaka/opcodes/jump.lisp new file mode 100644 index 000000000..cc2f0d30a --- /dev/null +++ b/oob/osaka/opcodes/jump.lisp @@ -0,0 +1,26 @@ +(module oob) + + +;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; OOB_INST_JUMP ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;; + +(defun (jump---standard-precondition) IS_JUMP) +(defun (jump---pc-new-hi) [DATA 1]) +(defun (jump---pc-new-lo) [DATA 2]) +(defun (jump---code-size) [DATA 5]) +(defun (jump---guaranteed-exception) [DATA 7]) +(defun (jump---jump-must-be-attempted) [DATA 8]) +(defun (jump---valid-pc-new) OUTGOING_RES_LO) + +(defconstraint jump---compare-pc-new-against-code-size (:guard (* (assumption---fresh-new-stamp) (jump---standard-precondition))) + (call-to-LT 0 (jump---pc-new-hi) (jump---pc-new-lo) 0 (jump---code-size))) + +(defconstraint jump---justify-hub-predictions (:guard (* (assumption---fresh-new-stamp) (jump---standard-precondition))) + (begin (eq! (jump---guaranteed-exception) (- 1 (jump---valid-pc-new))) + (eq! (jump---jump-must-be-attempted) (jump---valid-pc-new)) + (debug (is-binary (jump---guaranteed-exception))) + (debug (is-binary (jump---jump-must-be-attempted))) + (debug (eq! (+ (jump---guaranteed-exception) (jump---jump-must-be-attempted)) 1)))) diff --git a/oob/osaka/opcodes/jumpi.lisp b/oob/osaka/opcodes/jumpi.lisp new file mode 100644 index 000000000..6ea0688b4 --- /dev/null +++ b/oob/osaka/opcodes/jumpi.lisp @@ -0,0 +1,40 @@ +(module oob) + + +;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; OOB_INST_JUMPI ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (jumpi---standard-precondition) IS_JUMPI) +(defun (jumpi---pc-new-hi) [DATA 1]) +(defun (jumpi---pc-new-lo) [DATA 2]) +(defun (jumpi---jump-cond-hi) [DATA 3]) +(defun (jumpi---jump-cond-lo) [DATA 4]) +(defun (jumpi---code-size) [DATA 5]) +(defun (jumpi---jump-not-attempted) [DATA 6]) +(defun (jumpi---guaranteed-exception) [DATA 7]) +(defun (jumpi---jump-must-be-attempted) [DATA 8]) +(defun (jumpi---valid-pc-new) OUTGOING_RES_LO) +(defun (jumpi---jump-cond-is-zero) (next OUTGOING_RES_LO)) + +(defconstraint jumpi---compare-pc-new-against-code-size (:guard (* (assumption---fresh-new-stamp) (jumpi---standard-precondition))) + (call-to-LT 0 (jumpi---pc-new-hi) (jumpi---pc-new-lo) 0 (jumpi---code-size))) + +(defconstraint jumpi---check-jump-cond-is-zero (:guard (* (assumption---fresh-new-stamp) (jumpi---standard-precondition))) + (call-to-ISZERO 1 (jumpi---jump-cond-hi) (jumpi---jump-cond-lo))) + +(defconstraint jumpi---justify-hub-predictions (:guard (* (assumption---fresh-new-stamp) (jumpi---standard-precondition))) + (begin (eq! (jumpi---jump-not-attempted) (jumpi---jump-cond-is-zero)) + (eq! (jumpi---guaranteed-exception) + (* (- 1 (jumpi---jump-cond-is-zero)) (- 1 (jumpi---valid-pc-new)))) + (eq! (jumpi---jump-must-be-attempted) + (* (- 1 (jumpi---jump-cond-is-zero)) (jumpi---valid-pc-new))) + (debug (is-binary (jumpi---jump-not-attempted))) + (debug (is-binary (jumpi---guaranteed-exception))) + (debug (is-binary (jumpi---jump-must-be-attempted))) + (debug (eq! (+ (jumpi---guaranteed-exception) + (jumpi---jump-must-be-attempted) + (jumpi---jump-not-attempted)) + 1)))) diff --git a/oob/osaka/opcodes/rdc.lisp b/oob/osaka/opcodes/rdc.lisp new file mode 100644 index 000000000..74dec0dc2 --- /dev/null +++ b/oob/osaka/opcodes/rdc.lisp @@ -0,0 +1,44 @@ +(module oob) + + +;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; OOB_INST_RDC ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;; + +;; Note. We use rdc as a shorthand for RETURNDATACOPY + +(defun (rdc---standard-precondition) IS_RDC) +(defun (rdc---offset-hi) [DATA 1]) +(defun (rdc---offset-lo) [DATA 2]) +(defun (rdc---size-hi) [DATA 3]) +(defun (rdc---size-lo) [DATA 4]) +(defun (rdc---rds) [DATA 5]) +(defun (rdc---rdcx) [DATA 7]) +(defun (rdc---rdc-roob) (- 1 OUTGOING_RES_LO)) +(defun (rdc---rdc-soob) (shift OUTGOING_RES_LO 2)) + +(defconstraint rdc---check-offset-is-zero (:guard (* (assumption---fresh-new-stamp) (rdc---standard-precondition))) + (call-to-ISZERO 0 (rdc---offset-hi) (rdc---size-hi))) + +(defconstraint rdc---add-offset-and-size (:guard (* (assumption---fresh-new-stamp) (rdc---standard-precondition))) + (if-zero (rdc---rdc-roob) + (call-to-ADD 1 0 (rdc---offset-lo) 0 (rdc---size-lo)) + (noCall 1))) + +(defconstraint rdc---compare-offset-plus-size-against-rds (:guard (* (assumption---fresh-new-stamp) (rdc---standard-precondition))) + (if-zero (rdc---rdc-roob) + (begin (vanishes! (shift ADD_FLAG 2)) + (vanishes! (shift MOD_FLAG 2)) + (eq! (shift WCP_FLAG 2) 1) + (eq! (shift OUTGOING_INST 2) EVM_INST_GT) + (vanishes! (shift [OUTGOING_DATA 3] 2)) + (eq! (shift [OUTGOING_DATA 4] 2) (rdc---rds))) + (noCall 2))) + +(defconstraint rdc---justify-hub-predictions (:guard (* (assumption---fresh-new-stamp) (rdc---standard-precondition))) + (eq! (rdc---rdcx) + (+ (rdc---rdc-roob) + (* (- 1 (rdc---rdc-roob)) (rdc---rdc-soob))))) + diff --git a/oob/osaka/opcodes/sstore.lisp b/oob/osaka/opcodes/sstore.lisp new file mode 100644 index 000000000..51427fca1 --- /dev/null +++ b/oob/osaka/opcodes/sstore.lisp @@ -0,0 +1,19 @@ +(module oob) + + +;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; OOB_INST_SSTORE ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (sstore---standard-precondition) IS_SSTORE) +(defun (sstore---gas) [DATA 5]) +(defun (sstore---sstorex) [DATA 7]) +(defun (sstore---sufficient-gas) OUTGOING_RES_LO) + +(defconstraint sstore---compare-g-call-stipend-against-gas (:guard (* (assumption---fresh-new-stamp) (sstore---standard-precondition))) + (call-to-LT 0 0 GAS_CONST_G_CALL_STIPEND 0 (sstore---gas))) + +(defconstraint sstore---justify-hub-predictions (:guard (* (assumption---fresh-new-stamp) (sstore---standard-precondition))) + (eq! (sstore---sstorex) (- 1 (sstore---sufficient-gas)))) diff --git a/oob/osaka/opcodes/xcall.lisp b/oob/osaka/opcodes/xcall.lisp new file mode 100644 index 000000000..163f6e841 --- /dev/null +++ b/oob/osaka/opcodes/xcall.lisp @@ -0,0 +1,23 @@ +(module oob) + + +;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; OOB_INST_XCALL ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;; + +;; Note. We use XCALL as a shorthand for "eXceptional CALL-type instruction" + +(defun (xcall---standard-precondition) IS_XCALL) +(defun (xcall---value-hi) [DATA 1]) +(defun (xcall---value-lo) [DATA 2]) +(defun (xcall---value-is-nonzero) [DATA 7]) +(defun (xcall---value-is-zero) [DATA 8]) + +(defconstraint xcall---check-value-is-zero (:guard (* (assumption---fresh-new-stamp) (xcall---standard-precondition))) + (call-to-ISZERO 0 (xcall---value-hi) (xcall---value-lo))) + +(defconstraint xcall---justify-hub-predictions (:guard (* (assumption---fresh-new-stamp) (xcall---standard-precondition))) + (begin (eq! (xcall---value-is-nonzero) (- 1 OUTGOING_RES_LO)) + (eq! (xcall---value-is-zero) OUTGOING_RES_LO))) diff --git a/oob/osaka/opcodes/xcreate.lisp b/oob/osaka/opcodes/xcreate.lisp new file mode 100644 index 000000000..1320b3469 --- /dev/null +++ b/oob/osaka/opcodes/xcreate.lisp @@ -0,0 +1,26 @@ +(module oob) + + +;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; OOB_INST_XCREATE ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (xcreate---standard-precondition) IS_XCREATE ) +(defun (xcreate---init-code-size-hi) [DATA 1] ) +(defun (xcreate---init-code-size-lo) [DATA 2] ) ;; "" +(defun (xcreate---init-code-size-exceeds-MAX_INIT_CODE_SIZE) OUTGOING_RES_LO ) + + +(defconstraint xcreate---compare-init-code-size-against-MAX_INIT_CODE_SIZE + (:guard (* (assumption---fresh-new-stamp) (xcreate---standard-precondition))) + (call-to-LT 0 + 0 + MAX_INIT_CODE_SIZE + (xcreate---init-code-size-hi) + (xcreate---init-code-size-lo))) + +(defconstraint xcreate---enforce-maxcsx + (:guard (* (assumption---fresh-new-stamp) (xcreate---standard-precondition))) + (eq! (xcreate---init-code-size-exceeds-MAX_INIT_CODE_SIZE) 1)) diff --git a/oob/osaka/precompiles/blake2f/cds.lisp b/oob/osaka/precompiles/blake2f/cds.lisp new file mode 100644 index 000000000..01efb8aa0 --- /dev/null +++ b/oob/osaka/precompiles/blake2f/cds.lisp @@ -0,0 +1,22 @@ +(module oob) + + +;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; BLAKE2F_cds ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;; + +(defun (prc-blake-cds---standard-precondition) IS_BLAKE2F_CDS) +(defun (prc-blake-cds---valid-cds) OUTGOING_RES_LO) +(defun (prc-blake-cds---r@c-is-zero) (next OUTGOING_RES_LO)) + +(defconstraint prc-blake-cds---compare-cds-against-PRECOMPILE_CALL_DATA_SIZE___BLAKE2F (:guard (* (assumption---fresh-new-stamp) (prc-blake-cds---standard-precondition))) + (call-to-EQ 0 0 (prc---cds) 0 PRECOMPILE_CALL_DATA_SIZE___BLAKE2F)) + +(defconstraint prc-blake-cds---check--is-zero (:guard (* (assumption---fresh-new-stamp) (prc-blake-cds---standard-precondition))) + (call-to-ISZERO 1 0 (prc---r@c))) + +(defconstraint blake2f-a---justify-hub-predictions (:guard (* (assumption---fresh-new-stamp) (prc-blake-cds---standard-precondition))) + (begin (eq! (prc---hub-success) (prc-blake-cds---valid-cds)) + (eq! (prc---r@c-nonzero) (- 1 (prc-blake-cds---r@c-is-zero))))) diff --git a/oob/osaka/precompiles/blake2f/params.lisp b/oob/osaka/precompiles/blake2f/params.lisp new file mode 100644 index 000000000..9b21d131c --- /dev/null +++ b/oob/osaka/precompiles/blake2f/params.lisp @@ -0,0 +1,32 @@ +(module oob) + + +;;;;;;;;;;;;;;;;;;;::;; +;; ;; +;; BLAKE2F_params ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;; + +(defun (prc-blake-params---standard-precondition) IS_BLAKE2F_PARAMS) +(defun (prc-blake-params---blake-r) [DATA 6]) +(defun (prc-blake-params---blake-f) [DATA 7]) +(defun (prc-blake-params---sufficient-gas) (- 1 OUTGOING_RES_LO)) +(defun (prc-blake-params---f-is-a-bit) (next OUTGOING_RES_LO)) + + +(defconstraint prc-blake-params---compare-call-gas-against-blake-r (:guard (* (assumption---fresh-new-stamp) (prc-blake-params---standard-precondition))) + (call-to-LT 0 0 (prc---callee-gas) 0 (* GAS_CONST_BLAKE2_PER_ROUND (prc-blake-params---blake-r)))) + +(defconstraint prc-blake-params---compare-blake-f-against-blake-f-square (:guard (* (assumption---fresh-new-stamp) (prc-blake-params---standard-precondition))) + (call-to-EQ 1 + 0 + (prc-blake-params---blake-f) + 0 + (* (prc-blake-params---blake-f) (prc-blake-params---blake-f)))) + +(defconstraint prc-blake-params---justify-hub-predictions (:guard (* (assumption---fresh-new-stamp) (prc-blake-params---standard-precondition))) + (begin (eq! (prc---ram-success) + (* (prc-blake-params---sufficient-gas) (prc-blake-params---f-is-a-bit))) + (if-not-zero (prc---ram-success) + (eq! (prc---return-gas) (- (prc---callee-gas) (prc-blake-params---blake-r))) + (vanishes! (prc---return-gas))))) diff --git a/oob/osaka/precompiles/common/bls/bls_msm.lisp b/oob/osaka/precompiles/common/bls/bls_msm.lisp new file mode 100644 index 000000000..2b1e91fe0 --- /dev/null +++ b/oob/osaka/precompiles/common/bls/bls_msm.lisp @@ -0,0 +1,89 @@ +(module oob) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; For BLS_G1_MSM and BLS_G2_MSM ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (prc-g1msm-prc-g2msm---standard-precondition) + (+ IS_BLS_G1_MSM + IS_BLS_G2_MSM)) +(defun (msm-pair-size) + (+ (* PRECOMPILE_CALL_DATA_UNIT_SIZE___BLS_G1_MSM IS_BLS_G1_MSM) + (* PRECOMPILE_CALL_DATA_UNIT_SIZE___BLS_G2_MSM IS_BLS_G2_MSM))) +(defun (max-discount) + (+ (* PRC_BLS_G1_MSM_MAX_DISCOUNT IS_BLS_G1_MSM) + (* PRC_BLS_G2_MSM_MAX_DISCOUNT IS_BLS_G2_MSM))) +(defun (msm-multiplication-cost) + (+ (* PRC_BLS_G1_MSM_MULTIPLICATION_COST IS_BLS_G1_MSM) + (* PRC_BLS_G2_MSM_MULTIPLICATION_COST IS_BLS_G2_MSM))) +(defun (prc-g1msm-prc-g2msm---remainder) (shift OUTGOING_RES_LO 2)) +(defun (prc-g1msm-prc-g2msm---cds-is-multiple-of-msm-pair-size) (shift OUTGOING_RES_LO 3)) +(defun (prc-g1msm-prc-g2msm---num-inputs_msm-pair-size) (prc---cds)) +(defun (prc-g1msm-prc-g2msm---num-inputs-gt-128) (shift OUTGOING_RES_LO 4)) +(defun (prc-g1msm-prc-g2msm---num-inputs-leq-128) (- 1 (prc-g1msm-prc-g2msm---num-inputs-gt-128))) +(defun (prc-g1msm-prc-g2msm---discount) (shift OUTGOING_RES_LO 5)) +(defun (prc-g1msm-prc-g2msm---insufficient-gas) (shift OUTGOING_RES_LO 6)) +(defun (prc-g1msm-prc-g2msm---sufficient-gas) (- 1 (prc-g1msm-prc-g2msm---insufficient-gas))) +(defun (prc-g1msm-prc-g2msm---precompile-cost_msm-pair-size_PRC_BLS_MULTIPLICATION_MULTIPLIER) (* (prc-g1msm-prc-g2msm---num-inputs_msm-pair-size) (msm-multiplication-cost) (prc-g1msm-prc-g2msm---discount))) + + + +(defconstraint prc-g1msm-prc-g2msm---mod-cds-by-msm-pair-size (:guard (* (assumption---fresh-new-stamp) (prc-g1msm-prc-g2msm---standard-precondition))) + (call-to-MOD 2 0 (prc---cds) 0 (msm-pair-size))) + +(defconstraint prc-g1msm-prc-g2msm---check-remainder-is-zero (:guard (* (assumption---fresh-new-stamp) (prc-g1msm-prc-g2msm---standard-precondition))) + (call-to-ISZERO 3 0 (prc-g1msm-prc-g2msm---remainder))) + +(defconstraint prc-g1msm-prc-g2msm---compare-num-inputs-against-128 (:guard (* (assumption---fresh-new-stamp) (prc-g1msm-prc-g2msm---standard-precondition))) + (if-zero (prc-g1msm-prc-g2msm---cds-is-multiple-of-msm-pair-size) + (noCall 4) + (begin (vanishes! (shift ADD_FLAG 4)) + (vanishes! (shift MOD_FLAG 4)) + (eq! (shift WCP_FLAG 4) 1) + (vanishes! (shift BLS_REF_TABLE_FLAG 4)) + (eq! (shift OUTGOING_INST 4) EVM_INST_GT) + (vanishes! (shift [OUTGOING_DATA 1] 4)) + (eq! (* (shift [OUTGOING_DATA 2] 4) (msm-pair-size)) (prc-g1msm-prc-g2msm---num-inputs_msm-pair-size)) + (vanishes! (shift [OUTGOING_DATA 3] 4)) + (eq! (shift [OUTGOING_DATA 4] 4) 128)))) + +(defconstraint prc-g1-msm-prc-g2-msm---compute-discount (:guard (* (assumption---fresh-new-stamp) (prc-g1msm-prc-g2msm---standard-precondition))) + (if-zero (prc-g1msm-prc-g2msm---cds-is-multiple-of-msm-pair-size) + (noCall 5) + (if-not-zero (prc-g1msm-prc-g2msm---num-inputs-leq-128) + (begin (vanishes! (shift ADD_FLAG 5)) + (vanishes! (shift MOD_FLAG 5)) + (vanishes! (shift WCP_FLAG 5)) + (eq! (shift BLS_REF_TABLE_FLAG 5) 1) + (eq! (shift OUTGOING_INST 5) (wght-sum-prc-bls)) + (eq! (* (shift [OUTGOING_DATA 1] 5) (msm-pair-size)) (prc-g1msm-prc-g2msm---num-inputs_msm-pair-size)) + (vanishes! (shift [OUTGOING_DATA 2] 5)) + (vanishes! (shift [OUTGOING_DATA 3] 5)) + (vanishes! (shift [OUTGOING_DATA 4] 5))) + (begin (noCall 5) + (eq! (prc-g1msm-prc-g2msm---discount) (max-discount)))))) + +(defconstraint prc-g1msm-prc-g2msm---compare-call-gas-against-precompile-cost (:guard (* (assumption---fresh-new-stamp) (prc-g1msm-prc-g2msm---standard-precondition))) + (if-zero (prc-g1msm-prc-g2msm---cds-is-multiple-of-msm-pair-size) + (noCall 6) + (begin (vanishes! (shift ADD_FLAG 6)) + (vanishes! (shift MOD_FLAG 6)) + (eq! (shift WCP_FLAG 6) 1) + (vanishes! (shift BLS_REF_TABLE_FLAG 6)) + (eq! (shift OUTGOING_INST 6) EVM_INST_LT) + (vanishes! (shift [OUTGOING_DATA 1] 6)) + (eq! (shift [OUTGOING_DATA 2] 6) (prc---callee-gas)) + (vanishes! (shift [OUTGOING_DATA 3] 6)) + (eq! (* (shift [OUTGOING_DATA 4] 6) (msm-pair-size) PRC_BLS_MULTIPLICATION_MULTIPLIER) + (prc-g1msm-prc-g2msm---precompile-cost_msm-pair-size_PRC_BLS_MULTIPLICATION_MULTIPLIER))))) + +(defconstraint prc-g1msm-prc-g2msm---justify-hub-predictions (:guard (* (assumption---fresh-new-stamp) (prc-g1msm-prc-g2msm---standard-precondition))) + (begin (eq! (prc---hub-success) + (* (prc---cds-is-non-zero) (prc-g1msm-prc-g2msm---cds-is-multiple-of-msm-pair-size) (prc-g1msm-prc-g2msm---sufficient-gas))) + (if-zero (prc---hub-success) + (vanishes! (prc---return-gas)) + (eq! (* (prc---return-gas) (msm-pair-size) PRC_BLS_MULTIPLICATION_MULTIPLIER) + (- (* (prc---callee-gas) (msm-pair-size) PRC_BLS_MULTIPLICATION_MULTIPLIER) (prc-g1msm-prc-g2msm---precompile-cost_msm-pair-size_PRC_BLS_MULTIPLICATION_MULTIPLIER)))))) diff --git a/oob/osaka/precompiles/common/bls/bls_pairing_check.lisp b/oob/osaka/precompiles/common/bls/bls_pairing_check.lisp new file mode 100644 index 000000000..6726c251d --- /dev/null +++ b/oob/osaka/precompiles/common/bls/bls_pairing_check.lisp @@ -0,0 +1,44 @@ +(module oob) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; For BLS_PAIRING_CHECK ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (prc-blspairingcheck---standard-precondition) IS_BLS_PAIRING_CHECK) +(defun (prc-blspairingcheck---remainder) (shift OUTGOING_RES_LO 2)) +(defun (prc-blspairingcheck---cds-is-multiple-of-bls-pairing-check-pair-size) (shift OUTGOING_RES_LO 3)) +(defun (prc-blspairingcheck---insufficient-gas) (shift OUTGOING_RES_LO 4)) +(defun (prc-blspairingcheck---sufficient-gas) (- 1 (prc-blspairingcheck---insufficient-gas))) +(defun (prc-blspairingcheck---precompile-cost_PRECOMPILE_CALL_DATA_UNIT_SIZE___BLS_PAIRING_CHECK) (* (prc-blspairingcheck---cds-is-multiple-of-bls-pairing-check-pair-size) + (+ (* GAS_CONST_BLS_PAIRING_CHECK PRECOMPILE_CALL_DATA_UNIT_SIZE___BLS_PAIRING_CHECK) (* GAS_CONST_BLS_PAIRING_CHECK_PAIR (prc---cds))))) + +(defconstraint prc-blspairingcheck---mod-cds-by-PRECOMPILE_CALL_DATA_UNIT_SIZE___BLS_PAIRING_CHECK (:guard (* (assumption---fresh-new-stamp) (prc-blspairingcheck---standard-precondition))) + (call-to-MOD 2 0 (prc---cds) 0 PRECOMPILE_CALL_DATA_UNIT_SIZE___BLS_PAIRING_CHECK)) + +(defconstraint prc-blspairingcheck---check-remainder-is-zero (:guard (* (assumption---fresh-new-stamp) (prc-blspairingcheck---standard-precondition))) + (call-to-ISZERO 3 0 (prc-blspairingcheck---remainder))) + +(defconstraint prc-blspairingcheck---compare-call-gas-against-precompile-cost (:guard (* (assumption---fresh-new-stamp) (prc-blspairingcheck---standard-precondition))) + (if-zero (prc-blspairingcheck---cds-is-multiple-of-bls-pairing-check-pair-size) + (noCall 4) + (begin (vanishes! (shift ADD_FLAG 4)) + (vanishes! (shift MOD_FLAG 4)) + (eq! (shift WCP_FLAG 4) 1) + (vanishes! (shift BLS_REF_TABLE_FLAG 4)) + (eq! (shift OUTGOING_INST 4) EVM_INST_LT) + (vanishes! (shift [OUTGOING_DATA 1] 4)) + (eq! (shift [OUTGOING_DATA 2] 4) (prc---callee-gas)) + (vanishes! (shift [OUTGOING_DATA 3] 4)) + (eq! (* (shift [OUTGOING_DATA 4] 4) PRECOMPILE_CALL_DATA_UNIT_SIZE___BLS_PAIRING_CHECK) + (prc-blspairingcheck---precompile-cost_PRECOMPILE_CALL_DATA_UNIT_SIZE___BLS_PAIRING_CHECK))))) + +(defconstraint prc-blspairingcheck---justify-hub-predictions (:guard (* (assumption---fresh-new-stamp) (prc-blspairingcheck---standard-precondition))) + (begin (eq! (prc---hub-success) + (* (prc---cds-is-non-zero) (prc-blspairingcheck---cds-is-multiple-of-bls-pairing-check-pair-size) (prc-blspairingcheck---sufficient-gas))) + (if-zero (prc---hub-success) + (vanishes! (prc---return-gas)) + (eq! (* (prc---return-gas) PRECOMPILE_CALL_DATA_UNIT_SIZE___BLS_PAIRING_CHECK) + (- (* (prc---callee-gas) PRECOMPILE_CALL_DATA_UNIT_SIZE___BLS_PAIRING_CHECK) (prc-blspairingcheck---precompile-cost_PRECOMPILE_CALL_DATA_UNIT_SIZE___BLS_PAIRING_CHECK)))))) diff --git a/oob/osaka/precompiles/common/bls/point_evaluation_bls_adds_bls_maps.lisp b/oob/osaka/precompiles/common/bls/point_evaluation_bls_adds_bls_maps.lisp new file mode 100644 index 000000000..77e5de530 --- /dev/null +++ b/oob/osaka/precompiles/common/bls/point_evaluation_bls_adds_bls_maps.lisp @@ -0,0 +1,43 @@ +(module oob) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; For POINT_EVALUATION, BLS_G1_ADD, BLS_G2_ADD, BLS_MAP_FP_TO_G1, BLS_MAP_FP2_TO_G2 ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (prc-pointevaluation-prc-blsg1add-prc-blsg2add-prc-blsmapfptog1-prc-blsmapfp2tog2---standard-precondition) + (+ IS_POINT_EVALUATION + IS_BLS_G1_ADD + IS_BLS_G2_ADD + IS_BLS_MAP_FP_TO_G1 + IS_BLS_MAP_FP2_TO_G2)) +(defun (fixed-cds) + (+ (* PRECOMPILE_CALL_DATA_SIZE___POINT_EVALUATION IS_POINT_EVALUATION) + (* PRECOMPILE_CALL_DATA_SIZE___G1_ADD IS_BLS_G1_ADD) + (* PRECOMPILE_CALL_DATA_SIZE___G2_ADD IS_BLS_G2_ADD) + (* PRECOMPILE_CALL_DATA_SIZE___FP_TO_G1 IS_BLS_MAP_FP_TO_G1) + (* PRECOMPILE_CALL_DATA_SIZE___FP2_TO_G2 IS_BLS_MAP_FP2_TO_G2))) +(defun (fixed-gast-cost) + (+ (* GAS_CONST_POINT_EVALUATION IS_POINT_EVALUATION) + (* GAS_CONST_BLS_G1_ADD IS_BLS_G1_ADD) + (* GAS_CONST_BLS_G2_ADD IS_BLS_G2_ADD) + (* GAS_CONST_BLS_MAP_FP_TO_G1 IS_BLS_MAP_FP_TO_G1) + (* GAS_CONST_BLS_MAP_FP2_TO_G2 IS_BLS_MAP_FP2_TO_G2))) +(defun (prc-pointevaluation-prc-blsg1add-prc-blsg2add-prc-blsmapfptog1-prc-blsmapfp2tog2---precompile-cost) (fixed-gast-cost)) +(defun (prc-pointevaluation-prc-blsg1add-prc-blsg2add-prc-blsmapfptog1-prc-blsmapfp2tog2---valid-cds) (shift OUTGOING_RES_LO 2)) +(defun (prc-pointevaluation-prc-blsg1add-prc-blsg2add-prc-blsmapfptog1-prc-blsmapfp2tog2---sufficient-gas) (- 1 (shift OUTGOING_RES_LO 3))) + +(defconstraint prc-pointevaluation-prc-blsg1add-prc-blsg2add-prc-blsmapfptog1-prc-blsmapfp2tog2---check-cds-validity (:guard (* (assumption---fresh-new-stamp) (prc-pointevaluation-prc-blsg1add-prc-blsg2add-prc-blsmapfptog1-prc-blsmapfp2tog2---standard-precondition))) + (call-to-EQ 2 0 (prc---cds) 0 (fixed-cds))) + +(defconstraint prc-pointevaluation-prc-blsg1add-prc-blsg2add-prc-blsmapfptog1-prc-blsmapfp2tog2---compare-call-gas-against-precompile-cost (:guard (* (assumption---fresh-new-stamp) (prc-pointevaluation-prc-blsg1add-prc-blsg2add-prc-blsmapfptog1-prc-blsmapfp2tog2---standard-precondition))) + (call-to-LT 3 0 (prc---callee-gas) 0 (prc-pointevaluation-prc-blsg1add-prc-blsg2add-prc-blsmapfptog1-prc-blsmapfp2tog2---precompile-cost))) + +(defconstraint prc-pointevaluation-prc-blsg1add-prc-blsg2add-prc-blsmapfptog1-prc-blsmapfp2tog2---justify-hub-predictions (:guard (* (assumption---fresh-new-stamp) (prc-pointevaluation-prc-blsg1add-prc-blsg2add-prc-blsmapfptog1-prc-blsmapfp2tog2---standard-precondition))) + (begin (eq! (prc---hub-success) (* (prc-pointevaluation-prc-blsg1add-prc-blsg2add-prc-blsmapfptog1-prc-blsmapfp2tog2---valid-cds) (prc-pointevaluation-prc-blsg1add-prc-blsg2add-prc-blsmapfptog1-prc-blsmapfp2tog2---sufficient-gas))) + (if-zero (prc---hub-success) + (vanishes! (prc---return-gas)) + (eq! (prc---return-gas) + (- (prc---callee-gas) (prc-pointevaluation-prc-blsg1add-prc-blsg2add-prc-blsmapfptog1-prc-blsmapfp2tog2---precompile-cost)))))) diff --git a/oob/osaka/precompiles/common/common_constraints.lisp b/oob/osaka/precompiles/common/common_constraints.lisp new file mode 100644 index 000000000..a043cb4e0 --- /dev/null +++ b/oob/osaka/precompiles/common/common_constraints.lisp @@ -0,0 +1,34 @@ +(module oob) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; OOB_INST_prc_common ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (prc-common---standard-precondition) (flag-sum-prc-common)) +(defun (prc---callee-gas) [DATA 1]) +(defun (prc---cds) [DATA 2]) +(defun (prc---r@c) [DATA 3]) +(defun (prc---hub-success) [DATA 4]) +(defun (prc---ram-success) [DATA 4]) +(defun (prc---return-gas) [DATA 5]) +(defun (prc---extract-call-data) [DATA 6]) +(defun (prc---empty-call-data) [DATA 7]) +(defun (prc---r@c-nonzero) [DATA 8]) +(defun (prc---cds-is-zero) OUTGOING_RES_LO) +(defun (prc---cds-is-non-zero) (- 1 (prc---cds-is-zero))) +(defun (prc---r@c-is-zero) (next OUTGOING_RES_LO)) + +(defconstraint prc---check-cds-is-zero (:guard (* (assumption---fresh-new-stamp) (prc-common---standard-precondition))) + (call-to-ISZERO 0 0 (prc---cds))) + +(defconstraint prc---check-r@c-is-zero (:guard (* (assumption---fresh-new-stamp) (prc-common---standard-precondition))) + (call-to-ISZERO 1 0 (prc---r@c))) + +(defconstraint prc---justify-hub-predictions (:guard (* (assumption---fresh-new-stamp) (prc-common---standard-precondition))) + (begin (eq! (prc---extract-call-data) + (* (prc---hub-success) (- 1 (prc---cds-is-zero)))) + (eq! (prc---empty-call-data) (* (prc---hub-success) (prc---cds-is-zero))) + (eq! (prc---r@c-nonzero) (- 1 (prc---r@c-is-zero))))) diff --git a/oob/osaka/precompiles/common/ecpairing.lisp b/oob/osaka/precompiles/common/ecpairing.lisp new file mode 100644 index 000000000..9f15b0dcf --- /dev/null +++ b/oob/osaka/precompiles/common/ecpairing.lisp @@ -0,0 +1,43 @@ +(module oob) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; 4.4 For ECPAIRING ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (prc-ecpairing---standard-precondition) IS_ECPAIRING) +(defun (prc-ecpairing---remainder) (shift OUTGOING_RES_LO 2)) +(defun (prc-ecpairing---is-multiple_PRECOMPILE_CALL_DATA_UNIT_SIZE___ECPAIRING) (shift OUTGOING_RES_LO 3)) +(defun (prc-ecpairing---insufficient-gas) (shift OUTGOING_RES_LO 4)) +(defun (prc-ecpairing---precompile-cost_PRECOMPILE_CALL_DATA_UNIT_SIZE___ECPAIRING) (* (prc-ecpairing---is-multiple_PRECOMPILE_CALL_DATA_UNIT_SIZE___ECPAIRING) + (+ (* GAS_CONST_ECPAIRING PRECOMPILE_CALL_DATA_UNIT_SIZE___ECPAIRING) (* GAS_CONST_ECPAIRING_PAIR (prc---cds))))) + +(defconstraint prc-ecpairing---mod-cds-by-PRECOMPILE_CALL_DATA_UNIT_SIZE___ECPAIRING (:guard (* (assumption---fresh-new-stamp) (prc-ecpairing---standard-precondition))) + (call-to-MOD 2 0 (prc---cds) 0 PRECOMPILE_CALL_DATA_UNIT_SIZE___ECPAIRING)) + +(defconstraint prc-ecpairing---check-remainder-is-zero (:guard (* (assumption---fresh-new-stamp) (prc-ecpairing---standard-precondition))) + (call-to-ISZERO 3 0 (prc-ecpairing---remainder))) + +(defconstraint prc-ecpairing---compare-call-gas-against-precompile-cost (:guard (* (assumption---fresh-new-stamp) (prc-ecpairing---standard-precondition))) + (if-zero (prc-ecpairing---is-multiple_PRECOMPILE_CALL_DATA_UNIT_SIZE___ECPAIRING) + (noCall 4) + (begin (vanishes! (shift ADD_FLAG 4)) + (vanishes! (shift MOD_FLAG 4)) + (eq! (shift WCP_FLAG 4) 1) + (vanishes! (shift BLS_REF_TABLE_FLAG 4)) + (eq! (shift OUTGOING_INST 4) EVM_INST_LT) + (vanishes! (shift [OUTGOING_DATA 1] 4)) + (eq! (shift [OUTGOING_DATA 2] 4) (prc---callee-gas)) + (vanishes! (shift [OUTGOING_DATA 3] 4)) + (eq! (* (shift [OUTGOING_DATA 4] 4) PRECOMPILE_CALL_DATA_UNIT_SIZE___ECPAIRING) + (prc-ecpairing---precompile-cost_PRECOMPILE_CALL_DATA_UNIT_SIZE___ECPAIRING))))) + +(defconstraint prc-ecpairing---justify-hub-predictions (:guard (* (assumption---fresh-new-stamp) (prc-ecpairing---standard-precondition))) + (begin (eq! (prc---hub-success) + (* (prc-ecpairing---is-multiple_PRECOMPILE_CALL_DATA_UNIT_SIZE___ECPAIRING) (- 1 (prc-ecpairing---insufficient-gas)))) + (if-zero (prc---hub-success) + (vanishes! (prc---return-gas)) + (eq! (* (prc---return-gas) PRECOMPILE_CALL_DATA_UNIT_SIZE___ECPAIRING) + (- (* (prc---callee-gas) PRECOMPILE_CALL_DATA_UNIT_SIZE___ECPAIRING) (prc-ecpairing---precompile-cost_PRECOMPILE_CALL_DATA_UNIT_SIZE___ECPAIRING)))))) diff --git a/oob/osaka/precompiles/common/ecrecover_ecadd_ecmul.lisp b/oob/osaka/precompiles/common/ecrecover_ecadd_ecmul.lisp new file mode 100644 index 000000000..72706a802 --- /dev/null +++ b/oob/osaka/precompiles/common/ecrecover_ecadd_ecmul.lisp @@ -0,0 +1,22 @@ +(module oob) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; For ECRECOVER, ECADD, ECMUL ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (prc-ecrecover-prc-ecadd-prc-ecmul---standard-precondition) (+ IS_ECRECOVER IS_ECADD IS_ECMUL)) +(defun (prc-ecrecover-prc-ecadd-prc-ecmul---precompile-cost) (+ (* GAS_CONST_ECRECOVER IS_ECRECOVER) (* GAS_CONST_ECADD IS_ECADD) (* GAS_CONST_ECMUL IS_ECMUL))) +(defun (prc-ecrecover-prc-ecadd-prc-ecmul---insufficient-gas) (shift OUTGOING_RES_LO 2)) + +(defconstraint prc-ecrecover-prc-ecadd-prc-ecmul---compare-call-gas-against-precompile-cost (:guard (* (assumption---fresh-new-stamp) (prc-ecrecover-prc-ecadd-prc-ecmul---standard-precondition))) + (call-to-LT 2 0 (prc---callee-gas) 0 (prc-ecrecover-prc-ecadd-prc-ecmul---precompile-cost))) + +(defconstraint prc-ecrecover-prc-ecadd-prc-ecmul---justify-hub-predictions (:guard (* (assumption---fresh-new-stamp) (prc-ecrecover-prc-ecadd-prc-ecmul---standard-precondition))) + (begin (eq! (prc---hub-success) (- 1 (prc-ecrecover-prc-ecadd-prc-ecmul---insufficient-gas))) + (if-zero (prc---hub-success) + (vanishes! (prc---return-gas)) + (eq! (prc---return-gas) + (- (prc---callee-gas) (prc-ecrecover-prc-ecadd-prc-ecmul---precompile-cost)))))) diff --git a/oob/osaka/precompiles/common/sha2_ripemd_identity.lisp b/oob/osaka/precompiles/common/sha2_ripemd_identity.lisp new file mode 100644 index 000000000..b546709ee --- /dev/null +++ b/oob/osaka/precompiles/common/sha2_ripemd_identity.lisp @@ -0,0 +1,31 @@ +(module oob) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; For SHA2-256, RIPEMD-160, IDENTITY ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (prc-sha2-prc-ripemd-prc-identity---standard-precondition) (+ IS_SHA2 IS_RIPEMD IS_IDENTITY)) +(defun (prc-sha2-prc-ripemd-prc-identity---ceil) (shift OUTGOING_RES_LO 2)) +(defun (prc-sha2-prc-ripemd-prc-identity---insufficient-gas) (shift OUTGOING_RES_LO 3)) +(defun (prc-sha2-prc-ripemd-prc-identity---sha2-cost) (+ GAS_CONST_SHA2 (* GAS_CONST_SHA2_WORD (prc-sha2-prc-ripemd-prc-identity---ceil)))) +(defun (prc-sha2-prc-ripemd-prc-identity---ripemd-cost) (+ GAS_CONST_RIPEMD (* GAS_CONST_RIPEMD_WORD (prc-sha2-prc-ripemd-prc-identity---ceil)))) +(defun (prc-sha2-prc-ripemd-prc-identity---identity-cost) (+ GAS_CONST_IDENTITY (* GAS_CONST_IDENTITY_WORD (prc-sha2-prc-ripemd-prc-identity---ceil)))) +(defun (prc-sha2-prc-ripemd-prc-identity---precompile-cost) (+ (* (prc-sha2-prc-ripemd-prc-identity---sha2-cost) IS_SHA2 ) + (* (prc-sha2-prc-ripemd-prc-identity---ripemd-cost) IS_RIPEMD ) + (* (prc-sha2-prc-ripemd-prc-identity---identity-cost) IS_IDENTITY))) + +(defconstraint prc-sha2-prc-ripemd-prc-identity---div-cds-plus-31-by-32 (:guard (* (assumption---fresh-new-stamp) (prc-sha2-prc-ripemd-prc-identity---standard-precondition))) + (call-to-DIV 2 0 (+ (prc---cds) 31) 0 32)) + +(defconstraint prc-sha2-prc-ripemd-prc-identity---compare-call-gas-against-precompile-cost (:guard (* (assumption---fresh-new-stamp) (prc-sha2-prc-ripemd-prc-identity---standard-precondition))) + (call-to-LT 3 0 (prc---callee-gas) 0 (prc-sha2-prc-ripemd-prc-identity---precompile-cost))) + +(defconstraint prc-sha2-prc-ripemd-prc-identity---justify-hub-predictions (:guard (* (assumption---fresh-new-stamp) (prc-sha2-prc-ripemd-prc-identity---standard-precondition))) + (begin (eq! (prc---hub-success) (- 1 (prc-sha2-prc-ripemd-prc-identity---insufficient-gas))) + (if-zero (prc---hub-success) + (vanishes! (prc---return-gas)) + (eq! (prc---return-gas) + (- (prc---callee-gas) (prc-sha2-prc-ripemd-prc-identity---precompile-cost)))))) diff --git a/oob/osaka/precompiles/modexp/cds.lisp b/oob/osaka/precompiles/modexp/cds.lisp new file mode 100644 index 000000000..77900cae5 --- /dev/null +++ b/oob/osaka/precompiles/modexp/cds.lisp @@ -0,0 +1,28 @@ +(module oob) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; OOB_INST_MODEXP_cds ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (prc-modexp-cds---standard-precondition) IS_MODEXP_CDS) +(defun (prc-modexp-cds---extract-bbs) [DATA 3]) +(defun (prc-modexp-cds---extract-ebs) [DATA 4]) +(defun (prc-modexp-cds---extract-mbs) [DATA 5]) + +(defconstraint prc-modexp-cds---compare-0-against-cds (:guard (* (assumption---fresh-new-stamp) (prc-modexp-cds---standard-precondition))) + (call-to-LT 0 0 0 0 (prc---cds))) + +(defconstraint prc-modexp-cds---compare-32-against-cds (:guard (* (assumption---fresh-new-stamp) (prc-modexp-cds---standard-precondition))) + (call-to-LT 1 0 32 0 (prc---cds))) + +(defconstraint prc-modexp-cds---compare-64-against-cds (:guard (* (assumption---fresh-new-stamp) (prc-modexp-cds---standard-precondition))) + (call-to-LT 2 0 64 0 (prc---cds))) + +(defconstraint prc-modexp-cds---justify-hub-predictions (:guard (* (assumption---fresh-new-stamp) (prc-modexp-cds---standard-precondition))) + (begin (eq! (prc-modexp-cds---extract-bbs) OUTGOING_RES_LO) + (eq! (prc-modexp-cds---extract-ebs) (next OUTGOING_RES_LO)) + (eq! (prc-modexp-cds---extract-mbs) (shift OUTGOING_RES_LO 2)))) + diff --git a/oob/osaka/precompiles/modexp/extract.lisp b/oob/osaka/precompiles/modexp/extract.lisp new file mode 100644 index 000000000..2fef0cf65 --- /dev/null +++ b/oob/osaka/precompiles/modexp/extract.lisp @@ -0,0 +1,41 @@ +(module oob) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; OOB_INST_MODEXP_extract ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (prc-modexp-extract---standard-precondition) IS_MODEXP_EXTRACT) +(defun (prc-modexp-extract---bbs) [DATA 3]) +(defun (prc-modexp-extract---ebs) [DATA 4]) +(defun (prc-modexp-extract---mbs) [DATA 5]) +(defun (prc-modexp-extract---extract-base) [DATA 6]) +(defun (prc-modexp-extract---extract-exponent) [DATA 7]) +(defun (prc-modexp-extract---extract-modulus) [DATA 8]) +(defun (prc-modexp-extract---bbs-is-zero) OUTGOING_RES_LO) +(defun (prc-modexp-extract---ebs-is-zero) (next OUTGOING_RES_LO)) +(defun (prc-modexp-extract---mbs-is-zero) (shift OUTGOING_RES_LO 2)) +(defun (prc-modexp-extract---call-data-extends-beyond-exponent) (shift OUTGOING_RES_LO 3)) + +(defconstraint prc-modexp-extract---check-bbs-is-zero (:guard (* (assumption---fresh-new-stamp) (prc-modexp-extract---standard-precondition))) + (call-to-ISZERO 0 0 (prc-modexp-extract---bbs))) + +(defconstraint prc-modexp-extract---check-ebs-is-zero (:guard (* (assumption---fresh-new-stamp) (prc-modexp-extract---standard-precondition))) + (call-to-ISZERO 1 0 (prc-modexp-extract---ebs))) + +(defconstraint prc-modexp-extract---check-mbs-is-zero (:guard (* (assumption---fresh-new-stamp) (prc-modexp-extract---standard-precondition))) + (call-to-ISZERO 2 0 (prc-modexp-extract---mbs))) + +(defconstraint prc-modexp-extract---compare-96-plus-bbs-plus-ebs-against-cds (:guard (* (assumption---fresh-new-stamp) (prc-modexp-extract---standard-precondition))) + (call-to-LT 3 0 (+ 96 (prc-modexp-extract---bbs) (prc-modexp-extract---ebs)) 0 (prc---cds))) + +(defconstraint prc-modexp-extract---justify-hub-predictions (:guard (* (assumption---fresh-new-stamp) (prc-modexp-extract---standard-precondition))) + (begin (eq! (prc-modexp-extract---extract-modulus) + (* (prc-modexp-extract---call-data-extends-beyond-exponent) + (- 1 (prc-modexp-extract---mbs-is-zero)))) + (eq! (prc-modexp-extract---extract-base) + (* (prc-modexp-extract---extract-modulus) (- 1 (prc-modexp-extract---bbs-is-zero)))) + (eq! (prc-modexp-extract---extract-exponent) + (* (prc-modexp-extract---extract-modulus) (- 1 (prc-modexp-extract---ebs-is-zero)))))) diff --git a/oob/osaka/precompiles/modexp/lead.lisp b/oob/osaka/precompiles/modexp/lead.lisp new file mode 100644 index 000000000..d02040e00 --- /dev/null +++ b/oob/osaka/precompiles/modexp/lead.lisp @@ -0,0 +1,54 @@ +(module oob) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; OOB_INST_MODEXP_lead ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (prc-modexp-lead---standard-precondition) IS_MODEXP_LEAD) +(defun (prc-modexp-lead---bbs) [DATA 1]) +(defun (prc-modexp-lead---ebs) [DATA 3]) +(defun (prc-modexp-lead---load-lead) [DATA 4]) +(defun (prc-modexp-lead---cds-cutoff) [DATA 6]) +(defun (prc-modexp-lead---ebs-cutoff) [DATA 7]) +(defun (prc-modexp-lead---sub-ebs_32) [DATA 8]) +(defun (prc-modexp-lead---ebs-is-zero) OUTGOING_RES_LO) +(defun (prc-modexp-lead---ebs-less-than_32) (next OUTGOING_RES_LO)) +(defun (prc-modexp-lead---call-data-contains-exponent-bytes) (shift OUTGOING_RES_LO 2)) +(defun (prc-modexp-lead---comp) (shift OUTGOING_RES_LO 3)) + +(defconstraint prc-modexp-lead---check-ebs-is-zero (:guard (* (assumption---fresh-new-stamp) (prc-modexp-lead---standard-precondition))) + (call-to-ISZERO 0 0 (prc-modexp-lead---ebs))) + +(defconstraint prc-modexp-lead---compare-ebs-against-32 (:guard (* (assumption---fresh-new-stamp) (prc-modexp-lead---standard-precondition))) + (call-to-LT 1 0 (prc-modexp-lead---ebs) 0 32)) + +(defconstraint prc-modexp-lead---compare-ebs-against-cds (:guard (* (assumption---fresh-new-stamp) (prc-modexp-lead---standard-precondition))) + (call-to-LT 2 0 (+ 96 (prc-modexp-lead---bbs)) 0 (prc---cds))) + +(defconstraint prc-modexp-lead---compare-cds-minus-96-plus-bbs-against-32 (:guard (* (assumption---fresh-new-stamp) (prc-modexp-lead---standard-precondition))) + (if-not-zero (prc-modexp-lead---call-data-contains-exponent-bytes) + (call-to-LT 3 + 0 + (- (prc---cds) (+ 96 (prc-modexp-lead---bbs))) + 0 + 32))) + +(defconstraint prc-modexp-lead---justify-hub-predictions (:guard (* (assumption---fresh-new-stamp) (prc-modexp-lead---standard-precondition))) + (begin (eq! (prc-modexp-lead---load-lead) + (* (prc-modexp-lead---call-data-contains-exponent-bytes) + (- 1 (prc-modexp-lead---ebs-is-zero)))) + (if-zero (prc-modexp-lead---call-data-contains-exponent-bytes) + (vanishes! (prc-modexp-lead---cds-cutoff)) + (if-zero (prc-modexp-lead---comp) + (eq! (prc-modexp-lead---cds-cutoff) 32) + (eq! (prc-modexp-lead---cds-cutoff) + (- (prc---cds) (+ 96 (prc-modexp-lead---bbs)))))) + (if-zero (prc-modexp-lead---ebs-less-than_32) + (eq! (prc-modexp-lead---ebs-cutoff) 32) + (eq! (prc-modexp-lead---ebs-cutoff) (prc-modexp-lead---ebs))) + (if-zero (prc-modexp-lead---ebs-less-than_32) + (eq! (prc-modexp-lead---sub-ebs_32) (- (prc-modexp-lead---ebs) 32)) + (vanishes! (prc-modexp-lead---sub-ebs_32))))) diff --git a/oob/osaka/precompiles/modexp/pricing.lisp b/oob/osaka/precompiles/modexp/pricing.lisp new file mode 100644 index 000000000..6efc25567 --- /dev/null +++ b/oob/osaka/precompiles/modexp/pricing.lisp @@ -0,0 +1,53 @@ +(module oob) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; OOB_INST_MODEXP_pricing ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (prc-modexp-pricing---standard-precondition) IS_MODEXP_PRICING) +(defun (prc-modexp-pricing---exponent-log) [DATA 6]) +(defun (prc-modexp-pricing---max-xbs-ybs) [DATA 7]) +(defun (prc-modexp-pricing---exponent-log-is-zero) (next OUTGOING_RES_LO)) +(defun (prc-modexp-pricing---f-of-max) (* (shift OUTGOING_RES_LO 2) (shift OUTGOING_RES_LO 2))) +(defun (prc-modexp-pricing---big-quotient) (shift OUTGOING_RES_LO 3)) +(defun (prc-modexp-pricing---big-quotient_LT_GAS_CONST_MODEXP) (shift OUTGOING_RES_LO 4)) +(defun (prc-modexp-pricing---big-numerator) (if-zero (prc-modexp-pricing---exponent-log-is-zero) + (* (prc-modexp-pricing---f-of-max) (prc-modexp-pricing---exponent-log)) + (prc-modexp-pricing---f-of-max))) +(defun (prc-modexp-pricing---precompile-cost) (if-zero (prc-modexp-pricing---big-quotient_LT_GAS_CONST_MODEXP) + (prc-modexp-pricing---big-quotient) + GAS_CONST_MODEXP)) + +(defconstraint prc-modexp-pricing---check--is-zero (:guard (* (assumption---fresh-new-stamp) (prc-modexp-pricing---standard-precondition))) + (call-to-ISZERO 0 0 (prc---r@c))) + +(defconstraint prc-modexp-pricing---check-exponent-log-is-zero (:guard (* (assumption---fresh-new-stamp) (prc-modexp-pricing---standard-precondition))) + (call-to-ISZERO 1 0 (prc-modexp-pricing---exponent-log))) + +(defconstraint prc-modexp-pricing---div-max-xbs-ybs-plus-7-by-8 (:guard (* (assumption---fresh-new-stamp) (prc-modexp-pricing---standard-precondition))) + (call-to-DIV 2 + 0 + (+ (prc-modexp-pricing---max-xbs-ybs) 7) + 0 + 8)) + +(defconstraint prc-modexp-pricing---div-big-numerator-by-quaddivisor (:guard (* (assumption---fresh-new-stamp) (prc-modexp-pricing---standard-precondition))) + (call-to-DIV 3 0 (prc-modexp-pricing---big-numerator) 0 G_QUADDIVISOR)) + +(defconstraint prc-modexp-pricing---compare-big-quotient-against-GAS_CONST_MODEXP (:guard (* (assumption---fresh-new-stamp) (prc-modexp-pricing---standard-precondition))) + (call-to-LT 4 0 (prc-modexp-pricing---big-quotient) 0 GAS_CONST_MODEXP)) + +(defconstraint prc-modexp-pricing---compare-call-gas-against-precompile-cost (:guard (* (assumption---fresh-new-stamp) (prc-modexp-pricing---standard-precondition))) + (call-to-LT 5 0 (prc---callee-gas) 0 (prc-modexp-pricing---precompile-cost))) + +(defconstraint prc-modexp-pricing---justify-hub-predictions (:guard (* (assumption---fresh-new-stamp) (prc-modexp-pricing---standard-precondition))) + (begin (eq! (prc---ram-success) + (- 1 (shift OUTGOING_RES_LO 5))) + (if-zero (prc---ram-success) + (vanishes! (prc---return-gas)) + (eq! (prc---return-gas) (- (prc---callee-gas) (prc-modexp-pricing---precompile-cost)))) + (eq! (prc---r@c-nonzero) (- 1 OUTGOING_RES_LO)))) + diff --git a/oob/osaka/precompiles/modexp/xbs.lisp b/oob/osaka/precompiles/modexp/xbs.lisp new file mode 100644 index 000000000..fbaaf481a --- /dev/null +++ b/oob/osaka/precompiles/modexp/xbs.lisp @@ -0,0 +1,41 @@ +(module oob) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; OOB_INST_MODEXP_xbs ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (prc-modexp-xbs---standard-precondition) IS_MODEXP_XBS) +(defun (prc-modexp-xbs---xbs-hi) [DATA 1]) +(defun (prc-modexp-xbs---xbs-lo) [DATA 2]) +(defun (prc-modexp-xbs---ybs-lo) [DATA 3]) +(defun (prc-modexp-xbs---compute-max) [DATA 4]) +(defun (prc-modexp-xbs---max-xbs-ybs) [DATA 7]) +(defun (prc-modexp-xbs---xbs-nonzero) [DATA 8]) +(defun (prc-modexp-xbs---compo-to_512) OUTGOING_RES_LO) +(defun (prc-modexp-xbs---comp) (next OUTGOING_RES_LO)) + +(defconstraint prc-modexp-xbs---compare-xbs-hi-against-513 (:guard (* (assumption---fresh-new-stamp) (prc-modexp-xbs---standard-precondition))) + (call-to-LT 0 (prc-modexp-xbs---xbs-hi) (prc-modexp-xbs---xbs-lo) 0 513)) + +(defconstraint prc-modexp-xbs---compare-xbs-against-ybs (:guard (* (assumption---fresh-new-stamp) (prc-modexp-xbs---standard-precondition))) + (call-to-LT 1 0 (prc-modexp-xbs---xbs-lo) 0 (prc-modexp-xbs---ybs-lo))) + +(defconstraint prc-modexp-xbs---check-xbs-is-zero (:guard (* (assumption---fresh-new-stamp) (prc-modexp-xbs---standard-precondition))) + (call-to-ISZERO 2 0 (prc-modexp-xbs---xbs-lo))) + +(defconstraint additional-prc-modexp-xbs (:guard (* (assumption---fresh-new-stamp) (prc-modexp-xbs---standard-precondition))) + (begin (or! (eq! 0 (prc-modexp-xbs---compute-max)) (eq! 1 (prc-modexp-xbs---compute-max))) + (eq! (prc-modexp-xbs---compo-to_512) 1))) + +(defconstraint prc-modexp-xbs---justify-hub-predictions (:guard (* (assumption---fresh-new-stamp) (prc-modexp-xbs---standard-precondition))) + (if-zero (prc-modexp-xbs---compute-max) + (begin (vanishes! (prc-modexp-xbs---max-xbs-ybs)) + (vanishes! (prc-modexp-xbs---xbs-nonzero))) + (begin (eq! (prc-modexp-xbs---xbs-nonzero) + (- 1 (shift OUTGOING_RES_LO 2))) + (if-zero (prc-modexp-xbs---comp) + (eq! (prc-modexp-xbs---max-xbs-ybs) (prc-modexp-xbs---xbs-lo)) + (eq! (prc-modexp-xbs---max-xbs-ybs) (prc-modexp-xbs---ybs-lo)))))) diff --git a/oob/osaka/shorthands.lisp b/oob/osaka/shorthands.lisp new file mode 100644 index 000000000..fe5b3d10f --- /dev/null +++ b/oob/osaka/shorthands.lisp @@ -0,0 +1,162 @@ +(module oob) + + +(defun (flag-sum-inst) (+ IS_JUMP IS_JUMPI + IS_RDC + IS_CDL + IS_XCALL + IS_CALL + IS_XCREATE + IS_CREATE + IS_SSTORE + IS_DEPLOYMENT)) + +(defun (flag-sum-prc-common) (+ IS_ECRECOVER + IS_SHA2 + IS_RIPEMD + IS_IDENTITY + IS_ECADD + IS_ECMUL + IS_ECPAIRING + (flag-sum-prc-bls))) + +(defun (flag-sum-prc-blake) (+ IS_BLAKE2F_CDS + IS_BLAKE2F_PARAMS)) + +(defun (flag-sum-prc-modexp) (+ IS_MODEXP_CDS + IS_MODEXP_XBS + IS_MODEXP_LEAD + IS_MODEXP_PRICING + IS_MODEXP_EXTRACT)) + +(defun (flag-sum-eip-blob-transactions) IS_POINT_EVALUATION) + +(defun (flag-sum-eip-bls12-precompiles) (+ IS_BLS_G1_ADD + IS_BLS_G1_MSM + IS_BLS_G2_ADD + IS_BLS_G2_MSM + IS_BLS_PAIRING_CHECK + IS_BLS_MAP_FP_TO_G1 + IS_BLS_MAP_FP2_TO_G2)) + +(defun (flag-sum-prc-bls) (+ (flag-sum-eip-blob-transactions) + (flag-sum-eip-bls12-precompiles))) + +(defun (flag-sum-prc) (+ (flag-sum-prc-common) + (flag-sum-prc-blake) + (flag-sum-prc-modexp))) + +(defun (flag-sum) (+ (flag-sum-inst) + (flag-sum-prc))) + +(defun (wght-sum-inst) (+ (* OOB_INST_JUMP IS_JUMP) + (* OOB_INST_JUMPI IS_JUMPI) + (* OOB_INST_RDC IS_RDC) + (* OOB_INST_CDL IS_CDL) + (* OOB_INST_XCALL IS_XCALL) + (* OOB_INST_CALL IS_CALL) + (* OOB_INST_XCREATE IS_XCREATE) + (* OOB_INST_CREATE IS_CREATE) + (* OOB_INST_SSTORE IS_SSTORE) + (* OOB_INST_DEPLOYMENT IS_DEPLOYMENT))) + +(defun (wght-sum-prc-common) (+ (* OOB_INST_ECRECOVER IS_ECRECOVER) + (* OOB_INST_SHA2 IS_SHA2) + (* OOB_INST_RIPEMD IS_RIPEMD) + (* OOB_INST_IDENTITY IS_IDENTITY) + (* OOB_INST_ECADD IS_ECADD) + (* OOB_INST_ECMUL IS_ECMUL) + (* OOB_INST_ECPAIRING IS_ECPAIRING) + (wght-sum-prc-bls))) + +(defun (wght-sum-prc-blake) (+ (* OOB_INST_BLAKE_CDS IS_BLAKE2F_CDS) + (* OOB_INST_BLAKE_PARAMS IS_BLAKE2F_PARAMS))) + +(defun (wght-sum-prc-modexp) (+ (* OOB_INST_MODEXP_CDS IS_MODEXP_CDS) + (* OOB_INST_MODEXP_XBS IS_MODEXP_XBS) + (* OOB_INST_MODEXP_LEAD IS_MODEXP_LEAD) + (* OOB_INST_MODEXP_PRICING IS_MODEXP_PRICING) + (* OOB_INST_MODEXP_EXTRACT IS_MODEXP_EXTRACT))) + +(defun (wght-sum-prc-eip-blob-transactions) (+ (* OOB_INST_POINT_EVALUATION IS_POINT_EVALUATION))) + +(defun (wght-sum-prc-eip-bls12-precompiles) (+ (* OOB_INST_BLS_G1_ADD IS_BLS_G1_ADD) + (* OOB_INST_BLS_G1_MSM IS_BLS_G1_MSM) + (* OOB_INST_BLS_G2_ADD IS_BLS_G2_ADD) + (* OOB_INST_BLS_G2_MSM IS_BLS_G2_MSM) + (* OOB_INST_BLS_PAIRING_CHECK IS_BLS_PAIRING_CHECK) + (* OOB_INST_BLS_MAP_FP_TO_G1 IS_BLS_MAP_FP_TO_G1) + (* OOB_INST_BLS_MAP_FP2_TO_G2 IS_BLS_MAP_FP2_TO_G2))) + +(defun (wght-sum-prc-bls) (+ (wght-sum-prc-eip-blob-transactions) + (wght-sum-prc-eip-bls12-precompiles))) + +(defun (wght-sum-prc) (+ (wght-sum-prc-common) + (wght-sum-prc-blake) + (wght-sum-prc-modexp))) + +(defun (wght-sum) (+ (wght-sum-inst) + (wght-sum-prc))) + +(defun (maxct-sum-inst) (+ (* CT_MAX_JUMP IS_JUMP) + (* CT_MAX_JUMPI IS_JUMPI) + (* CT_MAX_RDC IS_RDC) + (* CT_MAX_CDL IS_CDL) + (* CT_MAX_XCALL IS_XCALL) + (* CT_MAX_CALL IS_CALL) + (* CT_MAX_XCREATE IS_XCREATE) + (* CT_MAX_CREATE IS_CREATE) + (* CT_MAX_SSTORE IS_SSTORE) + (* CT_MAX_DEPLOYMENT IS_DEPLOYMENT))) + +(defun (maxct-sum-prc-common) (+ (* CT_MAX_ECRECOVER IS_ECRECOVER) + (* CT_MAX_SHA2 IS_SHA2) + (* CT_MAX_RIPEMD IS_RIPEMD) + (* CT_MAX_IDENTITY IS_IDENTITY) + (* CT_MAX_ECADD IS_ECADD) + (* CT_MAX_ECMUL IS_ECMUL) + (* CT_MAX_ECPAIRING IS_ECPAIRING) + (maxct-sum-prc-bls))) + +(defun (maxct-sum-prc-blake) (+ (* CT_MAX_BLAKE2F_CDS IS_BLAKE2F_CDS) + (* CT_MAX_BLAKE2F_PARAMS IS_BLAKE2F_PARAMS))) + +(defun (maxct-sum-prc-modexp) (+ (* CT_MAX_MODEXP_CDS IS_MODEXP_CDS) + (* CT_MAX_MODEXP_XBS IS_MODEXP_XBS) + (* CT_MAX_MODEXP_LEAD IS_MODEXP_LEAD) + (* CT_MAX_MODEXP_PRICING IS_MODEXP_PRICING) + (* CT_MAX_MODEXP_EXTRACT IS_MODEXP_EXTRACT))) + +(defun (maxct-sum-prc-eip-blob-transactions)(+ (* CT_MAX_POINT_EVALUATION IS_POINT_EVALUATION))) + +(defun (maxct-sum-prc-eip-bls12-precompiles)(+ (* CT_MAX_BLS_G1_ADD IS_BLS_G1_ADD) + (* CT_MAX_BLS_G1_MSM IS_BLS_G1_MSM) + (* CT_MAX_BLS_G2_ADD IS_BLS_G2_ADD) + (* CT_MAX_BLS_G2_MSM IS_BLS_G2_MSM) + (* CT_MAX_BLS_PAIRING_CHECK IS_BLS_PAIRING_CHECK) + (* CT_MAX_BLS_MAP_FP_TO_G1 IS_BLS_MAP_FP_TO_G1) + (* CT_MAX_BLS_MAP_FP2_TO_G2 IS_BLS_MAP_FP2_TO_G2))) + +(defun (maxct-sum-prc-bls) (+ (maxct-sum-prc-eip-blob-transactions) + (maxct-sum-prc-eip-bls12-precompiles))) + +(defun (maxct-sum-prc) (+ (maxct-sum-prc-common) + (maxct-sum-prc-blake) + (maxct-sum-prc-modexp))) + +(defun (maxct-sum) (+ (maxct-sum-inst) + (maxct-sum-prc))) + +(defun (lookup-sum k) (+ (shift ADD_FLAG k) + (shift MOD_FLAG k) + (shift WCP_FLAG k) + (shift BLS_REF_TABLE_FLAG k))) + +(defun (wght-lookup-sum k) (+ (* 1 (shift ADD_FLAG k)) + (* 2 (shift MOD_FLAG k)) + (* 3 (shift WCP_FLAG k)) + (* 4 (shift BLS_REF_TABLE_FLAG k)))) + +(defun (assumption---fresh-new-stamp) (- STAMP (prev STAMP))) + +;; TODO: change maxct ot ct-max diff --git a/oob/osaka/specialized.lisp b/oob/osaka/specialized.lisp new file mode 100644 index 000000000..12fca7eff --- /dev/null +++ b/oob/osaka/specialized.lisp @@ -0,0 +1,64 @@ +(module oob) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; 2.6 Constraint systems ;; +;; for populating lookups ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;; support function to improve to reduce code duplication in the functions below +(defun (set-args k arg_1_hi arg_1_lo arg_2_hi arg_2_lo) + (begin (eq! (shift [OUTGOING_DATA 1] k) arg_1_hi) + (eq! (shift [OUTGOING_DATA 2] k) arg_1_lo) + (eq! (shift [OUTGOING_DATA 3] k) arg_2_hi) + (eq! (shift [OUTGOING_DATA 4] k) arg_2_lo))) + +(defun (call-to-ADD k arg_1_hi arg_1_lo arg_2_hi arg_2_lo) + (begin (eq! (wght-lookup-sum k) 1) + (eq! (shift OUTGOING_INST k) EVM_INST_ADD) + (set-args k arg_1_hi arg_1_lo arg_2_hi arg_2_lo))) + +(defun (call-to-DIV k arg_1_hi arg_1_lo arg_2_hi arg_2_lo) + (begin (eq! (wght-lookup-sum k) 2) + (eq! (shift OUTGOING_INST k) EVM_INST_DIV) + (set-args k arg_1_hi arg_1_lo arg_2_hi arg_2_lo))) + +(defun (call-to-MOD k arg_1_hi arg_1_lo arg_2_hi arg_2_lo) + (begin (eq! (wght-lookup-sum k) 2) + (eq! (shift OUTGOING_INST k) EVM_INST_MOD) + (set-args k arg_1_hi arg_1_lo arg_2_hi arg_2_lo))) + +(defun (call-to-LT k arg_1_hi arg_1_lo arg_2_hi arg_2_lo) + (begin (eq! (wght-lookup-sum k) 3) + (eq! (shift OUTGOING_INST k) EVM_INST_LT) + (set-args k arg_1_hi arg_1_lo arg_2_hi arg_2_lo))) + +(defun (call-to-GT k arg_1_hi arg_1_lo arg_2_hi arg_2_lo) + (begin (eq! (wght-lookup-sum k) 3) + (eq! (shift OUTGOING_INST k) EVM_INST_GT) + (set-args k arg_1_hi arg_1_lo arg_2_hi arg_2_lo))) + +(defun (call-to-EQ k arg_1_hi arg_1_lo arg_2_hi arg_2_lo) + (begin (eq! (wght-lookup-sum k) 3) + (eq! (shift OUTGOING_INST k) EVM_INST_EQ) + (set-args k arg_1_hi arg_1_lo arg_2_hi arg_2_lo))) + +(defun (call-to-ISZERO k arg_1_hi arg_1_lo) + (begin (eq! (wght-lookup-sum k) 3) + (eq! (shift OUTGOING_INST k) EVM_INST_ISZERO) + (eq! (shift [OUTGOING_DATA 1] k) arg_1_hi) + (eq! (shift [OUTGOING_DATA 2] k) arg_1_lo) + (debug (vanishes! (shift [OUTGOING_DATA 3] k))) + (debug (vanishes! (shift [OUTGOING_DATA 4] k))))) + +(defun (call-to-bls-ref-table k prc_name num_inputs) + (begin (eq! (wght-lookup-sum k) 4) + (eq! (shift OUTGOING_INST k) prc_name) + (eq! (shift [OUTGOING_DATA 1] k) num_inputs) + (debug (eq! (shift [OUTGOING_DATA 2] k) 0)) + (debug (eq! (shift [OUTGOING_DATA 3] k) 0)) + (debug (eq! (shift [OUTGOING_DATA 4] k) 0)))) + +(defun (noCall k) + (begin (eq! (wght-lookup-sum k) 0))) diff --git a/rlptxrcpt/columns.lisp b/rlptxrcpt/london/columns.lisp similarity index 100% rename from rlptxrcpt/columns.lisp rename to rlptxrcpt/london/columns.lisp diff --git a/rlptxrcpt/constants.lisp b/rlptxrcpt/london/constants.lisp similarity index 100% rename from rlptxrcpt/constants.lisp rename to rlptxrcpt/london/constants.lisp diff --git a/rlptxrcpt/constraints.lisp b/rlptxrcpt/london/constraints.lisp similarity index 100% rename from rlptxrcpt/constraints.lisp rename to rlptxrcpt/london/constraints.lisp diff --git a/rlptxrcpt/osaka/columns.lisp b/rlptxrcpt/osaka/columns.lisp new file mode 100644 index 000000000..a61887f48 --- /dev/null +++ b/rlptxrcpt/osaka/columns.lisp @@ -0,0 +1,42 @@ +(module rlptxrcpt) + +(defcolumns + (ABS_TX_NUM :i32) + (ABS_TX_NUM_MAX :i32) + (ABS_LOG_NUM :i32) + (ABS_LOG_NUM_MAX :i32) + (LIMB :i128 :display :bytes) + (nBYTES :i5) + (LIMB_CONSTRUCTED :binary@prove) + (INDEX :i24) + (INDEX_LOCAL :i24) + (PHASE :binary@prove :array [5]) + (PHASE_END :binary@prove) + (COUNTER :i32) + (nSTEP :i32) + (DONE :binary) + (TXRCPT_SIZE :i32) + (INPUT :i128 :display :bytes :array [4]) + (BYTE :byte@prove :array [4]) + (ACC :i128 :display :bytes :array [4]) + (ACC_SIZE :i5) + (BIT :binary@prove) + (BIT_ACC :byte) + (POWER :i128) + (IS_PREFIX :binary@prove) + (LC_CORRECTION :binary@prove) + (PHASE_SIZE :i32) + (DEPTH_1 :binary@prove) + (IS_TOPIC :binary@prove) + (IS_DATA :binary@prove) + (LOG_ENTRY_SIZE :i32) + (LOCAL_SIZE :i32) + (PHASE_ID :i16)) + +;; aliases +(defalias + CT COUNTER + LC LIMB_CONSTRUCTED + P POWER) + + diff --git a/rlptxrcpt/osaka/constants.lisp b/rlptxrcpt/osaka/constants.lisp new file mode 100644 index 000000000..3ee05f446 --- /dev/null +++ b/rlptxrcpt/osaka/constants.lisp @@ -0,0 +1,10 @@ +(module rlptxrcpt) + +(defconst + SUBPHASE_ID_WEIGHT_IS_PREFIX 6 + SUBPHASE_ID_WEIGHT_IS_OT 12 + SUBPHASE_ID_WEIGHT_IS_OD 24 + SUBPHASE_ID_WEIGHT_DEPTH 48 + SUBPHASE_ID_WEIGHT_INDEX_LOCAL 96) + + diff --git a/rlptxrcpt/osaka/constraints.lisp b/rlptxrcpt/osaka/constraints.lisp new file mode 100644 index 000000000..23ab2dec5 --- /dev/null +++ b/rlptxrcpt/osaka/constraints.lisp @@ -0,0 +1,446 @@ +(module rlptxrcpt) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; 4.1 Global Constraints ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; 4.1.1 Constancy columns ;; +;; Def block-constant +(defun (block-constant C) + (if-not-zero ABS_TX_NUM + (will-remain-constant! C))) + +;; Def counter-constant +(defun (counter-constant C) + (if-not-zero CT + (remained-constant! C))) + +;; Def counter-incrementing. +(defun (counter-incrementing C) + (if-not-zero CT + (or! (remained-constant! C) (did-inc! C 1)))) + +;; Definition phase-constancy. +(defpurefun (phase-constancy PHASE C) + (if-eq (* PHASE (prev PHASE)) 1 + (remained-constant! C))) + +;; Definition phase-incrementing +(defpurefun (phase-incrementing PHASE C) + (if-eq (* PHASE (prev PHASE)) 1 + (or! (remained-constant! C) (did-inc! C 1)))) + +;; Definition phase-decrementing +(defpurefun (phase-decrementing PHASE C) + (if-eq (* PHASE (prev PHASE)) 1 + (or! (remained-constant! C) (did-dec! C 1)))) + +;; Constancies +(defconstraint block-constancies () + (begin (block-constant ABS_TX_NUM_MAX) + (block-constant ABS_LOG_NUM_MAX))) + +(defconstraint counter-constancies () + (begin (for i [2 : 4] (counter-constant [INPUT i])) + (counter-constant nSTEP) + (counter-constant IS_PREFIX) + (counter-constant DEPTH_1) + (counter-constant IS_TOPIC) + (counter-constant IS_DATA))) + +(defconstraint special-ct-constancy () + (if-not-zero (+ (- 1 [PHASE 5]) (- 1 DEPTH_1) IS_PREFIX (- 1 IS_DATA)) + (counter-constant [INPUT 1]))) + +(defconstraint ct-incrementings () + (begin (if-zero (* IS_DATA IS_PREFIX) + (counter-incrementing LC)) + (counter-incrementing LC_CORRECTION))) + +(defconstraint phase4-decrementing () + (phase-decrementing [PHASE 4] IS_PREFIX)) + +(defconstraint phase5-incrementing () + (phase-incrementing [PHASE 5] DEPTH_1)) + +(defconstraint istopic-incrementing () + (phase-incrementing IS_TOPIC INDEX_LOCAL)) + +(defconstraint phase1-constant () + (phase-constancy [PHASE 1] TXRCPT_SIZE)) + +;; 4.1.2 Global Phase Constraints ;; +(defconstraint impose-phase-id () + (eq! PHASE_ID + (+ (reduce + + (for k [1 : 5] (* k [PHASE k]))) + (* SUBPHASE_ID_WEIGHT_IS_PREFIX IS_PREFIX) + (* SUBPHASE_ID_WEIGHT_IS_OT IS_TOPIC) + (* SUBPHASE_ID_WEIGHT_IS_OD IS_DATA) + (* SUBPHASE_ID_WEIGHT_DEPTH DEPTH_1) + (* SUBPHASE_ID_WEIGHT_INDEX_LOCAL IS_TOPIC INDEX_LOCAL)))) + +(defconstraint initial-stamp (:domain {0}) + (begin (vanishes! ABS_TX_NUM) + (vanishes! ABS_LOG_NUM))) + +(defconstraint phase-exclusion () + (if-zero ABS_TX_NUM + (vanishes! (reduce + (for i [5] [PHASE i]))) + (eq! 1 + (reduce + (for i [5] [PHASE i]))))) + +(defconstraint ABS_TX_NUM-evolution () + (if (or! (eq! [PHASE 1] 0) (remained-constant! [PHASE 1])) + ;; no change + (remained-constant! ABS_TX_NUM) + ;; increment + (did-inc! ABS_TX_NUM 1))) + +(defconstraint ABS_LOG_NUM-evolution () + (if-zero (+ (- 1 [PHASE 5]) (- 1 DEPTH_1) (- 1 IS_PREFIX) IS_TOPIC IS_DATA CT) + (did-inc! ABS_LOG_NUM 1) + (remained-constant! ABS_LOG_NUM))) + +(defconstraint no-done-no-end () + (if-zero DONE + (vanishes! PHASE_END))) + +(defconstraint still-size-no-end () + (if-not-zero PHASE_SIZE + (vanishes! PHASE_END))) + +(defconstraint no-end-no-changephase (:guard ABS_TX_NUM) + (if-zero PHASE_END + (eq! (reduce + + (for i [5] (* i [PHASE i]))) + (reduce + + (for i + [5] + (* i (next [PHASE i]))))))) + +(defconstraint phase-transition () + (if-eq PHASE_END 1 + (begin (eq! 1 + (+ (* [PHASE 1] (next [PHASE 2])) + (* [PHASE 2] (next [PHASE 3])) + (* [PHASE 3] (next [PHASE 4])) + (* [PHASE 4] (next [PHASE 5])) + (* [PHASE 5] (next [PHASE 1])))) + (if-eq [PHASE 5] 1 (vanishes! TXRCPT_SIZE))))) + +;; 4.1.3 Byte decomposition's loop heartbeat ;; +(defconstraint ct-imply-done (:guard ABS_TX_NUM) + (if-eq-else CT (- nSTEP 1) (eq! DONE 1) (vanishes! DONE))) + +(defconstraint done-imply-heartbeat (:guard ABS_TX_NUM) + (if-zero DONE + (will-inc! CT 1) + (begin (eq! LC (- 1 LC_CORRECTION)) + (vanishes! (next CT))))) + +;; 4.1.4 Blind Byte and Bit decomposition ;; +(defconstraint byte-decompositions () + (for k [1:4] (byte-decomposition CT [ACC k] [BYTE k]))) + +(defconstraint bit-decomposition () + (if-zero CT + (eq! BIT_ACC BIT) + (eq! BIT_ACC + (+ (* 2 (prev BIT_ACC)) + BIT)))) + +;; 4.1.5 Index Update ;; +(defconstraint index-reset () + (if-not-eq ABS_TX_NUM (prev ABS_TX_NUM) (vanishes! INDEX))) + +(defconstraint index-evolution () + (if-not-eq ABS_TX_NUM + (+ (prev ABS_TX_NUM) 1) + (eq! INDEX + (+ (prev INDEX) (prev LC))))) + +;; 4.1.6 Byte size updates ;; +(defconstraint globalsize-update () + (if-zero [PHASE 1] + (eq! TXRCPT_SIZE + (- (prev TXRCPT_SIZE) (* LC nBYTES))))) + +(defconstraint phasesize-update () + (if-eq 1 (+ (* [PHASE 4] (- 1 IS_PREFIX)) + (* [PHASE 5] DEPTH_1)) + (eq! PHASE_SIZE + (- (prev PHASE_SIZE) (* LC nBYTES))))) + +;; LC correction nullity ;; +(defconstraint lccorrection-nullity () + (if-zero (+ [PHASE 1] (* [PHASE 5] IS_DATA)) + (vanishes! LC_CORRECTION))) + +;; 4.1.8 Finalisation Constraints ;; +(defconstraint finalisation (:domain {-1}) + (if-not-zero ABS_TX_NUM + (begin (eq! PHASE_END 1) + (eq! [PHASE 5] 1) + (eq! ABS_TX_NUM ABS_TX_NUM_MAX) + (eq! ABS_LOG_NUM ABS_LOG_NUM_MAX)))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; 4.2 Phase constraints ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; 4.2.1 Phase 1 : RLP prefix ;; +(defconstraint phase1-init (:guard [PHASE 1]);; 4.1.1 + (if-zero (prev [PHASE 1]) + (begin (vanishes! (+ (- 1 IS_PREFIX) PHASE_END (next IS_PREFIX))) + (eq! nSTEP 1) + (if-zero [INPUT 1] + (eq! LC_CORRECTION 1) + (begin (vanishes! LC_CORRECTION) + (eq! LIMB + (* [INPUT 1] (^ 256 LLARGEMO))) + (eq! nBYTES 1)))))) + +(defconstraint phase1-rlprefix (:guard [PHASE 1]) + (if-zero IS_PREFIX + (begin (eq! nSTEP 8) + (vanishes! LC_CORRECTION) + (eq! [INPUT 1] TXRCPT_SIZE) + (rlpPrefixOfByteString [INPUT 1] CT nSTEP DONE [PHASE 1] ACC_SIZE POWER BIT [ACC 1] [ACC 2] LC LIMB nBYTES) + (if-eq DONE 1 (eq! PHASE_END 1))))) + +;; 4.2.2 Phase 2 : status code Rz ;; +(defconstraint phase2 () + (if-eq [PHASE 2] 1 + (begin (eq! nSTEP 1) + (if-zero [INPUT 1] + (eq! LIMB + (* RLP_PREFIX_INT_SHORT (^ 256 LLARGEMO))) + (eq! LIMB + (* [INPUT 1] (^ 256 LLARGEMO)))) + (eq! nBYTES 1) + (eq! PHASE_END 1)))) + +;; 4.2.3 Phase 3 : cumulative gas Ru ;; +(defconstraint phase3 () + (if-eq [PHASE 3] 1 + (begin (eq! nSTEP 8) + (rlpPrefixInt [INPUT 1] CT nSTEP DONE [BYTE 1] [ACC 1] ACC_SIZE POWER BIT BIT_ACC LIMB LC nBYTES) + (if-eq DONE 1 + (begin (limbShifting [INPUT 1] POWER ACC_SIZE LIMB nBYTES) + (eq! PHASE_END 1)))))) + +;; Phase 4: bloom filter Rb ;; +(defconstraint phase4-prefix (:guard [PHASE 4]) + (if-zero (prev [PHASE 4]) + (begin (vanishes! (+ (- 1 IS_PREFIX) PHASE_END (next IS_PREFIX))) + (eq! PHASE_SIZE 256) + (eq! nSTEP 1) + (eq! LIMB + (+ (* (+ RLP_PREFIX_INT_LONG 2) (^ 256 LLARGEMO)) + (* PHASE_SIZE (^ 256 13)))) + (eq! nBYTES 3) + (vanishes! INDEX_LOCAL)))) + +(defconstraint phase4-bloom-concatenation (:guard [PHASE 4]) + (if-zero IS_PREFIX + (begin (eq! nSTEP LLARGE) + (if-eq DONE 1 + (begin (for k + [1 : 4] + (begin (eq! [ACC k] [INPUT k]) + (eq! [INPUT k] + (shift LIMB (- k 4))) + (eq! (shift nBYTES (- k 4)) + LLARGE))) + (eq! (+ (shift LC -4) (shift LC -3)) + 1) + (if-zero PHASE_SIZE + (eq! PHASE_END 1)))) + (eq! INDEX_LOCAL + (+ (prev INDEX_LOCAL) + (* (prev LC) + (- 1 (prev IS_PREFIX)))))))) + +;; Phase 5: log series Rl ;; +(defconstraint phase5-init (:guard [PHASE 5]) + (if-zero (prev [PHASE 5]) + (vanishes! (+ DEPTH_1 (- 1 IS_PREFIX) IS_TOPIC IS_DATA)))) + +(defconstraint phase5-phaseRlpPrefix (:guard [PHASE 5]) + (if-zero DEPTH_1 + (begin (eq! [INPUT 1] PHASE_SIZE) + (if-zero [INPUT 1] + (begin (eq! nSTEP 1) + (eq! LIMB + (* RLP_PREFIX_LIST_SHORT (^ 256 LLARGEMO))) + (eq! nBYTES 1) + (eq! PHASE_END 1)) + (begin (eq! nSTEP 8) + (rlpPrefixOfByteString [INPUT 1] CT nSTEP DONE [PHASE 5] ACC_SIZE POWER BIT [ACC 1] [ACC 2] LC LIMB nBYTES) + (if-eq DONE 1 + (vanishes! (+ (- 1 (next DEPTH_1)) + (- 1 (next IS_PREFIX)) + (next IS_TOPIC) + (next IS_DATA))))))))) + +(defconstraint phase5-logentryRlpPrefix (:guard [PHASE 5]) + (if-eq 1 (* DEPTH_1 IS_PREFIX (- 1 IS_TOPIC) (- 1 IS_DATA)) + (begin (eq! [INPUT 1] LOG_ENTRY_SIZE) + (eq! nSTEP 8) + (rlpPrefixOfByteString [INPUT 1] CT nSTEP DONE [PHASE 5] ACC_SIZE POWER BIT [ACC 1] [ACC 2] LC LIMB nBYTES) + (if-eq DONE 1 + (vanishes! (+ (next IS_PREFIX) (next IS_TOPIC) (next IS_DATA))))))) + +(defconstraint phase5-rlpAddress (:guard [PHASE 5]) + (if-zero (+ IS_PREFIX IS_TOPIC IS_DATA) + (begin (eq! nSTEP 3) + (eq! LC 1) + (if-eq DONE 1 + (begin (eq! (shift LIMB -2) + (* (+ RLP_PREFIX_INT_SHORT 20) (^ 256 LLARGEMO))) + (eq! (shift nBYTES -2) 1) + (eq! (prev LIMB) + (* [INPUT 1] (^ 256 12))) + (eq! (prev nBYTES) 4) + (eq! LIMB [INPUT 2]) + (eq! nBYTES LLARGE) + (vanishes! (+ (- 1 (next IS_PREFIX)) + (- 1 (next IS_TOPIC)) + (next IS_DATA)))))))) + +(defconstraint phase5-topic-prefix (:guard [PHASE 5]) + (if-eq (* IS_PREFIX IS_TOPIC) 1 + (begin (vanishes! INDEX_LOCAL) + (eq! nSTEP 1) + (if-zero LOCAL_SIZE + (begin (eq! LIMB + (* RLP_PREFIX_LIST_SHORT (^ 256 LLARGEMO))) + (eq! nBYTES 1) + (eq! (next [INPUT 2]) INDEX_LOCAL) + (vanishes! (+ (- 1 (next IS_PREFIX)) + (next IS_TOPIC) + (- 1 (next IS_DATA))))) + (begin (if-eq-else LOCAL_SIZE 33 + (begin (eq! LIMB + (* (+ RLP_PREFIX_LIST_SHORT LOCAL_SIZE) + (^ 256 LLARGEMO))) + (eq! nBYTES 1)) + (begin (eq! LIMB + (+ (* (+ RLP_PREFIX_LIST_LONG 1) (^ 256 LLARGEMO)) + (* LOCAL_SIZE (^ 256 14)))) + (eq! nBYTES 2))) + (vanishes! (+ (next IS_PREFIX) + (- 1 (next IS_TOPIC)) + (next IS_DATA)))))))) + +(defconstraint phase5-topic (:guard [PHASE 5]) + (if-zero (+ IS_PREFIX (- 1 IS_TOPIC)) + (begin (eq! nSTEP 3) + (eq! LC 1) + (if-eq DONE 1 + (begin (eq! (+ INDEX_LOCAL (shift INDEX_LOCAL -2)) + (* 2 + (+ (shift INDEX_LOCAL -3) 1))) + (eq! (shift LIMB -2) + (* (+ RLP_PREFIX_INT_SHORT 32) (^ 256 LLARGEMO))) + (eq! (shift nBYTES -2) 1) + (eq! (prev LIMB) [INPUT 1]) + (eq! (prev nBYTES) LLARGE) + (eq! LIMB [INPUT 2]) + (eq! nBYTES LLARGE) + (if-zero LOCAL_SIZE + (begin (eq! (next [INPUT 2]) INDEX_LOCAL) + (vanishes! (+ (- 1 (next IS_PREFIX)) + (next IS_TOPIC) + (- 1 (next IS_DATA))))) + (vanishes! (+ (next IS_PREFIX) + (- 1 (next IS_TOPIC)) + (next IS_DATA))))))))) + +(defconstraint phase5-dataprefix (:guard [PHASE 5]) + (if-eq (* IS_PREFIX IS_DATA) 1 + (begin (eq! [INPUT 1] LOCAL_SIZE) + (if-zero LOCAL_SIZE + (begin (eq! nSTEP 1) + (vanishes! LC_CORRECTION) + (eq! LIMB + (* RLP_PREFIX_INT_SHORT (^ 256 LLARGEMO))) + (eq! nBYTES 1) + (vanishes! LOG_ENTRY_SIZE) + (if-zero PHASE_SIZE + (eq! PHASE_END 1) + (vanishes! (+ (- 1 (next IS_PREFIX)) + (next IS_TOPIC) + (next IS_DATA))))) + (begin (eq! nSTEP 8) + (if-eq-else LOCAL_SIZE 1 + (begin (if-not-eq CT (- nSTEP 2) (vanishes! LC)) + (rlpPrefixInt [INPUT 3] + CT + nSTEP + DONE + [BYTE 1] + [ACC 1] + ACC_SIZE + POWER + BIT + BIT_ACC + LIMB + LC + nBYTES) + (if-eq DONE 1 + (begin (eq! (+ (prev LC_CORRECTION) LC_CORRECTION) + 1) + (eq! (* [INPUT 3] (^ 256 LLARGEMO)) + (next [INPUT 1]))))) + (begin (vanishes! LC_CORRECTION) + (counter-incrementing LC) + (rlpPrefixOfByteString [INPUT 1] + CT + nSTEP + DONE + [PHASE 1] + ACC_SIZE + POWER + BIT + [ACC 1] + [ACC 2] + LC + LIMB + nBYTES))) + (if-eq DONE 1 + (vanishes! (+ (next IS_PREFIX) + (next IS_TOPIC) + (- 1 (next IS_DATA)))))))))) + +(defconstraint phase5-data (:guard [PHASE 5]) + (if-zero (+ IS_PREFIX (- 1 IS_DATA)) + (begin (eq! INDEX_LOCAL CT) + (eq! LC 1) + (eq! LIMB [INPUT 1]) + (if-zero DONE + (eq! nBYTES LLARGE) + (begin (vanishes! LOCAL_SIZE) + (vanishes! LOG_ENTRY_SIZE) + (if-zero PHASE_SIZE + (eq! PHASE_END 1) + (vanishes! (+ (- 1 (next IS_PREFIX)) + (next IS_TOPIC) + (next IS_DATA))))))))) + +(defconstraint phase5-logEntrySize-update (:guard [PHASE 5]) + (if-zero (+ (- 1 DEPTH_1) + (* IS_PREFIX (- 1 IS_TOPIC) (- 1 IS_DATA))) + (eq! LOG_ENTRY_SIZE + (- (prev LOG_ENTRY_SIZE) (* LC nBYTES))))) + +(defconstraint phase5-localsize-update (:guard [PHASE 5]) + (if-zero (+ IS_PREFIX + (- 1 (+ IS_TOPIC IS_DATA))) + (eq! LOCAL_SIZE + (- (prev LOCAL_SIZE) (* LC nBYTES))))) + + diff --git a/txndata/osaka/columns/cmptn_view.lisp b/txndata/osaka/columns/cmptn_view.lisp new file mode 100644 index 000000000..2b7428c59 --- /dev/null +++ b/txndata/osaka/columns/cmptn_view.lisp @@ -0,0 +1,26 @@ +(module txndata) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.Y CMPTN-view columns ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defperspective computation + + ;; selector + CMPTN + + ;; CMPTN view columns + ( + ( EUC_FLAG :binary@prove ) + ( WCP_FLAG :binary@prove ) + ( ARG_1_LO :i128 ) + ( ARG_2_LO :i128 ) + ( INST :i8 ) + ( WCP_RES :binary@prove ) ;; the @prove isn't strictly speaking necessary + ( EUC_QUOTIENT :i64 ) + ( EUC_REMAINDER :i64 ) + )) + diff --git a/txndata/osaka/columns/common.lisp b/txndata/osaka/columns/common.lisp new file mode 100644 index 000000000..f2f0138a0 --- /dev/null +++ b/txndata/osaka/columns/common.lisp @@ -0,0 +1,29 @@ +(module txndata) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.Y Common columns ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defcolumns + ;; HUB block and transaction labels + transaction bit markers + ;; ( BLK_NUMBER :i24 ) ;; defcomputed + ;; ( TOTL_TXN_NUMBER :i24 ) ;; defcomputed + ( SYSI_TXN_NUMBER :i24 ) + ( USER_TXN_NUMBER :i24 ) + ( SYSF_TXN_NUMBER :i24 ) + ( SYSI :binary ) ;; binarity is inherited from the HUB + ( USER :binary ) ;; same + ( SYSF :binary ) ;; same + ;; perspective flags + ( CMPTN :binary@prove ) + ( HUB :binary@prove ) + ( RLP :binary@prove ) + ;; heartbeat + ( CT :i4 ) + ( CT_MAX :i4 ) + ( GAS_CUMULATIVE :i128 ) + ) + diff --git a/txndata/osaka/columns/hub_view.lisp b/txndata/osaka/columns/hub_view.lisp new file mode 100644 index 000000000..b6e3b69bf --- /dev/null +++ b/txndata/osaka/columns/hub_view.lisp @@ -0,0 +1,54 @@ +(module txndata) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.Y HUB-view columns ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defperspective hub + + ;; selector + HUB + + ;; HUB view columns + ( + ;; block data from BTC module + ( btc_BLOCK_NUMBER :i32 ) + ( btc_BLOCK_GAS_LIMIT :i64 ) + ( btc_BASEFEE :i64 ) + ( btc_TIMESTAMP :i64 ) + ( btc_COINBASE_ADDRESS_HI :i32 ) + ( btc_COINBASE_ADDRESS_LO :i128 ) + ;; + ( TO_ADDRESS_HI :i32 ) + ( TO_ADDRESS_LO :i128 ) + ( FROM_ADDRESS_HI :i32 ) + ( FROM_ADDRESS_LO :i128 ) + ( IS_DEPLOYMENT :binary@prove ) + ( NONCE :i64 ) ;; recall the EIP capping nonces to 2^64 - 1 or so + ( VALUE :i128 ) + ( GAS_LIMIT :i64 ) + ( GAS_PRICE :i64 ) + ( GAS_INITIALLY_AVAILABLE :i128 ) + ( CALL_DATA_SIZE :i24 ) + ( INIT_CODE_SIZE :i24 ) + ( HAS_EIP_1559_GAS_SEMANTICS :binary@prove ) + ( REQUIRES_EVM_EXECUTION :binary@prove ) + ( COPY_TXCD :binary@prove ) + ( CFI :i16 ) + ( INIT_BALANCE :i128 ) + ( STATUS_CODE :binary@prove ) + ( GAS_LEFTOVER :i128 ) + ( REFUND_COUNTER_FINAL :i128 ) + ( REFUND_EFFECTIVE :i128 ) + ( EIP_4788 :binary@prove ) + ( EIP_2935 :binary@prove ) + ( NOOP :binary@prove ) + ( SYST_TXN_DATA_1 :i64 ) + ( SYST_TXN_DATA_2 :i16 ) + ( SYST_TXN_DATA_3 :i128 ) + ( SYST_TXN_DATA_4 :i128 ) + ( SYST_TXN_DATA_5 :binary ) + )) diff --git a/txndata/osaka/columns/rlp_view.lisp b/txndata/osaka/columns/rlp_view.lisp new file mode 100644 index 000000000..8fd3231ba --- /dev/null +++ b/txndata/osaka/columns/rlp_view.lisp @@ -0,0 +1,41 @@ +(module txndata) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.Y RLP-view columns ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defperspective rlp + + ;; selector + RLP + + ;; RLP view columns + ( + ( TX_TYPE :i3 ) + ( TYPE_0 :binary@prove ) + ( TYPE_1 :binary@prove ) + ( TYPE_2 :binary@prove ) + ( TYPE_3 :binary@prove ) + ( TYPE_4 :binary@prove ) + ( TO_ADDRESS_HI :i32 ) + ( TO_ADDRESS_LO :i128 ) + ( NONCE :i64 ) + ( IS_DEPLOYMENT :binary@prove ) + ( VALUE :i128 ) + ( NUMBER_OF_ZERO_BYTES :i24 ) + ( NUMBER_OF_NONZERO_BYTES :i24 ) + ( DATA_SIZE :i24 ) + ( INIT_SIZE :i24 ) + ( GAS_LIMIT :i64 ) + ( GAS_PRICE :i64 ) + ( MAX_PRIORITY_FEE_PER_GAS :i64 ) + ( MAX_FEE_PER_GAS :i64 ) + ( NUMBER_OF_ACCESS_LIST_ADDRESSES :i24 ) + ( NUMBER_OF_ACCESS_LIST_STORAGE_KEYS :i24 ) + ( CHAIN_ID :i32 ) + ( CFI :i16 ) + ( REQUIRES_EVM_EXECUTION :binary@prove ) + )) diff --git a/txndata/osaka/fork/prague.lisp b/txndata/osaka/fork/prague.lisp new file mode 100644 index 000000000..2e5a16c4a --- /dev/null +++ b/txndata/osaka/fork/prague.lisp @@ -0,0 +1,37 @@ +(module txndata) + +(defun (first-SYSI-row) (force-bin (* (prev (- 1 SYSI)) SYSI))) + +(defconstraint fork-specifics---prague-specifics---SYSI-transactions () + (if-not-zero SYSI + (if-not-zero HUB + (eq! (+ hub/EIP_4788 + hub/EIP_2935) + 1)))) + +(defconstraint fork-specifics---prague-specifics---SYSF-transactions () + (if-not-zero SYSF + (if-not-zero HUB + (eq! hub/NOOP 1)))) + +(defconstraint fork-specifics---prague-specifics---transaction-order---4788-and-forward () + (if-not-zero (first-SYSI-row) + (begin + (eq! hub/EIP_4788 1) + (eq! (shift hub/EIP_2935 nROWS___EIP_4788) 1) + ))) + + +(defproperty fork-specifics---prague-specifics---transaction-order---sanity-checks () + (if-not-zero (first-SYSI-row) + (begin + (eq! HUB 1) + (eq! (shift HUB nROWS___EIP_4788) 1) + ))) + +(defconstraint fork-specifics---prague-specifics---transaction-order---2935-and-forward () + (if-not-zero SYSI + (if-not-zero HUB + (if-not-zero hub/EIP_2935 + (eq! (shift (+ USER SYSF) nROWS___EIP_2935) 1) + )))) diff --git a/txndata/osaka/generalities/binary.lisp b/txndata/osaka/generalities/binary.lisp new file mode 100644 index 000000000..d6fd4711e --- /dev/null +++ b/txndata/osaka/generalities/binary.lisp @@ -0,0 +1,43 @@ +(module txndata) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.Z Binary constraints ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defproperty binarity-constraints + (begin + + ;; shared columns extracted from the HUB + ( is-binary SYSI ) + ( is-binary USER ) + ( is-binary SYSF ) + + ;; perspective flags + ;; ( is-binary CMPTN ) ;; is :binary@prove + ;; ( is-binary HUB ) + ;; ( is-binary RLP ) + + ;; rlp/ columns + ;; ( is-binary rlp/TYPE_0 ) ;; is :binary@prove + ;; ( is-binary rlp/TYPE_1 ) + ;; ( is-binary rlp/TYPE_2 ) + ;; ( is-binary rlp/TYPE_3 ) + ;; ( is-binary rlp/TYPE_4 ) + + ;; hub/ columns + ;; ( is-binary hub/IS_DEPLOYMENT ) ;; is :binary@prove + ;; ( is-binary hub/HAS_EIP_1559_GAS_SEMANTICS ) + ;; ( is-binary hub/REQUIRES_EVM_EXECUTION ) + ;; ( is-binary hub/COPY_TXCD ) + ;; ( is-binary hub/STATUS_CODE ) + ;; ( is-binary hub/EIP_4788 ) + ;; ( is-binary hub/EIP_2935 ) + ;; ( is-binary hub/NOOP ) + + ;; computation/ columns + ;; ( is-binary cmptn/EUC_FLAG ) + ;; ( is-binary cmptn/WCP_FLAG ) + )) diff --git a/txndata/osaka/generalities/constancies.lisp b/txndata/osaka/generalities/constancies.lisp new file mode 100644 index 000000000..e20d427a3 --- /dev/null +++ b/txndata/osaka/generalities/constancies.lisp @@ -0,0 +1,10 @@ +(module txndata) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.Z Constancy conditions ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +;; ràf: condition already known diff --git a/txndata/osaka/generalities/constraint_systems.lisp b/txndata/osaka/generalities/constraint_systems.lisp new file mode 100644 index 000000000..24015b8c2 --- /dev/null +++ b/txndata/osaka/generalities/constraint_systems.lisp @@ -0,0 +1,48 @@ +(module txndata) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.Z WCP_FLAG, EUC_FLAG and parametrized constraint systems ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;; binary constraints for WCP and EUC taken care of via :binary@prove + +(defconstraint EUC-and-WCP-are-binary-exclusive (:perspective computation) + (vanishes! (* EUC_FLAG WCP_FLAG))) + +(defun (small-call-to-LT relOffset + arg1 + arg2) + (begin + (eq! (shift computation/WCP_FLAG relOffset) 1) + (eq! (shift computation/ARG_1_LO relOffset) arg1) + (eq! (shift computation/ARG_2_LO relOffset) arg2) + (eq! (shift computation/INST relOffset) EVM_INST_LT))) + +(defun (small-call-to-LEQ relOffset + arg1 + arg2) + (begin + (eq! (shift computation/WCP_FLAG relOffset) 1) + (eq! (shift computation/ARG_1_LO relOffset) arg1) + (eq! (shift computation/ARG_2_LO relOffset) arg2) + (eq! (shift computation/INST relOffset) WCP_INST_LEQ))) + +(defun (small-call-to-ISZERO relOffset + arg1) + (begin + (eq! (shift computation/WCP_FLAG relOffset) 1) + (eq! (shift computation/ARG_1_LO relOffset) arg1) + (eq! (shift computation/INST relOffset) EVM_INST_ISZERO))) + +(defun (call-to-EUC relOffset + arg1 + arg2) + (begin + (eq! (shift computation/EUC_FLAG relOffset) 1) + (eq! (shift computation/ARG_1_LO relOffset) arg1) + (eq! (shift computation/ARG_2_LO relOffset) arg2))) + +(defun (result-must-be-true relOffset) (eq! (shift computation/WCP_RES relOffset) 1)) +(defun (result-must-be-false relOffset) (eq! (shift computation/WCP_RES relOffset) 0)) diff --git a/txndata/osaka/generalities/ct_max_and_ct.lisp b/txndata/osaka/generalities/ct_max_and_ct.lisp new file mode 100644 index 000000000..a4729e27e --- /dev/null +++ b/txndata/osaka/generalities/ct_max_and_ct.lisp @@ -0,0 +1,24 @@ +(module txndata) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.Z CT_MAX and CT constraints ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstraint CT_MAX-and-CT-constraints---CT_MAX-counter-constancy () + (counter-constancy CT CT_MAX)) + +(defconstraint CT_MAX-and-CT-constraints---automatic-vanishing () + (if-zero (txn-flag-sum) + (begin + (vanishes! CT_MAX ) + (vanishes! CT )))) + +(defconstraint CT_MAX-and-CT-constraints---CT-update-constraints () + (if-eq-else CT CT_MAX + (eq! (next CT) 0) ;; CT = CT_MAX + (eq! (next CT) (+ CT 1)) ;; CT = CT_MAX + )) + diff --git a/txndata/osaka/generalities/cumulative.lisp b/txndata/osaka/generalities/cumulative.lisp new file mode 100644 index 000000000..42695f913 --- /dev/null +++ b/txndata/osaka/generalities/cumulative.lisp @@ -0,0 +1,23 @@ +(module txndata) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.Z GAS_CUMULATIVE constraints ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstraint GAS_CUMULATIVE-constraints---counter-constancy () + (counter-constancy CT GAS_CUMULATIVE)) + +(defconstraint GAS_CUMULATIVE-constraints---it-vanishes-outside-of-USER-and-SYSF-rows () + (if-zero USER + (vanishes! GAS_CUMULATIVE))) + +(defconstraint GAS_CUMULATIVE-constraints---update-at-USER-transaction-boundaries () + (if-not-zero (- (next USER_TXN_NUMBER) USER_TXN_NUMBER) + (begin + (eq! (next HUB) 1) ;; sanity check in the spec + (will-inc! GAS_CUMULATIVE + (next (- hub/GAS_LIMIT hub/REFUND_EFFECTIVE)))))) + diff --git a/txndata/osaka/generalities/finalization.lisp b/txndata/osaka/generalities/finalization.lisp new file mode 100644 index 000000000..b7bdf0d56 --- /dev/null +++ b/txndata/osaka/generalities/finalization.lisp @@ -0,0 +1,12 @@ +(module txndata) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.Z Finalization constraints ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstraint finalization-constraints (:guard (txn-flag-sum) :domain {-1}) ;; "" + (begin (eq! SYSF 1) + (eq! CT_MAX CT))) diff --git a/txndata/osaka/generalities/flags_perspectives.lisp b/txndata/osaka/generalities/flags_perspectives.lisp new file mode 100644 index 000000000..9442fbfc6 --- /dev/null +++ b/txndata/osaka/generalities/flags_perspectives.lisp @@ -0,0 +1,19 @@ +(module txndata) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.Z perspective_sum constraints ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defun (perspective-sum) (+ RLP + HUB + CMPTN)) + +(defproperty perspective-sum-constraints---it-coincides-with-txn-flag-sum (eq! (perspective-sum) (txn-flag-sum))) +(defconstraint perspective-sum-constraints---it-vanishes-initially (:domain {0}) (eq! (perspective-sum) 0)) ;; "" +(defproperty perspective-sum-constraints---it-is-binary (is-binary (perspective-sum))) +(defconstraint perspective-sum-constraints---it-starts-with-a-HUB-row () (if-zero (perspective-sum) + (eq! (next (perspective-sum)) + (next HUB)))) diff --git a/txndata/osaka/generalities/flags_transactions.lisp b/txndata/osaka/generalities/flags_transactions.lisp new file mode 100644 index 000000000..484ebed13 --- /dev/null +++ b/txndata/osaka/generalities/flags_transactions.lisp @@ -0,0 +1,20 @@ +(module txndata) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.Z txn_flag_sum constraints ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defun (txn-flag-sum) (force-bin (+ SYSI USER SYSF))) + +(defconstraint txn-flag-sum-constraints---binary-constraint () + (is-binary (txn-flag-sum))) + +(defconstraint txn-flag-sum-constraints---initially-zero (:domain {0}) ;; "" + (vanishes! (txn-flag-sum))) + +(defconstraint txn-flag-sum-constraints---monotonicity () + (if-not-zero (txn-flag-sum) + (will-eq! (txn-flag-sum) 1))) diff --git a/txndata/osaka/generalities/number_blocks.lisp b/txndata/osaka/generalities/number_blocks.lisp new file mode 100644 index 000000000..1863a208d --- /dev/null +++ b/txndata/osaka/generalities/number_blocks.lisp @@ -0,0 +1,20 @@ +(module txndata) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.Z BLK_NUMBER constraints ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +;; this should be a defproperty ... but I don't believe there are domains for defproperty +(defconstraint block-number-constraints---vanishes-initially (:domain {0}) (vanishes! BLK_NUMBER)) ;; "" +(defproperty block-number-constraints---zero-one-increments (has-0-1-increments BLK_NUMBER)) +;; (defconstraint block-number-constraints---increments () (will-inc! BLK_NUMBER (* (- 1 SYSI) (next SYSI)))) +(defcomputedcolumn (BLK_NUMBER :i16 :fwd) (+ (prev BLK_NUMBER) + (* (- 1 (prev SYSI)) + SYSI))) +(defconstraint block-number-constraints---BLK_NUMBER-is-pegged-to-txn-flag-sum () (if-zero BLK_NUMBER + (eq! (txn-flag-sum) 0) ;; BLK = 0 + (eq! (txn-flag-sum) 1) ;; BLK ≠ 0 + )) diff --git a/txndata/osaka/generalities/number_transactions.lisp b/txndata/osaka/generalities/number_transactions.lisp new file mode 100644 index 000000000..64364e567 --- /dev/null +++ b/txndata/osaka/generalities/number_transactions.lisp @@ -0,0 +1,23 @@ +(module txndata) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.Z TOTL_TXN_NUMBER constraints ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + + +(defcomputedcolumn ( TOTL_TXN_NUMBER :i24 ) (+ SYSI_TXN_NUMBER + USER_TXN_NUMBER + SYSF_TXN_NUMBER)) + +(defconstraint totl-txn-number-constraints---counter-constancy () (counter-constancy CT TOTL_TXN_NUMBER)) +(defconstraint totl-txn-number-constraints---vanishes-initially (:domain {0}) (vanishes! TOTL_TXN_NUMBER)) ;; "" +(defconstraint totl-txn-number-constraints---increments () (will-inc! TOTL_TXN_NUMBER (next HUB))) +(defproperty totl-txn-number-constraints---zero-one-increments (has-0-1-increments TOTL_TXN_NUMBER)) +(defconstraint totl-txn-number-constraints---TOTL_TXN_NUMBER-is-pegged-to-txn-flag-sum () (if-zero TOTL_TXN_NUMBER + (eq! (txn-flag-sum) 0) ;; BLK = 0 + (eq! (txn-flag-sum) 1) ;; BLK ≠ 0 + )) + diff --git a/txndata/osaka/generalities/number_user_transactions.lisp b/txndata/osaka/generalities/number_user_transactions.lisp new file mode 100644 index 000000000..e865f9fa0 --- /dev/null +++ b/txndata/osaka/generalities/number_user_transactions.lisp @@ -0,0 +1,13 @@ +(module txndata) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.Z USER_TXN_NUMBER constraints ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstraint user-txn-number-constraints---vanishes-initially (:domain {0}) (vanishes! USER_TXN_NUMBER)) ;; "" +(defconstraint user-txn-number-constraints---increments () (will-inc! USER_TXN_NUMBER (* (next USER) (next HUB)))) +(defproperty user-txn-number-constraints---zero-one-increments (has-0-1-increments USER_TXN_NUMBER)) + diff --git a/txndata/osaka/generalities/transitions.lisp b/txndata/osaka/generalities/transitions.lisp new file mode 100644 index 000000000..bbcbdeaad --- /dev/null +++ b/txndata/osaka/generalities/transitions.lisp @@ -0,0 +1,20 @@ +(module txndata) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.Z perspective transitions ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defproperty perspective-transitions---sanitychecks + (if-not-zero (- (next TOTL_TXN_NUMBER) TOTL_TXN_NUMBER) + (begin + (will-eq! HUB 1) + (if-not-zero TOTL_TXN_NUMBER + (eq! CMPTN 1))))) + +(defconstraint perspective-transitions---computation-rows-lead-to-computation-rows-within-CT-cycles () + (if-not-zero (- CT_MAX CT) + (if-not-zero CMPTN + (will-eq! CMPTN 1)))) diff --git a/txndata/osaka/lookups/txndata_into_block_data.lisp b/txndata/osaka/lookups/txndata_into_block_data.lisp new file mode 100644 index 000000000..b2d7fa6ec --- /dev/null +++ b/txndata/osaka/lookups/txndata_into_block_data.lisp @@ -0,0 +1,36 @@ +(defun (source-selector---TXNDATA-into-BLOCKDATA) txndata.HUB) +(defun (target-selector---TXNDATA-into-BLOCKDATA) blockdata.IOMF) ;; "" + +;; recall that REL_BLOCK starts at 1 for the first block in the conflation +;; thus the actual block number is FIRST + (REL - 1) along non padding rows + +(defclookup + txndata-into-block-data + ; target selector + (target-selector---TXNDATA-into-BLOCKDATA) + ; target columns + ( + blockdata.REL_BLOCK + blockdata.NUMBER + blockdata.TIMESTAMP + blockdata.BASEFEE + blockdata.BLOCK_GAS_LIMIT + blockdata.COINBASE_HI + blockdata.COINBASE_LO + ) + ; source selector + (source-selector---TXNDATA-into-BLOCKDATA) + ; source columns + ( + txndata.BLK_NUMBER + txndata.hub/btc_BLOCK_NUMBER + txndata.hub/btc_TIMESTAMP + txndata.hub/btc_BASEFEE + txndata.hub/btc_BLOCK_GAS_LIMIT + txndata.hub/btc_COINBASE_ADDRESS_HI + txndata.hub/btc_COINBASE_ADDRESS_LO + ) + ) + + + diff --git a/txndata/osaka/lookups/txndata_into_euc.lisp b/txndata/osaka/lookups/txndata_into_euc.lisp new file mode 100644 index 000000000..a57ae3c2c --- /dev/null +++ b/txndata/osaka/lookups/txndata_into_euc.lisp @@ -0,0 +1,24 @@ +(defun (txn-data-into-euc-selector) (* txndata.CMPTN txndata.computation/EUC_FLAG)) + +(defclookup + (txndata-into-euc :unchecked) + ; target columns + ( + euc.DONE + euc.DIVIDEND + euc.DIVISOR + euc.QUOTIENT + euc.REMAINDER + ) + ; source selector + (txn-data-into-euc-selector) + ; source columns + ( + 1 + txndata.computation/ARG_1_LO + txndata.computation/ARG_2_LO + txndata.computation/EUC_QUOTIENT + txndata.computation/EUC_REMAINDER + ) + ) + diff --git a/txndata/osaka/lookups/txndata_into_hub.lisp b/txndata/osaka/lookups/txndata_into_hub.lisp new file mode 100644 index 000000000..036844db2 --- /dev/null +++ b/txndata/osaka/lookups/txndata_into_hub.lisp @@ -0,0 +1,27 @@ +(deflookup + txndata-into-hub + ; target columns + ( + hub.BLK_NUMBER + hub.TOTL_TXN_NUMBER + hub.SYSI_TXN_NUMBER + hub.USER_TXN_NUMBER + hub.SYSF_TXN_NUMBER + hub.SYSI + hub.USER + hub.SYSF + ) + ; source columns + ( + txndata.BLK_NUMBER + txndata.TOTL_TXN_NUMBER + txndata.SYSI_TXN_NUMBER + txndata.USER_TXN_NUMBER + txndata.SYSF_TXN_NUMBER + txndata.SYSI + txndata.USER + txndata.SYSF + ) + ) + + diff --git a/txndata/osaka/lookups/txndata_into_rlp_addr.lisp b/txndata/osaka/lookups/txndata_into_rlp_addr.lisp new file mode 100644 index 000000000..49b45f531 --- /dev/null +++ b/txndata/osaka/lookups/txndata_into_rlp_addr.lisp @@ -0,0 +1,28 @@ +(defun (txn-data-into-rlp-addr-selector) (* txndata.USER + txndata.HUB + txndata.hub/IS_DEPLOYMENT)) + +(defclookup + txndata-into-rlp-addr + ;; target columns + ( + rlpaddr.ADDR_HI + rlpaddr.ADDR_LO + rlpaddr.DEP_ADDR_HI + rlpaddr.DEP_ADDR_LO + rlpaddr.NONCE + rlpaddr.RECIPE_1 + ) + ;; source selector + (txn-data-into-rlp-addr-selector) + ;; source columns + ( + txndata.hub/FROM_ADDRESS_HI + txndata.hub/FROM_ADDRESS_LO + txndata.hub/TO_ADDRESS_HI + txndata.hub/TO_ADDRESS_LO + txndata.hub/NONCE + RLP_ADDR_RECIPE_1 + ) + ) + diff --git a/txndata/osaka/lookups/txndata_into_rlp_txn.lisp b/txndata/osaka/lookups/txndata_into_rlp_txn.lisp new file mode 100644 index 000000000..4740235a8 --- /dev/null +++ b/txndata/osaka/lookups/txndata_into_rlp_txn.lisp @@ -0,0 +1,12 @@ +(deflookup + txndata-into-rlp-txn + ; target columns + ( + txndata.USER_TXN_NUMBER + ) + ; source columns + ( + rlptxn.USER_TXN_NUMBER + ) + ) + diff --git a/txndata/osaka/lookups/txndata_into_rlp_txnrcpt.lisp b/txndata/osaka/lookups/txndata_into_rlp_txnrcpt.lisp new file mode 100644 index 000000000..482ca01c8 --- /dev/null +++ b/txndata/osaka/lookups/txndata_into_rlp_txnrcpt.lisp @@ -0,0 +1,37 @@ +(defun (txn-data---phase-sum) + (+ + (* txndata.RLP RLP_RCPT_SUBPHASE_ID_TYPE ) + (* txndata.HUB RLP_RCPT_SUBPHASE_ID_STATUS_CODE ) + (* txndata.CMPTN RLP_RCPT_SUBPHASE_ID_CUMUL_GAS ) + )) + +(defun (txn-data---outgoing-value) + (+ + (* txndata.RLP txndata.rlp/TX_TYPE ) + (* txndata.HUB txndata.hub/STATUS_CODE ) + (* txndata.CMPTN txndata.GAS_CUMULATIVE ) + )) + + + +;; "" +(defclookup + ( txndata-into-rlp-txn-rcpt :unchecked ) + ; target selector + ; + ; target columns + ( + rlptxrcpt.ABS_TX_NUM + rlptxrcpt.PHASE_ID + [rlptxrcpt.INPUT 1] ;; "" + ) + ; source selector + txndata.USER + ; source columns + ( + txndata.USER_TXN_NUMBER + (txn-data---phase-sum) + (txn-data---outgoing-value) + ) + ) + diff --git a/txndata/osaka/lookups/txndata_into_rom_lex.lisp b/txndata/osaka/lookups/txndata_into_rom_lex.lisp new file mode 100644 index 000000000..d05ebe0e2 --- /dev/null +++ b/txndata/osaka/lookups/txndata_into_rom_lex.lisp @@ -0,0 +1,34 @@ +(defun (txn-data-into-rom-lex-product) (* txndata.USER + txndata.HUB + txndata.hub/IS_DEPLOYMENT + txndata.hub/INIT_CODE_SIZE + )) +(defun (txn-data-into-rom-lex-selector) (if-not-zero (txn-data-into-rom-lex-product) + 1 ;; nonzero + 0 ;; zero + )) + +(defclookup + txndata-into-rom-lex + ; target columns + ( + romlex.CODE_FRAGMENT_INDEX + romlex.CODE_SIZE + romlex.ADDRESS_HI + romlex.ADDRESS_LO + romlex.DEPLOYMENT_NUMBER + romlex.DEPLOYMENT_STATUS + ) + ; source selector + (txn-data-into-rom-lex-selector) + ; source columns + ( + txndata.hub/CFI + txndata.hub/INIT_CODE_SIZE + txndata.hub/TO_ADDRESS_HI + txndata.hub/TO_ADDRESS_LO + 1 + 1 + ) + ) + diff --git a/txndata/osaka/lookups/txndata_into_wcp.lisp b/txndata/osaka/lookups/txndata_into_wcp.lisp new file mode 100644 index 000000000..c213cdb8e --- /dev/null +++ b/txndata/osaka/lookups/txndata_into_wcp.lisp @@ -0,0 +1,26 @@ +(defun (txn-data-into-wcp-selector) (* txndata.CMPTN txndata.computation/WCP_FLAG)) + +(defclookup + txndata-into-wcp + ; target columns + ( + wcp.ARG_1_HI + wcp.ARG_1_LO + wcp.ARG_2_HI + wcp.ARG_2_LO + wcp.RES + wcp.INST + ) + ; source selector + (txn-data-into-wcp-selector) + ; source columns + ( + 0 + txndata.computation/ARG_1_LO + 0 + txndata.computation/ARG_2_LO + txndata.computation/WCP_RES + txndata.computation/INST + ) + ) + diff --git a/txndata/osaka/processing/sysf/noop/constants.lisp b/txndata/osaka/processing/sysf/noop/constants.lisp new file mode 100644 index 000000000..df687387b --- /dev/null +++ b/txndata/osaka/processing/sysf/noop/constants.lisp @@ -0,0 +1,16 @@ +(module txndata) + +;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X. Shorthands ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconst + ROFF___SYSF___HUB_ROW 0 + ROFF___SYSF___CMP_ROW 1 + + nROWS___SYSF___NOOP 2 + ) + diff --git a/txndata/osaka/processing/sysf/noop/generalities.lisp b/txndata/osaka/processing/sysf/noop/generalities.lisp new file mode 100644 index 000000000..eaed86cc4 --- /dev/null +++ b/txndata/osaka/processing/sysf/noop/generalities.lisp @@ -0,0 +1,30 @@ +(module txndata) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X. SYSF transaction processing ;; +;; X.Y Generalities ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + + +(defun (first-row-of-SYSF-transaction) (force-bin (* (- TOTL_TXN_NUMBER (prev TOTL_TXN_NUMBER)) SYSF))) + + +(defconstraint SYSF-prelude-constraints---setting-the-first-few-perspectives + (:guard (first-row-of-SYSF-transaction)) + (eq! + (+ ( shift HUB ROFF___SYSF___HUB_ROW ) + ( shift CMPTN ROFF___SYSF___CMP_ROW )) + 2)) + +(defconstraint SYSF-transaction---generalities---SYSF-transactions-are-necessarily-NOOPs + (:guard (first-row-of-SYSF-transaction)) + (eq! (shift hub/NOOP ROFF___SYSF___HUB_ROW) 1)) + +(defun (ct-max-SYSF-sum) (* (- nROWS___SYSF___NOOP 1) ( shift hub/NOOP ROFF___SYSF___HUB_ROW ))) + +(defconstraint SYSF-prelude-constraints---setting-CT_MAX + (:guard (first-row-of-SYSF-transaction)) + (eq! CT_MAX (ct-max-SYSF-sum))) diff --git a/txndata/osaka/processing/sysf/noop/rows/noop.lisp b/txndata/osaka/processing/sysf/noop/rows/noop.lisp new file mode 100644 index 000000000..682ec6971 --- /dev/null +++ b/txndata/osaka/processing/sysf/noop/rows/noop.lisp @@ -0,0 +1,17 @@ +(module txndata) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X. SYSF transaction processing ;; +;; X.Y Generalities ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + + +(defproperty SYSF-prelude-constraints---noop-transactions-require-no-computations + (if-not-zero (first-row-of-SYSF-transaction) + (eq! (+ (shift computation/EUC_FLAG ROFF___SYSF___CMP_ROW) + (shift computation/WCP_FLAG ROFF___SYSF___CMP_ROW)) + 0))) + diff --git a/txndata/osaka/processing/sysi/eip-2935/computations.lisp b/txndata/osaka/processing/sysi/eip-2935/computations.lisp new file mode 100644 index 000000000..2bbc20dbe --- /dev/null +++ b/txndata/osaka/processing/sysi/eip-2935/computations.lisp @@ -0,0 +1,37 @@ +(module txndata) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.Z CT_MAX and CT constraints ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstraint EIP-2935---defining-the-previous-block-number---WCP-call + (:guard (first-row-of-EIP-2935-transaction)) + (small-call-to-ISZERO ROFF___EIP_2935___DEFINING_THE_PREVIOUS_BLOCK_NUMBER + (EIP-2935---block-number))) + +(defconstraint EIP-2935---defining-the-previous-block-number---committing-to-SYST_TXN_DATA---I + (:guard (first-row-of-EIP-2935-transaction)) + (eq! (EIP-2935---current-block-is-genesis-block) + (shift computation/WCP_RES ROFF___EIP_2935___DEFINING_THE_PREVIOUS_BLOCK_NUMBER))) + +(defconstraint EIP-2935---defining-the-previous-block-number---committing-to-SYST_TXN_DATA---II + (:guard (first-row-of-EIP-2935-transaction)) + (if-not-zero (force-bin (EIP-2935---current-block-is-genesis-block)) + (eq! (EIP-2935---prev-block-number) 0) ;; case + (eq! (EIP-2935---prev-block-number) (- (EIP-2935---block-number) 1)) ;; case + )) + +(defconstraint EIP-2935---computing-the-previous-block-number-modulo-8191---EUC-call + (:guard (first-row-of-EIP-2935-transaction)) + (call-to-EUC ROFF___EIP_2935___COMPUTING_THE_PREVIOUS-BLOCK_NUMBER_MOD_8191 + (EIP-2935---prev-block-number) + HISTORY_SERVE_WINDOW)) + +(defconstraint EIP-2935---computing-the-previous-block-number-modulo-8191---committing-to-SYST_TXN_DATA + (:guard (first-row-of-EIP-2935-transaction)) + (eq! (EIP-2935---prev-block-number-mod-8191) + (shift computation/EUC_REMAINDER ROFF___EIP_2935___COMPUTING_THE_PREVIOUS-BLOCK_NUMBER_MOD_8191))) + diff --git a/txndata/osaka/processing/sysi/eip-2935/shorthands.lisp b/txndata/osaka/processing/sysi/eip-2935/shorthands.lisp new file mode 100644 index 000000000..d14058031 --- /dev/null +++ b/txndata/osaka/processing/sysi/eip-2935/shorthands.lisp @@ -0,0 +1,25 @@ +(module txndata) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.Z CT_MAX and CT constraints ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + + +(defun (EIP-2935---prev-block-number) (shift hub/SYST_TXN_DATA_1 ROFF___SYSI___HUB_ROW)) +(defun (EIP-2935---prev-block-number-mod-8191) (shift hub/SYST_TXN_DATA_2 ROFF___SYSI___HUB_ROW)) +(defun (EIP-2935---prev-block-hash-hi) (shift hub/SYST_TXN_DATA_3 ROFF___SYSI___HUB_ROW)) +(defun (EIP-2935---prev-block-hash-lo) (shift hub/SYST_TXN_DATA_4 ROFF___SYSI___HUB_ROW)) +(defun (EIP-2935---current-block-is-genesis-block) (shift hub/SYST_TXN_DATA_5 ROFF___SYSI___HUB_ROW)) +(defun (EIP-2935---block-number) (shift hub/btc_BLOCK_NUMBER ROFF___SYSI___HUB_ROW)) + +(defun (first-row-of-EIP-2935-transaction) (* (first-row-of-SYSI-transaction) (shift hub/EIP_2935 ROFF___SYSI___HUB_ROW))) + + +(defconst + ROFF___EIP_2935___DEFINING_THE_PREVIOUS_BLOCK_NUMBER 1 + ROFF___EIP_2935___COMPUTING_THE_PREVIOUS-BLOCK_NUMBER_MOD_8191 2 + nROWS___EIP_2935 3 + ) diff --git a/txndata/osaka/processing/sysi/eip-4788/computations.lisp b/txndata/osaka/processing/sysi/eip-4788/computations.lisp new file mode 100644 index 000000000..ef441905b --- /dev/null +++ b/txndata/osaka/processing/sysi/eip-4788/computations.lisp @@ -0,0 +1,52 @@ +(module txndata) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.Z Computations ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +;; HUB row +;;;;;;;;;; + +(defconstraint EIP-4788---setting-the-timestamp + (:guard (first-row-of-EIP-4788-transaction)) + (eq! (EIP-4788---timestamp) + (shift hub/btc_TIMESTAMP ROFF___SYSI___HUB_ROW))) + + +;; computing TIMESTAMP % 8191 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defconstraint EIP-4788---computing-the-timestamp-modulo-8191---EUC-call + (:guard (first-row-of-EIP-4788-transaction)) + (call-to-EUC ROFF___EIP_4788___TIMESTAMP_MOD_8191 + (EIP-4788---timestamp) + HISTORY_BUFFER_LENGTH)) + +(defconstraint EIP-4788---computing-the-timestamp-modulo-8191---committing-to-SYST_TXN_DATA + (:guard (first-row-of-EIP-4788-transaction)) + (eq! (EIP-4788---timestamp-mod-8191) + (shift computation/EUC_REMAINDER ROFF___EIP_4788___TIMESTAMP_MOD_8191))) + +(defconstraint EIP-4788---detecting-the-genesis-block---WCP-call + (:guard (first-row-of-EIP-4788-transaction)) + (small-call-to-ISZERO ROFF___EIP_4788___DETECTING_THE_GENESIS_BLOCK + (EIP-4788---block-number))) + +;; detecting the genesis block +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defconstraint EIP-4788---detecting-the-genesis-block---commiting-to-SYST_TXN_DATA + (:guard (first-row-of-EIP-4788-transaction)) + (eq! (EIP-4788---current-block-is-genesis-block) + (shift computation/WCP_RES ROFF___EIP_4788___DETECTING_THE_GENESIS_BLOCK))) + +(defconstraint EIP-4788---detecting-the-genesis-block---enforcing-trivial-beacon-root-for-the-genesis-block + (:guard (first-row-of-EIP-4788-transaction)) + (if-not-zero (EIP-4788---current-block-is-genesis-block) + (begin + (vanishes! (EIP-4788---beaconroot-hi)) + (vanishes! (EIP-4788---beaconroot-lo))))) + diff --git a/txndata/osaka/processing/sysi/eip-4788/shorthands.lisp b/txndata/osaka/processing/sysi/eip-4788/shorthands.lisp new file mode 100644 index 000000000..b73b1292d --- /dev/null +++ b/txndata/osaka/processing/sysi/eip-4788/shorthands.lisp @@ -0,0 +1,22 @@ +(module txndata) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.Z CT_MAX and CT constraints ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (EIP-4788---timestamp) (shift hub/SYST_TXN_DATA_1 ROFF___SYSI___HUB_ROW)) +(defun (EIP-4788---timestamp-mod-8191) (shift hub/SYST_TXN_DATA_2 ROFF___SYSI___HUB_ROW)) +(defun (EIP-4788---beaconroot-hi) (shift hub/SYST_TXN_DATA_3 ROFF___SYSI___HUB_ROW)) +(defun (EIP-4788---beaconroot-lo) (shift hub/SYST_TXN_DATA_4 ROFF___SYSI___HUB_ROW)) +(defun (EIP-4788---current-block-is-genesis-block) (shift hub/SYST_TXN_DATA_5 ROFF___SYSI___HUB_ROW)) +(defun (EIP-4788---block-number) (shift hub/btc_BLOCK_NUMBER ROFF___SYSI___HUB_ROW)) + +(defun (first-row-of-EIP-4788-transaction) (* (first-row-of-SYSI-transaction) (shift hub/EIP_4788 ROFF___SYSI___HUB_ROW))) + +(defconst + ROFF___EIP_4788___TIMESTAMP_MOD_8191 1 + ROFF___EIP_4788___DETECTING_THE_GENESIS_BLOCK 2 + nROWS___EIP_4788 3 + ) diff --git a/txndata/osaka/processing/sysi/noop/computations.lisp b/txndata/osaka/processing/sysi/noop/computations.lisp new file mode 100644 index 000000000..cd5677a26 --- /dev/null +++ b/txndata/osaka/processing/sysi/noop/computations.lisp @@ -0,0 +1,19 @@ +(module txndata) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.Z NOOP transactions ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defun (first-row-of-SYSI-NOOP-transaction) (* (first-row-of-SYSI-transaction) (shift hub/NOOP ROFF___SYSI___HUB_ROW))) + +(defconst + ROFF_SYSI_NOOP___FIRST_AND_ONLY_COMPUTATION_ROW 1 + ) + + +(defproperty SYSI-NOOP---nothing-happens + (if-not-zero (first-row-of-SYSI-NOOP-transaction) + (vanishes! (shift (+ computation/WCP_FLAG computation/EUC_FLAG) ROFF_SYSI_NOOP___FIRST_AND_ONLY_COMPUTATION_ROW)))) diff --git a/txndata/osaka/processing/sysi/prelude.lisp b/txndata/osaka/processing/sysi/prelude.lisp new file mode 100644 index 000000000..dc98014f4 --- /dev/null +++ b/txndata/osaka/processing/sysi/prelude.lisp @@ -0,0 +1,41 @@ +(module txndata) + +;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X.Y.Z Prelude ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconst + ROFF___SYSI___HUB_ROW 0 + ROFF___SYSI___CMP_ROW 1 + + nROWS___SYSI___NOOP 2 + nROWS___SYSI___EIP_4788 3 + nROWS___SYSI___EIP_2935 3 + ) + + +(defun (first-row-of-SYSI-transaction) (* (- TOTL_TXN_NUMBER (prev TOTL_TXN_NUMBER)) SYSI)) + +(defconstraint SYSI-prelude-constraints---setting-the-first-few-perspectives (:guard (first-row-of-SYSI-transaction)) + (eq! + (+ ( shift HUB ROFF___SYSI___HUB_ROW ) + ( shift CMPTN ROFF___SYSI___CMP_ROW )) + 2)) + +(defconstraint SYSI-prelude-constraints---imposing-a-SYSI-transaction-scenario (:guard (first-row-of-SYSI-transaction)) + (eq! + (+ ( shift hub/NOOP ROFF___SYSI___HUB_ROW ) + ( shift hub/EIP_4788 ROFF___SYSI___HUB_ROW ) + ( shift hub/EIP_2935 ROFF___SYSI___HUB_ROW )) + 1)) + +(defun (ct-max-SYSI-sum) (+ (* (- nROWS___SYSI___NOOP 1) ( shift hub/NOOP ROFF___SYSI___HUB_ROW )) + (* (- nROWS___SYSI___EIP_4788 1) ( shift hub/EIP_4788 ROFF___SYSI___HUB_ROW )) + (* (- nROWS___SYSI___EIP_2935 1) ( shift hub/EIP_2935 ROFF___SYSI___HUB_ROW )))) + +(defconstraint SYSI-prelude-constraints---setting-CT_MAX (:guard (first-row-of-SYSI-transaction)) + (eq! CT_MAX (ct-max-SYSI-sum))) + diff --git a/txndata/osaka/processing/user/constants.lisp b/txndata/osaka/processing/user/constants.lisp new file mode 100644 index 000000000..634822617 --- /dev/null +++ b/txndata/osaka/processing/user/constants.lisp @@ -0,0 +1,32 @@ +(module txndata) + +;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X. Shorthands ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconst + ROFF___USER___HUB_ROW 0 + ROFF___USER___RLP_ROW 1 + ROFF___USER___CMPTN_ROW___EIP-2681___MAX_NONCE_UPPER_BOUND_CHECK 2 + ROFF___USER___CMPTN_ROW___INITIAL_BALANCE_MUST_COVER_VALUE_AND_GAS 3 + ROFF___USER___CMPTN_ROW___EIP-3860___MAX_INIT_CODE_SIZE_BOUND_CHECK 4 + ROFF___USER___CMPTN_ROW___EIP-3860___INIT_CODE_WORD_PRICING 5 + ROFF___USER___CMPTN_ROW___GAS_LIMIT_MUST_COVER_THE_UPFRONT_GAS_COST 6 + ROFF___USER___CMPTN_ROW___GAS_LIMIT_MUST_COVER_THE_TRANSACTION_FLOOR_COST 7 + ROFF___USER___CMPTN_ROW___UPPER_LIMIT_FOR_GAS_REFUNDS 8 + ROFF___USER___CMPTN_ROW___EFFECTIVE_GAS_REFUND_COMPUTATION 9 + ROFF___USER___CMPTN_ROW___EFFECTIVE_GAS_REFUND_VS_TRANSACTION_CALL_DATA_FLOOR_PRICE_COMPARISON 10 + ROFF___USER___CMPTN_ROW___DETECTING_EMPTY_CALL_DATA 11 + ROFF___USER___CMPTN_ROW___THE_MAXIMUM_GAS_PRICE_MUST_MATCH_OR_EXCEED_THE_BASEFEE 12 + ROFF___USER___CMPTN_ROW___CUMULATIVE_GAS_CONSUMPTION_MUST_NOT_EXCEED_BLOCK_GAS_LIMIT 13 + ;; specialized computations for transactions with EIP-1559 gas semantics + ROFF___USER___CMPTN_ROW___COMPARING_MAX_FEE_AND_MAX_PRIORITY_FEE 14 + ROFF___USER___CMPTN_ROW___COMPUTING_THE_EFFECTIVE_GAS_PRICE 15 + + nROWS___TRANSACTION___SANS___EIP_1559_GAS_SEMANTICS 14 + nROWS___TRANSACTION___WITH___EIP_1559_GAS_SEMANTICS 16 + ) + diff --git a/txndata/osaka/processing/user/decoding.lisp b/txndata/osaka/processing/user/decoding.lisp new file mode 100644 index 000000000..71ad904bc --- /dev/null +++ b/txndata/osaka/processing/user/decoding.lisp @@ -0,0 +1,108 @@ +(module txndata) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X. USER transaction processing ;; +;; X.Y Transaction decoding ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (USER-transaction---is-type-0) (shift rlp/TYPE_0 ROFF___USER___RLP_ROW)) +(defun (USER-transaction---is-type-1) (shift rlp/TYPE_1 ROFF___USER___RLP_ROW)) +(defun (USER-transaction---is-type-2) (shift rlp/TYPE_2 ROFF___USER___RLP_ROW)) +(defun (USER-transaction---is-type-3) (shift rlp/TYPE_3 ROFF___USER___RLP_ROW)) +(defun (USER-transaction---is-type-4) (shift rlp/TYPE_4 ROFF___USER___RLP_ROW)) + + + +(defun (USER-transaction---tx-decoding---tx-type-with-fixed-gas-price) + (+ + (USER-transaction---is-type-0) + (USER-transaction---is-type-1) + ;; (USER-transaction---is-type-2) + ;; (USER-transaction---is-type-3) + ;; (USER-transaction---is-type-4) + )) + +(defun (USER-transaction---tx-decoding---tx-type-sans-fixed-gas-price) + (+ + ;; (USER-transaction---is-type-0) + ;; (USER-transaction---is-type-1) + (USER-transaction---is-type-2) + (USER-transaction---is-type-3) + (USER-transaction---is-type-4) + )) + +(defun (USER-transaction---tx-decoding---tx-type-sans-access-set) + (+ + (USER-transaction---is-type-0) + ;; (USER-transaction---is-type-1) + ;; (USER-transaction---is-type-2) + ;; (USER-transaction---is-type-3) + ;; (USER-transaction---is-type-4) + )) + +(defun (USER-transaction---tx-decoding---tx-type-with-access-set) + (+ + ;; (USER-transaction---is-type-0) + (USER-transaction---is-type-1) + (USER-transaction---is-type-2) + (USER-transaction---is-type-3) + (USER-transaction---is-type-4) + )) + +(defun (USER-transaction---tx-decoding---tx-type-sans-delegation) + (+ + (USER-transaction---is-type-0) + (USER-transaction---is-type-1) + (USER-transaction---is-type-2) + (USER-transaction---is-type-3) + ;; (USER-transaction---is-type-4) + )) + +(defun (USER-transaction---tx-decoding---tx-type-with-delegation) + (+ + ;; (USER-transaction---is-type-0) + ;; (USER-transaction---is-type-1) + ;; (USER-transaction---is-type-2) + ;; (USER-transaction---is-type-3) + (USER-transaction---is-type-4) + )) + +(defun (USER-transaction---tx-decoding---tx-type-flag-sum) + (+ + (USER-transaction---tx-decoding---tx-type-with-fixed-gas-price) + (USER-transaction---tx-decoding---tx-type-sans-fixed-gas-price) + )) + +(defun (USER-transaction---tx-decoding---tx-type-wght-sum) + (+ + (* 0 (USER-transaction---is-type-0)) + (* 1 (USER-transaction---is-type-1)) + (* 2 (USER-transaction---is-type-2)) + (* 3 (USER-transaction---is-type-3)) + (* 4 (USER-transaction---is-type-4)) + )) + + +(defconstraint USER-transaction---transaction-decoding---precisely-one-of-the-transaction-type-flags-lights-up + (:guard (first-row-of-USER-transaction)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (eq! (USER-transaction---tx-decoding---tx-type-flag-sum) 1)) + +(defconstraint USER-transaction---transaction-decoding---the-transaction-type-flags-decode-the-transaction-type + (:guard (first-row-of-USER-transaction)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (eq! (USER-transaction---RLP---tx-type) + (USER-transaction---tx-decoding---tx-type-wght-sum))) + +(defconstraint USER-transaction---transaction-decoding---transactions-sans-access-list-have-no-addresses-nor-storage-keys-to-prewarm + (:guard (first-row-of-USER-transaction)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-not-zero (USER-transaction---tx-decoding---tx-type-sans-access-set) + (begin + (vanishes! (USER-transaction---RLP---number-of-access-list-keys)) + (vanishes! (USER-transaction---RLP---number-of-access-list-addresses)) + ))) + + diff --git a/txndata/osaka/processing/user/prelude.lisp b/txndata/osaka/processing/user/prelude.lisp new file mode 100644 index 000000000..25d5ca1fd --- /dev/null +++ b/txndata/osaka/processing/user/prelude.lisp @@ -0,0 +1,35 @@ +(module txndata) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X. USER transaction processing ;; +;; X.Y Prelude ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun (first-row-of-USER-transaction) (force-bin (* (- TOTL_TXN_NUMBER (prev TOTL_TXN_NUMBER)) USER))) +(defun (first-row-of-USER-transaction-with-EIP-1559-gas-semantics) (force-bin (* (first-row-of-USER-transaction) + (USER-transaction---HUB---has-eip-1559-gas-semantics)))) + + +(defconstraint USER-transaction-processing---prelude---setting-the-first-few-perspective-flags + (:guard (first-row-of-USER-transaction)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (eq! (+ (shift HUB ROFF___USER___HUB_ROW ) + (shift RLP ROFF___USER___RLP_ROW ) + (shift CMPTN ROFF___USER___CMPTN_ROW___EIP-2681___MAX_NONCE_UPPER_BOUND_CHECK)) + 3)) + +(defun (ct-max-USER-sum) + (+ (* (- nROWS___TRANSACTION___SANS___EIP_1559_GAS_SEMANTICS 1) (shift rlp/TYPE_0 ROFF___USER___RLP_ROW)) + (* (- nROWS___TRANSACTION___SANS___EIP_1559_GAS_SEMANTICS 1) (shift rlp/TYPE_1 ROFF___USER___RLP_ROW)) + (* (- nROWS___TRANSACTION___WITH___EIP_1559_GAS_SEMANTICS 1) (shift rlp/TYPE_2 ROFF___USER___RLP_ROW)) + (* (- nROWS___TRANSACTION___WITH___EIP_1559_GAS_SEMANTICS 1) (shift rlp/TYPE_3 ROFF___USER___RLP_ROW)) + (* (- nROWS___TRANSACTION___WITH___EIP_1559_GAS_SEMANTICS 1) (shift rlp/TYPE_4 ROFF___USER___RLP_ROW)) + )) + + +(defconstraint USER-transaction-processing---prelude---setting-CT_MAX + (:guard (first-row-of-USER-transaction)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (eq! CT_MAX (ct-max-USER-sum))) diff --git a/txndata/osaka/processing/user/rows/_02_eip-2681_max_nonce_check.lisp b/txndata/osaka/processing/user/rows/_02_eip-2681_max_nonce_check.lisp new file mode 100644 index 000000000..8928d4c7d --- /dev/null +++ b/txndata/osaka/processing/user/rows/_02_eip-2681_max_nonce_check.lisp @@ -0,0 +1,21 @@ +(module txndata) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X. USER transaction processing ;; +;; X.Y Common computations ;; +;; X.Y.Z EIP-2681 max nonce check ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstraint USER-transaction---common-computations---EIP-2681-max-nonce-upper-bound-check + (:guard (first-row-of-USER-transaction)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (begin + (small-call-to-LT ROFF___USER___CMPTN_ROW___EIP-2681___MAX_NONCE_UPPER_BOUND_CHECK + (USER-transaction---RLP---nonce) + EIP2681_MAX_NONCE) + (result-must-be-true ROFF___USER___CMPTN_ROW___EIP-2681___MAX_NONCE_UPPER_BOUND_CHECK) + )) + diff --git a/txndata/osaka/processing/user/rows/_03_initial_balance_must_cover_value_and_gas.lisp b/txndata/osaka/processing/user/rows/_03_initial_balance_must_cover_value_and_gas.lisp new file mode 100644 index 000000000..df6bf9281 --- /dev/null +++ b/txndata/osaka/processing/user/rows/_03_initial_balance_must_cover_value_and_gas.lisp @@ -0,0 +1,30 @@ +(module txndata) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X. USER transaction processing ;; +;; X.Y Common computations ;; +;; X.Y.Z Initial balance must cover value and gas ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + + +(defconstraint USER-transaction---common-computations---initial-balance-must-cover-value-and-gas + (:guard (first-row-of-USER-transaction)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (begin + (small-call-to-LEQ ROFF___USER___CMPTN_ROW___INITIAL_BALANCE_MUST_COVER_VALUE_AND_GAS + (USER-transaction---max-cost-in-wei) + (USER-transaction---HUB---initial-balance)) + (result-must-be-true ROFF___USER___CMPTN_ROW___INITIAL_BALANCE_MUST_COVER_VALUE_AND_GAS) + )) + +(defun (USER-transaction---max-cost-in-wei) + (+ (USER-transaction---RLP---value) + (* (USER-transaction---RLP---gas-limit) + (USER-transaction---max-gas-price)))) + +(defun (USER-transaction---max-gas-price) + (+ (* (USER-transaction---tx-decoding---tx-type-with-fixed-gas-price) (USER-transaction---RLP---gas-price)) + (* (USER-transaction---tx-decoding---tx-type-sans-fixed-gas-price) (USER-transaction---RLP---max-fee)))) diff --git a/txndata/osaka/processing/user/rows/_04_eip-3860_init_code_does_not_exceed_max_size.lisp b/txndata/osaka/processing/user/rows/_04_eip-3860_init_code_does_not_exceed_max_size.lisp new file mode 100644 index 000000000..f93242ed8 --- /dev/null +++ b/txndata/osaka/processing/user/rows/_04_eip-3860_init_code_does_not_exceed_max_size.lisp @@ -0,0 +1,20 @@ +(module txndata) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X. USER transaction processing ;; +;; X.Y Common computations ;; +;; X.Y.Z EIP-3860 mandated init code size check ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstraint USER-transaction---common-computations---EIP-3860---init-code-size-comparison-to-max-value + (:guard (first-row-of-USER-transaction)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (begin + (small-call-to-LEQ ROFF___USER___CMPTN_ROW___EIP-3860___MAX_INIT_CODE_SIZE_BOUND_CHECK + (USER-transaction---HUB---init-code-size) + MAX_INIT_CODE_SIZE) + (result-must-be-true ROFF___USER___CMPTN_ROW___EIP-3860___MAX_INIT_CODE_SIZE_BOUND_CHECK) + )) diff --git a/txndata/osaka/processing/user/rows/_05_eip-3860_init_code_pricing.lisp b/txndata/osaka/processing/user/rows/_05_eip-3860_init_code_pricing.lisp new file mode 100644 index 000000000..98b646558 --- /dev/null +++ b/txndata/osaka/processing/user/rows/_05_eip-3860_init_code_pricing.lisp @@ -0,0 +1,22 @@ +(module txndata) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X. USER transaction processing ;; +;; X.Y Common computations ;; +;; X.Y.Z EIP-3860 mandated init code pricing ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstraint USER-transaction---common-computations---EIP-3860---mandated-init-code-pricing + (:guard (first-row-of-USER-transaction)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (call-to-EUC ROFF___USER___CMPTN_ROW___EIP-3860___INIT_CODE_WORD_PRICING + (+ (USER-transaction---HUB---init-code-size) WORD_SIZE_MO) + WORD_SIZE) + ) + +(defun (USER-transaction---init-code-words) (shift computation/EUC_QUOTIENT ROFF___USER___CMPTN_ROW___EIP-3860___INIT_CODE_WORD_PRICING)) +(defun (USER-transaction---init-code-cost) (* GAS_CONST_INIT_CODE_WORD (USER-transaction---init-code-words))) + diff --git a/txndata/osaka/processing/user/rows/_06_gas_limit_must_cover_upfront_gas_cost.lisp b/txndata/osaka/processing/user/rows/_06_gas_limit_must_cover_upfront_gas_cost.lisp new file mode 100644 index 000000000..770393d6d --- /dev/null +++ b/txndata/osaka/processing/user/rows/_06_gas_limit_must_cover_upfront_gas_cost.lisp @@ -0,0 +1,35 @@ +(module txndata) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X. USER transaction processing ;; +;; X.Y Common computations ;; +;; X.Y.Z Gas limit must cover the upfront gas cost ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstraint USER-transaction---common-computations---gas-limit-must-cover-the-upfront-gas-cost---comparison + (:guard (first-row-of-USER-transaction)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (small-call-to-LEQ ROFF___USER___CMPTN_ROW___GAS_LIMIT_MUST_COVER_THE_UPFRONT_GAS_COST + (USER-transaction---upfront-gas-cost) + (USER-transaction---RLP---gas-limit)) + ) + + +(defconstraint USER-transaction---common-computations---gas-limit-must-cover-the-upfront-gas-cost---result-must-be-true + (:guard (first-row-of-USER-transaction)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (result-must-be-true ROFF___USER___CMPTN_ROW___GAS_LIMIT_MUST_COVER_THE_UPFRONT_GAS_COST) + ) + +(defun (USER-transaction---upfront-gas-cost) + (+ (USER-transaction---payload-cost) + (USER-transaction---init-code-cost) + GAS_CONST_G_TRANSACTION + (* (USER-transaction---RLP---is-deployment) GAS_CONST_G_TX_CREATE ) + (* (USER-transaction---RLP---number-of-access-list-addresses) GAS_CONST_G_ACCESS_LIST_ADRESS ) + (* (USER-transaction---RLP---number-of-access-list-keys) GAS_CONST_G_ACCESS_LIST_STORAGE ) + )) + diff --git a/txndata/osaka/processing/user/rows/_07_eip-7623_gas_limit_must_cover_transaction_floor_cost.lisp b/txndata/osaka/processing/user/rows/_07_eip-7623_gas_limit_must_cover_transaction_floor_cost.lisp new file mode 100644 index 000000000..6198e1213 --- /dev/null +++ b/txndata/osaka/processing/user/rows/_07_eip-7623_gas_limit_must_cover_transaction_floor_cost.lisp @@ -0,0 +1,25 @@ +(module txndata) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X. USER transaction processing ;; +;; X.Y Common computations ;; +;; X.Y.Z Gas limit must cover the transaction floor cost ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstraint USER-transaction---common-computations---gas-limit-and-transaction-floor-cost-comparison + (:guard (first-row-of-USER-transaction)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (small-call-to-LEQ ROFF___USER___CMPTN_ROW___GAS_LIMIT_MUST_COVER_THE_TRANSACTION_FLOOR_COST + (USER-transaction---transaction-floor-cost) + (USER-transaction---RLP---gas-limit)) + ) + +(defconstraint USER-transaction---common-computations---PRAGUE---gas-limit-must-cover-transaction-floor-cost + (:guard (first-row-of-USER-transaction)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (result-must-be-true ROFF___USER___CMPTN_ROW___GAS_LIMIT_MUST_COVER_THE_TRANSACTION_FLOOR_COST) + ) + diff --git a/txndata/osaka/processing/user/rows/_08_refunds_upper_limit.lisp b/txndata/osaka/processing/user/rows/_08_refunds_upper_limit.lisp new file mode 100644 index 000000000..132028582 --- /dev/null +++ b/txndata/osaka/processing/user/rows/_08_refunds_upper_limit.lisp @@ -0,0 +1,24 @@ +(module txndata) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X. USER transaction processing ;; +;; X.Y Common computations ;; +;; X.Y.Z Upper limit for refunds ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstraint USER-transaction-processing---common-computations---upper-limit-for-refunds + (:guard (first-row-of-USER-transaction)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (call-to-EUC ROFF___USER___CMPTN_ROW___UPPER_LIMIT_FOR_GAS_REFUNDS + (USER-transaction---execution-gas-cost) + MAX_REFUND_QUOTIENT)) + + +(defun (USER-transaction---execution-gas-cost) (- (USER-transaction---RLP---gas-limit) + (USER-transaction---HUB---gas-leftover))) + +(defun (USER-transaction---refund-limit) (shift computation/EUC_QUOTIENT ROFF___USER___CMPTN_ROW___UPPER_LIMIT_FOR_GAS_REFUNDS)) + diff --git a/txndata/osaka/processing/user/rows/_09_refunds_effective.lisp b/txndata/osaka/processing/user/rows/_09_refunds_effective.lisp new file mode 100644 index 000000000..2e62277b3 --- /dev/null +++ b/txndata/osaka/processing/user/rows/_09_refunds_effective.lisp @@ -0,0 +1,25 @@ +(module txndata) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X. USER transaction processing ;; +;; X.Y Common computations ;; +;; X.Y.Z Effective refund computation ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstraint USER-transaction-processing---common-computations---computing-effective-refund + (:guard (first-row-of-USER-transaction)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (small-call-to-LT ROFF___USER___CMPTN_ROW___EFFECTIVE_GAS_REFUND_COMPUTATION + (USER-transaction---HUB---refund-counter-final) + (USER-transaction---refund-limit))) + +(defun (USER-transaction---accrued-refunds-are-LT-than-refund-limit) (shift computation/WCP_RES ROFF___USER___CMPTN_ROW___EFFECTIVE_GAS_REFUND_COMPUTATION)) +(defun (USER-transaction---leftover-gas-plus-refunds) (if-zero (force-bin (USER-transaction---accrued-refunds-are-LT-than-refund-limit)) + (+ (USER-transaction---HUB---gas-leftover) (USER-transaction---refund-limit)) + (+ (USER-transaction---HUB---gas-leftover) (USER-transaction---HUB---refund-counter-final)) + )) +(defun (USER-transaction---consumed-gas-after-refunds) (- (USER-transaction---RLP---gas-limit) + (USER-transaction---leftover-gas-plus-refunds))) diff --git a/txndata/osaka/processing/user/rows/_10_eip-7623_refunds_vs_floor_cost.lisp b/txndata/osaka/processing/user/rows/_10_eip-7623_refunds_vs_floor_cost.lisp new file mode 100644 index 000000000..78f4fd375 --- /dev/null +++ b/txndata/osaka/processing/user/rows/_10_eip-7623_refunds_vs_floor_cost.lisp @@ -0,0 +1,35 @@ +(module txndata) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; X. USER transaction processing ;; +;; X.Y Common computations ;; +;; X.Y.Z Comparing effective refun to transaction floor cost ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defconstraint USER-transaction-processing---common-computations---comparing-consumed-gas-after-refunds-with-transaction-floor-cost + (:guard (first-row-of-USER-transaction)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (small-call-to-LT ROFF___USER___CMPTN_ROW___EFFECTIVE_GAS_REFUND_VS_TRANSACTION_CALL_DATA_FLOOR_PRICE_COMPARISON + (USER-transaction---consumed-gas-after-refunds) + (USER-transaction---transaction-floor-cost) + )) + +(defun (USER-transaction---pay-floor-price) (shift computation/WCP_RES ROFF___USER___CMPTN_ROW___EFFECTIVE_GAS_REFUND_VS_TRANSACTION_CALL_DATA_FLOOR_PRICE_COMPARISON)) + +;; Prague specific +(defconstraint USER-transaction-processing---common-computations---setting-REFUND_EFFECTIVE---PRAGUE-version + (:guard (first-row-of-USER-transaction)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (if-zero (force-bin (USER-transaction---pay-floor-price)) + ;; pay_floor_cost ≡ + (eq! (USER-transaction---HUB---refund-effective) + (- (USER-transaction---RLP---gas-limit) + (USER-transaction---consumed-gas-after-refunds))) + ;; pay_floor_cost ≡ <$l@ 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 literal 0 HcmV?d00001 From 0bc39b781fd0b0139ab7d399a62cf7309d9ee93c Mon Sep 17 00:00:00 2001 From: F Bojarski Date: Fri, 3 Oct 2025 17:39:53 +0530 Subject: [PATCH 2/4] fix: add zkevm to git ignore Signed-off-by: F Bojarski --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 08aa7e0f1..98af0d8d1 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ zkevm_paris.bin zkevm_shanghai.bin zkevm_cancun.bin zkevm_prague.bin +zkevm_osaka.bin zkevm.go.bin zkevm_for_reference_tests.bin zkevm_for_old_replay_tests.bin From fc295154978845e945b05c6d990161c189cb44b2 Mon Sep 17 00:00:00 2001 From: F Bojarski Date: Fri, 3 Oct 2025 17:41:34 +0530 Subject: [PATCH 3/4] no osaka asm specific constants Signed-off-by: F Bojarski --- Makefile | 3 +-- constants/osaka/constants.zkasm | 1 - 2 files changed, 1 insertion(+), 3 deletions(-) delete mode 100644 constants/osaka/constants.zkasm diff --git a/Makefile b/Makefile index 812ba268b..b5f973bfa 100644 --- a/Makefile +++ b/Makefile @@ -28,7 +28,6 @@ CONSTANTS := constants/constants.lisp CONSTANTS_LONDON := constants/london/constants.zkasm CONSTANTS_CANCUN := constants/cancun/constants.zkasm CONSTANTS_PRAGUE := constants/prague/constants.zkasm -CONSTANTS_OSAKA := constants/osaka/constants.zkasm EC_DATA := ecdata @@ -196,7 +195,7 @@ ZKEVM_MODULES_PRAGUE := ${ZKEVM_MODULES_COMMON} \ ${TXN_DATA_PRAGUE} ZKEVM_MODULES_OSAKA := ${ZKEVM_MODULES_COMMON} \ - ${CONSTANTS_OSAKA} \ + ${CONSTANTS_PRAGUE} \ ${TABLES_PRAGUE} \ ${BLOCKDATA_CANCUN} \ ${BLS_PRAGUE} \ diff --git a/constants/osaka/constants.zkasm b/constants/osaka/constants.zkasm deleted file mode 100644 index a71365a32..000000000 --- a/constants/osaka/constants.zkasm +++ /dev/null @@ -1 +0,0 @@ -const MAX_PRC_ADDRESS = 0x11 From 4c9083a9e2608a4d6abe7ec2f6b1ef7c3a83646d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Bojarski?= <54240434+letypequividelespoubelles@users.noreply.github.com> Date: Sat, 4 Oct 2025 09:34:27 +0530 Subject: [PATCH 4/4] Delete zkevm_osaka.bin MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: François Bojarski <54240434+letypequividelespoubelles@users.noreply.github.com> --- zkevm_osaka.bin | Bin 978660 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 zkevm_osaka.bin diff --git a/zkevm_osaka.bin b/zkevm_osaka.bin deleted file mode 100644 index 583f56ecc9303558ef2853ba58454c90a0c9e163..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 978660 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