版本指令
pragma solidity ^0.4.19;
它告诉我们源代码是为[0.4.19,0.5.0] 版本编写的
pragma solidity >=0.4.22 <0.7.0;
它告诉我们源代码是为[0.4.22,0.7.0] 版本编写的
合约
contract 合约名字{}
值类型
int uint uint8/32/64...256
bool
fixed/ufixed 定点数
address 地址 .balance获取余额 .transfer转移 判空 !=address(0)
类型转换
隐式转换
显式转换 :转化后类型 新变量 = (转化后类型)原变量;
uint转bytes
function toBytes(uint256 x) returns (bytes b) {
b = new bytes(32);
assembly {
mstore(add(b, 32), x)
}
}
string转bytes 显示转换
stirng转bytes32
function stringToBytesVer2(string memory source) returns (bytes32 result) {
assembly {
result := mload(add(source, 32))
}
}
数据位置
Storage 永久数据,高成本
Memory 临时数据,函数内生效
Calldata 不可修改的非持久性数据位
Stack 由EVM维护的非持久性数
数组
动态:未确定空间大小
静态:确定空间大小
方法:push(返回值为新的索引),length
初始化:uint a[3]=[1,2,3]
结构体
同类型的数据连续的存储可以节省gas
映射
mapping(_KeyType => _ValueType)
特殊全局变量
msg.sender
指的是当前调⽤用者(或智能合约)的 address
错误处理
无脑用require就完事了
//assert 式异常消耗了所有可用的调用 gas ,而从 Metropolis 版本起 require 式的异常不会消耗任何 gas
assert(bool condition)
−如果不满足条件,此方法调用将导致一个无效的操作码,
对状态所做的任何更改将被还原。
这个方法是用来处理内部错误的。
require(bool condition)
−如果不满足条件,此方法调用将恢复到原始状态。
此方法用于检查输入或外部组件的错误。
require(bool condition, string memory message)
−如果不满足条件,此方法调用将恢复到原始状态。
此方法用于检查输入或外部组件的错误。
它提供了一个提供自定义消息的选项。
revert()
−此方法将中止执行并将所做的更改还原为执行前状态。
revert(string memory reason)
−此方法将中止执行并将所做的更改还原为执行前状态。
它提供了一个提供自定义消息的选项。
字符串的哈希映射
keccak256(string)
函数语法
function + 函数的名字
+(传递给函数的参数,包括参数的名称和类型)
+函数可见性
+函数修饰符
+returns (返回的类型,若有多个,以逗号分隔)
函数可见性 :public、private、internal、external
用于设定函数的可见范围
public:public 是默认值,设定为 public 的函数可以被其他合约和本合约内部调用。
external:类似于 public 函数,唯⼀一的区别在于不能在合约内部调用,除非在调用时申明关键字 this。
internal:internal 函数只能被合约内部的函数调用。
private:类似于 internal 函数,唯一的区别在于 private 函数不能被当前合约所派生的子合约调用。
函数修饰符:view/constant、pure、payable、modifier
影响函数的行为
view/constant: 当函数被定义为 view,意味着它不对任何状态进行修改,只能读取数据不能更改数据。
pure:pure 函数不会读取或写入任何数据。函数只能处理参数,返回值给调用方。
payable:payable 函数用于接受外部的支付。
modifier :可以像函数一样接收参数,修饰符的最后一行为 _;,表示修饰符调用结束后返回,并执行调用函数余下的部分
构造函数
constructor(变量类型和变量名) 函数可见性 {
函数语句;
}
事件
声明事件 event 事件名(元素类型 元素);
触发事件 emit 事件名(元素类型 元素);
合约继承
Solidity支持单继承和多继承
contract 合约名字 is 继承的父类 { }
接口
在solidity 0.6.x 版本之后,接口类似于抽象合约,可以使用interface关键字创建
interface Calculator {
function getResult() external view returns(uint);
}
在之前的版本直接用contact代替interface