Solidity进阶
1.assert与require 特点 require assert 异常类型 Error Panic Gas 处理 剩余 gas 退回 剩余 gas 消耗掉 用途 外部输入条件检查(用户错误) 内部逻辑保证(代码错误) 信息提示 可自定义错误信息 不能加提示,只能抛出 Panic特点 当 assert 条件为 false 时: 会触发一个 Panic 异常(error code 0x01) 消耗掉函数调用中剩余的所有 gas(不退回) 回滚所有状态修改 官方推荐: assert 用于检查 永远应该为 true 的内部条件,也就是“不可能出错的逻辑”。 如果 assert 失败,说明代码里有 bug(比如整数溢出、不变式被破坏)。 Solidity 0.8.x 的变化在 0.8.x 版本后: 编译器会自动为 整数溢出、下溢 插入 assert,所以这类错误会抛出 Panic,而不是普通错误。 例如: 12uint8 x = 255;x += 1; // 自动触发 assert,因为溢出 Panic...
合约优化
📌 核心概念Gas费是执行以太坊智能合约所需的计算费用,优化Gas费可以大幅降低用户交互成本和合约部署成本。 一、基础优化策略1.1 变量类型优化solidity 12345678910// ❌ 不推荐uint256 public number1 = 100;uint256 public number2 = 200;// ✅ 推荐:使用更小的类型uint128 public number1 = 100;uint128 public number2 = 200; // 打包存储,节省存储槽// 或者使用uint8处理小数值uint8 public status = 1; // 状态值用最小的类型 1.2 变量打包(Packing)solidity 1234567891011121314151617181920// ❌ 不推荐 - 占用3个存储槽uint128 public a; // 槽1uint128 public b; // 槽2uint8 public c; // 槽3// ✅ 推荐 - 占用2个存储槽struct PackedVars...
Foundry
一、什么是Foundry?Foundry是一个用Rust编写的开源智能合约开发框架,专为Solidity和EVM兼容链的智能合约开发而设计。它与传统的开发框架(如Truffle、Hardhat)不同,Foundry更加专注于性能、简洁性和开发者体验,旨在解决区块链开发中的许多痛点。 二、Foundry的四大核心组件🔨 Forge:智能合约的瑞士军刀Forge是Foundry的核心组件,是一个用于构建、测试和部署智能合约的命令行工具。它承担了开发者日常工作中最频繁的操作: 编译合约:快速编译Solidity代码 运行测试:执行Solidity编写的测试用例 部署合约:将合约发布到各种EVM兼容网络 Forge最显著的特点是它集成了Revm(Rust EVM),这大大提升了测试时的运行时速度。与使用JavaScript编写测试的传统框架不同,Forge允许你直接用Solidity编写测试用例,这不仅减少了心智负担,还提高了测试的执行效率。 工具 分类 命令 描述 参数示例/详细写法 Forge 项目生命周期 forge...
合约安全(2)
7.DOS攻击在 Web2 中,拒绝服务攻击(DoS)是指通过向服务器发送大量垃圾信息或干扰信息的方式,导致服务器无法向正常用户提供服务的现象。而在 Web3,它指的是利用漏洞使得智能合约无法正常提供服务。 先看过程: 1234567891011121314// 游戏结束,退款开始,所有玩家将依次收到退款 function refund() external { require(!refundFinished, "Game Over"); uint256 pLength = players.length; // 通过循环给所有玩家退款 for(uint256 i; i < pLength; i++){ address player = players[i]; uint256 refundETH = balanceOf[player]; (bool success, ) = player.call{value:...





