【Solidity】类型

news/2024/9/22 13:06:39/

Value Type

Value Type (值类型) 的变量在赋值或作为函数参数传递时,会复制其数据的值。

  1. 布尔类型
contract Demo {bool public isActive; // 默认为 false
}

布尔值可以进行以下运算:

  • 逻辑运算:! (逻辑非)、&& (逻辑与)、|| (逻辑或)

  • 比较运算:== (等于)、!= (不等于)

其中,&&|| 是短路运算符,即如果第一个操作数已经能够确定整个表达式的值,则不会再计算第二个操作数。

  1. 整数类型
  • 无符号整数类型:uint8uint16、…、uint256 (uint256 可简写为 uint)

  • 有符号整数类型:int8int16、…、int256 (int256可简写为 int)

contract Demo {// 有符号整数类型int public signedInt; // 默认为 0// 无符号整数类型uint public unsignedInt; // 默认为 0
}

可以直接通过 API 获取指定整数类型的最大最小值:

contract Demo {uint public maxUint = type(uint).max; // 2^256-1uint public minUint = type(uint).min; // 0int public maxInt = type(int).max; // 2^255-1int public minInt = type(int).min; // -2^255
}

整数值可以进行以下运算:

  • 算术运算:+ (加)、- (减)、* (乘)、/ (除)、% (取余)、** (幂)

  • 比较运算:== (等于)、!= (不等于)、< (小于)、> (大于)、<= (小于等于)、>= (大于等于)

  1. 地址类型
  • 普通 address 类型:20 字节大小,存储合约或账户的地址

  • address payable 类型:比 address 多了 transfersend 方法,用于发送/接收以太币

contract Demo {address public owner; // 默认为 0x0000000000000000000000000000000000000000, 即 address(0)
}
  1. 定长字节类型
  • bytes1bytes2、…、bytes32
contract Demo {bytes1 public dataHash1; // 默认为 0x00bytes2 public dataHash2; // 默认为 0x0000// 可以看出, 1 字节 (byte) - 8 位 (bit) - 2 个十六进制数// 因为 2^4 = 16, 即 1 个十六进制数可以表示 4 位二进制数
}
contract Demo {bytes32 public _byte32 = "MiniSolidity"; // 以字节形式存储 "MiniSolidity"// 0x4d696e69536f6c69646974790000000000000000000000000000000000000000bytes1 public _byte = _byte32[0]; // 取出第一个字节// 0x4d
}
  1. 枚举类型
  • 枚举的默认值是其定义的第一个值

  • 枚举值在内部表示为 uint8,从 0 开始递增

