摘要:第一次写 Solidity:用 Remix IDE 在浏览器内置 Remix VM 里完成最小合约的编写、0.8.28 编译、部署、setMessage 写入与 message 读取。本文讲清 pragma、状态变量、constructor、event 与可见性,强调本场演示不碰主网资金;并附本机 solc 0.8.28 等价编译核对。

很多人第一次接触「区块链开发」,是从区块浏览器里看别人的交易开始的:会认 Status、Logs,但还没亲手写过一行合约。本文只做一件事——在 Remix IDE 里写一个最小 Solidity 合约,用Remix VM(浏览器内置虚拟机)完成编译、部署、写入和读取。全程不碰主网资金,也不需要 Sepolia 测试币。

本场演示环境是 Remix 2.6.5(中文界面),编译器 0.8.28+commit.7893614a,部署环境选 Remix VM (Osaka)。若你本机也装了 solc,文末用同版本命令行再核对一遍 ABI。读合约、发交易的 JS/Python 用法,可接着看 ethers.js 读合约 与 web3.py 连 Sepolia。

一、和「只会看浏览器」差在哪

浏览器告诉你「链上发生了什么」;写合约是在规定「链上允许发生什么」。合约部署后,状态变量落在合约存储里,外部账户通过交易调用函数去改它,调用结果会出现在交易回执的 Logs 里——回执字段怎么读,见 以太坊交易回执怎么读。

Remix 把编辑器、编译器、假链(Remix VM)和部署面板捆在同一个网页里,适合第一课。本文不用 Injected Provider / 钱包,避免误连主网;等以后有测试网 ETH,再换成 Sepolia。

二、合约最小结构:先认这几块

打开 Remix 后,在 Playground 工作区新建(或粘贴)下面这份 HelloWorld.sol。本场实拍时文件名是 HelloWorld.sol,合约名是 Hello:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

/// @title Hello — Remix VM 第一课最小合约
contract Hello {
    string public message;
    address public owner;
    event MessageChanged(address indexed who, string oldMsg, string newMsg);

    constructor(string memory initialMessage) {
        owner = msg.sender;
        message = initialMessage;
    }

    function setMessage(string memory newMessage) public {
        string memory old = message;
        message = newMessage;
        emit MessageChanged(msg.sender, old, newMessage);
    }
}
Solidity 第一课:合约结构与 Remix 本地/VM 部署怎么跑通-程序旅途
图1:app.remix.live 中文界面:Playground 工作区打开 HelloWorld.sol;左侧 Solidity 编译器图标带绿色勾;代码含 SPDX、pragma ^0.8.20、contract Hello、string public message、address public owner、event MessageChanged、constructor、setMessage;2026-10-08 实拍
构件 本例里是什么 第一课要记住
pragma ^0.8.20 编译器版本必须落在这个区间,否则编译失败
contract Hello 部署的是「合约类型」,不是文件名
状态变量 message / owner 写在链上存储里;public 会自动生成只读 getter
constructor 部署时跑一次 本例接收 initialMessage,并记下 msg.sender
函数可见性 setMessage … public 谁都能调;以后才会讲 onlyOwner 等权限
event MessageChanged 写入时打日志,浏览器 / eth_getLogs 能筛

string public message 既是存储,也是无参数的 message() 读函数;改状态必须走会花 Gas 的交易(本场在 VM 里是假 Gas)。

三、编译:版本对齐 pragma

左侧点「Solidity 编译器」,版本选 0.8.28(或任意满足 ^0.8.20 的 0.8.x),再点「编译 HelloWorld.sol」。成功后左侧编译图标会出现绿勾,合约下拉里能看到 Hello (HelloWorld.sol):

