Solidity 基础知识
官网:Solidity
版本设置
// SPDX-License-Identifier:MIT 表示身份协议
// ^0.8.7 表示当前代码支持 0.8.7 及以后 solidity 版本
// >=0.8.7 <0.8.12 表示支持该范围的版本
pragma solidity 0.8.7;
基本数据类型
// 基础数据类型:boolean uint(无符号整数) int address bytes
bool sutFlag = true;
// uint 存储空间大小可以设置 最少设置 8(1 bit 占 8 位,以 2 的指数倍设置) 默认是 256 一般都显式定义出来 如果不赋值默认为 0
uint256 public studentNum = 123;
// bytes 一般是 0x 开头接一些随机的数字字母,这里存的字符串 xiao,会自动转成 bytes,最大空间是 32
bytes32 stuName1 = "xiao";
// string 只能用来存字符串
string stuName = "panda";
函数和变量的四种可见标识符
- public
public 外部和内部可见(为存储/状态变量创建一个getter 函数) - private
仅在当前合约中可见 - external
仅在外部可见(仅适用于函数) - 即只能被消息调用(通过this.func) - internal
只在内部可见
不消耗 gas 的两种关键字
- view:标识函数代表只读,不允许在当前函数中修改任何状态
- pure:不允许修改状态,同时不允许读取区块链数据
注意:如果一个要改变区块链状态的函数调用了 view 或者 pure 函数,还是会消耗 gas。
结构体
// 定义
struct People {
uint256 num;
string name;
}
// 使用
People public person = People({myNum: 2, name: "panda"});
数组
People[] public persons;
function addPeople(string memory _name, uint256 _num) public {
// 两种创建数组的方式
persons.push(People(_num, _name));
People memory person = People({myNum: 2, name: "panda"});
persons.push(person);
// 映射
habbitMap[_name] = _num;
}
映射
mapping(string => uint256) public habbitMap;
EVM 存储
- Stack:栈内存存储
- Memory:变量只存在于临时的,可以再次赋值,且仅用于数组,结构体,映射对象(string 是字节数组)
- Storage:即使在执行的函数外,也存在变量
- Calldata:调用数据,变量只存在于临时的,当变量使用 calldata 定义时,变量不能再次赋值
- Code
- Logs