If / Else

本节是《Solidity by Example》的中文翻译与深入讲解,专为零基础或刚接触区块链开发的小白朋友打造。我们将通过"示例 + 解说 + 提示"的方式,带你逐步理解每一段 Solidity 代码的实际用途与背后的逻辑。

Solidity 是以太坊等智能合约平台使用的主要编程语言,就像写网页要用 HTML 和 JavaScript,写智能合约就需要会 Solidity。

如果你从没写过区块链代码也没关系,只要你了解一点点编程概念,比如"变量""函数""条件判断",我们就能从最简单的例子开始,一步步建立你的 Solidity 编程思维。

If / Else

Solidity 支持条件语句 if、else if 和 else。

  • 条件语句:
    • Solidity 提供了 ifelse ifelse 语句,用于根据条件执行不同的代码块。
    • 这些语句与传统编程语言(如 C++、JavaScript)的条件语句类似,允许开发者根据变量值或其他条件控制程序流程。
  • 用途:
    • 条件语句在智能合约中非常常见,例如:
      • 检查用户权限(例如,只有管理员可以执行某操作)。
      • 验证输入(例如,确保转账金额大于 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 中的两种条件判断方式:

  1. if/else 语句 :通过 ifelse ifelse 实现多条件分支逻辑。
  2. 三元运算符 :通过 ?: 提供简洁的条件判断写法(仅适用于简单二选一逻辑)。

代码做什么?

  • 函数 foo
    • 接受一个数字x,根据其值返回不同的结果:
      • 如果 x < 10,返回 0。
      • 如果 x >= 10 且 < 20,返回 1。
      • 如果 x >= 20,返回 2。
    • 使用标准的 if/else 结构实现多条件分支。
  • 函数 ternary
    • 接受一个数字_x,根据其值返回:
      • 如果 _x < 10,返回 1。
      • 否则(_x >= 10),返回 2。
    • 使用三元运算符(?:)简化 if/else 逻辑。
  • Gas 成本:
    • 两个函数都是 pure,不读取或修改区块链状态,因此链下调用免费。
    • 部署合约本身需要 Gas(因为创建了合约代码)。
  • 公开访问:
    • 两个函数都是 public,可以被外部调用(用户、其他合约或 DApp)。

关键点:

  • if/else 语句:
    • 类似于其他编程语言,if (条件) { 代码 } 检查条件是否为真。
    • else ifelse 提供后续条件或默认分支。
    • 适合复杂逻辑(多于两个分支)。
  • 三元运算符:
    • 格式:条件 ? 值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 是否在合理范围内)。
    • 使用 requireassert 防止无效输入导致逻辑错误。
  • Gas 优化:
    • 避免在循环中嵌套复杂 if/else 逻辑,可能导致高 Gas 消耗。
    • 对于简单条件,优先考虑三元运算符以提高代码简洁性。
相关推荐
boyedu8 小时前
Hyperledger Fabric深入解读:企业级区块链的架构、应用与未来
架构·区块链·fabric·企业级区块链
gaog2zh12 小时前
0102基础补充_交易演示-区块链-web3
web3·区块链
搬砖的小码农_Sky15 小时前
区块链:以太坊侧链Polygon
区块链
boyedu15 小时前
区块链发展史全景长图
区块链
嘻嘻仙人17 小时前
区块链的三种共识机制——PoW、PoS和DPoS原理
区块链·共识算法
boyedu1 天前
Hyperledger Fabric架构详解:企业级区块链的模块化设计与实现
架构·区块链·fabric·企业级区块链
boyedu2 天前
以太坊应用开发基础:从理论到实战的完整指南
区块链·以太坊
boyedu2 天前
区块链应用场景深度解读:从金融革命到社会治理的全方位革新
金融·区块链