@@ -15,6 +15,155 @@ timezone: UTC+8
1515## Notes
1616
1717<!-- Content_START -->
18+ # 2025-08-14
19+
20+ ## 2.合约结构详解
21+
22+ ### 1.基本结构
23+
24+ - // 是Solidity中的单行注释符号,例如:` //SPDX-License-Identifier:MIT ` 用于指定源代码的许可证类型
25+ - ` pragma ` 关键字用于声明 Solidity 源代码所需的编译器版本,确保合约在兼容的编译器环境中正确编译。
26+ - ` contract ` 关键字用于定义一个智能合约,其语法格式为:` contract 合约名 { ... } ` 。
27+ - 一个智能合约的基本结构通常由以下三部分组成:状态变量、构造函数和普通函数
28+
29+ ``` solidity
30+ // SPDX-License-Identifier: MIT
31+ pragma solidity ^0.8.0;
32+
33+ contract MyContract {
34+ // 状态变量
35+ uint256 public myNumber;
36+
37+ // 构造函数
38+ constructor() {
39+ myNumber = 100;
40+ }
41+
42+ // 函数
43+ function setNumber(uint256 _number) public {
44+ myNumber = _number;
45+ }
46+ }
47+ ```
48+
49+ ### 2.状态变量** (State Variables)**
50+
51+ 状态变量是指在合约中定义的、其值永久存储在区块链上的变量。它们用于记录合约的持久化数据,构成了合约的整体状态。当合约被部署后,这些变量将被写入区块链,并在合约的整个生命周期中保持可访问性和可追踪性。
52+
53+ ``` solidity
54+ contract MyContract {
55+ /*
56+ * 可以通过内部与外部函数更改变量
57+ * public可以通过前端代码访问
58+ */
59+ uint256 public totalSupply;
60+ mapping(address => uint256) private balances;
61+ address public owner;
62+
63+ // 常量
64+ uint256 public constant MAX_SUPPLY = 1000000;
65+
66+ // 不可变量(构造函数中设置一次)
67+ uint256 public immutable deploymentTime;
68+
69+ constructor() {
70+ owner = msg.sender;
71+ deploymentTime = block.timestamp;
72+ totalSupply = 0;
73+ }
74+ }
75+ ```
76+
77+ ## 3.函数
78+
79+ 函数是 Solidity 智能合约中执行具体逻辑操作的核心组成部分。通过函数,可以实现对状态变量的读取、修改,或执行特定业务逻辑。
80+
81+ ### ** 函数声明格式**
82+
83+ Solidity 中函数的标准声明格式如下所示:
84+
85+ ``` solidity
86+ function <函数名>(<参数列表>)
87+ <可见性>
88+ <状态可变性>
89+ <修饰符列表>
90+ <虚拟/重写关键字>
91+ returns (<返回值列表>)
92+ {
93+ // 函数体
94+ }
95+ ```
96+
97+ 各部分含义如下:
98+
99+ - ` <函数名> ` :函数的名称;
100+ - ` <参数列表> ` :传入函数的参数;
101+ - ` <可见性修饰符> ` :如 ` public ` 、` private ` 、` internal ` 、` external ` ;
102+ - ` <状态可变性修饰符> ` :如 ` view ` 、` pure ` 、` payable ` ;
103+ - ` <函数修饰符> ` :如 ` onlyOwner ` 等自定义逻辑控制;
104+ - ` virtual/override ` :用于支持继承与函数重写;
105+ - ` returns ` :定义返回值及其类型。
106+
107+ ### 函数状态修饰符
108+
109+ 用于指明函数是否修改或读取合约状态:
110+
111+ ``` solidity
112+ contract StateModifiers {
113+ uint256 public count = 0;
114+
115+ // view: 只读函数,不修改状态
116+ function getCount() public view returns(uint256) {
117+ return count;
118+ }
119+
120+ // pure: 纯函数,不读取也不修改状态
121+ function add(uint256 a, uint256 b) public pure returns(uint256) {
122+ return a + b;
123+ }
124+
125+ // payable: 可接收以太币
126+ function deposit() public payable {
127+ // msg.value 是发送的以太币数量
128+ }
129+
130+ // 默认:可修改状态
131+ function increment() public {
132+ count++;
133+ }
134+ }
135+ ```
136+
137+ ### 函数参数和返回值
138+
139+ Solidity 支持多参数与多返回值,以及命名返回值:
140+
141+ ``` solidity
142+ // 多个返回值
143+ function getPersonInfo() public pure returns(string memory name, uint256 age) {
144+ name = "Alice";
145+ age = 25;
146+ }
147+
148+ // 命名返回值
149+ function calculate(uint256 a, uint256 b) public pure returns(uint256 sum, uint256 product) {
150+ sum = a + b;
151+ product = a * b;
152+ // 自动返回命名变量
153+ }
154+
155+ // 调用带多返回值的函数
156+ function callExample() public pure {
157+ (string memory name, uint256 age) = getPersonInfo();
158+ // 或者忽略某些返回值
159+ (, uint256 productOnly) = calculate(5, 3);
160+ }
161+ ```
162+
163+ ### 修饰符
164+
165+ 修饰符允许在函数执行前插入额外逻辑,常用于权限控制与前置检查:
166+
18167# 2025-08-13
19168
20169## Solidity智能合约教程
0 commit comments