Solidity基础一

如果快乐太难,那就祝你腰缠万贯

目录

一、Solidity 的 SPDX许可证

二、Solidity版本声明

三、Solidity合约声明

四、Solidity的注释

五、Solidity的数据类型

1.值类型

2.引用类型---后面详细讲

六、Solidity的变量

1.变量的基本概念和操作

2.变量的默认值

3.Solidity 变量作用域 

七、Solidity的常量

八、Solidity的标识符

九、Solidity的关键字

十、Solidity的运算符

1.算术运算符

2.关系运算符

3.逻辑运算符

4.赋值运算符

5.三元运算符

6.位运算符


一、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开头

地址类型的属性:

  1. balance :可以使用 balance 属性来查询该地址的余额
  2. transfer():可以使用 transfer 函数向该发送以太币 (以 wei 为单位)

 实际上地址类型有两种形式,他们大致相同

  1. address:保存一个20字节的值(以太坊地址的大小)。
  2. 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

//不管是左移还是右移前提要先平均拆分

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值