0

0

以太坊坎昆升级前,项目开发者必看的几项安全检查

DDD

DDD

发布时间:2024-03-07 10:13:02

|

848人浏览过

|

来源于脚本之家

转载

长话短说:坎昆升级临近,本次升级主要包含六个eip提出的执行层变更,eip-1153、eip-4788、eip-4844、eip-5656、eip-6780和eip-7516。eip-4844是本次升级的主角,旨在提升以太坊的可扩展性,为l2降低交易成本、提升交易速度。坎昆升级已分别于1月17日、1月30日、2月7日在以太坊goerli、sepolia和holesky测试网完成升级,并计划在3月13日在以太坊主网上激活。在升级前,salus整理了此次升级的重要安全注意事项,供开发者自行检查。

以太坊坎昆升级前,项目开发者必看的几项安全检查

EIP提案回顾

EIP-1153

EIP-1153引入了临时存储操作码,这些操作码用于操作状态,其行为与存储几乎相同,但每笔交易结束后临时存储将被丢弃。这意味着,临时存储不会从存储中反序列化值,也不会序列化值到存储,因此,由于不需要磁盘访问,临时存储成本更低。通过两个新的操作码TLOAD和TSTORE(其中“T”代表“临时”),智能合约可以访问临时存储。这项提议旨在为Ethereum的交易执行中的多个嵌套执行框架之间的通信提供一个专用且高效的解决方案。

EIP-4788

EIP-4788旨在将信标链区块的哈希树根暴露于EVM中,以允许在智能合约内部访问这些根。这样做可以无需信任地访问共识层状态,支持staking pools、restaking结构、智能合约桥、MEV缓解等多种用例。该提案通过一个智能合约存储这些根,并使用环形缓冲区来限制存储消耗,确保每个执行区块只需常量空间即可表示这些信息。

EIP-4844

EIP-4844介绍了一种新的事务格式,称为"分片Blob事务",旨在以简单、向前兼容的方式扩展以太坊的数据可用性。这项提案通过引入包含大量数据的"blob-carrying transactions",这些数据不能被EVM执行访问,但可以访问其承诺。这种格式与将来全分片使用的格式完全兼容,为滚动式扩容提供了临时但显著的缓解。

EIP-5656

EIP-5656引入了一种新的EVM指令MCOPY,旨在提高内存区域的高效复制。该提案的目的是降低在EVM上执行内存复制操作的成本,通过MCOPY指令实现内存数据的直接复制。MCOPY允许源地址和目标地址重叠,同时考虑了向后兼容性,旨在提高数据结构构建、内存对象访问和复制等多种场景的执行效率。

EIP-6780

EIP-6780修改了SELFDESTRUCT操作码的功能。在这个提案中,SELFDESTRUCT只会在与合约创建相同的交易中删除账户和传输所有以太币,除此之外,执行SELFDESTRUCT时,合约将不会被删除,只是将所有以太币转移到指定目标。这一改变是为了适应未来Verkle树的使用,旨在简化EVM实现,减少状态变化的复杂性,同时保留SELFDESTRUCT的部分常用场景。

EIP-7516

EIP-7516引入了一个新的EVM指令BLOBBASEFEE,用于返回当前区块执行中的blob基础费用值。这个指令与EIP-3198中的BASEFEE操作码相似,不同之处在于它返回的是根据EIP-4844定义的blob基础费用。这个功能使得合约可以编程地考虑blob数据的气体价格,例如,允许rollup合约无需信任地计算blob数据使用成本,或者基于此实现blob气体期货,以平滑blob数据成本。

官方披露的安全考量

EIP-1153

智能合约开发人员应在使用前了解瞬态存储变量的生命周期。由于临时存储会在交易结束时自动清除,因此智能合约开发人员可能会试图避免在调用过程中清除插槽以节省 Gas。然而,这可能会阻止在同一事务中与合约进行进一步的交互(例如,在重入锁的情况下)或导致其他错误,因此智能合约开发人员应小心,仅在临时存储槽被保留时保留非零值。旨在供同一事务中的未来调用使用。SSTORE否则,这些操作码的行为与和完全相同SLOAD,因此所有常见的安全注意事项都适用,特别是在重入风险方面。

智能合约开发人员也可能会尝试使用瞬态存储作为内存映射的替代方案。他们应该意识到,当调用返回或恢复时,临时存储不会像内存一样被丢弃,并且应该在这些用例中优先选择内存,以免在同一事务中的重入时产生意外的行为。内存上的瞬态存储成本必然很高,这应该已经阻止了这种使用模式。内存中映射的大多数用法可以通过按键排序的条目列表来更好地实现,并且智能合约中很少需要内存中映射(即作者知道生产中没有已知的用例)。

EIP-4844

此 EIP 使每个信标块的带宽要求最多增加约 0.75 MB。这比当今区块的理论最大大小(30M Gas / 每个 calldata 字节 16 Gas = 1.875M 字节)大 40%,因此它不会大幅增加最坏情况下的带宽。合并后,区块时间是静态的,而不是不可预测的泊松分布,为大区块的传播提供了保证的时间段。

即使调用数据有限,此 EIP 的持续负载也比可降低调用数据成本的替代方案低得多,因为不需要将 Blob 存储与执行负载一样长的时间。这使得实现这些 blob 必须保留至少一段时间的策略成为可能。选择的具体值是MIN_EPOCHS_FOR_BLOB_SIDECARS_REQUESTS纪元,约为 18 天,与建议的(但尚未实施)执行有效负载历史的一年轮换时间相比,延迟要短得多。

EIP-5656

客户端应注意其实现不使用中间缓冲区(例如 C stdlibmemmove函数不使用中间缓冲区),因为这是潜在的拒绝服务 (DoS) 向量。大多数用于移动字节的语言内置函数/标准库函数在这里都具有正确的性能特征。

除此之外,对拒绝服务 (DoS) 和内存耗尽攻击的分析与其他接触内存的操作码相同,因为内存扩展遵循相同的定价规则。

EIP-6780

以下应用程序SELFDESTRUCT将被破坏,并且以这种方式使用它的应用程序不再安全:

WhereCREATE2用于在同一位置重新部署合约,以使合约可升级。不再支持此功能,应改用ERC-2535或其他类型的代理合约。

如果合约依赖于通过以SELFDESTRUCT合约作为受益人燃烧以太币,则合约不是在同一交易中创建的。

智能合约相关风险

EIP1153

设想使用操作码TLOAD和TSTORE的两种场景:

  • 被调用合约使用该操作码

  • 发起调用合约使用该操作码

风险1:

相比于传统的 SSTORE 和 SLOAD ,新增的瞬态存储主要改变了数据的存储期限,tstore存储的数据通过tload进行读取,在一笔交易执行结束后该数据将会被释放,而不是同sstore一样写入合约被永久性的记录。开发者在使用该操作码时应该认清该操作码的特性,以免错误的使用导致数据不能正确的写入到合约中而造成损失。另外,tstore的数据属于私有变量,仅合约本身可以访问。如果想要外部使用该数据只能通过参数的形式进行传递或暂存到一个public stroage变量中。

风险2:

另一个潜在风险是,如果智能合约开发人员不正确管理瞬态存储变量的生命周期,可能导致数据在不应该的时间被清除或错误地保留。如果合约期望在事务的后续调用中使用存储在瞬态存储中的数据,但未能适当地管理这些数据的生命周期,可能会在不同调用之间错误地共享或丢失数据,从而导致逻辑错误或安全漏洞。考虑到类似于Token项目的balance或者allowance数据未能正确的存储将会导致合约逻辑的错误,造成损失。或在对owner地址进行设置时使用了该操作码将会导致特权地址不能正确的被记录从而丢失对合约重要参数的修改。

考虑一个智能合约,该合约使用瞬态存储来临时记录一个加密货币交易平台上的交易价格。该合约在每笔交易完成时更新价格,并允许用户在短时间内查询最新价格。然而,如果合约设计没有考虑到瞬态存储在交易结束时被自动清除的特性,那么在一笔交易结束后到下一笔交易开始之前的这段时间内,用户可能会得到一个错误或过时的价格。这不仅可能导致用户做出基于错误信息的决策,还可能被恶意利用,影响平台的信誉和用户的资产安全。

EIP-6780

该提案改变了之前selfdestruct操作码的行为,不销毁合约,仅转移token,仅与自毁同一交易中创建的合约才会被销毁。这个EIP的影响相对较大。

用create2在同一地址重新部署合约,以使合合约升级。不再支持此功能,应改用 ERC-2535 或其他类型的代理合约。(这可能会影响到使用create2实现可升级合约的链上合约的安全性)

智能合约中的SELFDESTRUCT操作允许合约销毁,并将合约余额发送给指定的目标地址。在这种情况下,合约使用SELFDESTRUCT销毁以太币,并将销毁的以太币发送给了合约。但是该合约仅能是在同一笔交易中创建的合约(同一笔交易中由本合约或其他合约创建的合约)。否则将仅转账以太而不销毁合约(例如自毁且受益者为自毁合约,这将会不产生任何改变)。这将会影响一切依赖于selfdestruct进行提款或其他操作的合约。

