本文详细介绍了如何设置环境并使用Certora Prover对Solidity智能合约进行形式化验证。内容涵盖了前置工具安装、项目目录配置、获取Certora访问密钥、编写并运行第一个规范文件,以及如何使用配置文件简化验证流程,并展示了验证结果。
Certora 的形式化验证
上次更新时间:2026 年 2 月 13 日
在上一章中,我们学习了形式化验证的理论方面,包括它是什么以及它是如何工作的。在本模块中,我们将超越理论,学习以下内容:
让我们首先设置 Certora Prover 的项目环境。
在设置项目目录之前,请确保你的本地机器已安装以下先决条件:
你可以通过在终端中运行 python3 --version 和 java --version 命令来检查你的机器是否已安装这两个软件。
💡 对于 Windows 用户,我们强烈建议使用适用于 Linux 的 Windows 子系统 (WSL) 以获得更好的体验。
安装完先决条件后,创建一个名为 certora-counter 的空目录,进入该目录,然后按照以下说明正确设置你的项目目录。
在你的本地机器上,运行以下命令安装 virtualenv。这个工具将允许我们创建一个 Python 虚拟环境,这对于管理项目目录中的依赖项至关重要。
pip3 install virtualenv
安装 virtualenv 后,通过在终端中运行以下命令为我们的项目创建一个 Python 虚拟环境。
virtualenv certora-env
接下来,通过在终端中运行以下命令激活你创建的 Python 虚拟环境。
source certora-env/bin/activate
接下来,在终端中运行以下命令安装 Prover。
pip3 install certora-cli
接下来,使用以下命令在你的虚拟环境中安装 solc-select。这将使我们能够方便地更改我们正在使用的 Solidity 编译器版本。
pip3 install solc-select
要运行 Prover,你需要设置一个访问密钥作为系统变量。要获取你的个人访问密钥,请在 Certora 网站注册。注册后,你将收到 Certora 发送的一封电子邮件,其中包含访问密钥和 Certora 账户的初始密码。
要将访问密钥添加为系统变量,请遵循以下说明:
打开终端并确保你位于项目目录中。
使用 nano .profile 命令创建并打开 .profile 文件。
要将访问密钥添加为环境变量,请在其中添加以下文本。
#certora access key
export CERTORAKEY=<your-certora-access-key>
要保存更改,请按 CTRL + O,然后按 Enter。
要退出,请按 CTRL + X。
要在终端中加载我们对 .profile 文件所做的最新更改,请运行以下命令。
source .profile
zsh 的 Mac 用户打开终端并确保你位于 certora-counter 目录中。
通过在终端中运行 nano .zshenv 命令创建一个名为 .zshenv 的文件。
在你喜欢的文本编辑器中打开 .zshenv 文件。
要将访问密钥添加为环境变量,请在其中添加以下文本。
#certora access key
export CERTORAKEY=<your-certora-access-key>
要保存更改,请按 CTRL + O,然后按 Enter。
要退出,请按 CTRL + X。
要应用我们刚刚创建的环境变量,请在终端中运行以下命令。
source .zshenv
请注意,每当你打开新的终端时,请务必运行 source .zshenv 或 source .profile 命令来加载环境变量;否则,你将收到 Prover 发出的错误消息 The environment variable CERTORAKEY does not contain a Certora key。
在 certora-counter 目录中,添加一个名为 contracts 的子文件夹。完成后,在其中创建一个名为 Counter.sol 的文件,并添加以下合约。
//SPDX-License-Identifier: MIT
pragma solidity 0.8.25;
contract Counter {
uint256 public count;
function increment() external {
count++;
}
}
上面的合约是一个简单的智能合约,它只有一个名为 count 的公共状态变量,其值可以通过外部函数 increment() 递增。
Certora Verification Language LSP如果你使用 Microsoft 的 VS Code 编辑器或其分支版本,我们建议安装 Certora Verification Language LSP 以通过以下说明增强你的开发体验,包括语法检查、语法高亮和代码补全:
在 certora-counter 目录中,添加一个名为 specs 的子文件夹。完成后,在其中创建一个名为 counter.spec 的文件,并添加以下代码。
methods {
function count() external returns(uint256) envfree;
function increment() external envfree;
}
rule checkCounter() {
// Pre-Call State
uint256 precallCount = count();
// Method Call
increment();
// Post-call state
uint256 postcallCount = count();
// Assert that the post-call count is exactly one more than the pre-call count
assert postcallCount == precallCount + 1;
}
目前,不必担心代码。我们将在下一章中详细剖析并解释每个部分。
在运行 Prover 之前,我们需要添加正确的 Solidity 编译器。要为我们的项目添加和使用正确的 Solidity 编译器版本,请在终端中运行以下两个命令。
solc-select install 0.8.25
solc-select use 0.8.25
一旦我们有了合约和规范,我们就可以将它们提交给 Certora Prover 进行验证过程,方法是运行 certoraRun 命令。此命令需要 Solidity 合约的路径和相关的 .spec 文件,如下所示,才能成功执行。
certoraRun contractFilePath:contractName --verify contractName:specFilePath
要验证我们的规范,请确保你位于 certora-counter 目录中,然后在终端中运行以下命令。
certoraRun contracts/Counter.sol:Counter --verify Counter:specs/counter.spec
运行上述命令后,你应该会看到如下所示的输出。

要查看验证结果,请打开终端中打印的验证链接。结果应与下图类似。

然而,对于大型项目,直接在终端中使用带有许多参数的 certoraRun 命令可能会变得很麻烦。因此,建议使用配置文件。
certoraRun 命令在 Certora 中,配置文件是一个简单的 JSON5 文件,使用 .conf 扩展名编写,它至少需要两个关键参数以及其他配置选项:
要使用配置文件,请在项目目录中创建一个名为 confs 的子文件夹。然后,在 confs 文件夹中创建一个名为 counter.conf 的文件,并添加以下内容。
{
"files": [
"contracts/Counter.sol:Counter"
],
"verify": "Counter:specs/counter.spec",
}
将配置文件正确放置后,我们只需运行 certoraRun 命令并引用配置文件的路径即可执行验证过程,如下所示:
certoraRun confs/counter.conf
如果命令成功执行,你应该会看到如下所示的输出,其中包含一个验证结果的链接。

打开终端中打印的验证链接,查看验证结果。结果应与下图类似。

目前,只需了解绿色勾号 (✅) 表示 Prover 已成功验证规范文件 (counter.spec) 中指定的条件。这意味着合约已按照规范中概述的断言和逻辑按预期运行。
恭喜! 你已成功设置开发环境并执行了你的第一次形式化验证运行。然而,到目前为止,我们一直将规范文件 (.spec) 视为一个“黑匣子”。我们运行了它,但没有查看内部。在下一章中,我们将打开这个盒子并剖析 Certora 规范的结构。我们将分解其两个基本组成部分,即规则块(Rule Blocks)和方法块(Methods Blocks),并学习如何定义验证你的第一个智能合约所需的先决条件(pre-conditions)、动作(actions)和后置条件(post-conditions)。
本文是关于使用 Certora Prover 进行形式化验证系列文章的一部分。
- 原文链接: rareskills.io/post/certo...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!