资讯详情

资讯详情

WTF-Solidity 第 2 讲:Solidity 值类型全解析——bool、int/uint、address、定长字节数组与 enum

WTF-Solidity 第 2 讲Solidity 值类型全解析——bool、int/uint、address、定长字节数组与 enum【免费下载链接】WTF-SolidityWTF Solidity 极简入门教程供小白们使用。Now supports English! 官网: https://wtf.academy项目地址: https://gitcode.com/GitHub_Trending/wt/WTF-Solidity本教程对应 WTF-Solidity 入门系列第 2 讲英文版原文见 Languages/en/02_ValueTypes_en/readme.md系统讲解 Solidity 中最重要的基础类型——值类型Value Type。读完本文你将掌握Solidity 四大变量类型的分类逻辑、布尔型含短路求值、有符号/无符号整数及其运算符、普通地址与 payable 地址的区别、定长字节数组的存储细节以及枚举 enum 与 uint 的相互转换。所有知识点均配有可直接在 Remix 中编译运行的合约代码见 Languages/en/02_ValueTypes_en/ValueTypes.sol是一份面向零基础开发者、可照抄验证的实战指南。Solidity 中的变量类型总览在深入值类型之前先建立整体框架。Solidity 的变量类型可以划分为以下四类值类型Value Type包括布尔型、整数型等这类变量在赋值时直接传递数值对值进行拷贝引用类型Reference Type包括数组array和结构体struct这类变量占用的空间较大赋值时直接传递地址类似指针多个变量名可以同时指向同一份数据映射类型Mapping TypeSolidity 中存储键值对key-value的数据结构可以理解为哈希表函数类型Function TypeSolidity 官方文档将函数归入值类型但由于它的行为与普通值类型差异很大本教程将其单独列为一类。本章只介绍最常用的类型——值类型。引用类型与映射类型会在后续章节数组与结构体、映射、数据存储位置中详细展开。1. 布尔型bool布尔型是二值变量取值只能是true或false// 布尔值 bool public _bool true;布尔运算符布尔型支持的运算符包括运算符含义!逻辑非NOT逻辑与AND||逻辑或OR等于equality!不等于inequality对应的演示代码来自 Languages/en/02_ValueTypes_en/ValueTypes.sol 第 4-11 行// 布尔运算 bool public _bool1 !_bool; // 取非结果为 false bool public _bool2 _bool _bool1; // 与结果为 false bool public _bool3 _bool || _bool1; // 或结果为 true bool public _bool4 _bool _bool1; // 相等结果为 false bool public _bool5 _bool ! _bool1; // 不相等结果为 true以上代码中_bool的值为true_bool1是_bool的非为false_bool _bool1为false_bool || _bool1为true_bool _bool1为false_bool ! _bool1为true。你可以在 Remix 部署合约后逐一核对这 6 个公共变量的值。短路求值规则重要和||运算符遵循**短路求值short-circuit evaluation**规则对于表达式f(x) || g(y)如果f(x)已经是true则g(y)不会被计算对于表达式f(x) g(y)如果f(x)已经是false则g(y)不会被计算。也就是说当第一个条件已经能确定整个表达式的最终结果时第二个条件会被直接跳过。这在合约中常用于节省 Gas也常被用于防御性编程例如先检查地址是否合法再执行调用。2. 整数型int / uint整数是 Solidity 中使用频率最高的类型之一分为两类有符号整数int可以为负例如int public _int -1;无符号整数uint只能为非负例如uint public _uint 1;。此外Solidity 还支持按位数区分的变体uint8、uint16、uint32……一直到uint256位数必须是 8 的倍数int同理其中uint是uint256的别名int是int256的别名。最多可存储256 位的整数或数据单元。教程合约中使用了三者中最具代表性的组合// 整数 int public _int -1; // 整数包括负数 uint public _uint 1; // 无符号整数 uint256 public _number 20220330; // 256 位无符号整数整数运算符整数常用的运算符分为两组比较运算符返回布尔值、、、!、、算术运算符、-、*、/、%取余/取模、**幂// 整数运算 uint256 public _number1 _number 1; // 加、减、乘、除 uint256 public _number2 2**2; // 幂运算结果为 4 uint256 public _number3 7 % 2; // 取余结果为 1 bool public _numberbool _number2 _number3; // 比较大小结果为 true你可以在 Remix 中运行代码验证这 4 个变量_number1为20220331、_number2为4、_number3为1、_numberbool为true。两个值得注意的细节整数除法两个整数相除的结果仍为整数小数部分被截断向下取整溢出与下溢Solidity 0.8.x 及更高版本在编译层面内置了溢出/下溢检查算术越界会直接触发 revert无需再手动依赖 SafeMath。如果感兴趣可以在本仓库的 整数溢出安全专题 中了解其在安全攻防中的意义。3. 地址类型address地址类型用于保存以太坊账户地址共有两类普通地址address存储一个20 字节的值即以太坊地址的大小可支付地址address payable与普通address相同但额外拥有transfer和send两个成员方法可以接收转账并查询余额。// 地址 address public _address 0x7A58c0Be72BE218B41C608b7Fe7C5bB630736C71; address payable public _address1 payable(_address); // payable 地址可以转账、查余额 // 地址类型的成员 uint256 public balance _address1.balance; // 查询地址余额上例中先用一个以太坊地址初始化普通变量_address再通过payable(_address)显式转换得到可支付地址_address1随后通过_address1.balance成员读取该地址的余额。何时需要payable当你需要向某个地址发送 ETH 时必须使用address payable才能调用transfer/send方法普通address只能查看余额、发起调用不能直接转出 ETH。关于三种转账方式transfer/send/call的详细对比可参考后续章节 发送 ETH。4. 定长字节数组fixed-size byte array字节数组分为定长与不定长两种定长字节数组属于值类型长度在声明后不可改变。根据长度分为bytes1、bytes8、bytes32等类型最大为bytes32最多存储 32 字节数据不定长字节数组属于引用类型长度在声明后可以改变例如bytes、string。这类类型将在后续章节介绍。// 固定长度的字节数组 bytes32 public _byte32 MiniSolidity; bytes1 public _byte _byte32[0];底层存储细节在上述代码中字符串MiniSolidity以字节的形式存入_byte32。把它转换成十六进制就是0x4d696e69536f6c69646974790000000000000000000000000000000000000000这个结果可以这样拆解M i n i S o l i d i t y共 12 个字符对应的十六进制字节为4d 69 6e 69 53 6f 6c 69 64 69 74 79前 12 字节由于bytes32固定为 32 字节剩余 20 字节全部以0x00填充——这就是字符串右对齐、左侧高位补零在定长字节数组中的体现。而_byte取的是_byte32的第一个字节即0x4d对应字符M的 ASCII/十六进制编码。5. 枚举enum枚举是 Solidity 中用户自定义的数据类型主要用于为uint分配可读的名称让程序更易阅读和维护。它与 C 语言中的enum类似用名称替代从0开始计数的uint// 用 enum 将 uint 0、1、2 表示为 Buy、Hold、Sell enum ActionSet { Buy, Hold, Sell } // 创建 enum 变量 action ActionSet action ActionSet.Buy;上述代码中Buy对应0、Hold对应1、Sell对应2action的初始值即为ActionSet.Buy对应0。enum 与 uint 的相互转换枚举可以显式地与uint互相转换并且转换时会检查目标无符号整数是否落在枚举成员的范围内越界会直接报错// enum 可以和 uint 显式转换 function enumToUint() external view returns(uint){ return uint(action); }由于action的值为ActionSet.Buy调用enumToUint()将返回0。需要说明的是enum在 Solidity 中属于相对冷门的数据类型实际合约中并不常用但理解它有助于阅读涉及状态机如订单状态、流程阶段的合约代码。在 Remix 上运行验证本教程的全部代码都在同一个合约 Languages/en/02_ValueTypes_en/ValueTypes.sol 中仓库根目录的中文原版见 02_ValueTypes/ValueTypes.sol二者逻辑一致合约声明pragma solidity ^0.8.34与仓库根目录 foundry.toml 中统一配置的solc 0.8.34编译器版本相匹配。推荐的验证步骤如下打开 Remix新建一个文件并将合约代码粘贴进去切换到“编译Compile”面板确认编译器版本为 0.8.34 或更高满足^0.8.34的版本范围切换到“部署与运行Deploy Run Transactions”面板部署合约展开已部署的合约实例逐个点击公共变量查看取值。部署合约后可以查看每个变量的数值接着验证 enum 与 uint 的转换。action ActionSet.Buy时调用enumToUint()返回0将action改为ActionSet.Sell后再调用enumToUint()返回2总结本讲完成了 Solidity 值类型的入门从四类变量类型值类型、引用类型、映射类型、函数类型的整体框架出发详细介绍了值类型中的五个常用成员——布尔型bool含短路求值、整数型int/uint/uint256及其运算符、地址address与address payable及balance成员、定长字节数组bytes1~bytes32的存储与十六进制表示和枚举enum与uint的显式转换。下一讲我们将学习 Solidity 中的函数可见性、view/pure、payable等可提前阅读 函数篇对变量默认值感兴趣的读者可直接跳到 默认值篇 了解各类型未初始化时的取值。全套英文教程目录见 Languages/en/README.md。【免费下载链接】WTF-SolidityWTF Solidity 极简入门教程供小白们使用。Now supports English! 官网: https://wtf.academy项目地址: https://gitcode.com/GitHub_Trending/wt/WTF-Solidity创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →