错误处理

微信扫码分享
Solidity详解:错误处理与接口继承

Solidity详解:错误处理与接口继承

视频 AI 总结: 本视频主要介绍了 Solidity 中的修改器(Modifier)、错误处理、事件、接口和继承等核心概念。视频首先解释了修改器作为代码复用的语法糖,用于条件检查(如权限控制)。接着重点讲解了 Solidity 的错误处理机制,包括 require、assert、revert 和 try-catch 的用法,强调 EVM 交易的原子性(全部成功或全部回滚),并指出只有外部调用的错误才能被捕获。随后介绍了事件(event)作为链上日志记录的作用,以及索引(indexed)字段对日志查询的优化。最后讲解了接口(interface)用于抽象函数调用,以及继承(inheritance)和抽象合约(abstract contract)在编译时的代码复用,包括 virtual、override 和 super 关键字的使用。 关键信息: 1. **修改器(Modifier)**:一种语法糖,用于代码复用,常见于权限检查(如 onlyOwner)。编译时进行代码扩展,可能增加字节码大小。 2. **错误处理原子性**:EVM 交易具有原子性,出错时所有状态回滚到最初状态(与数据库事务类似)。 3. **错误处理方法**: - **require**:用于检查外部输入条件,不满足时抛出异常。 - **assert**:用于检查内部编码错误(如数组越界、除零)。 - **revert**:可携带错误消息或自定义 error(推荐使用 error 以节省 gas)。 - **try-catch**:仅能捕获**外部调用**(如其他合约的函数调用)产生的错误;内部调用、合约不存在、out of gas(非程序指定)等错误无法被捕获。 4. **事件(Event)**:用于记录链上日志,便于外部监听。其中 `indexed` 字段会存入 topic 建立索引,非 indexed 字段存入 data。 5. **接口(Interface)**:函数声明的抽象,用于编译时的类型检查。调用时依赖具体实例的合约地址,接口与实现合约之间不需要显式继承,只要函数签名匹配即可。 6. **继承与抽象合约**:继承是编译时的代码复用,部署时只有最终派生合约存在。使用 `virtual` 标记可重写函数,`override` 表示重写,`super` 调用父合约方法。抽象合约不能部署,专为代码复用设计。

38 0 0 2026-05-15 07:48
Solidity进阶:修饰器、错误处理、事件、接口与继承

Solidity进阶:修饰器、错误处理、事件、接口与继承

视频 AI 总结: 视频详细讲解了 Solidity 语言的进阶特性,包括自定义修饰器用于权限控制和前置检查,以及 EVM 独特的错误处理机制,强调交易原子性和 `try-catch` 仅限外部调用。此外,视频还介绍了事件(Events)作为合约与外部通信及日志记录的方式,接口(Interfaces)用于定义合约交互规范,以及继承(Inheritance)实现代码复用,涵盖了抽象合约、`virtual` 和 `override` 等概念。最后,鼓励通过实践项目巩固所学。 关键信息: 1. **自定义修饰器 (Custom Modifiers)**: * 用于函数执行前的检查和权限控制(如 `onlyOwner`)。 * 提高代码复用性,类似于 Python 装饰器。 * 通过 `modifier` 关键字定义,使用 `_` 占位符插入被修饰函数体。 2. **错误处理 (Error Handling)**: * EVM 交易的原子性:任何错误发生时,之前所有状态修改都会回滚到初始状态。 * 主要机制:`require` (最常用,用于验证输入或条件)、`assert` (用于检查内部不变量)、`revert` (直接抛出错误) 及自定义错误。 * Gas 消耗:自定义错误比包含字符串的错误消息更节省 Gas。 * `try-catch`:仅用于捕获 *外部调用* 的错误,不适用于内部调用。 * `panic` 错误:通常由程序逻辑缺陷引起(如除以零、数组越界),会记录 `Lcode`。 * 无法捕获的错误:合约不存在、交易 Gas 耗尽等特定情况。 3. **事件 (Events)**: * 作用:合约向外部世界通知状态变化,记录链上日志,因为合约内部执行环境是封闭的。 * 用途:异步获取交易结果、廉价数据存储、外部监听和过滤(通过 `indexed` 参数)。 * 语法:`event` 关键字声明事件,`emit` 关键字触发事件。 4. **接口 (Interfaces)**: * 设计原则:依赖接口而非具体实现。 * 特点:只包含函数定义,无构造函数、无状态变量。 * 用途:定义合约间交互规范,实现跨合约调用时的类型检查,提高代码模块化。 5. **继承 (Inheritance)**: * 目的:代码复用(与组合是两种主要复用方式)。 * 可见性:`internal` 成员可被子合约访问,`private` 成员仅限自身访问。 * 抽象合约 (`abstract`):不能直接部署,用于定义通用逻辑和抽象方法。 * 方法重写:`virtual` 标记可被重写的方法,`override` 标记重写父合约的方法。 * `super`:用于调用父合约的方法。 * 编译时:父合约代码会被复制到子合约中;运行时:只有一个部署的合约实例。 6. **实践建议**:通过 Big Bank 案例练习继承、接口和合约间调用,例如使用一个合约作为管理员(admin)来管理另一个合约的权限,以加深对这些高级特性的理解。

