本文深入探讨了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局部变量的限制,最终实现了对合约关键属性的精确验证。
文章详细介绍了使用 Certora 进行智能合约形式化验证中的核心概念:不变量(Invariants)。它解释了不变量与规则(Rules)的区别,深入探讨了如何使用 Certora Verification Language (CVL) 定义、设置和验证智能合约中的不变量,并阐述了Certora Prover基于数学归纳法的验证原理和优化机制。
本文介绍了使用Certora Prover进行智能合约形式化验证的核心组件——规范文件(.spec)。文章详细解释了规范文件中规则(Rule)的构成,包括前置条件、操作和后置期望,并阐述了方法块(Methods Block)的作用及其envfree标签的使用,最后通过一个Counter合约示例指导读者如何编写和运行验证。
envfree
本文详细介绍了在 Certora 形式化验证中使用蕴涵运算符 (=>)。它解释了该运算符如何简洁地表达条件,避免 if 语句在 CVL 中的编译问题,并通过 Solidity 示例深入探讨了蕴涵的逻辑特性、等价性(如反证法)以及常见陷阱(如空泛真理和同义反复),最后通过对 Solmate 的 mulDivUp() 函数进行形式化验证来展示实际应用。
if
mulDivUp()
本文详细介绍了如何使用Certora Prover对ERC-721代币的transferFrom()、approve()、setApprovalForAll()以及balanceOf(0)等核心功能进行形式化验证。文章通过具体的Certora验证语言(CVL)代码示例,深入解析了每个规则的前置条件、状态记录、方法调用以及活性、效果和无副作用断言,旨在确保代币操作的正确性和安全性。
transferFrom()
approve()
setApprovalForAll()
balanceOf(0)
本文深入介绍了Certora形式化验证工具中的方法属性(Method Properties),详细阐述了如何在Certora验证语言(CVL)的参数化规则中使用这些属性,例如函数选择器f.selector,来实现函数特有的断言检查。文章还讲解了如何利用filtered块排除不相关的视图(view)函数,以优化验证过程,提高效率。
f.selector
filtered
文章详细介绍了如何使用Certora形式化验证工具中的@withrevert方法标签和lastReverted特殊变量来验证智能合约中的预期revert行为。它解释了Certora Prover默认忽略revert的原因,以及如何显式地处理revert路径,从而确保合约在所有情况下(包括溢出等异常情况)的行为符合预期。
@withrevert
lastReverted
文章详细介绍了 Certora 形式化验证工具中的“持久化幽灵变量”(persistent ghost),阐述了其与普通幽灵变量在外部调用和回滚时的行为差异。通过具体案例展示了持久化幽灵变量如何在追踪底层 ETH 转移失败等场景中解决普通幽灵变量遇到的数据重置问题,并强调了何时不应滥用持久化幽灵变量,以避免掩盖真实的合约漏洞。