如何审计一个智能合约
智能合约审计用于整个 DeFi 生态系统,通过对协议代码的深入审查,可以帮助解决识别错误、低效代码以及这些问题。智能合约具有不可篡改的特点,这使得审计成为任何区块链项目安全流程的关键部分。
代码审计对任何应用程序都很重要,但它们对去中心化应用程序 (dApp) 尤其重要,因为它们建立在其之上的区块链是不可变的。如果代码漏洞导致用户资金丢失,这些资金将无法找回。迄今为止,DeFi 中的黑客已经损失了超过 50 亿美元。
在本文中,我们研究了智能合约审计到底是什么、如何进行审计、需要注意的常见智能合约漏洞、Solidity gas 优化策略、流行的审计工具等等。

每个月在 Defi 被盗的资金.
在 2023 年 2 月 20 日前,在 Defi 中被盗的总资金是 51.3 亿美元
什么是智能合约审计?
智能合约审计包括对一个协议的智能合约代码进行详细分析,以识别安全漏洞、不良的编码实现方式和低效代码,然后再提出解决这些问题的解决方案。审计有助于确保跨 Web3 的去中心化应用程序的安全性、可靠性和性能。
在智能合约审核期间,安全专家团队将以自动和人工的方式,审查应用程序的代码、逻辑、架构和安全措施,以识别任何潜在问题。他们专门寻找可能容易受到恶意攻击的任何代码,以及任何需要改进的部分。
智能合约代码最终将部署到 Avalanche、BNB Chain 或 Ethereum 等区块链中。一旦合约生效,任何人都可以访问它们——从终端用户到恶意攻击者——这就是为什么在启动或更新去中心化应用程序之前必须解决所有漏洞。
审计完成后,审计师会发布一份摘要报告,其中提供有关审计结果、解决方法和任何其他问题的详细信息,以及未来解决现存问题的路线图。经过全面的智能合约审计后,项目可以放心地部署他们的合约,因为应用程序的安全性有了保证,用户资金也受到保护。
如何审计智能合约
智能合约审计利用各种技术和工具来减少风险点并使协议更加健壮。
步骤 1. 收集文档
被审计的项目必须先冻结代码,并向审计员提供技术文档,包括代码库、白皮书、架构和任何其他相关材料。该文档应该为审计员提供有关代码旨在实现的目标、范围和具体实施的详细指南。
步骤 2. 自动化测试
也称为形式化验证引擎,自动化测试检查智能合约的每个可能状态,并针对可能攻击合约功能性或安全性的问题发出警报。审计人员还可以对单个功能进行集成测试、单元测试,以及探测安全漏洞的渗透测试。
步骤 3. 人工审核
安全专家团队仔细检查每一行代码,找出错误和漏洞。虽然自动化测试可以很好地识别代码中的错误,但人类工程师更有能力检测合约逻辑或架构的问题、技术上正确且通过自动化测试的不良编码实现、gas 优化以及常见攻击点(比如说抢先交易)。
步骤 4. 合约错误分类
每个错误都根据它可能被利用的漏洞严重性进行分类:
-
严重 - 影响协议的安全运行。
-
重大 - 可能导致用户资金或协议控制损失的中心化和逻辑错误。
-
中等 — 影响平台的性能或可靠性。
-
次要 - 不会使应用程序的安全受到威胁的低效代码。
-
信息性 — 与代码风格或行业最佳实践相关的错误。
第 5 步。初始报告
审计员起草一份初步报告,总结代码缺陷和其他问题,以及项目团队如何解决这些问题的反馈。一些智能合约服务提供商拥有一个专家团队,可以帮助修复发现的每个错误。通过解决所有问题,项目可以确保其智能合约的安全性,并且做好部署的准备。
第 6 步。发布最终审计报告
审计人员在详细将所有发现的问题写入最终报告中,所有问题都被标记为已解决或未解决。该报告将提供给项目团队并同时会被公开,以便协议的用户和其他利益相关者具有完全的透明度。
本指南全面分析了如何评估区块链预言机的安全性。
常见的智能合约漏洞
以下是当前智能合约审计清单的一部分的常见漏洞。
重入问题
当智能合约函数被不受信任的外部合约调用时,可能会发生重入攻击。重入攻击中,使该外部合约能够通过递归调用原始合约来耗尽用户资金或进行其他恶意操作。
整数上溢和下溢
当智能合约执行算术运算输出超过当前存储容量的数字时,可能会发生整数溢出或下溢,从而导致计算错误。
抢先交易机会
设计不合理的代码可能会泄露有关 dApp 尚未发生的的交易信息,其他用户可以先行运行这些信息,以牺牲协议为代价锁定利润。
重放攻击
当数据被恶意延迟或重复时,就会发生重播攻击,尤其是在硬分叉事件期间,攻击者可以使用新的系统上的消息从遗留系统中提取资金。
随机数漏洞
如果 dApp 使用公开的数字(例如块哈希)来播种随机数,则它很容易受到利用,这就是为什么许多协议使用 Chainlink VRF 来实现随机性。
函数可见性错误
打算私有的函数必须定义为私有的,因为 Solidity 中的默认可见性属性是公共的。如果是公开的,任何人都可以调用该函数。
中心化风险
中心化机制有单点故障的问题,如果单个私钥或类似密钥被泄露,可能会破坏协议的安全性。时间锁和授予 DAO 特权是处理中心化风险的常用技术。
未锁定编译器版本
Solidity 有许多编译器版本。 dApps 应该锁定他们使用的编译器版本,这样用户就不能用不同的版本编译它,否则这可能会导致不同的字节码和意想不到的问题。
Solidity gas 优化
Gas 是指在以太坊网络上进行特定操作所需的费用。 Gas 优化是降低智能合约代码执行成本的过程,随着项目规模的扩大和需要更多的 Gas 来运行,这一点变得越来越重要。它还有助于防止协议被滥用。
Solidity gas 优化技术包括:
-
启用 Solidity 编译器优化器,最大限度地减少代码的大小。
-
最小化所需的链上数据量。
-
释放未使用的存储空间。
智能合约审计工具
流行的智能合约安全审计工具包括:
-
Echidna – 一个 Haskell 程序,专为模糊测试的以太坊智能合约而设计。
-
Ethlint — 分析 Solidity 代码的风格和安全问题并帮助解决这些问题。
-
Mythril – EVM 字节码安全分析工具,使用符号执行(symbolic execution)、SMT 求解(SMT solving)和污点分析(taint analysis)来检测各种安全漏洞。
-
MythX – 自动扫描以太坊和其他基于 EVM 的区块链智能合约中的安全漏洞。
-
Rattle — 一个使用流敏感分析(flow-sensitive analysis)的 EVM 二进制静态分析框架。
-
Slither – 针对安全漏洞和最佳实践对 Solidity 源代码进行静态分析。
-
Solgraph — 生成一个 DOT 图,可视化功能控制流并显示潜在的安全漏洞。
-
Scribble – 规范语言和运行时验证工具,可将高级规范转换为 Solidity 代码。
常见问题
智能合约审计的费用是多少?
智能合约审计通常需要花费 5,000 到 15,000 美元,根据代码复杂性和技术支持要求,还有可能更高。
如何成为智能合约审计师?
智能合约审计员必须对软件工程有高层次的理解,了解特定区块链环境的特定语言,如以太坊的 Solidity,并了解去中心化金融等关键垂直领域。审计师的收入通常在 10 万到 25 万美元之间,有些人的收入超过 40 万美元。
如何准备智能合约审计?
通过清理代码库、收集所有文档然后冻结代码来准备智能合约审计。在 Hacken 的这篇文章中了解更多信息。
审计智能合约需要多长时间?
完成智能合约安全审计的时间取决于代码的大小和复杂性。虽然可以在 48 小时内审核一个简单的通证合约,但一个完整的去中心化应用程序可能需要数周的时间来审核。
如何选择智能合约审计师?
如果你正在寻找合约审计人员建议,也可以联系我们的技术专家。
欢迎关注 Chainlink 预言机并且私信加入开发者社区,有大量关于智能合约的学习资料以及关于区块链的话题!
相关文章:
如何审计一个智能合约
智能合约审计用于整个 DeFi 生态系统,通过对协议代码的深入审查,可以帮助解决识别错误、低效代码以及这些问题。智能合约具有不可篡改的特点,这使得审计成为任何区块链项目安全流程的关键部分。 代码审计对任何应用程序都很重要,…...
不用PS,也能实现抠图的工具
对于非设计专业的同学来说,专门下载 PS 抠图有点大材小用,而且运用 PS 对电脑配置一定要求。不过现在有了更多选择,市面上出现了越来越多的抠图软件,不过越多的抠图软件选择也意味着需要花费时间试错因此本文将给大家推荐 3 款非常…...
集群化存储的概述
集群化存储的概述 1、存储的分类方式: 存储的分类-网络拓扑 用于存储的网络拓扑 NAS:小米路由器;SAN:存储区网络–>网络网和存储网络区分开DAS:常见的存储;本地存储 存储分类-存储技术网络拓扑存储技…...
asyncio 并发编程(一)
Python2 时代高性能的网络编程主要是 Twisted、Tornado 和 Gevent 这三个库,但是它们的异步代码相互之间既不兼容也不能移植。Gvanrossum 希望在 Python 3 实现一个原生的基于生成器的协程库,其中直接内置了对异步 IO 的支持,这就是 asyncio&…...
春招冲刺(二):BFC 盒子面试题总结
BFC 盒子面试题总结 Q1:BFC盒子是什么? BFC全称是Block Formatting Context 意思就是块级格式化上下文。 可以把BFC看做一个容器,容器里边的元素不会影响到容器外部的元素。 Q2:如何创建BFC? 根元素:bo…...
Ep_计网面试题-本地IP地址怎么一层层向上转换?
将数据加上报头打包在一起形成新的数据包继续往下一层传递。拆包的时候就是把数据包去掉包头作为新数据传给上一层 视频讲解: https://edu.csdn.net/course/detail/38090 点我进入 面试宝典 很多人不知道面试问什么,或者其他的XXGuide,那里边的太多没用的,也没有源码解析,都…...
MySQL高级三
目录 三、MySQL高级03 3.1 MyCat 3.1.1 MyCat简介 3.1.2 中间件的作用 3.2 安装MyCat 3.3 主从复制 3.3.1 主从复制的原理 3.3.2 主从复制的好处 3.3.3 配置主从复制 三、MySQL高级03 如果虚拟机的磁盘已满,可以对磁盘进行重新分配 参考:虚拟…...
set和map的基本使用
目录 关联式容器 要点分析 键值对 pair介绍 set 模板参数列表: set的构造: 常用接口 操作 multiset map map的构造 插入 make_pair map的迭代器 operator[] multimap multimap中为什么没有重载operator[] 关联式容器 关联式容器也是用…...
已解决pip install wxPython模块安装失败
已解决(pip install wxPython安装失败)error: legacy-instal1-failure Encountered error while trying to install package.wxPython note: This is an issue with the package mentioned above,not pip. hint : See above for output from …...
Linux基础——连接Xshell7
个人简介:云计算网络运维专业人员,了解运维知识,掌握TCP/IP协议,每天分享网络运维知识与技能。座右铭:海不辞水,故能成其大;山不辞石,故能成其高。个人主页:小李会科技的…...
C++——智能指针1
目录 RAII auto_ptr模拟实现 智能指针拷贝问题 唯一指针 shared_ptr(可以拷贝) shared_ptr模拟实现 完整代码 循环引用 weak_ptr模拟实现 定制删除器 shared_ptr定制删除器模拟实现 内存泄漏 RAII RAII(Resource Acquisit…...
[数据集][VOC][目标检测]翻越栏杆翻越防护栏数据集目标检测可用yolo训练-1035张介绍
数据集格式:Pascal VOC格式(不包含分割路径的txt文件和yolo格式的txt文件,仅仅包含jpg图片和对应的xml) 图片数量(jpg文件个数):1035 标注数量(xml文件个数):1035 标注类别数:2 标注类别名称:["fylg","…...
深度学习 | BN层原理浅谈
深度学习 | BN层原理浅谈 文章目录深度学习 | BN层原理浅谈一. 背景二. BN层作用三. 计算原理四. 注意事项为什么BN层一般用在线性层和卷积层的后面,而不是放在激活函数后为什么BN能抑制过拟合(有争议)一. 背景 神经网络在训练时,由于内存限制࿰…...
每日面试题
2022/12/15 如何实现一个IOC容器 1、配置文件配置包扫描路径 2、递归包扫描获取.class文件 3、反射、确定需要交给lOC管理的类4、对需要注入的类进行依赖注入 配置文件中指定需要扫描的包路径 定义一些注解,分别表示访问控制层、业务服务层、数据持久层、依赖注…...
将IDEA的项目托管到gitee
目录1. 在gitee上创建仓库2. 本地创建仓库目录3. 将项目添加到缓冲区4. 将缓冲区的项目添加到本地仓库5. 将本地仓库的项目上传到gitee6. 遇到的问题6.1 问题描述6.2 解决方法7. 相关图示与补充8. 相关参考1. 在gitee上创建仓库 2. 本地创建仓库目录 在IDEA中选择创建 Git 仓…...
父类子类静态代码块、构造代码块、构造方法执行顺序
github:https://github.com/nocoders/java-everything.git 名词解释 静态代码块:java中使用static关键字修饰的代码块,每个代码块只会执行一次,JVM加载类时会执行静态代码块中的代码,静态代码块先于主方法执行。构造代码块&#…...
【C++】开散列实现unordered_map与unordered_set的封装
本文主要介绍unordered_map与unordered_set的封装,此次封装主要用上文所说到的开散列,通过开散列的一些改造来实现unordered_map与unordered_set的封装 文章目录一、模板参数二、string的特化三、正向迭代器四、构造与析构五、[]的实现六、unordered_map的实现七、u…...
华为OD机试真题Python实现【删除指定目录】真题+解题思路+代码(20222023)
删除指定目录 题目 某文件系统中有 N 个目录, 每个目录都一个独一无二的 ID。 每个目录只有一个付目录, 但每个目录下可以有零个或多个子目录, 目录结构呈树状结构。 假设 根目录的 ID 为0,且根目录没有父目录 ID 用唯一的正整数表示,并统一编号 现给定目录 ID 和其付目…...
CSS选择器大全(上)
基础选择器: id选择器:#id{} 类选择器: .class{} 标签选择器: h1{} 复合选择器: 交集选择器:作用:选中同时符合多个条件的元素 语法:选择器1选择器2选择器3选择器n{} 注意ÿ…...
JavaScript 俄罗斯方块 - setTimeout和rAF
本节内容需要有些基础知识,如进程和线程,队列数据结构 一、setTimeout和setInterval 只要使用过JavaScript的朋友,对setTimeout和setInterval应该不会默生,如果光说怎样去使用这个API,并不难,无非就是隔多少毫秒再执行某个函数,把变化的内容封装在函数中,就可以制作出动…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...
回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...
短视频矩阵系统文案创作功能开发实践,定制化开发
在短视频行业迅猛发展的当下,企业和个人创作者为了扩大影响力、提升传播效果,纷纷采用短视频矩阵运营策略,同时管理多个平台、多个账号的内容发布。然而,频繁的文案创作需求让运营者疲于应对,如何高效产出高质量文案成…...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...
RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...
