本节是《Solidity by Example》的中文翻译与深入讲解,专为零基础或刚接触区块链开发的小白朋友打造。我们将通过"示例 + 解说 + 提示"的方式,带你逐步理解每一段 Solidity 代码的实际用途与背后的逻辑。
Solidity 是以太坊等智能合约平台使用的主要编程语言,就像写网页要用 HTML 和 JavaScript,写智能合约就需要会 Solidity。
如果你从没写过区块链代码也没关系,只要你了解一点点编程概念,比如"变量""函数""条件判断",我们就能从最简单的例子开始,一步步建立你的 Solidity 编程思维。
If / Else
Solidity 支持条件语句 if、else if 和 else。
- 条件语句:
- Solidity 提供了
if
、else if
和else
语句,用于根据条件执行不同的代码块。 - 这些语句与传统编程语言(如 C++、JavaScript)的条件语句类似,允许开发者根据变量值或其他条件控制程序流程。
- Solidity 提供了
- 用途:
- 条件语句在智能合约中非常常见,例如:
- 检查用户权限(例如,只有管理员可以执行某操作)。
- 验证输入(例如,确保转账金额大于 0)。
- 根据状态执行不同逻辑(例如,根据余额决定奖励)。
- 条件语句在智能合约中非常常见,例如:
javascript
// SPDX-License-Identifier: MIT
// 声明代码采用 MIT 开源许可证,这是一种常见的开源许可协议,允许自由使用、修改和分发代码。
pragma solidity ^0.8.26;
// 指定 Solidity 编译器版本必须大于或等于 0.8.26 并且小于 0.9.0。
// `pragma` 指令确保合约使用兼容的编译器版本,`^0.8.26` 表示支持 0.8.26 或更高版本(但不超过 0.9.0)。
contract IfElse {
// 定义一个名为 `IfElse` 的智能合约。
// 合约是一个运行在以太坊区块链上的程序,包含数据(状态变量)和逻辑(函数)。
// 这个合约的目的是展示 Solidity 中的 if/else 条件语句和三元运算符。
function foo(uint256 x) public pure returns (uint256) {
// 定义一个名为 `foo` 的公共函数,接受一个参数 `x`(类型为 `uint256`,无符号整数)。
// `public` 表示函数可以被外部调用(用户、其他合约或 DApp)。
// `pure` 表示函数不读取也不修改区块链状态(仅进行计算),链下调用不消耗 Gas。
// 返回值类型为 `uint256`,表示函数返回一个无符号整数。
if (x < 10) {
// 如果 `x` 小于 10,执行以下代码块。
return 0;
// 返回 0,函数执行到此结束。
} else if (x < 20) {
// 如果 `x` 不小于 10 且小于 20,执行以下代码块。
return 1;
// 返回 1,函数执行到此结束。
} else {
// 如果以上条件都不满足(即 `x` 大于或等于 20),执行以下代码块。
return 2;
// 返回 2,函数执行到此结束。
}
}
function ternary(uint256 _x) public pure returns (uint256) {
// 定义一个名为 `ternary` 的公共函数,接受一个参数 `_x`(类型为 `uint256`)。
// `public` 表示函数可以被外部调用。
// `pure` 表示函数不读取也不修改区块链状态,链下调用不消耗 Gas。
// 返回值类型为 `uint256`。
// 以下注释展示了传统的 if/else 写法(未实际执行):
// if (_x < 10) {
// return 1;
// }
// return 2;
// shorthand way to write if / else statement
// 简写方式,用于替代 if/else 语句。
// the "?" operator is called the ternary operator
// "?" 运算符被称为三元运算符。
return _x < 10 ? 1 : 2;
// 使用三元运算符(ternary operator)简化条件判断:
// 格式:`条件 ? 值1 : 值2`
// 如果 `_x < 10` 为真,返回 1;否则返回 2。
// 等价于注释中的 if/else 逻辑,但更简洁。
}
}
IfElse
是一个简单的智能合约,展示了 Solidity 中的两种条件判断方式:
- if/else 语句 :通过
if
、else if
和else
实现多条件分支逻辑。 - 三元运算符 :通过
?:
提供简洁的条件判断写法(仅适用于简单二选一逻辑)。
代码做什么?
- 函数
foo
:- 接受一个数字x,根据其值返回不同的结果:
- 如果
x < 10
,返回 0。 - 如果
x >= 10 且 < 20
,返回 1。 - 如果
x >= 20
,返回 2。
- 如果
- 使用标准的
if/else
结构实现多条件分支。
- 接受一个数字x,根据其值返回不同的结果:
- 函数
ternary
:- 接受一个数字_x,根据其值返回:
- 如果
_x < 10
,返回 1。 - 否则(
_x >= 10
),返回 2。
- 如果
- 使用三元运算符(
?:
)简化if/else
逻辑。
- 接受一个数字_x,根据其值返回:
- Gas 成本:
- 两个函数都是
pure
,不读取或修改区块链状态,因此链下调用免费。 - 部署合约本身需要 Gas(因为创建了合约代码)。
- 两个函数都是
- 公开访问:
- 两个函数都是
public
,可以被外部调用(用户、其他合约或 DApp)。
- 两个函数都是
关键点:
- if/else 语句:
- 类似于其他编程语言,
if (条件) { 代码 }
检查条件是否为真。 else if
和else
提供后续条件或默认分支。- 适合复杂逻辑(多于两个分支)。
- 类似于其他编程语言,
- 三元运算符:
- 格式:
条件 ? 值1 : 值2
。 - 仅适用于简单的二选一逻辑(一个条件,两个可能结果)。
- 比
if/else
更简洁,但在 Solidity 中 Gas 节省效果有限(编译后差异不大)。
- 格式:
- pure 函数:
pure
表示函数只进行计算,不涉及区块链状态(读写状态变量或调用其他合约)。- 链下调用不消耗 Gas,适合条件判断或数学运算。
- 用途:
- 条件语句在智能合约中用于:
- 权限控制(例如,只有特定用户可以执行操作)。
- 输入验证(例如,检查金额是否足够)。
- 动态逻辑(例如,根据余额分配奖励)。
- 条件语句在智能合约中用于:
if/else 和三元运算符的注意事项
- if/else 语句:
- 适合处理多个条件分支(例如
foo
中的三个分支)。 - 代码清晰,易于理解和维护。
- 在复杂逻辑中,可能增加 Gas 消耗(因为代码量更多)。
- 适合处理多个条件分支(例如
- 三元运算符:
- 适合简单的二选一逻辑(例如
ternary
中的_x < 10 ? 1 : 2
)。 - 代码更简洁,但在 Solidity 中 Gas 优化效果有限(编译后与 if/else 类似)。
- 不支持多分支(只能处理两个结果)。
- 适合简单的二选一逻辑(例如
- pure 函数:
pure
函数不访问区块链状态,适合条件判断、数学计算等。- 如果函数需要读取状态变量(如
msg.sender
),使用view
修饰符。
- 安全性:
- 在条件语句中,检查输入有效性(例如
_x
是否在合理范围内)。 - 使用
require
或assert
防止无效输入导致逻辑错误。
- 在条件语句中,检查输入有效性(例如
- Gas 优化:
- 避免在循环中嵌套复杂
if/else
逻辑,可能导致高 Gas 消耗。 - 对于简单条件,优先考虑三元运算符以提高代码简洁性。
- 避免在循环中嵌套复杂