Solidity学习笔记-基础语法整理

33 阅读2分钟

一、命名约定

  1. 变量:小写字母开头,采用驼峰式(如 myVariable)。
  2. 类型/合约:大写字母开头(如 MyContractAddress)。
  3. 函数:小写字母开头,动词优先(如 transferFunds())。

二、基础数据类型

类型描述示例
bool布尔值,仅取值 truefalsebool 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() 调用)对外接口

image.png

五、转账函数

方法特性示例
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只读临时存储(外部函数参数)外部调用参数优化
stackEVM 栈存储(深度限制 1024)操作中间结果

七、数据结构

  1. 结构体(Struct)
    自定义复合类型,类似类:

    struct User {
        string name;
        uint256 balance;
    }
    User public user = User("Alice", 100);
    
  2. 数组(Array)
    • 动态数组:uint[] public numbers;
    • 固定数组:uint[5] public fixedArray;

  3. 映射(Mapping)
    键值对存储,适合快速查询:

    mapping(address => uint) public balances;
    balances[msg.sender] = 100;
    

八、修改器(Modifier)

用于函数执行前的条件校验:

modifier onlyOwner() {
    require(msg.sender == owner, "Not owner");
    _; // 继续执行函数体
}
function withdraw() external onlyOwner {
    // 仅所有者可调用
}