本文探讨了Certora Prover在形式化验证中处理循环(包括显式和隐式循环)时遇到的路径爆炸问题。文章详细解释了Prover如何通过有界循环展开来缓解这一问题,并介绍了--loop_iter和--optimistic_loop两个配置标志,同时指出了这些方法的局限性(不完整性或不健全性)。
--loop_iter
--optimistic_loop
本文详细介绍了 Certora 形式化验证工具中 requireInvariant 语句的用法。它通过在规则和不变式中引入已证明的不变式作为假设,避免了在不切实际的合约状态下进行验证,从而提高了验证的效率和准确性。文章以 ERC20 代币的 transfer 函数为例进行了实践演示。
requireInvariant
transfer
这篇文章详细介绍了使用 Certora 工具进行形式化验证中的参数化规则(Parametric Rules)。它解释了如何通过定义通用规则来验证智能合约在任何函数调用后都应保持不变的属性,例如 ERC-20 代币的总供应量不变性,并深入探讨了参数化规则的作用范围和执行机制。
本文详细介绍了如何设置环境并使用Certora Prover对Solidity智能合约进行形式化验证。内容涵盖了前置工具安装、项目目录配置、获取Certora访问密钥、编写并运行第一个规范文件,以及如何使用配置文件简化验证流程,并展示了验证结果。
这篇文章详细介绍了 Certora 形式化验证中“保留块”(preserved blocks)的作用和用法。它解释了如何利用保留块来指导 Certora Prover 避免在探索不切实际的符号状态时产生虚假告警,从而确保对智能合约不变量(invariants)的验证更加准确和有效。文章以 WETH 合约为案例,逐步演示了如何通过添加保留块来解决验证失败的问题。
文章介绍了形式化验证,阐明了规范的定义,并将其与模糊测试进行了比较,分析了形式化验证的优点和局限性。文中以Certora Prover为例,探讨了如何通过数学方法来证明智能合约符合预设规范,特别强调了其在DeFi应用中的重要性及核心原理。
本文介绍了如何在 Certora Verification Language (CVL) 中使用 if/else 语句和三元运算符进行形式化验证。通过实例展示了对 Solidity 合约中条件行为(如溢出处理、max 函数)的验证,并强调了优化 CVL 规则以提高验证效率的重要性。文章还讨论了 if/else 的局限性及三元运算符的适用场景。
本文深入探讨了Certora形式化验证中幽灵变量(Ghost Variables)未受约束可能导致验证失败的问题。文章通过Counter合约示例,详细解释了Prover的havocing机制如何产生“假阳性”的验证结果,并提出了使用CVL中的require语句来约束幽灵变量的初始值,从而确保验证过程的逻辑一致性和有效性。
Counter
require
这篇文章详细介绍了如何在Certora Prover的CVL规则中处理Solidity的msg.sender和msg.value等环境变量。通过一个计数器合约的例子,它解释了env变量的使用,如何编写访问控制规则,并展示了在验证过程中可能遇到的非预期revert情况,以及如何通过添加前置条件来完善验证规则。文章还比较了使用<=>和=>运算符在规则中表达条件的不同。
msg.sender
msg.value
env
<=>
=>
本文深入探讨了如何使用Certora的存储Hook(Storage Hooks)和幽灵变量(Ghost Variables)进行智能合约的形式化验证。文章通过具体案例,详细阐述了如何观察合约内部私有状态的变化,并克服了规则无法直接访问Hook局部变量的限制,最终实现了对合约关键属性的精确验证。