前言
很多 Solidity 入门文章,都会卡在一个尴尬的位置:
语法讲了一堆
关键字背了一堆
真正让你 “写一个能跑、能用、能解释的合约” 时,却无从下手
而现实是:
Web3 不缺“懂语法的人”,缺的是“能写可上线合约的人”
所以从这一篇开始,我不会走“语法百科”路线,而是:
直接实战,用工程思维写 Solidity
这是 Solidity 实战系列第一篇,目标只有一个:
让你真正写出人生第一个“像样”的智能合约
一、Solidity 实战前,你必须先转变的 3 个认知
在动手之前,有 3 个认知如果不先建立,后面一定踩坑。
1️⃣ 智能合约 ≠ 后端服务
很多 Java / Go 工程师会下意识把合约当成:
“部署在链上的 Spring Boot”
这是错误的。
后端服务智能合约
可随时改代码一旦部署几乎不可改
出 bug 可回滚出 bug 可能直接亏钱
性能第一安全第一
日志排错链上不可 debug
👉 合约写的是“规则”,不是“业务流程”
2️⃣ 合约不是“自动运行”的
智能合约不会定时执行,不会自己跑。
它的执行模型只有一种:
交易触发执行
没交易 → 合约不会动
没人调用 → 合约不会跑
3️⃣ Gas 是真实成本
每一行代码,都是钱。
一个 for 循环 = 真金白银
一次 storage 写入 = 成本最高操作
Gas 优化 = 工程能力
二、Solidity 开发环境(最简实战版)
2.1 推荐:Remix(新手第一选择)
为什么第一篇不用 Hardhat?
因为你现在的目标不是“工程化”,而是“理解合约本身”
Remix 特点:
浏览器直接用
不用装环境
即写即编译
适合理解 EVM 行为
👉 直接打开:
https://remix.ethereum.org
2.2 新建 Solidity 文件
contracts/
└── SimpleStorage.sol
三、第一个 Solidity 合约:状态存储
3.1 最基础合约结构
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
contract SimpleStorage {
}
这 3 行非常重要:
SPDX:开源协议声明
pragma:编译器版本(安全红线)
contract:合约定义
3.2 写入第一个状态变量
contract SimpleStorage {
uint256 public storedData;
}
关键点解释:
uint256:EVM 原生 256 位整数
public:自动生成 getter 方法
状态变量存储在链上
部署后你会发现:
Solidity 自动帮你生成了一个 storedData() 方法
四、写方法:真正“可交互”的合约
4.1 写一个 set 方法
function set(uint256 x) external {
storedData = x;
}
解释:
external:只能外部调用(省 Gas)
修改状态 → 必须发交易
4.2 再写一个 get 方法(对比)
function get() external view returns (uint256) {
return storedData;
}
注意区别:
类型是否消耗 Gas
view不消耗
pure不消耗
普通函数消耗
五、升级实战:加入“权限控制”
目前这个合约有一个致命问题:
任何人都能修改 storedData
这在真实链上是不可接受的。
5.1 引入 owner 概念
address public owner;
constructor() {
owner = msg.sender;
}
constructor:部署时执行一次
msg.sender:部署者地址
5.2 加权限校验
function set(uint256 x) external {
require(msg.sender == owner, “not owner”);
storedData = x;
}
require 是 Solidity 最重要的安全工具之一。
六、完整合约(可直接部署)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
contract SimpleStorage {
uint256 private storedData;
address public owner;
constructor() {
owner = msg.sender;
}
function set(uint256 x) external {
require(msg.sender == owner, "not owner");
storedData = x;
}
function get() external view returns (uint256) {
return storedData;
}
}
这已经是一个:
✅ 有状态
✅ 有权限
✅ 有读写分离
✅ 可真实部署的合约
七、你已经无意中学会的 Solidity 核心点
回顾一下,这一篇你已经掌握了:
合约基本结构
状态变量存储
public / private 区别
view vs 非 view
msg.sender
constructor
require 权限控制
这些,已经覆盖了 80% 实际合约的基础用法。
八、工程师最容易犯的 3 个错误(提前避坑)
❌ 1. 把复杂逻辑写进合约
错误示例:
for (uint i = 0; i < users.length; i++) {
…
}
👉 复杂计算放链下
❌ 2. 忽略权限设计
没权限控制的合约 = 裸奔
❌ 3. 随意用 storage
记住一句话:
storage 是最贵的资源
九、实战【一】的正确学习方式
建议你这样练:
1️⃣ 自己手敲一遍
2️⃣ 删掉 require,看看会发生什么
3️⃣ 把 external 改成 public,对比 Gas
4️⃣ 把 storedData 改成 public,看自动 getter
十、下一篇预告:Solidity 实战【二】
下一篇我们会直接进入真实业务模型:
👉 Solidity 实战【二】:手写一个“链上资金托管合约”
内容包括:
payable
address(this).balance
转账三种方式
重入攻击初探

