📋
EVM

智能合约简介
什么是智能合约?
智能合约是部署在区块链上的程序代码,它自动执行预定义的规则和条款。
智能合约的特点:
1.不可变性
(Immutable)
•
一旦部署,代码无法修改
•
部署前必须充分测试
2.自动执行
•
消除了人为错误和欺诈
3.确定性
•
给定相同的输入,必定产生相同的输出
•
这是共识机制的基础
4.透明性
•
任何人都可以调用
EVM(以太坊虚拟机)
什么是
Solidity
的特点:
特性 | 说明 |
| 图灵完备 | 可以执行任何计算逻辑 |
| 隔离环境 | 每个合约在独立沙箱中运行 |
| Gas 限制 | 每个操作都有计算成本 |
| 无状态 | 不保存状态,每次执行从头开始 |
| 确定性 | 执行结果可预测 |
EVM
执行流程:
1.接收交易
Gas
为什么需要
Gas?
•
/>
2.2
的核心特性:
特性
说明
类比
静态类型 编译时检查类型错误
Java、C++
面向合约 以合约为核心组织代码
面向对象编程
Gas 敏感
每行代码都有计算成本
按量计费
继承支持 支持多重继承
Java、Python
事件驱动 通过
event
事件
异常处理 require/revert/assert
try-catch
Solidity
JavaScript
特性
JavaScript
Solidity
类型
动态类型
静态类型
执行环境
浏览器/Node.js
EVM
状态存储
内存/硬盘
区块链状态
代码可变性
可随时修改
部署后不可变
执行成本
免费
需要支付
Gas
并发模型
单线程异步
单线程同步
Solidity
的独特概念:
•Gas:
每个操作都有成本
•Storage:
永久存储,成本高
•Memory:
临时存储,成本低
•Calldata:
只读数据,成本最低
•Events:
日志记录,不存储在状态中
/>
2.3
基础语法详解
数据类型
值类型
(Value
Types)
值类型在赋值时会创建副本。
//布尔类型
0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb;
address
Status.Active;
整数类型详解:
//无符号整数
(默认)
引用类型
(Reference
Types)
引用类型在赋值时不会创建副本,而是引用同一数据。
//字符串
0x123...);
映射详解:
//定义映射
true;
变量作用域
contractExample
}
存储位置对比:
存储位置
持久性
Gas
成本
可修改性
storage 永久
高
可读可写
memory 临时
低
可读可写
calldata 临时
最低
只读
函数可见性
contractExample
}
可见性对照表:
修饰符
合约内部
继承合约
外部调用
public✅
✅
✅
external❌
❌
✅
internal✅
✅
❌
private✅
❌
❌
函数修饰符
状态修改修饰符:
//view
}
修饰符对比:
修饰符
读取状态
修改状态
接收
成本
view✅
❌
❌
低
pure❌
❌
❌
最低
payable✅
✅
✅
取决于操作
(无)
✅
✅
❌
取决于操作
何时使用
view/pure?
//view
}
特殊变量
contractSpecialVariables
}
msg.sender
tx.origin:
contractfunction
安全警告:不要使用
tx.origin进行身份验证,容易被钓鱼攻击!/>
🛠️
开发环境,无需安装,开箱即用。
访问
Remix
1.打开
访问:https://remix.ethereum.org/
2.了解界面布局
/>
/>不得不说,第一眼看Remix的主界面,内容非常多,也很凌乱。
3.创建工作区
•
"Create
workspace"
•
"Blank"
"Create"
/>步骤
(20分钟)
创建合约文件
1.新建文件
•
"New
命名为
HelloWeb3.sol
2.编写合约代码
/>
payable(owner).transfer(balance);
/**
}
代码解析
1.
SPDX
告诉编译器代码使用的开源许可证
•
MIT
必须放在第一行
•
Solidity
编译器版本
•
^0.8.20表示兼容0.8.20
0.9.0
•
>=0.8.20<0.9.0是另一种写法
•
记录日志,不存储在状态中
•
Gas
便于前端监听
1.打开编译器
•
点击左侧
或使用快捷键
Ctrl+S/Cmd+S
2.选择编译器版本
•
"Compiler"
下拉菜单中选择
0.8.20•
确保与
声明匹配
3.编译合约
•
"Compile
等待编译完成
4.检查结果
•
绿色勾号:编译成功
•
红色叉号:编译失败,查看错误信息
/>
/>
我们看到编译的时候生成几个json文件,可以点进去看看。
1.打开部署面板
•
点击左侧
图标
2.选择环境
•
下拉菜单中选择
无需连接钱包,测试使用
3.部署合约
•
"Deploy"
按钮旁确认选中了
HelloWeb3合约•
"Deploy"
等待部署完成
•
在下方
下找到
HelloWeb3•
点击展开合约,可以看到所有公开的函数和变量
/>
/>
1.打开调试面板
•
点击左侧
图标
2.查看事件
•
"logs"
hash”中的内容到DEBUGGER中,就可以看到debug信息。
/>
/>
2.
Pragma
声明
pragmasolidity
^0.8.20;
3.
@dev
用户可见的注释
4.
事件
eventMessageChanged(...);
5.
修饰符
modifieronlyOwner()
(5分钟)
编译步骤
常见编译错误
错误
原因
解决方法
Expectedidentifier
语法错误
检查代码语法
Typeerror
类型不匹配
检查变量类型
Undeclaredidentifier
变量未声明
检查变量名拼写
Functionoverload
clash
函数重载冲突
修改函数签名
/>步骤
(25分钟)
部署合约
![]()
/>
/>4.查看部署结果
测试合约
1.
message
测试访问控制
#切换到另一个账户
函数)
合约中定义了receive()函数,可以直接向合约地址转账:
#Deploy
找到最下方的合约地址按钮(低地址按钮)
点击该地址按钮触发
/>
在94.99的基础上又增加了5ETH
![]()
/>
6.1)
查看事件日志
了解不同的部署环境
Remix
适合开发测试
Injected
Provider
MetaMask
•
MetaMask
Gas
Web3
Provider
•
需要提供
URL
今天我人只测试和体验了Remix
Provider和Web3
今日产出检查清单
理论知识
•
EVM
理解数据类型(值类型、引用类型)
•
理解存储位置(storage、memory、calldata)
实操能力
•
Remix
掌握访问控制的使用
代码能力
•
能够处理
wei?
A:wei
ETH
wei。
这是为了避免浮点数精度问题。
1ETH
吗?
A:不完全正确。
如果外部调用
view/pure
修饰符?
A:只有带有
payable
ETH。
这是为了防止意外转账和潜在的安全问题。
Q4:
事件和状态变量有什么区别?
A:
•事件:
记录日志,不存储在状态中,成本低,用于前端监听
•状态变量:
永久存储,成本高,可以随时读取
Q5:
如何选择存储位置?
A:
•storage:
需要永久保存的数据
•memory:
函数内部临时使用的数据
•calldata:
/>
📖
课后作业(选做)
1.扩展合约功能
•
添加一个计数器,记录合约被调用的总次数
•
添加一个函数,可以设置最大修改次数
•
实现一个简单的投票机制
2.测试不同数据类型
•
创建一个使用
struct
3.优化
Gas
使用事件替代部分状态变量
4.记录学习笔记
•
总结最佳实践
•
掌握错误处理(require、revert、assert)
•
ERC-20
学习智能合约的安全最佳实践
•
阅读关于面向对象编程的基础知识
•
ERC-20
/>难度:⭐⭐☆☆☆
智能合约进阶与
春节7天Web3学习计划:我决定用假期给自己"充值"
祝你学习顺利!🚀
/>🎯
明天预告
明天我们将深入学习智能合约的进阶功能:
预习建议:


