这一章主要是对 solidity 这个语言特性的一些总结。
- 静态语言
- 编译前变量类型需要确认
- 值类型
- 布尔类型
- 整型
- 定长浮点型
- 定长字节数组
- 有理数和整型常量
- 字符串常量
- 十六进制常量
- 枚举
- 函数类型
- 地址类型
- 地址常量
public|private|internal 也可用于修饰状态变量。
public 变量会自动生成同名的 getter 函数,用于查询数值。
没有标明可见性类型的状态变量,默认为 internal。
布尔类型
booltrue/false- 支持运算
- ! && != || == 「支持短路」
1 | pragma solidity ^0.4.0; |
整型
intint8int16…int256「数字表示类型所占空间的位数」
uint无符号,只能大于0uint8uint16…uint256
运算
/(除)- 截断,除
0会抛出异常
- 截断,除
x << y- 和乘等价,左移一位相当于乘以
2
- 和乘等价,左移一位相当于乘以
x >> y- 和除等价,右移一位相当于除以
2
- 和除等价,右移一位相当于除以
a++a--a += c
1 | pragma solidity ^0.4.0; |
上面 add 和 add1 作用是相同的。
溢出问题
1 | uint8 x = 0x80; |
解决溢出
assertSafeMath「库」
assert
1 | pragma solidity ^0.4.18; |
不满足 assert 会抛出异常。
定长浮点型 「暂时无法使用」
fixedufixed
由于 solidity 对空间要求非常严格,所以,我们需要声明浮点型所占空间。
fixedM*N- M : 位数 以 8 步进, 8 -256
- N : 小数点位数 为 0 - 80
定长字节数组
占空间的固定数组,后面跟着的数字表示为字节。之前的类型表示的都是位。
- bytes1
- bytes2
- bytes8
- …
- bytes32
- .length 获取字节数组长度
如果后面没有接数字,表示为 bytes1
1 | pragma solidity ^0.4.18; |
另外,bytes 可以像 string 一样存储字符串,并且,由于 string 不是定长的,而 bytes 可以定长,所以,bytes 需要的存储更小。
bytes 支持整型运算,比如 > < = 还支持位运算。
bytes 还可以像数组一样索引。
1 | pragma solidity ^0.4.18; |
常量
数字常量
概念和其他语言一样,需要注意的是,在计算过程中,常量不会截断也不会溢出
1 | uint a = 5/2 + 5/2; // 5 |
变量是不能和常量一起运算的。
1 | uint a = 1; |
字符串常量
支持转译字符。
1 | \n |
- 不支持拼接
"abc" + "d"// 错误
16 进制常量
表达式中直接出现的字符串:内容是 16 进制数
hex"001122f"- 可以转化为
bytes
- 可以转化为
1 | pragma solidity ^0.4.18; |
枚举
- 可以与整型进行转换,但是,必须是强制类型转换
- 枚举至少需要一个成员
1 | pragma solidity ^0.4.18; |
地址类型
address- 表示一个地址类型
20字节 - 不需要双引号
- 表示一个地址类型
- 成员
.balance单位是wei
- 函数
transfer()
1 | pragma solidity ^0.4.18; |
transfer
这个中文意思是转移,但是,使用起来更像是接收的意思。
1 | pragma solidity ^0.4.18; |
上面如果运行 trnasfer 其作用是 合约地址转 1eth 给 a 地址。
更加细节的用法参考