文章更新

This commit is contained in:
祀梦
2025-10-10 10:54:35 +08:00
parent 95dc8fecf9
commit 7e413866c2
4 changed files with 68 additions and 152 deletions

View File

@@ -7,3 +7,15 @@ permalink: /programming/solidity/
## Solidity 智能合约概述 ## Solidity 智能合约概述
Solidity 是一种用于编写智能合约的静态类型编程语言它运行在以太坊虚拟机EVM上。
## 推荐的资料
推荐的编辑器
Remix IDE[https://remix.ethereum.org/](https://remix.ethereum.org/)
有在线版本,也可以下载之后使用,而且可以通过 Docker 部署,很方便
Solidity 学习资料:
- [Solidity 官方文档](https://docs.soliditylang.org/zh-cn/latest/index.html)
- [cryptozombies](https://cryptozombies.io/zh/course)

View File

@@ -6,180 +6,83 @@ permalink: /programming/solidity/basic-syntax/
# Solidity 基础语法与数据类型~(≧∇≦)ノ # Solidity 基础语法与数据类型~(≧∇≦)ノ
嗨~欢迎来到 Solidity 基础语法的学习时间!今天我们要一起探索 Solidity 这门神奇语言的基本结构和数据类型哦准备好了吗Let's go(๑>◡<) ## Solidity 文件基础框架
## 智能合约的基本结构 🏗️ Solidity 文件的基础框架通常包含以下几个部分:
让我们先来看一个最简单的 Solidity 智能合约是什么样子的吧 1. **SPDX 许可证标识符 (SPDX License Identifier)**:为了避免法律问题和明确智能合约的开源许可证,建议在合约的开头添加 SPDX 许可证标识符。
2. **Solidity 版本声明 (Pragma)**:这会告诉编译器您希望使用哪个版本的 Solidity 来编译您的代码。
3. **ABI编码编译指示**:通过`pragma abicoder v1``pragma abicoder v2`来指定ABI编码版本。
4. **合约定义 (Contract Definition)**:这是您编写智能合约代码的主体部分。
下面是一个基础的 Solidity 文件框架示例,您可以直接使用:
```solidity ```solidity
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity ^0.8.0; pragma solidity ^0.8.20;
pragma experimental ABIEncoderV2;
contract HelloWorld {
// 状态变量
string public greeting = "Hello, World!";
// 函数
function setGreeting(string memory _greeting) public {
greeting = _greeting;
}
function getGreeting() public view returns (string memory) {
return greeting;
}
}
```
是不是看起来有点像其他编程语言呀让我们来一点一点地了解它吧
## 版本声明和许可证 📜
Solidity 合约的最开始我们需要添加两行重要的声明
```solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
```
- **许可证声明**告诉别人你的代码使用什么许可证可以自由使用吗
- **版本声明**指定合约使用的 Solidity 编译器版本`^0.8.0` 表示可以使用 0.8.0 及以上的版本哦
## 数据类型 🌈
Solidity 有很多有趣的数据类型让我们来认识一下它们吧
### 值类型
这些类型在赋值时会直接复制值哦
#### 布尔型 (Boolean)
```solidity
bool public isActive = true;
bool public isPaused = false;
```
布尔型只有两个值`true` `false`就像开关一样简单(˘˘)
#### 整型 (Integer)
```solidity
int public negativeNumber = -42;
uint public positiveNumber = 42;
// 你还可以指定位数哦~
uint8 public smallNumber = 255; // 0-255
uint256 public bigNumber = 1000000000000000000; // 这是 1 以太币的 wei 值哦~
```
整型分为有符号`int`和无符号`uint`两种可以存储正数和负数呢
#### 地址型 (Address)
```solidity
address public owner = 0x71C7656EC7ab88b098defB751B7401B5f6d8976F;
// 可以转账的地址类型
address payable public recipient = payable(0x71C7656EC7ab88b098defB751B7401B5f6d8976F);
```
地址类型非常特别它用于存储以太坊账户的地址就像是账户的身份证号码一样`address payable` 还可以接收以太币转账呢
### 引用类型
这些类型在赋值时只会传递引用而不是复制整个值哦
#### 字符串 (String)
```solidity
string public message = "Hello, Solidity!";
string public name = "祀梦";
```
字符串用于存储文本数据就像你平时写的便签一样
#### 数组 (Array)
```solidity
// 固定大小的数组
uint[5] public fixedArray = [1, 2, 3, 4, 5];
// 动态大小的数组
uint[] public dynamicArray;
// 你还可以在函数中这样使用哦~
function addNumber(uint _number) public {
dynamicArray.push(_number);
}
```
数组就像是一个收纳盒可以按顺序存放多个相同类型的数据呢
#### 映射 (Mapping)
```solidity
// 映射:地址 => 余额
mapping(address => uint) public balances;
// 使用方式
function deposit() public payable {
balances[msg.sender] += msg.value;
}
```
映射是 Solidity 中非常强大的数据结构就像是一个魔法字典可以通过键快速找到对应的值
## 变量作用域 🔍
Solidity 变量有不同的作用域哦
### 状态变量
```solidity
contract MyContract { contract MyContract {
// 状态变量:存储在区块链上的 // 在这里编写您的合约代码
uint public myStateVariable = 42;
} }
``` ```
状态变量是存储在区块链上的所有合约函数都可以访问它们就像是合约的公共记忆一样 ## Solidity 基础数据类型
### 局部变量 - 布尔类型bool值为 `true``false`
- 运算符:`!`(逻辑非)、`&&`(逻辑与)、`||`(逻辑或)、`==`(等于)、`!=`(不等于)
- 整形int/uint
- 有符号整数int可以表示负数和零。
- 无符号整数uint只能表示非负数。
- 整数类型可以是8位、16位、32位、64位或256位。只要是八的倍数都可以
- 例如:`int8``uint256`等。
- 运算符:
- 比较运算符:`<=`,`<`,`>=`,`>`
- 位运算符:`&`(按位与)、`|`(按位或)、`^`(按位异或)、`~`(按位取反)
- 移位运算符:`<<`(左移)、`>>`(右移)
- 算数运算符:`+`(加法)、`-`(减法)、`*`(乘法)、`/`(除法)、`%`(取余)
- 对于一个整数类型`X`,可以使用`type(X).min``type(X).max`来获取其最小值和最大值。
## Solidity 基础语法结构
## Solidity 基础操作
### 导入其他源文件
Solidity 支持导入其他源文件,使用`import`语句。例如:
```solidity ```solidity
function myFunction() public { import "filename.sol";
// 局部变量:只在函数内部可见
uint myLocalVariable = 100;
}
``` ```
局部变量只在定义它们的函数内部可见函数执行结束后就会消失哦 这将导入`filename.sol`文件中的合约代码。
### 全局变量 还可以创建一个新的全局符号
```solidity ```solidity
function getSender() public view returns (address) { import * as NewName from "filename.sol"
// msg.sender 是一个全局变量,包含当前调用者的地址
return msg.sender;
}
``` ```
全局变量是 Solidity 内置的特殊变量可以在任何地方使用它们提供了关于区块链和交易的重要信息呢 这将创建一个新的全局符号`NewName`,您可以在合约中使用它来引用`filename.sol`文件中的合约,例如`NewName.ContractName`
## 小练习 🏋️‍♀️ 还可以在导入的同时重命名符号:`import {symbol1 as alias, symbol2} from "filename";`
现在让我们来做一个小练习吧试着编写一个简单的计数器合约包含以下功能 ### 注释
1. 一个状态变量来存储计数值 Solidity 支持两种类型的注释:
2. 一个函数来增加计数
3. 一个函数来减少计数
4. 一个函数来获取当前计数值
你可以做到吗相信自己你一定可以的(̀ㅂ́)و 1. **行注释**:使用`//`来注释单行代码。
2. **块注释**:使用`/*``*/`来注释多行代码。
## 写在最后~💌 例如:
今天我们学习了 Solidity 的基础语法和数据类型这些都是构建智能合约的基石哦虽然一开始可能会觉得有点复杂但只要多练习你一定会越来越熟练的下节课我们将学习 Solidity 的函数和修饰器敬请期待吧 ```solidity
// 这是一个行注释
如果有任何问题欢迎随时提问哦让我们一起在区块链的世界里快乐地探索吧( 3 ̄) /*
这是一个
块注释
*/
```

View File

@@ -8,8 +8,8 @@
"node": "^20.6.0 || >=22.0.0" "node": "^20.6.0 || >=22.0.0"
}, },
"scripts": { "scripts": {
"docs:dev": "vuepress dev docs", "docs:dev": "vuepress dev docs --port 4567",
"docs:dev-clean": "vuepress dev docs --clean-cache --clean-temp", "docs:dev-clean": "vuepress dev docs --clean-cache --clean-temp --port 4567",
"docs:build": "vuepress build docs --clean-cache --clean-temp", "docs:build": "vuepress build docs --clean-cache --clean-temp",
"docs:preview": "http-server docs/.vuepress/dist", "docs:preview": "http-server docs/.vuepress/dist",
"vp-update": "npx vp-update" "vp-update": "npx vp-update"

1
start.bat Normal file
View File

@@ -0,0 +1 @@
npm run docs:dev -- --host 0.0.0.0