Solidity基础入门—web3

Remix介绍

官网地址

Remix 是一个基于浏览器的 Solidity 开发环境,主要用于编写、测试、调试和部署以太坊智能合约。

Solidity基本数据类型

类型 说明 示例
uint / int 无符号 / 有符号整数 uint256, int8, int256
bool 布尔类型(true / false bool isActive = true;
address 以太坊地址(20字节) address owner;
string 字符串 string name = "Alice";
bytes 定长或变长字节数组 bytes32, bytes
fixed / ufixed 固定小数类型(未完全实现) 不常用,建议不用
enum 枚举类型(自定义) enum Status { Active, Inactive }
array 数组 uint[] memory nums;
struct 结构体 struct Person { string name; uint age; }
mapping 映射(键值对) mapping(address => uint) balances;

1. 整数类型 uint / int

  • uint 是无符号整数(不能为负)
  • int 是有符号整数
  • 支持从 8256(每 8 位递增)
solidity 复制代码
uint256 a = 100;
int8 b = -20;

2.布尔类型 bool

复制代码
bool isOpen = true;

3.地址类型 address

用于存储以太坊地址(例如钱包地址、合约地址)

复制代码
address owner = msg.sender;

还可以加上 payable 使其可接收 ETH:

  • msg.sender 默认是 address 类型,不能直接收 ETH。

  • 必须用 payable(...) 转换为 payable address,才可以用 .transfer() 接受或 .send() 发送 ETH

    payable(msg.sender).transfer(1 ether);

4.字符串 string

复制代码
string memory name = "Alice";=

📌 注意:字符串不能直接比较是否相等,需要用 keccak256 哈希后比对。

5.字节数组 bytes

  • bytes 是动态字节数组

  • bytes1 ~ bytes32 是定长字节数组

    bytes32 hash = keccak256(abi.encodePacked("hello"));

  • abi.encodePacked(...):将参数打包成二进制格式

  • keccak256(...):对打包后的数据进行哈希

👉 结果是一个 bytes32 类型的哈希值

6.枚举 enum

复制代码
enum Status { Active, Inactive, Pending }
Status public currentStatus;

// 设置状态为 Pending
function setPending() public {
	currentStatus = Status.Pending;
}

7.结构体 struct

复制代码
struct Person {
    string name;
    uint age;
}

8. 映射 mapping

复制代码
mapping(address => uint256) public balances;

Solidity 中的数据存储位置

Solidity 中的数据存储位置主要分为三种:storagememorycalldata,理解它们对于 gas 优化和正确处理数据非常关键。


🧠 存储类型(关键字)

用于修饰数组(array),结构(struct),字符串(string),字节(bytes),映射(mapping仅storage支持)

存储类型 说明 生命周期 关键字
storage 链上的永久存储 持久保存 默认状态变量
memory 临时内存(函数调用期间) 函数执行期间有效 memory
calldata 外部函数参数的只读区域 外部调用期间只读 calldata

🔸 1. storage(链上存储)

  • 数据保存在区块链上,是持久化的
  • 用于合约中的状态变量或引用链上已有变量进行修改
solidity 复制代码
string public myName = "Alice"; // 状态变量 -> 存储在 storage 中

struct Person {
    string name;
    uint age;
}

Person[] public people;

function updatePerson(uint index) public {
    Person storage person = people[index]; // 引用链上的 person
    person.age = 30; // 改变的是链上的数据
}

🔸 2. memory(临时内存)

  • 只在函数调用期间有效

  • 常用于函数内部的临时数据或函数参数

  • 可读写,但函数执行完就被销毁

    function getUpper(string memory _name) public pure returns (string memory) {
    return _name;
    }

🔸 3. calldata(只读外部输入)

  • 用于 external 函数参数

  • 只读不可修改

  • 相比 memory 更省 gas

    function sayHello(string calldata _name) external pure returns (string memory) {
    return _name;
    }

相关推荐
fuzamei88814 小时前
肖风:区块链正在重构数字时代的财富新形式
重构·区块链
刘一说14 小时前
2026年区块链技术在农业果园领域的应用:技术革新与产业升级
区块链
Rockbean19 小时前
3分钟Solidity: 9.3 通过 Create2 预计算合约地址
web3·智能合约·solidity
学术小白人1 天前
【EI会议征稿通知】2026年智能感知与自主控制国际学术会议(IPAC 2026)
人工智能·物联网·数据分析·区块链·能源
DICOM医学影像2 天前
15. Go-Ethereum测试Solidity ERC20合约 - Go-Ethereum调用合约方法
开发语言·后端·golang·区块链·智能合约·以太坊·web3.0
选择不变2 天前
跟庄高抛低吸分时副图指标操作技术教程-操盘训练营学员学习
区块链·通达信指标公式·短线指标·炒股指标·翻倍密码系统
Sui_Network2 天前
Sui 2025→2026 直播回顾中文版
大数据·前端·人工智能·深度学习·区块链
quant_19862 天前
外汇期货实时行情 API 使用教程
经验分享·后端·websocket·程序人生·金融·区块链
MicroTech20252 天前
微算法科技(NASDAQ :MLGO)构建量子安全区块链架构,增强后量子数据安全性技术介绍
科技·安全·区块链
Rockbean2 天前
3分钟Solidity: 8.6 ERC721(NFT)
web3·智能合约·solidity