第一个 Solidity 程序
Solidity 是一种用于编写以太坊虚拟机(EVM)智能合约的编程语言。
掌握 Solidity 是参与链上项目的必备技能
在 Remix 中,左侧菜单有三个按钮,分别对应文件(编写代码)、编译(运行代码)和部署(将合约部署到链上)。点击“创建新文件”(Create New File)按钮,即可创建一个空白的 Solidity 合约。
编写代码
// 第 1 行是注释,说明代码所使用的软件许可(license),这里使用的是 MIT 许可。如果不写许可,编译时会出现警告(warning),但程序仍可运行
// SPDX-License-Identifier: MIT
// 第 2 行声明源文件所使用的 Solidity 版本,因为不同版本的语法有差异。这行代码表示源文件将不允许小于 0.8.21 版本或大于等于 0.9.0 的编译器编译(第二个条件由 ^ 提供)。
pragma solidity ^0.8.21;
// 第 3-4 行是合约部分。第 3 行创建合约(contract),并声明合约名为 HelloWeb3。第 4 行是合约内容,声明了一个 string(字符串)变量 _string,并赋值为 "Hello Web3!"。
contract HelloWeb3{
string public _string = "Hello Web3!";
}
编译并部署代码
在 Remix 编辑代码的页面,按 Ctrl + S 即可编译代码。
编译完成后,点击左侧菜单的“部署”按钮,进入部署页面。
Remix 会使用 Remix 虚拟机(以前称为 JavaScript 虚拟机)来模拟以太坊链,运行智能合约,类似在浏览器里运行一条测试链。
Remix 还会为你分配一些测试账户,每个账户里有 100 ETH(测试代币),随意使用。
点击 Deploy(黄色按钮),即可部署我们编写的合约。
部署成功后,在下方会看到名为 HelloWeb3 的合约。点击 _string,即可看到 “Hello Web3!”。
变量类型
- 值类型(Value Type):包括布尔型,整数型等等,这类变量赋值时候直接传递数值。
- 引用类型(Reference Type):包括数组和结构体,这类变量占空间大,赋值时候直接传递地址(类似指针)。
- 映射类型(Mapping Type): Solidity中存储键值对的数据结构,可以理解为哈希表
值类型
- 布尔型
- 整型
- 地址类型
- 访问修饰符修饰的 address: 存储一个 20 字节的值(以太坊地址的大小)。
- payable 修饰的 address: 比普通地址多了 transfer 和 send 两个成员方法,用于接收转账。
// 地址
address public _address = 0x7A58c0Be72BE218B41C608b7Fe7C5bB630736C71;
address payable public _address1 = payable(_address); // payable address,可以转账、查余额
// 地址类型的成员
uint256 public balance = _address1.balance; // balance of address
- 定长字节数组
- 定长字节数组: 属于值类型,数组长度在声明之后不能改变。根据字节数组的长度分为 bytes1, bytes8, bytes32 等类型。定长字节数组最多存储 32 bytes 数据,即bytes32。
- 不定长字节数组: 属于引用类型(之后的章节介绍),数组长度在声明之后可以改变,包括 bytes 等。
// 固定长度的字节数组
bytes32 public _byte32 = "MiniSolidity";
bytes1 public _byte = _byte32[0];
在上述代码中,MiniSolidity 变量以字节的方式存储进变量 _byte32。如果把它转换成 16 进制,就是:0x4d696e69536f6c69646974790000000000000000000000000000000000000000
_byte 变量的值为 _byte32 的第一个字节,即 0x4d。
- 枚举 enum
枚举(enum)是 Solidity 中用户定义的数据类型。它主要用于为 uint 分配名称,使程序易于阅读和维护。它与 C 语言 中的 enum 类似,使用名称来代替从 0 开始的 uint:
// 用enum将uint 0, 1, 2表示为Buy, Hold, Sell
enum ActionSet { Buy, Hold, Sell }
// 创建enum变量 action
ActionSet action = ActionSet.Buy;
枚举可以显式地和 uint 相互转换,并会检查转换的正整数是否在枚举的长度内,否则会报错:
// enum可以和uint显式的转换
function enumToUint() external view returns(uint){
return uint(action);
}
enum 是一个比较冷门的变量,几乎没什么人用。
在 Remix 上运行
部署合约后可以查看每个类型的变量的数值:
2-1.png
enum 和 uint 转换的示例:
2-2.png 2-3.png