forked from OpenZeppelin/openzeppelin-contracts
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Update certora/README.md (OpenZeppelin#4114)
Co-authored-by: Francisco <[email protected]>
- Loading branch information
1 parent
1c8df65
commit 4f4b6ab
Showing
1 changed file
with
43 additions
and
39 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,56 +1,60 @@ | ||
# Running the certora verification tool | ||
|
||
These instructions detail the process for running CVT on the OpenZeppelin (Wizard/Governor) contracts. | ||
These instructions detail the process for running Certora Verification Tool on OpenZeppelin Contracts. | ||
|
||
Documentation for CVT and the specification language are available | ||
[here](https://certora.atlassian.net/wiki/spaces/CPD/overview) | ||
Documentation for CVT and the specification language are available [here](https://certora.atlassian.net/wiki/spaces/CPD/overview). | ||
|
||
## Prerequisites | ||
|
||
Follow the [Certora installation guide](https://docs.certora.com/en/latest/docs/user-guide/getting-started/install.html) in order to get the Certora Prover Package and the `solc` executable folder in your path. | ||
|
||
> **Note** | ||
> An API Key is required for local testing. Although the prover will run on a Github Actions' CI environment on selected Pull Requests. | ||
## Running the verification | ||
|
||
The scripts in the `certora/scripts` directory are used to submit verification | ||
jobs to the Certora verification service. After the job is complete, the results will be available on | ||
[the Certora portal](https://vaas-stg.certora.com/). | ||
The Certora Verification Tool proves specs for contracts, which are defined by the `./specs.json` file along with their pre-configured options. | ||
|
||
These scripts should be run from the root directory; for example by running | ||
The verification script `./run.js` is used to submit verification jobs to the Certora Verification service. | ||
|
||
``` | ||
sh certora/scripts/verifyAll.sh <meaningful comment> | ||
You can run it from the root of the repository with the following command: | ||
|
||
```bash | ||
node certora/run.js [[CONTRACT_NAME:]SPEC_NAME] [OPTIONS...] | ||
``` | ||
|
||
The most important of these is `verifyAll.sh`, which checks | ||
all of the harnessed contracts (`certora/harness/Wizard*.sol`) against all of | ||
the specifications (`certora/spec/*.spec`). | ||
Where: | ||
|
||
The other scripts run a subset of the specifications or the contracts. You can | ||
verify different contracts or specifications by changing the `--verify` option, | ||
and you can run a single rule or method with the `--rule` or `--method` option. | ||
- `CONTRACT_NAME` matches the `contract` key in the `./spec.json` file and may be empty. It will run all matching contracts if not provided. | ||
- `SPEC_NAME` refers to a `spec` key from the `./specs.json` file. It will run every spec if not provided. | ||
- `OPTIONS` extend the [Certora Prover CLI options](https://docs.certora.com/en/latest/docs/prover/cli/options.html#certora-prover-cli-options) and will respect the preconfigured options in the `specs.json` file. | ||
|
||
For example, to verify the `WizardFirstPriority` contract against the | ||
`GovernorCountingSimple` specification, you could change the `--verify` line of | ||
the `WizardControlFirstPriortity.sh` script to: | ||
> **Note** | ||
> A single spec may be configured to run for multiple contracts, whereas a single contract may run multiple specs. | ||
``` | ||
--verify WizardFirstPriority:certora/specs/GovernorCountingSimple.spec \ | ||
Example usage: | ||
|
||
```bash | ||
node certora/run.js AccessControl # Run the AccessControl spec against every contract implementing it | ||
``` | ||
|
||
## Adapting to changes in the contracts | ||
|
||
Some of our rules require the code to be simplified in various ways. Our | ||
primary tool for performing these simplifications is to run verification on a | ||
contract that extends the original contracts and overrides some of the methods. | ||
These "harness" contracts can be found in the `certora/harness` directory. | ||
|
||
This pattern does require some modifications to the original code: some methods | ||
need to be made virtual or public, for example. These changes are handled by | ||
applying a patch to the code before verification. | ||
|
||
When one of the `verify` scripts is executed, it first applies the patch file | ||
`certora/applyHarness.patch` to the `contracts` directory, placing the output | ||
in the `certora/munged` directory. We then verify the contracts in the | ||
`certora/munged` directory. | ||
|
||
If the original contracts change, it is possible to create a conflict with the | ||
patch. In this case, the verify scripts will report an error message and output | ||
rejected changes in the `munged` directory. After merging the changes, run | ||
`make record` in the `certora` directory; this will regenerate the patch file, | ||
which can then be checked into git. | ||
Some of our rules require the code to be simplified in various ways. Our primary tool for performing these simplifications is to run verification on a contract that extends the original contracts and overrides some of the methods. These "harness" contracts can be found in the `certora/harness` directory. | ||
|
||
This pattern does require some modifications to the original code: some methods need to be made virtual or public, for example. These changes are handled by applying a patch | ||
to the code before verification by running: | ||
|
||
```bash | ||
make -C certora apply | ||
``` | ||
|
||
Before running the `certora/run.js` script, it's required to apply the corresponding patches to the `contracts` directory, placing the output in the `certora/patched` directory. Then, the contracts are verified by running the verification for the `certora/patched` directory. | ||
|
||
If the original contracts change, it is possible to create a conflict with the patch. In this case, the verify scripts will report an error message and output rejected changes in the `patched` directory. After merging the changes, run `make record` in the `certora` directory; this will regenerate the patch file, which can then be checked into git. | ||
|
||
For more information about the `make` scripts available, run: | ||
|
||
```bash | ||
make -C certora help | ||
``` |