一、命名约定
- 变量:小写字母开头,采用驼峰式(如
myVariable
)。 - 类型/合约:大写字母开头(如
MyContract
、Address
)。 - 函数:小写字母开头,动词优先(如
transferFunds()
)。
二、基础数据类型
类型 | 描述 | 示例 |
---|---|---|
bool | 布尔值,仅取值 true 或 false | bool isActive = true; |
uint256 | 无符号整数(范围:0 到 2²⁵⁶-1),默认推荐使用 uint 表示此类型 | uint256 balance = 100; |
int256 | 有符号整数(范围:-2²⁵⁵ 到 2²⁵⁵-1) | int256 temperature = -10; |
bytes32 | 固定长度字节数组,常用于哈希值存储 | bytes32 hash = keccak256("data"); |
string | 动态长度 UTF-8 字符串 | string name = "Alice"; |
address | 以太坊地址类型(20 字节) | address owner = 0x...; |
合约类型 | 合约本身可作为数据类型(如继承或交互) | MyContract contract = MyContract(address); |
三、关键字与内置函数
1. 常量修饰符
• constant
:编译时确定值,不可修改(如 uint constant MAX = 100;
)。
• immutable
:构造函数初始化后不可修改(如 address immutable owner;
)。
2. 环境变量
• msg.sender
:当前函数调用者的地址。
• msg.value
:调用时附加的以太币数量(单位:wei)。
• block.number
:当前区块号。
• tx.origin
:交易发起者地址(慎用,存在安全风险)。
四、函数可见性
修饰符 | 描述 | 适用场景 |
---|---|---|
public | 内外均可访问,自动生成 getter 函数(状态变量默认) | 外部调用或合约内部逻辑 |
private | 仅当前合约内访问,子合约不可继承 | 内部工具函数 |
internal | 当前合约及继承合约可访问 | 可复用的内部逻辑 |
external | 仅外部调用(合约内部需通过 this.func() 调用) | 对外接口 |
五、转账函数
方法 | 特性 | 示例 |
---|---|---|
transfer | 固定 2300 gas,失败时回滚交易 | payable(addr).transfer(1 ether); |
send | 固定 2300 gas,返回布尔值(需手动处理失败) | bool success = payable(addr).send(1 ether); |
call | 灵活 gas 设置,支持数据传递(推荐使用) | (bool success,) = addr.call{value: 1 ether}(""); |
六、存储模式
类型 | 特性 | 适用场景 |
---|---|---|
storage | 永久存储(链上),消耗高 gas | 状态变量 |
memory | 临时存储(函数内),可修改(基础类型自动分配) | 函数参数、局部变量 |
calldata | 只读临时存储(外部函数参数) | 外部调用参数优化 |
stack | EVM 栈存储(深度限制 1024) | 操作中间结果 |
七、数据结构
-
结构体(Struct)
自定义复合类型,类似类:struct User { string name; uint256 balance; } User public user = User("Alice", 100);
-
数组(Array)
• 动态数组:uint[] public numbers;
• 固定数组:uint[5] public fixedArray;
-
映射(Mapping)
键值对存储,适合快速查询:mapping(address => uint) public balances; balances[msg.sender] = 100;
八、修改器(Modifier)
用于函数执行前的条件校验:
modifier onlyOwner() {
require(msg.sender == owner, "Not owner");
_; // 继续执行函数体
}
function withdraw() external onlyOwner {
// 仅所有者可调用
}