准备:
以太坊智能合约开发基础: https://learnblockchain.cn/article/22542?course_id=93
IDE: Remix https://remix.ethereum.org/
MetaMask 钱包: https://metamask.io/zh-CN/download
Solidity 合约长什么样? 小结
合约基础结构 Solidity 合约是部署到区块链的最小单元,类似其他语言的
class,核心由状态变量(存储合约数据)和合约函数(处理数据逻辑)组成。 编写合约需先通过pragma solidity声明编译器版本(如pragma solidity >=0.8.0;)。核心组件解析
构造函数:用
constructor声明,仅在合约部署时执行,用于初始化状态变量;若省略,编译器会自动生成默认构造函数。状态变量可在声明时直接初始化,未初始化则默认值为 0。变量与函数可见性:共 4 种,
public(内部/外部均可访问,状态变量自动生成 getter 函数)、external(仅外部可调用,内部调用需用this.func())、internal(当前合约及派生合约可访问,默认可见性)、private(仅当前合约可访问)。注意:链上数据透明,private仅限制访问权限,无法隐藏数据。特性 public external internal private 修饰函数 √ √ √ √ 修饰变量 √ √ √ 当前合约内可访问 √ √ √ 派生合约可访问 √ √ 外部访问 √ √ 特殊变量类型:
constant常量:编译期确定值,不占用存储,仅支持值类型和字符串,赋值不可依赖链上/外部数据。immutable不可变量:部署时(构造函数中)赋值,之后不可修改,不占用存储,适合存储合约创建者地址、关联合约地址等固定值。
函数定义规则 函数格式为
function 函数名(参数类型 参数名) 可见性 状态可变性 returns(返回类型),包含以下核心特性:- 参数与返回值:参数声明与变量一致;返回值支持命名(可直接赋值)或仅指定类型,用
return语句返回结果。 - 状态可变性修饰符:
view视图函数:仅读取状态,外部调用无需 Gas,内部被修改状态的函数调用时需消耗 Gas。pure纯函数:不读取、不修改状态,仅做计算逻辑。payable:允许函数接收以太币,未声明则拒绝接收以太币。
- 状态修改逻辑:修改状态变量的函数需通过区块链交易调用,消耗 Gas 并经节点共识确认;仅读取状态的函数可直接在节点执行,无需上链。
- 参数与返回值:参数声明与变量一致;返回值支持命名(可直接赋值)或仅指定类型,用
合约的核心是状态转换
总结表格
| 总结 | |
|---|---|
| 合约基础 | 类似class,包含状态变量(数据)+ 函数(逻辑);需用pragma solidity声明编译器版本 |
| 构造函数 | constructor关键字,部署时执行初始化;可省略(默认生成空构造函数) |
| 可见性修饰符 | public(内外可访问,变量自动生成getter)、external(仅外部调用)、internal(默认,当前/派生合约)、private(仅当前合约) |
| 特殊变量 | constant(编译期定值,不占存储)、immutable(部署时赋值,不可修改) |
| 函数定义 | 格式:function 名(参数) 可见性 状态可变性 returns(返回类型) |
| 状态可变性 | view(仅读状态)、pure(不读不改)、payable(可接收以太币) |
| 核心特性 | 状态修改需上链交易(耗Gas),仅读取可直接节点执行(免Gas);链上数据透明,private不隐藏数据 |
挑战:https://decert.me/challenge/185b4d27-e8f0-4ab9-98e2-eede75c449bb