339 0 0 2026-03-05 10:53
Rust 编程基础

Rust 编程基础

视频 AI 总结: 本视频是 Rust 编程语言的速成课程介绍,旨在帮助学习者掌握 Rust 的基础到中级知识,特别是所有权和借用规则,并最终能够编写和审计基于 Rust 的智能合约,如 Solana 和 Arbitrum Stylus。课程不包含闭包、智能指针以及一些并发概念,但会涵盖异步编程的基础。学习者需要具备基本的编程概念和终端操作经验。 关键信息: * 课程目标:掌握 Rust 基础到中级知识,编写和审计 Rust 智能合约。 * 核心内容:所有权和借用规则,异步编程基础。 * 不包含内容:闭包、智能指针、部分并发概念。 * 先决条件:基本编程概念,终端操作经验。 * 推荐工具:VS Code 编辑器及 Rust Analyzer 插件。 * 代码练习:通过 Git 克隆仓库,在 exercises 文件夹中找到练习和解决方案。 * 安装 Rust:使用 rustup 工具安装 Rust 编译器和 Cargo 包管理器。 * Cargo 常用命令:init, build, fmt, run, test。 * Rust 程序入口:main 函数。 * 宏:以 `!` 结尾,编译时生成 Rust 代码。 * 变量默认不可变,使用 `mut` 关键字声明可变变量。 * 常量使用 `const` 关键字声明。 * 类型推断:Rust 自动推断变量类型。 * 打印变量:使用 `println!` 宏,支持占位符、位置参数和调试输出。 * 函数定义:使用 `fn` 关键字,可返回单个或多个值(使用元组)。 * 数据类型:包括标量类型(整数、浮点数、布尔值、字符)和复合类型(元组、数组、切片、字符串)。 * 枚举:使用 `enum` 关键字,表示数据类型可能取值的集合。 * 结构体:使用 `struct` 关键字,将不同数据类型组合成一个单元。 * 向量:可动态增长和缩小的数组。 * 哈希映射:使用 `HashMap` 存储键值对。 * 控制流:包括 if-else 语句和循环(loop, while, for)。 * 模式匹配:使用 `match` 语句,根据值执行不同的代码块。 * 所有权:每个值都有一个所有者,一次只能有一个所有者,所有者离开作用域时值被销毁。 * 借用:允许临时使用值而不获取所有权,分为可变借用和不可变借用。 * 生命周期:确保引用有效性的机制。 * 错误处理:使用 `panic!` 宏、`Option` 和 `Result` 类型。 * 模块:使用 `mod` 关键字组织代码,支持嵌套和文件分割。 * 泛型:使用类型占位符,编写可用于多种类型的代码。 * Trait:定义共享行为,类型可以实现 trait。 * 异步编程:使用 `async` 和 `await` 关键字,实现并发执行。 * Tokyo 库:用于异步编程的常用库,提供 `join!` 和 `select!` 宏。

