2、Solidity入门:语言特性、开发环境与第一个合约
好,咱们正式开始写智能合约了。
这一章,我会带你从零搭建Solidity开发环境,写一个能跑起来的合约。我个人觉得,学编程最快的方式就是动手。别怕,合约没那么神秘。
2.1 Solidity语言特性速览
Solidity是什么?说白了,它是专门给以太坊写智能合约的语言。语法上有点像JavaScript,但骨子里完全不同。
我简单列几个核心特性,你先有个印象:
- 静态类型:变量类型必须提前声明。不像JS那么随意。
- 面向合约:每个合约就像一个类,有状态变量和函数。
- EVM运行:代码跑在以太坊虚拟机上,不是浏览器。
- Gas机制:每行代码都要花钱。嗯,这个很重要。
- 不可篡改:部署后代码不能改。所以测试要仔细。
我记得刚学Solidity时,最不习惯的就是Gas。写个循环都要算成本。后来慢慢就习惯了——你想想看,链上资源是共享的,收费也合理。
2.2 开发环境搭建:Remix IDE
工欲善其事,必先利其器。我建议新手直接用Remix IDE。
为什么?因为它不需要安装,打开浏览器就能用。我在项目中遇到过很多次,临时要验证一段逻辑,直接打开Remix写几行代码,比搭本地环境快多了。
访问地址:https://remix.ethereum.org/
界面主要分三块:
- 左侧文件区:管理你的.sol文件
- 中间编辑区:写代码的地方
- 右侧操作区:编译、部署、调试
2.3 第一个智能合约:Hello World
好,咱们直接写代码。新建一个文件,叫 HelloWorld.sol。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract HelloWorld {
string public message;
constructor() {
message = "Hello, Web3!";
}
function setMessage(string memory _newMsg) public {
message = _newMsg;
}
function getMessage() public view returns (string memory) {
return message;
}
}
这段代码很简单,但我还是逐行解释一下:
- 第一行:许可证声明。不加的话编译器会警告。我一般都用MIT。
- 第二行:指定Solidity版本。^0.8.0表示兼容0.8.x系列。
- contract:合约关键字,类似class。
- string public message:状态变量,存在链上。public会自动生成一个getter函数。
- constructor:构造函数,部署时执行一次。
- setMessage:写入函数,会消耗Gas。
- getMessage:读取函数,view表示不修改状态,不花Gas。
重点: view和pure函数不消耗Gas。但如果是外部调用,节点可能会收一点点费用。嗯,细节先不管,后面会讲。
2.4 编译与部署
代码写完了,接下来就是编译和部署。
2.4.1 编译
在Remix右侧,切换到「Solidity Compiler」标签。点击「Compile HelloWorld.sol」。
如果代码没问题,你会看到一个绿色的勾。如果有错误,下面会显示红色提示。我曾经因为少写了一个分号,找了半天……嗯,Solidity对语法要求挺严格的。
2.4.2 部署
编译通过后,切换到「Deploy & Run Transactions」标签。
环境选择:
| 环境 | 说明 |
|---|---|
| JavaScript VM | 本地模拟,免费,适合测试 |
| Injected Provider | 连接MetaMask,部署到真实网络 |
| Remix VM | 类似JavaScript VM,但更稳定 |
我建议新手先用JavaScript VM。不用花钱,随便玩。
点击「Deploy」按钮,稍等几秒,下面就会出现你的合约实例。展开它,就能看到message、setMessage、getMessage这些函数了。
2.5 与合约交互
部署成功后,我们来玩一下。
- 点击message按钮,你会看到返回"Hello, Web3!"
- 在setMessage输入框里,输入"你好,区块链!"
- 点击setMessage,确认交易
- 再点击message,你会发现消息变了
是不是很简单?你想想看,这个小小的交互背后,其实发生了很多事情:交易被打包、状态被修改、全网节点同步……但对我们开发者来说,就是点几个按钮的事。
2.6 避坑指南
最后,分享几个我踩过的坑:
- 版本问题:不同版本的Solidity语法有差异。0.8.0之后,很多旧写法不能用了。我建议统一用0.8.x。
- Gas估算:写循环时要小心。如果循环次数太多,Gas可能超限。我曾经写过一个无限循环……嗯,那笔交易直接卡死了。
- 权限控制:合约里的public函数谁都能调用。如果不想这样,记得加权限修饰符。后面会详细讲。
好了,这一章就到这里。你已经学会了Solidity的基本语法、环境搭建、以及第一个合约的编译部署。下一章,我们会深入变量类型和数据结构。到时候见。