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;
    }

相关推荐
寻月隐君25 分钟前
Web3 开发实操:用 Anchor 在 Solana 创建代币 Mint Account
后端·web3·github
姜家志3 小时前
AI+去中心化=下一波生产力革命(1)
web3
穗余5 小时前
WEB3——什么是ABI
web3
Black_mario1 天前
解码 Skate:打造链间可组合应用栈,构建跨越虚拟机的无状态未来
区块链
阿雄不会写代码1 天前
长安链合约操作 查询合约命令解析
区块链
广州正荣2 天前
百度量子蜘蛛3.0横空出世,搜索引擎迎来“量子跃迁“级革命
深度学习·百度·区块链
巅峰赛2000分以下是巅峰2 天前
PortSwigger-03-点击劫持
web3
悦数图数据库2 天前
Web3 风控挑战重重,图数据库为何成为破局关键-悦数图数据库
数据库·web3
穗余2 天前
Web3怎么开发?什么是钱包地址和合约地址-代币系统展示
web3·区块链
穗余2 天前
WEB3—— 简易NFT铸造平台(ERC-721)-入门项目推荐
区块链