704 0 0 2025-10-23 09:14
EVM 编程课程 #8 - 错误

EVM 编程课程 #8 - 错误

视频 AI 总结: 该视频主要讲解了以太坊虚拟机(EVM)中的错误处理机制,区分了 EVM 层面的错误与 Solidity 语言层面的错误。EVM 中,合约执行要么成功(stop, return),要么因错误而终止(revert, invalid)。Solidity 在此基础上增加了用户自定义错误和 panic 的概念。视频还通过代码示例展示了不同错误类型在 EVM 中的表现,以及 Solidity 如何处理这些错误,包括如何使用低级调用(low-level call)或 try-catch 语句来控制错误的传播。 关键信息: * EVM 中合约执行结束的方式:正常结束(stop, return)和错误结束(revert, invalid)。 * `stop` 停止执行,`return` 停止执行并返回数据,`revert` 停止执行并标记为错误,`invalid` 消耗所有 gas 并停止执行。 * Solidity 0.8 版本之前,`assert` 失败会使用 `invalid` opcode 消耗所有 gas,之后改为抛出 panic。 * Solidity 中的错误处理:可以自定义错误类型,并使用错误选择器(error selector)来区分不同的错误。 * Solidity 默认会将合约执行中遇到的错误向上冒泡,导致整个交易回滚。可以使用低级调用或 try-catch 语句来阻止错误的冒泡。 * Solidity 中 panic 是一种特殊的错误,但与普通错误的处理方式类似,不会导致程序完全停止执行。 * EVM 可能会遇到一些运行时错误,例如 out of gas、栈溢出、无效跳转目标等,这些错误通常会被视为 revert。

1158 0 0 2025-08-01 18:05
Solidity/EVM 错误处理

Solidity/EVM 错误处理

视频 AI 总结: 该视频主要讲解了Solidity/EVM 中错误处理机制,与其他语言不同,EVM 在遇到错误时会回滚所有之前的状态变更,除非错误被程序处理。Solidity 提供了几种错误处理方式,包括抛出错误让 EVM 回滚,以及使用 try-catch 捕获外部调用产生的错误。 关键信息: * EVM 的错误处理机制具有原子性,要么全部成功,要么全部失败,不会出现中间状态。 * Solidity 中可以使用 `require` 和 `assert` 进行条件检查,条件不满足时会抛出异常。 * `assert` 用于代码不应该到达的状态,而 `require` 用于检查外部条件。 * 抛出错误时可以指定字符串或自定义错误类型,自定义错误类型 Gas 消耗更低。 * `try-catch` 只能用于捕获外部调用产生的错误,不能捕获合约内部的错误。 * `try-catch` 无法捕获 out-of-gas 错误和调用不存在合约的错误。

210 0 0 2025-07-12 10:35
QA:合约参数处理、接口与错误处理

QA:合约参数处理、接口与错误处理

视频 AI 总结: 该视频主要讲解了以太坊智能合约中参数匹配、数据传递、合约组织、错误处理以及接口与实现的关系等问题。首先解释了合约函数参数的传递方式,通过 input data 传递,并按照特定规则(前四个字节为函数签名,后每 32 字节为一个参数)进行解析。然后讨论了合约的组织方式,以及接口和实现的关系,强调了 ABI 编码在合约调用中的作用。最后,详细解释了错误处理机制,包括 revert、require、assert 和 panic 的使用场景和区别。 关键信息: * 合约参数通过 input data 传递,前四个字节为函数签名,后每 32 字节为一个参数。 * 合约可以 import 其他合约,实现代码复用。 * 编译后的字节码和发送的字节码相同,但链上存储的字节码是构造函数执行后的结果。 * 接口和实现之间并非强制继承关系,ABI 编码是合约调用的基础。 * 错误处理机制包括 revert、require、assert 和 panic,assert 用于断言程序本身的错误。

143 0 0 2025-07-12 10:29