github.com/ethereum-optimism/optimism@v1.7.2/packages/contracts-bedrock/test/kontrol/scripts/run-kontrol.sh (about)

     1  #!/bin/bash
     2  set -euo pipefail
     3  
     4  export FOUNDRY_PROFILE=kprove
     5  
     6  SCRIPT_HOME="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
     7  # shellcheck source=/dev/null
     8  source "$SCRIPT_HOME/common.sh"
     9  export RUN_KONTROL=true
    10  parse_args "$@"
    11  
    12  #############
    13  # Functions #
    14  #############
    15  kontrol_build() {
    16    notif "Kontrol Build"
    17    # shellcheck disable=SC2086
    18    run kontrol build \
    19      --verbose \
    20      --require $lemmas \
    21      --module-import $module \
    22      $rekompile
    23  }
    24  
    25  kontrol_prove() {
    26    notif "Kontrol Prove"
    27    # shellcheck disable=SC2086
    28    run kontrol prove \
    29      --max-depth $max_depth \
    30      --max-iterations $max_iterations \
    31      --smt-timeout $smt_timeout \
    32      --workers $workers \
    33      $reinit \
    34      $bug_report \
    35      $break_on_calls \
    36      $break_every_step \
    37      $auto_abstract \
    38      $tests \
    39      $use_booster \
    40      --init-node-from $state_diff \
    41      --xml-test-report
    42  }
    43  
    44  dump_log_results(){
    45    trap clean_docker ERR
    46      RESULTS_FILE="results-$(date +'%Y-%m-%d-%H-%M-%S').tar.gz"
    47      LOG_PATH="test/kontrol/logs"
    48      RESULTS_LOG="$LOG_PATH/$RESULTS_FILE"
    49  
    50      if [ ! -d $LOG_PATH ]; then
    51        mkdir $LOG_PATH
    52      fi
    53  
    54      notif "Generating Results Log: $LOG_PATH"
    55  
    56      run tar -czvf results.tar.gz kout-proofs/ > /dev/null 2>&1
    57      if [ "$LOCAL" = true ]; then
    58        mv results.tar.gz "$RESULTS_LOG"
    59      else
    60        docker cp "$CONTAINER_NAME:/home/user/workspace/results.tar.gz" "$RESULTS_LOG"
    61      fi
    62      if [ -f "$RESULTS_LOG" ]; then
    63        cp "$RESULTS_LOG" "$LOG_PATH/kontrol-results_latest.tar.gz"
    64      else
    65        notif "Results Log: $RESULTS_LOG not found, skipping.."
    66      fi
    67      # Report where the file was generated and placed
    68      notif "Results Log: $(dirname "$RESULTS_LOG") generated"
    69  
    70      if [ "$LOCAL" = false ]; then
    71        notif "Results Log: $RESULTS_LOG generated"
    72        RUN_LOG="run-kontrol-$(date +'%Y-%m-%d-%H-%M-%S').log"
    73        docker logs "$CONTAINER_NAME" > "$LOG_PATH/$RUN_LOG"
    74      fi
    75  }
    76  
    77  # Define the function to run on failure
    78  on_failure() {
    79    dump_log_results
    80  
    81    if [ "$LOCAL" = false ]; then
    82      clean_docker
    83    fi
    84  
    85    notif "Cleanup complete."
    86    exit 1
    87  }
    88  
    89  # Set up the trap to run the function on failure
    90  trap on_failure ERR INT
    91  
    92  #########################
    93  # kontrol build options #
    94  #########################
    95  # NOTE: This script has a recurring pattern of setting and unsetting variables,
    96  # such as `rekompile`. Such a pattern is intended for easy use while locally
    97  # developing and executing the proofs via this script. Comment/uncomment the
    98  # empty assignment to activate/deactivate the corresponding flag
    99  lemmas=test/kontrol/pausability-lemmas.md
   100  base_module=PAUSABILITY-LEMMAS
   101  module=OptimismPortalKontrol:$base_module
   102  rekompile=--rekompile
   103  rekompile=
   104  regen=--regen
   105  # shellcheck disable=SC2034
   106  regen=
   107  
   108  #################################
   109  # Tests to symbolically execute #
   110  #################################
   111  
   112  # Temporarily unexecuted tests
   113  # "OptimismPortalKontrol.prove_proveWithdrawalTransaction_paused0" \
   114  # "OptimismPortalKontrol.prove_proveWithdrawalTransaction_paused1" \
   115  # "OptimismPortalKontrol.prove_proveWithdrawalTransaction_paused2" \
   116  # "OptimismPortalKontrol.prove_proveWithdrawalTransaction_paused3" \
   117  # "OptimismPortalKontrol.prove_proveWithdrawalTransaction_paused4" \
   118  # "OptimismPortalKontrol.prove_proveWithdrawalTransaction_paused5" \
   119  # "OptimismPortalKontrol.prove_proveWithdrawalTransaction_paused6" \
   120  # "OptimismPortalKontrol.prove_proveWithdrawalTransaction_paused7" \
   121  # "OptimismPortalKontrol.prove_proveWithdrawalTransaction_paused8" \
   122  # "OptimismPortalKontrol.prove_proveWithdrawalTransaction_paused9" \
   123  # "OptimismPortalKontrol.prove_proveWithdrawalTransaction_paused10" \
   124  
   125  test_list=()
   126  if [ "$SCRIPT_TESTS" == true ]; then
   127    test_list=( "OptimismPortalKontrol.prove_proveWithdrawalTransaction_paused0" \
   128                "OptimismPortalKontrol.prove_proveWithdrawalTransaction_paused1" \
   129                "OptimismPortalKontrol.prove_finalizeWithdrawalTransaction_paused" \
   130                "L1StandardBridgeKontrol.prove_finalizeBridgeERC20_paused" \
   131                "L1StandardBridgeKontrol.prove_finalizeBridgeETH_paused" \
   132                "L1ERC721BridgeKontrol.prove_finalizeBridgeERC721_paused" \
   133                "L1CrossDomainMessengerKontrol.prove_relayMessage_paused"
   134    )
   135  elif [ "$CUSTOM_TESTS" != 0 ]; then
   136    test_list=( "${@:${CUSTOM_TESTS}}" )
   137  fi
   138  tests=""
   139  for test_name in "${test_list[@]}"; do
   140    tests+="--match-test $test_name "
   141  done
   142  
   143  #########################
   144  # kontrol prove options #
   145  #########################
   146  max_depth=10000
   147  max_iterations=10000
   148  smt_timeout=100000
   149  max_workers=7 # Set to 7 since the CI machine has 8 CPUs
   150  # workers is the minimum between max_workers and the length of test_list
   151  # unless no test arguments are provided, in which case we default to max_workers
   152  if [ "$CUSTOM_TESTS" == 0 ] && [ "$SCRIPT_TESTS" == false ]; then
   153    workers=${max_workers}
   154  else
   155    workers=$((${#test_list[@]}>max_workers ? max_workers : ${#test_list[@]}))
   156  fi
   157  reinit=--reinit
   158  reinit=
   159  break_on_calls=--no-break-on-calls
   160  # break_on_calls=
   161  break_every_step=--break-every-step
   162  break_every_step=
   163  auto_abstract=--auto-abstract-gas
   164  auto_abstract=
   165  bug_report=--bug-report
   166  bug_report=
   167  use_booster=--use-booster
   168  # use_booster=
   169  state_diff="./snapshots/state-diff/Kontrol-Deploy.json"
   170  
   171  #############
   172  # RUN TESTS #
   173  #############
   174  conditionally_start_docker
   175  
   176  kontrol_build
   177  kontrol_prove
   178  
   179  dump_log_results
   180  
   181  if [ "$LOCAL" == false ]; then
   182      notif "Stopping docker container"
   183      clean_docker
   184  fi
   185  
   186  notif "DONE"