欢迎光临
我们一直在努力

Solidity 实战【一】

前言

很多 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

转账三种方式

重入攻击初探

赞(0)
未经允许不得转载:171主机测评 » Solidity 实战【一】
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址