Web3 智能合约安全的测试和形式验证

Web3 智能合约安全的测试和形式验证

Web3 智能合约安全的测试和形式验证 PlatoBlockchain 数据智能。垂直搜索。人工智能。

阅读时间: 9 分钟

想象一下跳伞。 在跳下飞机之前,你会检查你的降落伞一百次,对吧? 检查和测试是安全的一个组成部分; 考虑任何与安全相关的事情。 可能会有事后检测的机制,不管是装闭路电视,还是在学校笔试前检查钢笔的墨水,我们都遵守安全措施。 涉及的风险越高,我们测试的东西就越多。 当我们谈论智能合约时,风险是巨大的。 在智能合约安全方面,您不能大意。

1.安全永远是需要的。

你肯定可以锁门两次或三次都没有关系。 你能确定你不在的时候你的房子不会被抢劫吗? 你不能,因为你不知道强盗可能会做什么来闯入房子——我们采取的每一项安全措施都是如此。 没有完全安全的方法可以保证安全。 尽管如此,我们迅速采取的行动会增加我们安全的机会,这就是游戏的本质。 我们希望通过采用不同的措施来增加安全的几率。

Web3 的世界也不例外。 没有安全的方法可以自救,但是拥有来自 QuillAudits 的经验丰富的审计员可以极大地增加您的协议受到保护的几率,并将确保您的最新安全性。 在 web3 中,有两种重要的机制可以帮助您通过对协议进行一些测试来了解您的安全性:-

  1. 智能合约测试
  2. 智能合约的形式验证

让我们详细了解它们并了解它们如何帮助我们了解合约的弱点或漏洞。

2. 智能合约测试

有经验的开发人员可以用代码向机器解释工作。 尽管如此,有时由于代码中的缺陷或逻辑错误,机器并没有描述开发人员所想的确切机制。 测试是帮助确定我们的代码在哪里失败以及可以做什么以使其符合我们需要它执行的操作的过程。

智能合约测试 是开发周期中的一个阶段,在这个阶段我们对我们的合约进行详细分析,并试图找出我们的代码失败的地方和原因。 几乎所有的智能合约都会经历这个阶段。 有两种方法可以完成智能合约测试。 让我们探索它们。

2.1 自动化

顾名思义,这种测试智能合约的方法是用来进行脚本化测试的。 它涉及自动化软件,该软件执行重复测试以发现智能合约中的任何漏洞和缺陷。 这些自动化测试工具可以配置测试数据和预期结果。 然后将实际结果与预期结果进行比较,以检查合约是否正常工作。 自动化测试可以进一步分为三类。

2.1.1. 功能测试

假设您编写了一个程序来获取两个数字 a 和 b,然后返回两个数字的加法。 所以要检查那个程序,你给出 2 和 8 并输入预期结果 10。现在当程序运行时,它也应该返回 10。如果是,那么它工作正常,我们的代码是正确的,但如果它没有,那么我们的代码有一些错误。 

功能测试需要了解您的合约在特定条件下的行为方式。 我们可以通过使用选定值运行计算并比较返回的输出来测试它。 功能测试分为三类:-

  1. 单元测试:- 这涉及测试智能合约的各个组件的正确性。 它是自信的或需要对变量的陈述。
  1. 集成 TESTI吴:- 这些涉及一起测试几个单独的组件。 集成测试在层次结构中比单元测试高一级。 它帮助我们确定不同功能交互产生的错误,这些功能可能是其他智能合约的一部分。
  1. 系统 文本吴:- 这是层次结构中的最高层。 在此,我们将整个合约作为一个完全集成的系统进行测试,看它是否按照我们的需要执行。 它是从用户的角度来完成的,最好的方法是将其部署在测试网上。

2.1.2. 静态分析

静态分析甚至可以在不运行程序的情况下完成。 它涉及在执行前对智能合约的源代码或字节码的分析。 顾名思义,静态分析可以检测出一些常见的漏洞。

2.1.3. 动态分析

与静态分析不同,动态分析是在智能合约运行时进行的,以识别代码中的问题。 动态代码分析器观察合约的运行状态并生成漏洞和财产违规的详细报告。 模糊测试属于动态分析。 模糊测试提供不正确或恶意的输入以导致意外的代码执行。

2.2手册

顾名思义,这种智能合约测试方法涉及与人类开发人员的定期互动。 开发人员检查代码行的代码审计属于智能合约测试的手动模式。

手动模式需要相当多的时间、技能、金钱和努力。 尽管如此,结果通常是值得的,因为有了这个,我们可以识别在自动测试中可能被忽视的漏洞。 手动测试有两种基本类型:-

2.2.1 代码审计:- 

测试您的安全措施是否正常工作的最佳方法是尝试破坏它。 例如,如果您想检查您的汽车锁是否正常工作,请尝试将其打开。 现在您可能会问,熟练的偷车贼可以轻易地闯入我的车。 我可能不会,所以解决方案是雇用擅长闯入的人,以便他可以指导您!

 是的,我说的是 QuillAudits。 我们是一支经验丰富的审核员团队,可以为您提供指导。 代码审计需要攻击者的心态来发现源代码中所有可能的漏洞。 代码审计是对智能合约代码的详细评估,以发现潜在的漏洞和缺陷。

2.2.2 漏洞赏金:-

如果您认为您的源代码中可能存在一些安全漏洞(大多数是)并且您找不到它们,您可以通过创建奖励系统将这项工作外包给自由职业者。 这更像是宣布奖励任何可以破解你的智能合约的人。 通过这样做,您可以了解您的智能合约中存在的漏洞,以便您可以更好地保护它并避免您的用户遭受损失。

