如果快乐太难,那就祝你腰缠万贯
目录
一、Solidity 的 SPDX许可证
Solidity ^0.6.8 以上版本引入了 SPDX 许可证,如果源码中未包含 SPDX 许可证说明,编译时会出现警告:
Warning: SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing "SPDX-License-Identifier: <SPDX-License>" to each source file. Use "SPDX-License-Identifier: UNLICENSED" for non-open-source code. Please see https://spdx.org for more information.一般是在.sol文件第一行加上:
// SPDX-License-Identifier: MIT不过这行到底是做什么的呢?
答: SPDX-License-Identifier 是用来声明版权的注释。
SPDX-License-Identifier 就是在指明智能合约采用什么样的对外开放标准,该标准规定了别人是否拥有商业开发,学习使用等权利。
MIT 规定了任何人都可以随便用该代码,但出了问题不负责。
SPDX 是一个组织名,官方网站为:SPDX 许可证列表 |软件包数据交换 (SPDX)。
SPDX-License-Identifier 组合起来就是在指SPDX的许可证列表。
后面的格式为 : SPDX的许可证列表中的某个许可证,比如:MIT、SimPL-3.0 等。
二、Solidity版本声明
用于声明Solidity的版本
关键字:
pragma solidity 版本号
solidity程序版本声明
- ^ 只适用于该版本
- > >= 大于,大于等于该版本
- < <= 小于,小于等于该版本
- >版本1<版本2 在版本1到版本2范围内
例如:
pragma solidity ^0.8.0
采用8.0版本
三、Solidity合约声明
用于声明一个合约
语法:
contract 合约名 { 合约体 }
合约名采用首字母大写的驼峰命名法命名
四、Solidity的注释
- 单行注释://
- 多行注释:/* */
五、Solidity的数据类型
在用任何语言编写程序时,都需要使用变量来存储各种信息。
变量是内存空间的名称,变量有不同类型,例如整型、字符串类型等等。
为了区分不同数据、数据管理方便、数据分类管理,因此引出了数据类型
Solidity中,变量类型有以下几大类:
- 值类型:以下类型也称为值类型,因为这些类型的变量将始终按值来传递。 也就是说,当这些变量被用作函数参数或者用在赋值语句中时,总会进行值拷贝。
- 引用类型:引用类型可以通过多个不同的名称修改它的值,而值类型的变量,每次都有独立的副本。因此,必须比值类型更谨慎地处理引用类型。 目前,引用类型包括结构体,数组和映射,如果使用引用类型,则必须明确指明数据存储哪种类型的位置(空间)里
1.值类型
整型
- 有符号整型 int8 to int256
- 无符号整型 uint8 to uint256
后面加数字代表位,以8位起步,256为结尾,中间为8的倍数:8、16、32、64、····、256
注意事项:超过长度会报错 ,不写后面的数字,则默认为256长度
位是计算机内最小的存储单位,用于存储二进制数0和1
布尔型
- bool
布尔值分为 true 和 false
定长浮点型(长度不可变的浮点数)
- 定长有符号定长浮点型 fixed
- 定长无符号定长浮点型 ufixed
Solidity 还没有完全支持定长浮点型。可以声明定长浮点型的变量,但不能给它们赋值或把它们赋值给其他变量。。
定长字节数组(长度不可变的字节数组)
- bytes1 to bytes32
后面加数字代表字节,以1个字节起步,32字节为结尾,中间加1:1、2、3、····、32
注意:超过长度会报错 ,不写后面的数字,则默认为32长度,一个汉字等于3个字节
因为 : 一个字节=8位 所以bytes以1开头32结尾相当于位8开头256结尾
定长字节数组的赋值:
- 以16进制数为单位(0x开头),两个16进制数等于一个字节(数字0-9,字母a-f/A-F,大写会自动转换成小写)
例如:bytes1 example = 0x2b; bytes2 example2 = 0xA2BB;
- 单引号引起来的单个或多个字符(一个字符等于一个字节、一个汉字等于3个字节)(字母、数字、汉字)
例如:bytes1 example = 'a'; bytes2 example2 = 'a2' ;bytes3 example3 = unicode'汉';
定长字节数组的属性
length:表示字节数组的长度(只读,不允许修改)。若类型为 byte则返回1
在 0.8.0 之前
byte
用作为bytes1
的别名:byte(字符)=bytes1
定长字节数组的查询
可以用下标来访问里面的数据,下标从0开始 依次整数递增0、1、2、3、4、······
bytes1 a = 'a';
bytes2 b = 'ab';
//上面两个作为字符(byte)传入字节
bytes1 c = 0x32;
bytes2 d = 0x7a68;
//上面两个作为16进制数字节转入节字
function aa() public returns(uint,bytes1) {
return (c.length,c[0]);
}
地址类型
- address
地址类型表示以太坊地址,一般长度为20字节。地址值以0x开头
地址类型的属性:
balance
:可以使用 balance 属性来查询该地址的余额transfer():
可以使用 transfer 函数向该发送以太币 (以 wei 为单位)实际上地址类型有两种形式,他们大致相同
address
:保存一个20字节的值(以太坊地址的大小)。address payable
:可支付地址,与address
相同,不过有成员数transfer()
和send()
两种地址的区别
这种区别背后的思想是
address payable
可以向其发送以太币,而不能向一个普通的address
发送以太币,例如,它可能是一个普通类型的智能合约地址,或者定义的普通地址总之:只要涉及到转账操作,都将其转为payable类型的地址
转换格式:
payable(地址)
payable(0x7EF2e0048f5bAeDe046f6BF797943daF4ED8CB47)
或者定义一个payable类型的地址
定义格式:
address payable 变量名;
枚举类型
- enum
详细看后面文章
函数类型
- function
详细看后面文章
2.引用类型---详细看后面文章
数组
- 普通定长[]、变长数组[]
- 变长字节数组bytes
- 字符串string
结构体
- struct
映射
- mapping
六、Solidity的变量
1.变量的基本概念和操作
变量的概念
- 内存中的一块存储区域
- 即在内存开辟一块空间,用于存储数据
- 为此空间定义一个名称:变量
- 为了区分不同的变量,我们引出了变量名
Solidity 支持三种类型的变量:
- 状态变量 – 变量值永久保存在智能合约存储空间中的变量。
- 局部变量 – 变量值仅在函数执行过程中有效的变量,函数退出后,变量无效。
- 全局变量 – 保存在全局命名空间,用于获取整个区块链相关信息的特殊变量,与当前合约无关,比如:时间戳、块高等。
变量定义格式:
变量数据类型 变量修饰符 变量名
变量赋值格式:
变量名 = 值
2.变量的默认值
Solidity 智能合约中所有的状态变量和局部变量,都有默认值。
这些变量在没有被赋值之前,它的值已默认值的形式存在。
其中:
- bool 类型变量默认值为 false;
- int 类型变量默认值为 0;
- uint 类型变量默认值为 0;
- address 类型变量默认值为:0x0000000000000000000000000000000000000000,共 40个 0;
- bytes32 类型变量默认值为:0x0000000000000000000000000000000000000000000000000000000000000000,共 64个 0。
3.Solidity 变量作用域
局部变量的作用域仅限于定义它们的函数
但是状态变量可以有四种作用域类型:
- public – 公共状态变量可以在内部访问,也可以从外部访问。对于公共状态变量,将自动生成一个 getter 函数。
- private – 私有状态变量只能从当前合约内部访问,派生合约内不能访问。
- internal – 内部状态变量只能从当前合约或其派生合约内访问。
七、Solidity的常量
关键字
constant
定义格式
数据类型 constant 常量名 = 常量值
constant 修饰的变量需要在编译期确定值, 链上不会为这个变量分配存储空间, 它会在编译时用具体的值替代, 因此, constant 常量是不支持使用运行时状态赋值的(例如:
block.number
,now
,msg.sender
等 )
温馨提示:constant 目前仅支持修饰 strings 及 值类型。
八、Solidity的标识符
标识符,也就是名字
标识符的命名规范
1.变量、常量: 驼峰命名法、下划线命名法
2.合约、函数:首字母大写的驼峰命名法、下划线命名法
要求:见名知意、多个单词组成时,区分大小写
注意事项:标识符只能是 数字、字母、_ 、$ 构成 且 不能以数字开头
九、Solidity的关键字
Solidity的关键字是Solidity语言的基本语法
不能用关键字来作为标识符
十、Solidity的运算符
1.算术运算符
+ - * / % ++ -- **取次幂 : a**2 :a的2次幂
2.关系运算符
< > <= >= == !=
3.逻辑运算符
&& 且 || 或 !非
4.赋值运算符
= += -= *= /= %=
5.三元运算符(条件运算符,条件表达式)
判断 ? t : f
6.位运算符
// & 与: 如果对应位都是1,则结果为1,否则为0 格式(A&B)
uint a=2; //0010
uint b=3; //0011
uint c=a&b; //0010 =2
// | 或: 如果对应位都是0,则结果为0,否则为1 格式(A|B)
uint d=2; //0010
uint e=3; //0011
uint f=d|e; //0011 =3
// ^ 异或: 如果对应位相同,则结果为0,否则为1 格式(A^B)
uint g=2; //0010
uint h=3; //0011
uint i=g^h; //0001 = 1
// ~ 位补: 翻转操作,0变成1,1变成0 格式(~A) (~B)
uint aa=2; //0010
uint bb=3; //0011
uint cc=~aa; //1101
uint dd=~bb; //1100
// << 左移: 按照右边的位往左边移动指定位数,后面用0补上 格式(A<<指定位数)
uint aaa=2; //00001010
uint ccc=aaa<<2; //00101000
// >> 右移: 按照左边的位往右边移动指定位数,前面用0补上 格式(A>>指定位数)
uint ccccc=aa>>2; //00000010
//不管是左移还是右移前提要先平均拆分
区块链开发语言智能合约
来自专栏
智能合约
尽欢i 14篇文章 12人订阅
AI必读
发布于2023-05-18著作权归作者所有