news 2026/9/4 16:57:37

智能合约评审如何识别隐性风险

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
智能合约评审如何识别隐性风险

智能合约评审如何识别隐性风险

AI 能很快补出 Solidity 的骨架,但它不理解这份合约在什么资产、什么升级路径和什么权限体系里运行。评审时,语法正确并不是通过理由。更可靠的起点是把需求拆成状态、不变量和外部边界:谁能改参数,资金总额如何变化,失败时哪些状态必须保持不变。

先看状态转换,再看函数写法

以领取奖励为例,评审者要先写清楚余额的来源、扣减时点、可领取额度的计算方式,以及同一笔份额能否重复领取。随后再检查代码是否遵循检查、更新状态、外部交互的顺序。nonReentrant有用,但不是替代推理的印章;跨函数共享的余额、暂停状态和回调路径仍可能形成问题。

function withdraw(uint256 amount) external nonReentrant { uint256 available = claimable[msg.sender]; require(amount <= available, "amount exceeds claimable"); claimable[msg.sender] = available - amount; rewardToken.safeTransfer(msg.sender, amount); emit Withdrawn(msg.sender, amount); }

这段代码也不自动安全。还要确认claimable的更新是否与总奖励池一致,代币地址是否可被权限方替换,暂停后是否仍能调用,以及转账失败是否会连同状态修改一起回滚。测试应覆盖重入接收方、零金额、边界金额和异常代币,而不是只测一次正常领取。

预言机和价格单位要落到明确约束

模型常会写出latestRoundData(),却漏掉价格为非正数、更新时间为空或数据过期等条件。合约需要定义自己可接受的时间窗口,并处理预言机 decimals 与资产 decimals 的换算。不要把某个固定轮次检查当成所有网络的通用规则;应以当前使用的喂价接口、网络和业务允许的延迟为依据。对于清算、抵押率等敏感动作,还要评审极端价格时是否有人工暂停、限额或二次确认路径。

升级和权限需要单独审

代理合约最容易被“只看本次 diff”漏掉。每次升级都应比较编译产物中的存储布局,确认没有改变既有变量的类型、顺序或继承结构。新变量的位置、初始化函数是否只能执行一次、实现合约是否能被直接初始化,都要进发布检查单。预留 gap 只是某些继承模式下的做法,不是可以不看布局的理由。

权限同样不能只搜索onlyOwner。列出所有能升级、铸币、改费率、暂停和转出资产的入口,确认角色由谁持有、是否采用多签或时间锁、紧急权限是否有事件记录与撤销办法。权限越大,发布前越需要独立复核。

让工具做它擅长的事

静态分析、编译器检查、fuzz 和属性测试可以持续发现已知模式,但不能证明合约没有漏洞。CI 可以要求编译、测试、Slither 或等价工具通过,并把存储布局和关键权限变更作为人工审批项。自动规则应尽量基于语义或 AST;仅凭搜索transfer__gap等字符串,误报和漏报都会很多。

主网上线前,团队至少应重新演练一次:升级回滚怎么做,预言机失效时谁能暂停,用户资金卡住时如何处理。AI 生成的代码可以进入候选方案,不能绕过这套评审。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/4 16:57:34

MATLAB绘图进阶:从基础函数到专业可视化实战指南

1. 项目概述&#xff1a;从“能画”到“画好”的跨越 提到MATLAB&#xff0c;很多人的第一反应是强大的矩阵运算和算法开发能力。但在我十多年的工程与科研生涯里&#xff0c;我发现&#xff0c; 绘图 才是让数据“开口说话”、让成果被看见、让逻辑被理解的关键环节。一个粗…

作者头像 李华
网站建设 2026/9/2 7:29:06

SQL 行转列(经典面试题)

已知条件&#xff1a;1. 学生表&#xff0c;字段为 学号和姓名2. 课程表&#xff0c;字段为科目ID和科目名称3. 成绩表 &#xff0c;字段为学生学号&#xff0c;科目ID&#xff0c;成绩现要得到如下查询结果解答&#xff1a;1. 先对score 表进行行转列&#xff0c;将科目名称作…

作者头像 李华
网站建设 2026/9/2 12:42:39

基于Java的学生考勤系统设计与实现:Spring Boot+MyBatis全解析

简介&#xff1a;Java后端开发中&#xff0c;权限管理与数据库设计是构建企业级应用的核心基础。Spring Boot作为当前主流的Java开发框架&#xff0c;通过自动配置与starter机制大幅简化了项目搭建&#xff1b;MyBatis则凭借灵活的SQL控制能力&#xff0c;在复杂业务报表查询中…

作者头像 李华
网站建设 2026/9/2 7:42:34

ROS2 Humble激光雷达仿真工程:多线雷达+Gazebo模块化架构

简介&#xff1a;本资源是一个面向ROS2初学者与机器人仿真开发者的实践型工程包&#xff0c;聚焦多线激光雷达在Gazebo中的建模与仿真应用&#xff0c;解决SLAM、定位与环境感知等任务的前期验证难题。压缩包共30个文件&#xff08;62KB&#xff09;&#xff0c;涵盖12个xacro宏…

作者头像 李华
网站建设 2026/8/30 20:57:48

Day 30:Client 端总览 — Web UI 前端架构

Day 30:Client 端总览 — Web UI 前端架构 今日目标 理解 dsh 前端的整体架构 读 packages/client/ 的目录结构 理解前端的分层架构(通信层/运行时层/UI 渲染层/插槽系统) 理解前端和 Host 端的通信方式 理解前端的技术栈(框架/构建工具/状态管理) 理解前端的启动流程 理…

作者头像 李华
网站建设 2026/8/31 1:25:12

STM32实战笔记:从ADC采样到温度校准,精准获取MCU内部温度

1. STM32内部温度传感器基础认知第一次接触STM32内部温度传感器时&#xff0c;我误以为它和外部DS18B20这类传感器类似&#xff0c;结果踩了个大坑。实际上这个传感器是直接集成在芯片晶圆上的&#xff0c;主要用途是监测CPU核心温度而非环境温度。它的输出电压会随晶圆温度变化…

作者头像 李华