{"content":{"title":"如何审计一个智能合约","body":"智能合约审计用于整个 [DeFi](https://chain.link/education/defi) 生态系统，通过对协议代码的深入审查，可以帮助解决识别错误、低效代码以及这些问题。[智能合约](https://chain.link/education/smart-contracts)具有不可篡改的特点，这使得审计成为任何区块链项目[安全流程](https://blog.chain.link/defi-security-best-practices/)的关键部分。\r\n\r\n  \r\n\r\n代码审计对任何应用程序都很重要，但它们对去中心化应用程序 (dApp) 尤其重要，因为它们建立在其之上的区块链是不可变的。如果代码漏洞导致用户资金丢失，这些资金将无法找回。迄今为止，DeFi 中的黑客已经损失了[超过 50 亿美元](https://defillama.com/hacks)。\r\n\r\n  \r\n\r\n在本文中，我们研究了智能合约审计到底是什么、如何进行审计、需要注意的常见智能合约漏洞、Solidity gas 优化策略、流行的审计工具等等。\r\n\r\n  ![10-1.png](https://img.learnblockchain.cn/attachments/2023/03/HdGeKRvT63ff3f6c5d439.png)\r\n  每个月在 Defi 被盗的资金.\r\n\r\n在 2023 年 2 月 20 日前，在 Defi 中被盗的总资金是 51.3 亿美元\r\n\r\n## 什么是智能合约审计？\r\n\r\n智能合约审计包括对一个协议的智能合约代码进行详细分析，以识别安全漏洞、不良的编码实现方式和低效代码，然后再提出解决这些问题的解决方案。[审计](https://chain.link/resources/blockchain-oracle-security)有助于确保跨 [Web3](https://chain.link/education/web3) 的去中心化应用程序的安全性、可靠性和性能。\r\n\r\n  \r\n\r\n在智能合约审核期间，安全专家团队将以自动和人工的方式，审查应用程序的代码、逻辑、架构和安全措施，以识别任何潜在问题。他们专门寻找可能容易受到恶意攻击的任何代码，以及任何需要改进的部分。\r\n\r\n  \r\n\r\n智能合约代码最终将部署到 Avalanche、BNB Chain 或 Ethereum 等区块链中。一旦合约生效，任何人都可以访问它们——从终端用户到恶意攻击者——这就是为什么在启动或更新去中心化应用程序之前必须解决所有漏洞。\r\n\r\n审计完成后，审计师会发布一份摘要报告，其中提供有关审计结果、解决方法和任何其他问题的详细信息，以及未来解决现存问题的路线图。经过全面的智能合约审计后，项目可以放心地部署他们的合约，因为应用程序的安全性有了保证，用户资金也受到保护。\r\n## 如何审计智能合约\r\n\r\n智能合约审计利用各种技术和工具来减少风险点并使协议更加健壮。\r\n\r\n### 步骤 1. 收集文档\r\n\r\n被审计的项目必须先冻结代码，并向审计员提供技术文档，包括代码库、白皮书、架构和任何其他相关材料。该文档应该为审计员提供有关代码旨在实现的目标、范围和具体实施的详细指南。\r\n\r\n  \r\n\r\n### 步骤 2. 自动化测试\r\n\r\n也称为形式化验证引擎，自动化测试检查智能合约的每个可能状态，并针对可能攻击合约功能性或安全性的问题发出警报。审计人员还可以对单个功能进行集成测试、单元测试，以及探测安全漏洞的渗透测试。\r\n\r\n  \r\n\r\n### 步骤 3. 人工审核\r\n\r\n安全专家团队仔细检查每一行代码，找出错误和漏洞。虽然自动化测试可以很好地识别代码中的错误，但人类工程师更有能力检测合约逻辑或架构的问题、技术上正确且通过自动化测试的不良编码实现、gas 优化以及常见攻击点（比如说抢先交易）。\r\n\r\n  \r\n\r\n### 步骤 4. 合约错误分类\r\n\r\n每个错误都根据它可能被利用的漏洞严重性进行分类：\r\n\r\n  \r\n\r\n- 严重 - 影响协议的安全运行。\r\n\r\n- 重大 - 可能导致用户资金或协议控制损失的中心化和逻辑错误。\r\n\r\n- 中等 — 影响平台的性能或可靠性。\r\n\r\n- 次要 - 不会使应用程序的安全受到威胁的低效代码。\r\n\r\n- 信息性 — 与代码风格或行业最佳实践相关的错误。\r\n\r\n### 第 5 步。初始报告\r\n\r\n审计员起草一份初步报告，总结代码缺陷和其他问题，以及项目团队如何解决这些问题的反馈。一些智能合约服务提供商拥有一个专家团队，可以帮助修复发现的每个错误。通过解决所有问题，项目可以确保其智能合约的安全性，并且做好部署的准备。\r\n\r\n  \r\n\r\n### 第 6 步。发布最终审计报告\r\n\r\n审计人员在详细将所有发现的问题写入最终报告中，所有问题都被标记为已解决或未解决。该报告将提供给项目团队并同时会被公开，以便协议的用户和其他利益相关者具有完全的透明度。\r\n\r\n  \r\n\r\n  \r\n\r\n本[指南](https://chain.link/resources/blockchain-oracle-security)全面分析了如何评估区块链预言机的安全性。\r\n\r\n  \r\n\r\n## 常见的智能合约漏洞\r\n\r\n以下是当前智能合约审计清单的一部分的常见漏洞。\r\n\r\n  \r\n\r\n### 重入问题\r\n\r\n当智能合约函数被不受信任的外部合约调用时，可能会发生重入攻击。重入攻击中，使该外部合约能够通过递归调用原始合约来耗尽用户资金或进行其他恶意操作。\r\n\r\n  \r\n\r\n### 整数上溢和下溢\r\n\r\n当智能合约执行算术运算输出超过当前存储容量的数字时，可能会发生整数溢出或下溢，从而导致计算错误。\r\n\r\n  \r\n\r\n### 抢先交易机会\r\n\r\n设计不合理的代码可能会泄露有关 dApp 尚未发生的的交易信息，其他用户可以先行运行这些信息，以牺牲协议为代价锁定利润。\r\n\r\n  \r\n\r\n### 重放攻击\r\n\r\n当数据被恶意延迟或重复时，就会发生重播攻击，尤其是在硬分叉事件期间，攻击者可以使用新的系统上的消息从遗留系统中提取资金。\r\n\r\n  \r\n\r\n### 随机数漏洞\r\n\r\n如果 dApp 使用公开的数字（例如块哈希）来播种随机数，则它很容易受到利用，这就是为什么许多协议使用 Chainlink VRF 来实现随机性。\r\n\r\n  \r\n\r\n### 函数可见性错误\r\n\r\n打算私有的函数必须定义为私有的，因为 Solidity 中的默认可见性属性是公共的。如果是公开的，任何人都可以调用该函数。\r\n\r\n  \r\n\r\n### 中心化风险\r\n\r\n中心化机制有单点故障的问题，如果单个私钥或类似密钥被泄露，可能会破坏协议的安全性。时间锁和授予 DAO 特权是处理中心化风险的常用技术。\r\n\r\n  \r\n\r\n### 未锁定编译器版本\r\n\r\nSolidity 有许多编译器版本。 dApps 应该锁定他们使用的编译器版本，这样用户就不能用不同的版本编译它，否则这可能会导致不同的字节码和意想不到的问题。\r\n\r\n  \r\n\r\n## Solidity gas 优化\r\n\r\nGas 是指在以太坊网络上进行特定操作所需的费用。 Gas 优化是降低智能合约代码执行成本的过程，随着项目规模的扩大和需要更多的 Gas 来运行，这一点变得越来越重要。它还有助于防止协议被滥用。\r\n\r\n  \r\n\r\nSolidity gas 优化技术包括：\r\n\r\n  \r\n\r\n- 启用 Solidity 编译器优化器，最大限度地减少代码的大小。\r\n\r\n- 最小化所需的链上数据量。\r\n\r\n- 释放未使用的存储空间。\r\n\r\n## 智能合约审计工具\r\n\r\n  \r\n\r\n流行的智能合约安全审计工具包括：\r\n\r\n  \r\n\r\n- Echidna – 一个 Haskell 程序，专为模糊测试的以太坊智能合约而设计。\r\n\r\n- Ethlint — 分析 Solidity 代码的风格和安全问题并帮助解决这些问题。\r\n\r\n- Mythril – EVM 字节码安全分析工具，使用符号执行（symbolic execution）、SMT 求解（SMT solving）和污点分析（taint analysis）来检测各种安全漏洞。\r\n\r\n- MythX – 自动扫描以太坊和其他基于 EVM 的区块链智能合约中的安全漏洞。\r\n\r\n- Rattle — 一个使用流敏感分析（flow-sensitive analysis）的 EVM 二进制静态分析框架。\r\n\r\n- Slither – 针对安全漏洞和最佳实践对 Solidity 源代码进行静态分析。\r\n\r\n- Solgraph — 生成一个 DOT 图，可视化功能控制流并显示潜在的安全漏洞。\r\n\r\n- Scribble – 规范语言和运行时验证工具，可将高级规范转换为 Solidity 代码。\r\n\r\n  \r\n\r\n## 常见问题\r\n\r\n<b>智能合约审计的费用是多少？</b>\r\n\r\n智能合约审计通常需要花费 5,000 到 15,000 美元，根据代码复杂性和技术支持要求，还有可能更高。\r\n\r\n  \r\n\r\n<b>如何成为智能合约审计师？</b>\r\n\r\n智能合约审计员必须对软件工程有高层次的理解，了解特定区块链环境的特定语言，如以太坊的 Solidity，并了解去中心化金融等关键垂直领域。审计师的收入通常在 10 万到 25 万美元之间，有些人的收入超过 40 万美元。\r\n\r\n  \r\n\r\n<b>如何准备智能合约审计？</b>\r\n\r\n通过清理代码库、收集所有文档然后冻结代码来准备智能合约审计。在 [Hacken](https://hacken.io/discover/sales-funnel-how-to-prepare-for-a-smart-contract-audit/) 的这篇文章中了解更多信息。\r\n\r\n  \r\n\r\n<b>审计智能合约需要多长时间？</b>\r\n\r\n完成智能合约安全审计的时间取决于代码的大小和复杂性。虽然可以在 48 小时内审核一个简单的通证合约，但一个完整的去中心化应用程序可能需要数周的时间来审核。\r\n\r\n  \r\n\r\n<b>如何选择智能合约审计师？</b>\r\n\r\n如果你正在寻找合约审计人员建议，也可以联系我们的技术专家。\r\n\r\n  \r\n\r\n欢迎关注 Chainlink 预言机并且私信加入开发者社区，有大量关于智能合约的学习资料以及关于区块链的话题！"},"author":{"user":"https://learnblockchain.cn/people/398","address":null},"history":null,"timestamp":1677672454,"version":1}