Solidty语法总结

版本指令

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

你可能感兴趣的:(Solidty语法总结)