目录标题
Solidity源文件布局
pragma (版本杂注)
• 源文件可以被版本 杂注pragma所注解,表明要求的编译
器版本
• 例如:pragma solidity ^0.4.0;
• 源文件将既不允许低于 0.4.0 版本的编译器编译, 也不允许高于(包含) 0.5.0 版本的编译器编译(第二个条件因使用 ^ 被添加)
import(导入其它源文件)
• Solidity 所支持的导入语句import,语法同 JavaScript(从ES6 起)非常类似Solidity源文件布局-- importimport “filename”;
• 从“filename”中导入所有的全局符号到当前全局作用域中
import * as symbolName from “filename”;
• 创建一个新的全局符号 symbolName,其成员均来自 “filename”
中全局符号import {symbol1 as alias, symbol2} from “filename”;
• 创建新的全局符号 alias 和 symbol2,分别从 “filename” 引 用 symbol1 和 symbol2 import “filename” as symbolName;
• 这条语句等同于 import * as symbolName from “filename”;
Solidity值类型
• 布尔(bool):可能的取值为字符常量值 true 或 false
• 整型(int/uint):分别表示有符号和无符号的不同位数的整型变量; 支持
关键字 uint8 到 uint256(无符号,从 8 位到 256 位)以及 int8 到 int256, 以 8 位为步长递增
• 定长浮点型(fixed / ufixed): 表示各种大小的有符号和无符号的定长浮
点型;在关键字 ufixedMxN 和 fixedMxN 中,M 表示该类型占用的位数,N 表示可用的小数位数
• 地址(address):存储一个 20 字节的值(以太坊地址大小)
• 定长字节数组:关键字有 bytes1, bytes2, bytes3, …, bytes32
• 枚举(enum):一种用户可以定义类型的方法,与C语言类似,默认从0
开始递增,一般用来模拟合约的状态
• 函数(function):一种表示函数的类型
Solidity引用类型
数组(Array)
• 数组可以在声明时指定长度(定长数组),也可以动态调整大小(变长数组、动态数组)
• 对于存储型(storage) 的数组来说,元素类型可以是任意的(即元素也可以是数组类型,映射类型或者结构体);对于内存型(memory)的数组来说,元素类型不能是映射(mapping)类型
结构体(Struct)
• Solidity 支持通过构造结构体的形式定义新的类型
映射(Mapping)
• 映射可以视作 哈希表 ,在实际的初始化过程中创建每个可能的 key,并将其映射到字节形式全是零的值(类型默认值)
Solidity地址类型
address
• 地址类型存储一个 20 字节的值(以太坊地址的大小);地址类型也有成员
变量,并作为所有合约的基础address payable(v0.5.0引入) • 与地址类型基
本相同,不过多出了 transfer 和 send 两个成员变量两者区别和转换
• Payable 地址是可以发送 ether 的地址,而普通 address 不能
• 允许从 payable address 到 address 的隐式转换,而反过来的直接转换是
不
可能的(唯一方法是通过uint160来进行中间转换)
• 从0.5.0版本起,合约不再是从地址类型派生而来,但如果它有payable的回
退函数,那同样可以显式转换为 address 或者 address payable 类型
地址类型成员变量<address>.balance (uint256)
• 该地址的 ether 余额,以Wei为单位
<address payable>.transfer(uint256 amount)
• 向指定地址发送数量为 amount 的 ether(以Wei为单位),失败时抛出异常,
发送 2300 gas 的矿工费,不可调节
<address payable>.send(uint256 amount) returns (bool)
• 向指定地址发送数量为 amount的 ether(以Wei为单位),失败时返回
false,发送 2300 gas 的矿工费用,不可调节
<address>.call(bytes memory) returns (bool, bytes memory)
• 发出底层函数 CALL,失败时返回 false,发送所有可用 gas,可调节
<address>.delegatecall(bytes memory) returns (bool, bytes memory)
• 发出底层函数 DELEGATECALL,失败时返回 false,发送所有可用 gas,
可调节<address>.staticcall(bytes memory) returns (bool, bytes memory)
• 发出底层函数 STATICCALL ,失败时返回 false,发送所有可用 gas,可调节
地址成员变量用法
balance 和 transfer
• 可以使用 balance 属性来查询一个地址的余额, 可以使用 transfer 函数向一个payable地址发送 以太币Ether(以 wei 为单位)
address payable x = address(0x123);
address myAddress = address(this);
if (x.balance < 10 && myAddress.balance >= 10)
x.transfer(