Solidity 第一课:合约结构与 Remix 本地/VM 部署怎么跑通-程序旅途
图2:Remix「SOLIDITY 编译器」:Compiler 为 0.8.28+commit.7893614a;按钮为「编译 HelloWorld.sol」;合约列表显示 Hello (HelloWorld.sol);可展开编译详情 / ABI / Bytecode;界面简体中文,2026-10-08
  • 版本不一致是新手最常见坑:例如 pragma 写 ^0.8.20,却选了 0.7.x,会直接编不过。
  • 改完代码记得保存(Ctrl+S)。Remix 有时可开「自动编译」,第一课建议手动点,方便确认当前文件。
  • 编译产物是 ABI + Bytecode。ABI 供前端 / web3 库编码调用;字节码才是部署时真正上链的内容。

四、部署到 Remix VM:改状态 + 读状态

左侧切到「部署 & 发交易」:

  1. 环境选 Remix VM (Osaka)(或你界面里带 Remix VM 字样的项)。账户会自带约 100 ETH 的测试余额,全是假币。
  2. 合约选 Hello。构造函数参数填一串字符串,例如 Hello Remix VM(有的界面要带引号,以输入框提示为准)。
  3. 点蓝色 Deploy / 部署。成功后「已部署的合约」出现 HELLO AT 0xd91… 一类实例;终端出现绿色勾,to 写着 Hello.(constructor),并给出假交易 hash。
Solidity 第一课:合约结构与 Remix 本地/VM 部署怎么跑通-程序旅途
图3:Remix「部署 & 发交易」:环境 Remix VM (Osaka);Account 1 余额约 99.999 ETH;已部署 Hello at 0xd91…39138;橙色 setMessage 与蓝色 message、owner 按钮;底部终端显示 from 0x5B3…eddC4、to Hello.(constructor)、hash 0x1dc…df39b;界面简体中文,2026-10-08

接着在已部署实例里操作:

写入 setMessage
在橙色 setMessage 旁的输入框填新字符串(如 Hi from Remix VM),点按钮 / Transact。这是一笔状态修改交易,终端会再出一条记录,并可看到 MessageChanged 日志。
读取 message / owner
点蓝色 message、owner。这是 eth_call 式只读调用,不改状态;返回值会出现在按钮下方或解码输出里。

本场明确说明:演示全程在 Remix VM,不消耗真实 Gas,也不连接钱包。等有 Sepolia ETH 时,再把环境换成 Injected Provider,用同一份合约打到测试网,并在 Sepolia Etherscan 核对。

五、本机 solc 等价核对(可选)

若本机安装了与 Remix 相同的 solc 0.8.28,可对同一份 Hello.sol 再编译一次,确认 ABI 里确实有 constructor、setMessage、message、owner 和 MessageChanged:

Solidity 第一课:合约结构与 Remix 本地/VM 部署怎么跑通-程序旅途
图4:本机 xterm 实跑:solc Version 0.8.28+commit.7893614a.Linux.g++;Compiler run successful;ABI JSON 含 constructor(initialMessage)、event MessageChanged、message、owner、setMessage;bytecode bytes 1818;脚注说明正文以 Remix VM 为准
solc --version
solc --bin --abi --optimize -o build Hello.sol --overwrite

常见坑

  • 编译器版本和 pragma 对不上:先看 pragma,再选编译器。
  • 环境选错:Injected Provider 会调起钱包;第一课务必停在 Remix VM。
  • 把私钥粘进网页:任何要求你粘贴私钥 / 助记词的页面都按钓鱼处理。Remix VM 不需要私钥。
  • 主网误部署:主网部署要真 ETH。本课不涉及;钱包网络怎么认,以后用测试网再学。
  • 构造函数参数没填:Hello 的 constructor 需要 string,漏填会部署失败或行为不符合预期。

相关阅读

说明:配图均为 2026-10-08 在 app.remix.live(中文)与本机 solc 实拍/实跑;Remix VM 交易哈希与合约地址只在本地会话有效,刷新或换工作区会变。本文不构成投资建议,也不引导主网部署。