1.代码注释:
和c风格是一样的
2.数据类型:
- 值类型:
类型 | 关键字 | 取值 |
布尔型 | ㅤ | ㅤ |
有符号整型 | ㅤ | ㅤ |
无符号整形 | ㅤ | ㅤ |
有符号定长浮点型 | ㅤ | ㅤ |
无符号定长浮点型 | ㅤ | ㅤ |
- 地址类型:
地址类型表示以太坊地址,长度为20字节。
用
.balance
方法获得余额,也可以使用.transfer
方法将余额转到另一个地址。- 引用类型/复合数据类型:
- 数组 (字符串与bytes是特殊的数组,所以也是引用类型)
- struct (结构体)
- map (映射)
3.变量:
Solidity 支持三种类型的变量:
- 状态变量 – 变量值永久保存在合约存储空间中的变量。
- 局部变量 – 变量值仅在函数执行过程中有效的变量,函数退出后,变量无效。
- 全局变量 – 保存在全局命名空间,用于获取区块链相关信息的特殊变量。
attention:Solidity 是一种静态类型语言,这意味着需要在声明期间指定变量类型。每个变量声明时,都有一个基于其类型的默认值。没有
undefined
或null
的概念。状态变量和局部变量的区别:
全局变量说明:
这些是全局工作区中存在的特殊变量,提供有关区块链和交易属性的信息。
名称 | 返回 |
blockhash(uint blockNumber) returns (bytes32) | 给定区块的哈希值 – 只适用于256最近区块, 不包含当前区块。 |
block.coinbase (address payable) | 当前区块矿工的地址 |
block.difficulty (uint) | 当前区块的难度 |
block.gaslimit (uint) | 当前区块的gaslimit |
block.number (uint) | 当前区块的number |
block.timestamp (uint) | 当前区块的时间戳,为unix纪元以来的秒 |
gasleft() returns (uint256) | 剩余 gas |
msg.data (bytes calldata) | 完成 calldata |
msg.sender (address payable) | 消息发送者 (当前 caller) |
msg.sig (bytes4) | calldata的前四个字节 (function identifier) |
msg.value (uint) | 当前消息的wei值 |
now (uint) | 当前块的时间戳 |
tx.gasprice (uint) | 交易的gas价格 |
tx.origin (address payable) | 交易的发送方 |
4.变量作用域:
局部变量的作用域仅限于定义它们的函数,但是状态变量可以有三种作用域类型。
- Public – 公共状态变量可以在内部访问,也可以通过消息访问。对于公共状态变量,将生成一个自动getter函数。
- Internal – 内部状态变量只能从当前合约或其派生合约内访问。
- Private – 私有状态变量只能从当前合约内部访问,派生合约内不能访问。
5.运算符:
和c一毛一样
- 算术运算符:
+、-、*、/、%、++、--。
- 比较运算符:
==、!=、>、<、>=、<=。
- 逻辑运算符:
&&、||、!
- 位运算符:
&、|、^、~、<<、>>
- 赋值运算符:
=、-=.........
- 条件运算符:
? :
6.循环语句和条件判断:
和c也是一毛一样
7.字符串:
Solidity 中,字符串值使用双引号(“)和单引号(‘)包括,字符串类型用
string
表示。字符串是特殊的数组,是引用类型。Solidity提供字节与字符串之间的内置转换,可以将字符串赋给
byte32
类型变量。bytes到字符串的转换:
可以使用
string()
构造函数将bytes转换为字符串。示例
bytes到字符串的转换。
输出:
8.转义字符:
序号 | 转义字符 |
1 | \n开始新的一行 |
2 | \\反斜杠 |
3 | \’单引号 |
4 | \”双引号 |
5 | \b退格 |
6 | \f换页 |
7 | \r回车 |
8 | \t制表符 |
9 | \v垂直制表符 |
10 | \xNN表示十六进制值并插入适当的字节。 |
11 | \uNNNN表示Unicode值并插入UTF-8序列。 |
9.数组:
数组成员详解10.枚举:
枚举将一个变量的取值限制为几个预定义值中的一个。精确使用枚举类型有助于减少代码中的bug。
For Example:
考虑一个鲜榨果汁商店的应用程序,将玻璃杯的容量大小限制为:小、中、大。这将确保任何人不能购买其他容量的果汁。
将其部署到测试链。
首先单击 setLarge 按钮将值设置为 LARGE,然后单击 getChoice 获取所选的选项。
输出
单击 getDefaultChoice 按钮获得默认选项。
输出
11.结构体:
结构体和c是一样的:
定义结构体:
For Example:
一本书的信息:
- Title
- Author
- Subject
- Book ID
定义结构体,使用结构体,访问结构体中的成员。
12.映射(mapping)类型:
与数组和结构体一样,映射也是引用类型。下面是声明映射类型的语法。
_KeyType
– 可以是任何内置类型,或者bytes和字符串。不允许使用引用类型或复杂对象。
_ValueType
– 可以是任何类型。
注意
- 映射的数据位置(data location)只能是storage,通常用于状态变量。
- 映射可以标记为public,Solidity 自动为它创建getter。
示例
放到测试链
首先单击
updateBalance
按钮将值设置为10,然后查看日志输出:输出
13.类型转换:
Solidity允许类型之间进行隐式转换和显式转换。
隐式转换时必须符合一定条件,不能导致信息丢失。例如,uint8可以转换为uint16,但是int8不可以转换为uint256,因为int8可以包含uint256中不允许的负值。
类型转换分析