3. 智能合约形式化验证

形式验证是基于形式规范评估合约正确性的过程。 这意味着正式验证评估代码是否按预期进行。 形式验证使用形式化方法来指定、设计和验证程序。

3.1 什么是正式规范?

在智能合约的背景下,正式规范指的是在所有可能的情况下必须保持不变的属性。 这些是“不变量”属性,因为它们不能改变并代表关于合约执行的逻辑断言。

形式规范是用形式语言编写的语句的集合。 规范涵盖了不同的属性,并描述了合约的属性在其他情况下应该如何表现。 形式规范是至关重要的,因为如果合约在执行过程中没有不变变量或属性发生变化,则可能导致财产利用,从而可能导致巨大损失。

它可以帮助我们确定智能合约是否符合规范或是否存在意外行为。 形式验证包含三个组件:规范、模型和验证引擎。

3.1.1规范

规范是对智能合约要求的清晰、明确和完整的描述。 它应该描述合同应该做什么和不应该做什么。 以下是添加两个数字的简单智能合约的示例规范:

// Specification: Adds two numbers
// Inputs: a, b (uint)
// Outputs: the sum of a and b (uint) function add(uint a, uint b) public view returns (uint) {
// Implementation details are not relevant to the specification
// …
}

3.1.2模型

模型正式表示可用于推理其行为的智能合约。 一种流行的智能合约模型是 Solidity 编程语言。 以下是上述 add 函数的示例模型:

// Model: Adds two numbers
// Inputs: a, b (uint)
// Outputs: the sum of a and b (uint) function add(uint a, uint b) public view returns (uint) {
return a + b;
}

3.1.3 验证引擎

验证引擎是一种工具,可以分析模型并验证其关于给定规范的正确性。 有多种验证引擎可用于智能合约,包括:

秘银: 一种开源符号执行工具,可以检测 Solidity 智能合约中的各种安全漏洞。

混音 IDE: 集成开发环境,包括可以验证智能合约正确性的形式验证工具。

Certora证明者: 一种商业工具,可以使用自动数学推理来验证智能合约的正确性。 下面是一个示例,说明如何使用 Certora Prover 使用形式验证来验证智能合约的正确性:

pragma solidity 0.7.6; // Model: Adds two numbers
// Inputs: a, b (uint)
// Outputs: the sum of a and b (uint)
function add(uint a, uint b) public pure returns (uint) {
return a + b;
} // Model: Adds two numbers
// Inputs: a, b (uint)
// Outputs: the sum of a and b (uint) function add(uint a, uint b) public pure returns (uint) {
return a + b;
} // Specification: Adds two numbers
// Inputs: a, b (uint)
// Outputs: the sum of a and b (uint) function test_add(uint a, uint b) public pure returns (bool) {
uint expected = a + b;
uint actual = add(a, b);
return expected == actual;
} // Verification: Verify the correctness of the add function contract TestAdd {
function test_add(uint a, uint b) public view returns (bool) {
return CertoraProver.verify(test_add, a, b);
}
}

在上面的例子中,我们定义了一个 Solidity 智能合约,它包括一个 add 函数的模型,一个函数的规范,以及一个可以验证函数正确性的验证引擎(Certora Prover)。 我们还定义了一个测试函数 (test_add),可用于验证函数的正确性。

3.2 测试 VS 形式验证

正如我们所讨论的,测试返回它缺少的一些输入数据机器人的预期结果,因为我们不能说它没有测试过的数据。 在每个可能的输入上检查它几乎是不可能的。 因此我们不确定它的“功能正确性”。 这就是形式验证的用武之地。形式验证方法使用严格的数学技术来指定和验证软件或智能合约。

3.3 形式验证技术

形式验证具有广泛的增强技术 智能合约安全. 在博客的这一部分,我们将单独探讨一些。

3.3.1 模型检查

当我们讨论什么是正式规范时,我们在这种正式验证技术中根据其规范检查智能合约。 这些智能合约表示为状态转换系统,并且使用时序逻辑定义属性。 

该技术主要用于评估描述智能合约随时间变化行为的时间属性。 访问控制属性(管理员调用 自我毁灭) 可以写成形式逻辑。 然后模型检查算法可以验证合约是否满足这种形式验证。

模型检查使用一种称为状态空间探索的技术,它基本上是尝试我们的智能合约可能处于的所有可能状态,然后检查是否有任何状态导致属性违规。 然而,这可能会导致无限多的状态; 因此,模型检查器依靠抽象技术来对智能合约进行有效分析。

3.3.2 定理证明

定理证明是关于程序正确性的数学推理。 它涉及创建合同系统和规范的逻辑印象,并验证声明之间的“逻辑等价性”。 逻辑等价是一种数学关系,它表示当且仅当陈述 B 为真时,陈述 A 为真。

正如我们在模型检查技术中学到的,我们将合同建模为具有有限状态的转换系统。 定理证明可以处理无限状态系统的分析。 然而,自动定理证明器并不总是知道逻辑问题是否可判定; 因此,通常需要人工协助来指导定理证明者推导正确性证明。

4。 结论

测试和形式验证都是智能合约开发的组成部分。 这些是用于使智能合约安全并帮助使合约准备好部署的方法。 但如您所知,仅靠安全是不够的。 许多智能合约只是因为没有适当的测试而遭到黑客攻击。 现在 web3 社区比以往任何时候都需要更安全的协议。 

我们 QuillAudits 的使命是帮助保护您的协议。 凭借我们技术娴熟且经验丰富的团队,我们确保不会漏掉任何一个漏洞。 请访问我们的网站并保护您的 Web3 项目!

28 观点

时间戳记:

更多来自 散列