这是Web3.0学习的第二章Solidity基础,文内如出现知识性和理解性错误还请各位斧正,原创文章,完全开源,若能得转载不胜荣幸,推特会分享Coding学习,生活日常和NBA等内容。
Remix介绍
第一个智能合约
Solidity基础数据类型
Solidity是一门面向合约的,为实现智能合约而创建的高级编程语言,在EVM虚拟机上运行,语法整体类似于JavaScript,是目前最流行的智能合约语言,也是入门区块链与Web3所必须掌握的语言。
Solidity智能合约的开发往往无法直接通过一个IDE或本地环境进行方便的调试,而是需要与一个链上节点进行交互。
Welcome to Remix.
Solidity是一个更新频率很高的语言,和别的语言相比,它总会有新版本,我们需要告诉代码,要用哪个版本,我们通过"pragma solidity"加上要用的版本号,来约定版本号。记得在我们开发的时候,根据我们的需求加上注释。在代码中留下注释,这样在回顾的时候可以最快了解当时的想法。
//这样写表示只使用0.8.7这个版本
pragma solidity 0.8.7;//最新版0.8.17,0.8.7被认为是一个稳定的版本
//这样写也可以使用比0.8.7更新的版本
//<- This means that this section is a comment!
pragma solidity ^0.8.7;//这样表示任何比0.8.7更新的版本都适用这段代码
//这样写可以使用某个范围内的版本
pragma solidity >=0.8.7 <0.9.0;//这样表示版本大于等于0.8.7,但是要小于0.9.0
在代码的最上方,我们可以加入SPDX-License-Identifier,尽管这个是可选的,但是没有的话,有些编译器会出现警告,这段代码会定义license(软件许可证)和代码分享规则。添加一个SPDX许可证标识符。
软件许可是创建和提供应用程序、基础源代码或相关产品的实体与其最终用户之间的合同。该许可证是一个文本文档,旨在保护软件开发人员的知识产权,并限制因使用该许可证而可能产生的针对他们的任何索赔。
软件许可证还为软件的分发和使用提供了具有法律约束力的定义。最终用户的权利,如安装、保证和责任,也经常在软件许可中明确说明,包括对开发者知识产权的保护。
//SPDX-License-Identifier:MIT//MIT是限制最少的License之一,我们会在大多数的代码中使用MIT协议
接着输入”contract“,开始定义智能合约,这会告诉Solidity,接下来的会是智能合约。可以把它看作Java里面类似"class"的关键字。
//SPDX-License-Identifier:MIT
pragma solidity ^0.8.8;
contract SimpleStorage {
}
bytes:byte[]的缩写,分为固定大小数组和可变数组,通过byte1 a = 0xb5;来定义
变量通常是"0x"开头然后有一些随机的数字和字母
bytes32是最大的(32byte是bytes型变量被允许的分配的最多空间)。
boolean:布尔类型有true和false两种类型,可以通过bool public boo = true;来定义,默认值为false。
uint:定义无符号整数,表示这个数字只能是正数,uint比较特殊,我们可以决定给它分配的空间(其实就是有多少存储分配给了这个数字)
可以指定uint8,uint16,uint256,默认为uint256,通过uint8 public u8 = 1;来定义,默认值为0。
bits(位)和bytes(字节)是衡量计算机数据的单位,它是最小的数据形式,它基本上就像一个开关,它可以是0或1。16位=2个字节
uint8,就是分配了8个bit;这个数字可以一直分配到uint256,如果你不知道被赋值的数字多大,默认就是uint256,最小设置uint8(因为8bit是一个byte,我们按照byte为单位步长来增加空间)
通常把分配空间显式的写出来是一个好习惯。
int:整数类型,可以指定int8到int256,默认为int256,通过int public int = 0;来定义,默认值为0,还可以通过type(int).min和type(int).max来查看类型最小和最大值。
address:地址类型,可以通过address public addr = 0xCA35b7d915458EF540aDe2F44E8fa733c;来定义,默认值为0x000000000000000000。
表示地址,就像在MetaMask中看到的一样
string:代表一个词,可以通过双引号表达它们,它可以是一个词,一个短语或者任何其他组合。
string其实是一种bytes,但是只能存储文本
Enum是枚举类型,可以通过以下语法来定义
enum Status { UnKnown, Start, End, Pause }
并通过以下语法来进行更新与初始化
//实例化枚举类型 Status public status; //更新枚举值 function pause() { status = Status.Pause; } //初始化枚举值 function reset() public{ delete status; }
//SPDX-License-Identifier:MIT
pragma solidity ^0.8.8;
contract SimpleStorage {
bool hasFavoriteNumber = true;
uint256 favoriteNumber = 5;
string favoriteNumberInText = "Five";
int256 favoriteInt = -5;
address myAddress = 0x3563c97491114E4F87389446E7f48d77c9220789;
bytes32 favoriteBytes = "cat";//cat是一个string,但是可以自动转化为bytes
}
在Solidity中,如果我不给变量赋值,它会有一个默认值,默认值是null的值,在Solidity中是0,所以声明一个uint256变量但不赋值,就相当于声明变量然后赋值为0,因为它初始化的时候就是0.
我们通过这些基础数据类型,定义不同的变量,变量是用来存储不同的数值的