contract Demo {enum State {PENDING, // 0ACTIVE, // 1INACTIVE // 2}State public state; // 默认值为 PENDING, 即 0
}

枚举可以显式地和 uint 相互转换,且会检查转换的正整数是否在枚举的长度内,否则会报错:

contract Demo {enum State {PENDING, // 0ACTIVE, // 1INACTIVE // 2}State public state = State.ACTIVE; // 1uint public stateValue = uint(state); // 1State public newState = State(stateValue); // ACTIVE, 即 1
}



Reference Type

Reference Type (引用类型) 的变量在赋值或作为函数参数传递时,会复制存储数据的地址。

  1. 字符串类型
contract Demo {string public stringData; // 默认为空字符串 ""
}
  1. 动态字节类型
contract Demo {bytes public byteData; // 默认为 0x
}
  1. 数组类型
  • 固定大小数组类型:uint[5] 表示包含 5 个无符号整数的数组

  • 动态大小数组类型:uint[] 表示大小可变的无符号整数数组

contract Demo {// 固定大小数组类型uint[3] public fixedArray1; // 默认为 [0, 0, 0]// 动态大小数组类型uint[] public dynamicArray; // 默认为 []// 对于固定大小数组类型的变量, 还能如下创建uint[] public fixedArray2 = new uint[](3); // 默认为 [0, 0, 0]
}
  1. 结构体类型:用于将不同类型的数据组合在一起
contract Demo {struct Person {string name;uint age;}Person public person;// 数据的默认值为对应类型的默认值, 这里 name 默认为空字符串 "", age 默认为 0
}



Mapping Type

Mapping Type (映射类型) 是存储键值对的数据结构,可以理解为哈希表。

contract Demo {mapping(address => uint) public balances;// key-value 中, value 的默认值为对应类型的默认值, 这里为 uint 的默认值 0
}

需要注意:① 映射的 key 只能是 Solidity 内置的值类型,如 uint、address; ② 映射类型也属于引用类型的一种; ③ 映射的存储位置必需是 storage 。

原理: 映射使用 keccak256(abi.encodePacked(key, slot)) 当成 offset 存取 value,其中 slot 是映射变量定义所在的插槽位置。



Function Type

Function Type (函数类型) 是 Solidity 的一种特殊类型,用于存储函数的引用。

contract Demo {function add(uint a, uint b) public pure returns (uint) {return a + b;}
}




http://www.ppmy.cn/news/1523829.html

相关文章

华为 HCIP-Datacom H12-821 题库 (16)

有需要题库的可以加下方Q群 V群进行学习交流 1. OSPF 邻居关系建立出现故障&#xff0c;通过 display ospf error 命令来检查&#xff0c;输出结果如图所示&#xff0c;根据图中内容分析&#xff0c;邻居建立失败的原因可能是以下哪一项&#xff1f; A、Process ID 不一致 B、…

多维时序 | Matlab基于TCN-Transformer+LSTM双输入神经网络时间序列预测

多维时序 | Matlab基于TCN-TransformerLSTM双输入神经网络时间序列预测 目录 多维时序 | Matlab基于TCN-TransformerLSTM双输入神经网络时间序列预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab基于TCN-TransformerLSTM双输入神经网络时间序列预测&#xff…

智慧教室无纸化同屏方案是否适用RTMP?

智慧教室无纸化方案技术背景 智慧教室无纸化方案是一种基于现代信息技术&#xff0c;旨在通过数字化手段实现教学过程的无纸化、智能化和高效化的解决方案。该方案以学生为中心&#xff0c;强调互动化的数字教学服务&#xff0c;旨在提升教学质量和学习效率&#xff0c;同时减…

Java重修笔记 第五十二天 Junit

Junit 的使用 1. 为了方便程序员测试某一个方法而使用 2. 在方法上面加上 Test 并引用 5.X 版本 3. 就能在方法前面看到可运行的按钮 public class Homework07 {public static void main(String[] args) {}Testpublic void testList() {DAO<User> dao new DAO<&g…

掌握Hive函数[2]:从基础到高级应用

目录 高级聚合函数 多进一出 1. 普通聚合 count/sum... 2. collect_list 收集并形成list集合&#xff0c;结果不去重 3. collect_set 收集并形成set集合&#xff0c;结果去重 案例演示 1. 每个月的入职人数以及姓名 炸裂函数 概述 案例演示 1. 数据准备 1&#xff09;表…

静态代理和动态代理

目录 一、什么是代理模式 二、静态代理 1.定义 2.实现 三、动态代理 1 定义 2 实现 四、静态代理与动态代理 五、总结 一、什么是代理模式 代理模式是一种设计模式&#xff0c;它允许一个对象访问另外一个对象。代理对象通常通过包含真实对象的引用来控制对真实对象的…

Mysql基础练习题 1757.可回收且低脂的产品(力扣)

编写解决方案找出既是低脂又是可回收的产品编号。 题目链接&#xff1a; https://leetcode.cn/problems/recyclable-and-low-fat-products/description/ 建表插入数据&#xff1a; Create table If Not Exists Products (product_id int, low_fats ENUM(Y, N), recyclable …

hive表格统计信息不准确

问题描述 有个hive分区表&#xff0c;orc存储格式&#xff0c;有个分区&#xff0c;查询 select count(1) from table where dtyyyyMMdd 结果是0&#xff0c; 但查询 select * from table where dtyyyyMMdd又能查到数据&#xff0c;去hdfs对应目录下查看&#xff0c;也能看到有…