From 7e413866c28cbad129a51e05ea5a47fdbedc9c88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A5=80=E6=A2=A6?= <3501646051@qq.com> Date: Fri, 10 Oct 2025 10:54:35 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=87=E7=AB=A0=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/notes/programming/solidity/README.md | 12 ++ .../programming/solidity/basic-syntax.md | 203 +++++------------- package.json | 4 +- start.bat | 1 + 4 files changed, 68 insertions(+), 152 deletions(-) create mode 100644 start.bat diff --git a/docs/notes/programming/solidity/README.md b/docs/notes/programming/solidity/README.md index d1c4a48..6f88247 100644 --- a/docs/notes/programming/solidity/README.md +++ b/docs/notes/programming/solidity/README.md @@ -7,3 +7,15 @@ permalink: /programming/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) diff --git a/docs/notes/programming/solidity/basic-syntax.md b/docs/notes/programming/solidity/basic-syntax.md index ea6a7ff..74e9b66 100644 --- a/docs/notes/programming/solidity/basic-syntax.md +++ b/docs/notes/programming/solidity/basic-syntax.md @@ -6,180 +6,83 @@ permalink: /programming/solidity/basic-syntax/ # 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 // 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 { - // 状态变量:存储在区块链上的 - 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 -function myFunction() public { - // 局部变量:只在函数内部可见 - uint myLocalVariable = 100; -} +import "filename.sol"; ``` -局部变量只在定义它们的函数内部可见,函数执行结束后就会消失哦~ +这将导入`filename.sol`文件中的合约代码。 -### 全局变量 +还可以创建一个新的全局符号 ```solidity -function getSender() public view returns (address) { - // msg.sender 是一个全局变量,包含当前调用者的地址 - return msg.sender; -} +import * as NewName from "filename.sol" ``` -全局变量是 Solidity 内置的特殊变量,可以在任何地方使用,它们提供了关于区块链和交易的重要信息呢~ +这将创建一个新的全局符号`NewName`,您可以在合约中使用它来引用`filename.sol`文件中的合约,例如`NewName.ContractName`。 -## 小练习 🏋️‍♀️ +还可以在导入的同时重命名符号:`import {symbol1 as alias, symbol2} from "filename";` -现在让我们来做一个小练习吧!试着编写一个简单的计数器合约,包含以下功能: +### 注释 -1. 一个状态变量来存储计数值 -2. 一个函数来增加计数 -3. 一个函数来减少计数 -4. 一个函数来获取当前计数值 +Solidity 支持两种类型的注释: -你可以做到吗?相信自己,你一定可以的!(๑•̀ㅂ•́)و✧ +1. **行注释**:使用`//`来注释单行代码。 +2. **块注释**:使用`/*`和`*/`来注释多行代码。 -## 写在最后~💌 +例如: -今天我们学习了 Solidity 的基础语法和数据类型,这些都是构建智能合约的基石哦~虽然一开始可能会觉得有点复杂,但只要多练习,你一定会越来越熟练的!下节课我们将学习 Solidity 的函数和修饰器,敬请期待吧~ +```solidity +// 这是一个行注释 -如果有任何问题,欢迎随时提问哦~让我们一起在区块链的世界里快乐地探索吧!(づ ̄ 3 ̄)づ +/* +这是一个 +块注释 +*/ +``` \ No newline at end of file diff --git a/package.json b/package.json index a2a2226..ed58052 100644 --- a/package.json +++ b/package.json @@ -8,8 +8,8 @@ "node": "^20.6.0 || >=22.0.0" }, "scripts": { - "docs:dev": "vuepress dev docs", - "docs:dev-clean": "vuepress dev docs --clean-cache --clean-temp", + "docs:dev": "vuepress dev docs --port 4567", + "docs:dev-clean": "vuepress dev docs --clean-cache --clean-temp --port 4567", "docs:build": "vuepress build docs --clean-cache --clean-temp", "docs:preview": "http-server docs/.vuepress/dist", "vp-update": "npx vp-update" diff --git a/start.bat b/start.bat new file mode 100644 index 0000000..7a2e5a8 --- /dev/null +++ b/start.bat @@ -0,0 +1 @@ +npm run docs:dev -- --host 0.0.0.0 \ No newline at end of file