Solidity 详解:变量与函数
视频 AI 总结: 本视频详细讲解了Solidity语言的基础语法,包括其特性、数据类型、函数定义和变量声明。视频强调Solidity作为一种编译型、强类型语言,专为EVM设计,并与JavaScript等语言有相似之处。核心内容涵盖了函数可见性、状态可变性(如`view`, `pure`, `payable`对Gas消耗的影响)、各种数据类型(布尔、整型、地址、数组、结构体、映射)的特点及使用注意事项,特别是整型溢出和数组遍历的Gas成本。此外,视频还深入探讨了内部与外部函数调用、构造函数以及`receive()`和`fallback()`这两个特殊回调函数的触发机制和重要性。 视频中提出了哪些关键信息: 1. **Solidity语言特性:** 编译型、高级语言、专为EVM设计,语法与JavaScript相似,是强类型语言。 2. **函数定义:** * **可见性:** `public` (内外皆可), `private` (合约内部), `internal` (内部及继承), `external` (仅外部)。 * **状态可变性:** `view` (只读状态变量), `pure` (不读不改状态变量), `payable` (可接收ETH)。 * **Gas消耗:** `view`/`pure`函数在读取时不消耗Gas,修改状态的函数消耗Gas。Gas限制适用于所有函数。 3. **变量定义:** * **类型:** 必须指定类型。 * **可见性:** `public` (自动生成getter函数), `private`, `internal`。 * **存储位置:** `memory` (临时内存), `storage` (链上持久化存储), `calldata` (函数参数,不可变)。 * **常量:** `constant` (编译时确定), `immutable` (构造时确定)。 4. **数据类型:** * **布尔型:** `true`/`false`,支持短路运算。 * **整型:** `int`/`uint` (有/无符号),不同位宽(如`uint8`),需特别注意**溢出/下溢**问题。 * **地址类型:** `address` (普通地址), `address payable` (可接收ETH)。`transfer`方法有2300 Gas限制。 * **数组:** 定长/变长,`length`, `push`, `pop`。**遍历数组的Gas消耗**是重要优化点,删除元素建议“移位再删除”。 * **结构体:** 自定义复合类型,可封装多个属性。 * **映射 (Mapping):** `key-value`对,只能是`storage`,不支持遍历,key不能是数组。 5. **函数调用:** * **内部调用:** 同一上下文,更高效。 * **外部调用:** 跨合约或`this`调用,切换上下文,可指定`value`和`gas` (不推荐)。 6. **特殊函数:** * **构造函数 (Constructor):** 合约部署时执行一次,不包含在运行时字节码中,用于初始化逻辑。 * **`receive()`:** 接收不带数据的ETH转账时被动调用,必须是`payable`。 * **`fallback()`:** 当调用不存在的函数或接收带数据但无匹配函数的ETH转账时被动调用,可`payable`。 7. **全局API:** `msg.sender`, `msg.value`, `block.timestamp`等,用于获取交易和区块信息。 8. **实践建议:** 编写智能合约时需关注Gas消耗,避免高Gas操作(如无限循环遍历数组)。合约要接收ETH必须显式实现`receive()`或`fallback()`(或`payable`函数)。