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

相关推荐
麦兜*14 小时前
Redis在Web3中的应用探索:作为链下状态缓存与索引层
java·spring boot·redis·spring cloud·缓存·docker·web3
leijiwen1 天前
什么是 Web3 品牌?S11e Protocol 如何构建下一代加密原生数字品牌
web3·生活·品牌
苹果二1 天前
可信数据空间的分布式数字凭证和分布式数字身份
区块链·可信数据空间·分布式数字身份·分布式数字凭证
Wilson Chen2 天前
区块链与以太坊基础:环境搭建与智能合约部署
区块链·智能合约
许强0xq2 天前
Q6: 如何计算以太坊交易的美元成本?
面试·web3·区块链·智能合约·dapp
mit6.8242 天前
[AI tradingOS] AI决策引擎 | decision/engine.go | 交易哲学prompts
人工智能·区块链
Chef_Chen2 天前
数据科学每日总结--Day20--区块链
区块链
mit6.8242 天前
[AI tradingOS] 市场数据系统 | 多交易所交易接口 | 适配器模式
人工智能·区块链
dingzd952 天前
跨平台账号矩阵高效协同术
线性代数·矩阵·web3·facebook·tiktok·instagram·clonbrowser
Less^_^2 天前
DeFi 协议分析:Hyperliquid 一个去中心化的永续合约交易平台
web3·去中心化·区块链·defi