摘要:第一次写 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);
}
}

| 构件 | 本例里是什么 | 第一课要记住 |
|---|---|---|
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):

- 版本不一致是新手最常见坑:例如 pragma 写
^0.8.20,却选了 0.7.x,会直接编不过。 - 改完代码记得保存(Ctrl+S)。Remix 有时可开「自动编译」,第一课建议手动点,方便确认当前文件。
- 编译产物是 ABI + Bytecode。ABI 供前端 / web3 库编码调用;字节码才是部署时真正上链的内容。
四、部署到 Remix VM:改状态 + 读状态
左侧切到「部署 & 发交易」:
- 环境选
Remix VM (Osaka)(或你界面里带 Remix VM 字样的项)。账户会自带约 100 ETH 的测试余额,全是假币。 - 合约选
Hello。构造函数参数填一串字符串,例如Hello Remix VM(有的界面要带引号,以输入框提示为准)。 - 点蓝色 Deploy / 部署。成功后「已部署的合约」出现
HELLO AT 0xd91…一类实例;终端出现绿色勾,to写着Hello.(constructor),并给出假交易 hash。

接着在已部署实例里操作:
在橙色
setMessage 旁的输入框填新字符串(如 Hi from Remix VM),点按钮 / Transact。这是一笔状态修改交易,终端会再出一条记录,并可看到 MessageChanged 日志。点蓝色
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:

solc --version
solc --bin --abi --optimize -o build Hello.sol --overwrite
常见坑
- 编译器版本和 pragma 对不上:先看 pragma,再选编译器。
- 环境选错:Injected Provider 会调起钱包;第一课务必停在 Remix VM。
- 把私钥粘进网页:任何要求你粘贴私钥 / 助记词的页面都按钓鱼处理。Remix VM 不需要私钥。
- 主网误部署:主网部署要真 ETH。本课不涉及;钱包网络怎么认,以后用测试网再学。
- 构造函数参数没填:
Hello的 constructor 需要string,漏填会部署失败或行为不符合预期。
相关阅读
- web3.py 读 ERC-20:balanceOf、decimals 换算与裸 eth_call 核对
- web3.py 连 Sepolia:HTTPProvider、读余额与本地账户
- ethers.js 读合约:ABI、address 与 call 字段
- 以太坊交易回执怎么读:Status、Logs 与 Cumulative Gas 字段核对
说明:配图均为 2026-10-08 在 app.remix.live(中文)与本机 solc 实拍/实跑;Remix VM 交易哈希与合约地址只在本地会话有效,刷新或换工作区会变。本文不构成投资建议,也不引导主网部署。
