上一篇文章我们简单的介绍了一个完整的Solidity文件的结构。接下来该学什么了?变量类型!没错!就是变量类型,相信大家C/C++、Java、Python总接触过一门吧。solidity的变量类型跟之前学的可能不太一样,静静看。话不多说,直接开始!


文章目录

  • 1.值类型
  • 1.1 整型
  • 1.2 布尔
  • 1.3 地址
  • 1.4 定长字节数组
  • 1.5 有理数和整型字面量
  • 1.6 枚举类型
  • 1.7 函数
  • 2 引用类型
  • 2.1 不定长字节数组
  • 2.2 字符串
  • 2.3 数组
  • 2.4 结构体
  • 3.字典


1.值类型

1.1 整型

  • 整型包括有符号整型(int)和无符号整型(uint),例如int8、int16、int24、···、int8n (1<=n<=32);uint8、uint16、uint24、···、uint8n (1<=n<=32)
    unit和int的别名分别为unit256,int256
  • 小数由"."组成,左边或者右边至少包含一个数字,如1.,.1 1.3均为有效的小数

1.2 布尔

布尔(bool)变量的值为true或false。

1.3 地址

address的长度为20字节,160位,所以可以用unit160编码

1.4 定长字节数组

固定大小的数组bytesn,n的取值范围是1~32,byte等同于bytes1.

bytes1 aa = 0*35;
bytes2 bb = 10;
bytes3 cc = -1;
bytes4 dd = 259;

1.5 有理数和整型字面量

  • 整型字面量,如1,10,-1,-100.
  • 字符字面量,如“test” 字符字面量可以用单引号,也可以用双引号
  • 地址字面量
  • 十六进制字面量

1.6 枚举类型

枚举类型(Enums)是Solidity的一种用户自定义类型,可以显式的与整数进行转换,但不能进行隐式转换
我们看下列示例:

pragma solidity ^0.8.0;

contract Seasons {
    enum Season {SPRING, SUMMER, FALL, WINTER}
    Season public currentSeason;
    
    constructor() {
        currentSeason = Season.SPRING;
    }
    
    function setSeason(Season _season) public {
        currentSeason = _season;
    }
}

1.7 函数

函数类型是函数这种特殊的类型,可以将一个函数赋值给一个变量,还可以将一个函数作为参数进行传递,也可以在函数调用中返回一个函数。
函数分为两个类型:

  • 内部函数:内部函数只能在当前合约内被使用,不能在当前合约的上下文环境以外的地方执行,如在当前的代码块内包括内部库函数和继承的函数,默认的函数类型就是internal
  • 外部函数:外部函数由地址和函数方法签名两部分组成,可作为外部函数调用的函数,或者由外部函数调用返回。

2 引用类型

2.1 不定长字节数组

不定长字节数组bytes是一个动态数组,能够容纳任意长度的字节
要在Solidity中声明动态字节数组,可以使用“字节”类型。此类型允许您创建任意长度的字节数组。下面是一个例子:

bytes memory myBytes = new bytes(10);

在这个例子中,我们创建了一个名为“myBytes”的字节数组,长度为10。您可以将“10”替换为任何整数值,以创建所需长度的字节数组。

如果要为字节数组赋值,可以使用以下语法:

myBytes = "hello world";

这将把字符串“helloworld”分配给字节数组。请注意,字节数组的长度将自动调整,以适应指定值的长度。

2.2 字符串

要在Solidity中使用字符串,您可以简单地用字符串类型声明一个变量。例如:

string myString = "Hello, world!";

也可以使用+连接字符串
如:

string greeting = "Hello, ";
string name = "Alice";
string message = greeting + name; // "Hello, Alice"

我们需要注意的是:Solidity中的字符串是UTF-8编码的,最大长度为2^256-1字节。

2.3 数组

固定大小数组的长度在声明时确定,以后不能更改。它们是使用以下语法声明的:

uint[5] myArray;

这将创建一个由5个无符号整数组成的数组。您可以使用索引表示法访问和修改数组的各个元素,如下所示:

myArray[0] = 10;
uint x = myArray[1];

另一方面,动态数组的长度可以在运行时确定。它们是使用以下语法声明的:

uint[] myArray;

可以使用push方法将元素添加到数组中,如下所示:

myArray.push(10);
myArray.push(20);

也可以使用索引表示法访问和修改数组的各个元素,就像使用固定大小的数组一样。

2.4 结构体

struct被用来实现用户定义的数据类型,结构是一个组合数据类型,包含多个不同数据类型的变量,仅由变量过程
如:

struct User{
		address addr;
		unit amount;
	}

3.字典

在 Solidity 编程语言中,字典是一种非常有用的数据结构。字典是一种映射类型,可以将一个键(key)映射到一个值(value)。它类似于其他编程语言中的哈希表、关联数组或映射,可以用于存储和查找数据。
在 Solidity 中,我们可以使用以下两种方式来定义字典:

  1. 使用 mapping 类型, mapping 是 Solidity 中的一种内置类型,它可以将一个键映射到一个值。例如,我们可以创建一个名为 balances 的 mapping,用于存储地址余额信息:
mapping (address => uint256) public balances;

这个 mapping 将一个地址映射到一个 uint256 类型的无符号整数,表示该地址的余额。我们可以使用以下代码来添加新的地址及其余额:

balances[0x1234567890123456789012345678901234567890] = 1000;

这条语句将地址 0x1234567890123456789012345678901234567890 的余额设置为 1000。

  1. 使用关键字显式创建字典 除了使用 mapping 类型外,我们还可以使用关键字(如 struct、enum、contract 等)来显式地定义一个字典。例如,我们可以通过以下代码创建一个名为 Person 的结构体,并包含一个字典 addresses,用于存储一个人的地址信息:
struct Person {
    string name;
    mapping (string => string) addresses;
}

这个 Person 结构体包含一个名为 name 的字符串类型成员和一个名为 addresses 的 mapping,将一个字符串类型的键映射到一个字符串类型的值,表示该人的地址信息。我们可以使用以下代码来添加新的地址及其信息:

Person p = Person("Alice");
p.addresses["home"] = "123 Main St.";
p.addresses["work"] = "456 Park Ave.";

这些语句将 Alice 的 home 地址设置为 “123 Main St.”,将 work 地址设置为 “456 Park Ave.”。

除了添加和查找操作外,字典还支持更新和删除操作。例如,我们可以使用以下代码将已有的地址余额更新为新的值:

balances[0x1234567890123456789012345678901234567890] = 2000;

删除字典中的元素也很简单。我们可以使用 delete 关键字来删除一个键的值,例如:

delete balances[0x1234567890123456789012345678901234567890];

这条语句将删除地址 0x1234567890123456789012345678901234567890 的余额信息。

总之,字典是 Solidity 中非常有用的一种数据结构,可以帮助我们存储和查找大量数据。无论是在编写智能合约还是在开发其他类型的 Solidity 应用程序,字典都是必不可少的工具之一。