一种类似于 1inch CHI Token的Gas Token的工作原理:保持一个偏移量,始终在此偏移量处执行 CREATE2 或 SELFDESTRUCT。在此更新之后,如果当前偏移量的合约尚未正确自毁,则之后的CREATE2 将不能成功的部署合约。

该提案实施并不能导致直接对合约进行攻击,但会损害原有已部署的依赖selfdestruct操作的合约的正常逻辑(仅依赖自毁进行资金转移的合约不受到影响,如果后续操作必须要求自毁的合约被删除,则受到影响),导致合约非预期工作,仅对合约以及用户而言,可能导致合约的罢工,损失资金等危害(例如原本利用create2在原地址部署新合约,自毁原合约进行升级的合约,不再能够成功部署)。长远来看,修改某项操作码的功能可能会带来中心化的问题。

例如现有一个金库合约vault进行更新:

  • create2临时存储合约用来临时储备vault的资金

  • 自毁vault合约,资金转账到临时合约(仅转移了资金而没有销毁合约)

  • 在原地址create2新的vault合约(失败,因为原有vault合约没有被销毁)

  • 自毁临时合约将资金还给vault(资金损失,vault合约没有被创建)

扩展阅读

坎昆升级将进一步增强以太坊的竞争优势。但此次升级对核心智能合约层的改动带来了风险,这会影响现有的DApps的安全运行。在进行智能合约开发的过程中,这些改变以及可能引发的风险同样需要被高度关注。您可以与Salus联系获得风险检查或审计支持,也可以通过进一步阅读相关内容以了解变化。

Cancun Network Upgrade Specification

EIP-1153

EIP-4788

EIP-4844

EIP-5656

EIP-6780

EIP-7516

Metapod contract

GasToken2 contract

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1566

2023.10.24

登录token无效
登录token无效

登录token无效解决方法:1、检查token的有效期限,如果token已经过期,需要重新获取一个新的token;2、检查token的签名,如果签名不正确,需要重新获取一个新的token;3、检查密钥的正确性,如果密钥不正确,需要重新获取一个新的token;4、使用HTTPS协议传输token,建议使用HTTPS协议进行传输 ;5、使用双因素认证,双因素认证可以提高账户的安全性。

6608

2023.09.14

登录token无效怎么办
登录token无效怎么办

登录token无效的解决办法有检查Token是否过期、检查Token是否正确、检查Token是否被篡改、检查Token是否与用户匹配、清除缓存或Cookie、检查网络连接和服务器状态、重新登录或请求新的Token、联系技术支持或开发人员等。本专题为大家提供token相关的文章、下载、课程内容,供大家免费下载体验。

842

2023.09.14

token怎么获取
token怎么获取

获取token值的方法:1、小程序调用“wx.login()”获取 临时登录凭证code,并回传到开发者服务器;2、开发者服务器以code换取,用户唯一标识openid和会话密钥“session_key”。想了解更详细的内容,可以阅读本专题下面的文章。

1092

2023.12.21

token什么意思
token什么意思

token是一种用于表示用户权限、记录交易信息、支付虚拟货币的数字货币。可以用来在特定的网络上进行交易,用来购买或出售特定的虚拟货币,也可以用来支付特定的服务费用。想了解更多token什么意思的相关内容可以访问本专题下面的文章。

2178

2024.03.01

treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

549

2023.12.01

C++ 高效算法与数据结构
C++ 高效算法与数据结构

本专题讲解 C++ 中常用算法与数据结构的实现与优化,涵盖排序算法(快速排序、归并排序)、查找算法、图算法、动态规划、贪心算法等,并结合实际案例分析如何选择最优算法来提高程序效率。通过深入理解数据结构(链表、树、堆、哈希表等),帮助开发者提升 在复杂应用中的算法设计与性能优化能力。

30

2025.12.22

深入理解算法:高效算法与数据结构专题
深入理解算法:高效算法与数据结构专题

本专题专注于算法与数据结构的核心概念,适合想深入理解并提升编程能力的开发者。专题内容包括常见数据结构的实现与应用,如数组、链表、栈、队列、哈希表、树、图等;以及高效的排序算法、搜索算法、动态规划等经典算法。通过详细的讲解与复杂度分析,帮助开发者不仅能熟练运用这些基础知识,还能在实际编程中优化性能,提高代码的执行效率。本专题适合准备面试的开发者,也适合希望提高算法思维的编程爱好者。

44

2026.01.06

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Python进阶视频教程
Python进阶视频教程

共30课时 | 8.1万人学习

Node.js,就该这样学
Node.js,就该这样学

共27课时 | 3.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号