# 怎样用 Remix VM 安全练习合约？编译、部署、读写与预期失败

整理：链小知（AI 辅助）
资料核对日期：2026-10-11
引用地址：https://lianxiaozhi.com/tools/guides/remix-local-vm-first-contract
难度：入门
核验方式：官方文档整理，未执行真实账户操作

在浏览器沙箱里验证一个有边界检查的计数合约，全程使用沙箱账号，不连接真实钱包。

## 使用工具
- [Remix IDE](https://lianxiaozhi.com/tools/remix) · [官方入口](https://remix.ethereum.org/)

## 前置条件
- 通过 remix.ethereum.org 打开官方 IDE。
- 仅使用 Remix VM 环境；不选择 Browser Extension 或公共网络。
- 本教程是基于官方文档的演练设计，本次尚未实机执行。

## 1. 建立单独练习文件

创建 TutorialCounter.sol，使用下列原创最小合约。它只能把 number 设为 0–9，适合同时观察成功写入和边界失败：
```solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
contract TutorialCounter {
    uint256 public number;
    function setNumber(uint256 next) external {
        require(next < 10, "limit");
        number = next;
    }
}
```

核对结果：文件内容仅有练习合约，没有外部调用、私钥或网络配置。
依据：[Remix：编译、部署与 VM 沙箱](https://remix-ide.readthedocs.io/en/latest/run.html)

## 2. 选择编译器并编译

在 Solidity Compiler 选择与 pragma 兼容的 0.8.x 编译器，记录具体版本后 Compile。出现错误时读对应行；不要先切换钱包或部署网络。多合约文件要核对当前选中的合约是 TutorialCounter。

核对结果：编译没有错误，当前选择的名称正确。
依据：[Remix：编译、部署与 VM 沙箱](https://remix-ide.readthedocs.io/en/latest/run.html)

## 3. 确认沙箱环境再部署

打开 Deploy & Run，选名称以 Remix VM 开头的沙箱环境，Value 保持 0，再 Deploy。官方说明 VM 是浏览器内沙箱并预置测试账号；若弹出真实钱包确认，请停止并重新检查环境。

核对结果：Deployed Contracts 出现实例，环境仍为 Remix VM。
依据：[Remix：编译、部署与 VM 沙箱](https://remix-ide.readthedocs.io/en/latest/run.html)

## 4. 先读，再写，再读

展开实例，读取 number，应为初始值 0；在 setNumber 输入 7，执行后再次读取，应为 7。官方文档区分只读函数按钮与改变状态的按钮；此处写入仅在沙箱链中发生。

核对结果：先后读到 0 与 7，并能指出哪一次操作改变状态。
依据：[Remix：只读与写入函数及参数输入](https://remix-ide.readthedocs.io/en/latest/udapp.html)

## 5. 主动验证边界失败

再输入 10 调用 setNumber，合约应按 require 回滚。查看终端错误，并重新读取 number，预期仍为 7。若读到 10，先检查是否部署了另一个没有边界条件的实例；若找不到实例则核对是否切换环境。

核对结果：观察到失败且原状态未被改写，而不是仅看编译通过。
依据：[Remix：只读与写入函数及参数输入](https://remix-ide.readthedocs.io/en/latest/udapp.html)

## 6. 保存练习结果及局限

保留源码、编译器版本、沙箱环境、成功写入与失败后读数。这个演练只证明已执行的读写和边界行为；不能推导任意真实合约安全。不要把沙箱 ETH、实例地址或测试结果展示成主网资金与部署。

核对结果：记录清楚标为本地沙箱；是否实际完成由自己的读数与终端结果证明。
依据：[Remix：编译、部署与 VM 沙箱](https://remix-ide.readthedocs.io/en/latest/run.html)

## 常见错误
- Browser Extension 与 Remix VM 混淆。
- 编译成功就当合约行为验证完成。
- 没有读回状态就声称回滚保留原值。

## 完成检查
- 在自己的沙箱中观察到 0→7。
- 输入 10 失败后仍读到 7；若未实际运行，应保留为未验证。

## 相关知识

## 官方依据
- [Remix：编译、部署与 VM 沙箱](https://remix-ide.readthedocs.io/en/latest/run.html)
- [Remix：只读与写入函数及参数输入](https://remix-ide.readthedocs.io/en/latest/udapp.html)
