Solidity 数据类型

2025年5月27日 | 6分钟阅读

DeFi 的运作在很大程度上依赖于智能合约。尽管 Rust 和 Yul 等各种语言已被广泛使用,但 Solidity 已成为智能合约的首选语言。

Solidity 是由 以太坊网络 开发的面向对象的、高级语言,用于生成 DApps 和智能合约。由于 Solidity 支持库、函数、全局变量和继承,它已成为每个 Web 3.0 开发人员的必备工具。

由于它是一种静态类型编程语言,程序员必须在编译期间为每个变量指定规范。本教程将详细介绍各种 Solidity 数据类型,以及初学者应该理解的几个关键主题。

各种 Solidity 数据类型

1) 值类 Solidity

值类型数据直接在内存中存储信息。这允许在赋值或函数中进行复制,因为这些值类型随后与变量关联。即使值类型数据被复制,它们也可以为每个复制的变量保留单独的副本。

这意味着,即使修改了复制变量的值,也不会影响原始变量。以下是 Solidity 中常见值类型的列表。

1. 地址

address 值类型旨在匹配以太坊地址的大小,并用于存储容量高达 20 或 160 字节。 “Address”和“address Payable”是地址数据的两个不同类别。除了“address payable”可用于促进 Ether 的转账外,它们的功能基本相同。

2. 枚举

在 Solidity 中,基本值类型称为 enums,它是 enumerators 的缩写。这种数据类型定义了常量值,并使智能合约更易于阅读和维护。

Enum 默认是为了用户方便而设计的,智能合约中的 DApp 无法识别这种数据。程序员现在有责任为 Enum 常量分配一个整数值。

3. 布尔值

Solidity 包含一种称为布尔值的语言类型,主要用于具有二元结果的数据类型。任何“bool”数据类型都有两个固定值:True 或 False,以及 Yes 或 No。Solidity 中的布尔值默认值为 false。Solidity 支持所有广泛使用的布尔逻辑。但是,该语言不允许将布尔数据类型转换为数字。

4. 带符号数值数据

在智能合约中,带符号整数用于存储正值和负值。它们通常使用“int”关键字声明。它是“int256”的缩写,默认最多需要 32 字节的存储空间。如果您决定减少字节存储,您可以指定每个整数应占用的位数(int64、int8 等)。您必须将总位数分成 8 位一组!

5. 无符号数值数据

在 Solidity 中,非负值存储为无符号整数(0 及以上)。无符号整数,使用“uint”关键字声明,默认也需要高达 32 字节的存储空间。与带符号整数类似,无符号整数可以通过指定它们允许的位数(以 8 位为增量)来确定其存储容量。

6. 字节

Byte 数据类型表示 8 位带符号整数。使用 Byte 值类型可以更轻松地存储二进制值(1 和 0)。byte 类型的默认值为 0x00。

2) 引用类型 Solidity

引用类型值不直接存储值,而是通过引用数据的存储位置的地址来存储值,而不实际共享它。数据的位置显著影响每次交易使用的汽油量。当数据位置没有得到正确优化时,智能合约的性能会受到不利影响。

Solidity 特别使用引用类型;每个引用变量将用户导向值数据类型的存储位置。两个不同的变量可以引用同一个存储位置,而不会相互影响。以下是一些知名的引用数据类型示例。

1. 数组

Solidity 中最重要的类型之一是数组。数组是变量的集合,每个变量都有自己的索引。这个特殊的索引有助于定位和检索特定的变量。数组是固定大小还是动态大小取决于其大小。

通过存储多种数据类型,数组使各种过程更加简单。借助独特的索引位置,可以检索已请求的特定变量。

2. 数组成员

通常,数组成员根据长度定义,长度也指定了单个数组中可以有多少个元素。为了能够调整动态大小数组的大小,您可以使用数组成员来设置长度。

Array Members 的两个主要功能是“Push”和“Pop”。当 pop 操作从动态数组的最后一个位置取出一个元素时,push 任务通常使用动态数组的成员将一个元素添加到最后一个位置。

3. 内存数组

一种特殊的动态大小数组,用于将一组字节保存在一起,称为字节数组。字节数组和字节值类型不同。字节值类型以二进制表示形式存储有符号整数,而字节数组存储这些字节用于各种目的。

4. 字符串数组

在 Solidity 中,具有特殊约束的动态数组称为字符串数组。单个或双引号通常会包围字符串数组中的字符。

5. 结构体

使用 Struct,您可以将多个值类型和引用类型变量组合到一个预定义的结构中,以创建您自定义的数据类型。

6. 映射

Mapping 是 Solidity 计算机语言中最常用的数据类型,类似于其他语言中的 hashable。它以键值对的形式存储信息,以便您可以通过提供键来获取值。

每个 Solidity 初学者都应该了解的事情

1. 语法及其基础

Solidity 的语法更类似于 C++CC#Java,尽管它借鉴了 PythonJavaScript 的灵感。尽管它是一种花括号语言,但它没有任何手动内存管理或其他 C++ 或 C# 所闻名的复杂性。

Super 关键字、修饰符和多重继承只是 Python 影响力的几个方面。

2. 控制结构和表达式 与其他花括号语言一样,Solidity 与 C 和 C++ 共享许多表达式和控制结构。它是一种经常使用 if、else、for、break 和 return 运算符的编程语言。

3. 面向对象语言 Solidity 是一种面向对象的编程语言,类似于 Python、C++ 和 Java。它的基础是类。

4. 继承 (Inheritance)

面向对象编程语言的一个基本特征是继承,Solidity 支持这一点。通过继承,一个人可以通过在另一个基类之上构建自定义类来增加基类的功能。

5. Solidity 程序在以太坊虚拟机 (EVM) 上执行

Solidity 在 以太坊虚拟机 (EVM) 上运行,就像 Python 在 PVM 上运行一样。由于它们不编译为二进制代码,像 Solidity 这样的高级编程语言不能直接在 CPU 上执行。

6. Solidity 是静态类型

由于 Solidity 缺少通用类型变量,因此每个变量都需要专门定义。值类型和引用类型是数据的两个基本类别,我们已经在前面进行了详细介绍。在 Solidity 中,没有 null 值。每个新创建的变量都会有一个默认值,该默认值因数据类型而异。

7. 库

库中有多个函数可以在以后调用。将它们视为主要用于重用的预写合约。以下是库的一些关键属性

  • 如果状态未更改,则无法立即调用库。
  • 假定库是无状态的。
  • 库不允许使用状态变量。
  • 不能通过库继承元素。
  • 无法继承库
  • 全局函数和变量

基本变量和函数作为全局暴露,而不是存储在标准库中。您将遇到的最常见的全局变量包括有关区块链、数学运算、编码、解码等方面的信息。

结论

Solidity 已成为以太坊区块链智能合约开发的首选语言。尽管 Yul、Rust 甚至 Javascript 等竞争语言越来越受欢迎,Solidity 仍然是创建智能合约最广泛使用的语言之一。

Solidity 因多种原因成为 Web 3.0 开发者的首选,包括其极大的灵活性、Solidity 数据类型的多样性以及对库和其他全局功能的访问。