solidity基本语法:
1、值类型和引用类型
值类型:基础数据类型,int,bool,address,func。
引用类型:复杂数据类型,struct,mapping,数组[]。
2、变长数组的成员方法
变长数组的方法:只能在一端操作。(定长数组不可以操作)
.length获取数组长度
.push(),向末尾添加元素。
.pop(),删除末尾的元素。
另外,变长数组要注意,如果for循环影响到数组的取值,可能会因为太大,导致超出gaslimit最终没法执行。
另外,删除数组中的元素,如何弄?
3、地址的成员方法
<address>.balance:获取地址的以太币余额
<address (payable)>.transfer:合约向该地址转账
3、整型溢出
整数溢出:在老版本中,如果整数溢出,不会报错,就很容易出错,而新版本会报错,无法编译通过,所以防止整型溢出的办法就是,用新版本的solidity编译器。
4、引用类型于值类型
引用类型占用空间巨大,值拷贝开销很大。
引用类型数据的三种存储位置:
1、memory,内存,生命周期仅存在于函数调用期间。
2、storage,状态变量的保存位置,开销最大
3、calldata,调用数据,用于函数参数不可变存储区域。
5、引用传递和值拷贝
在solidity中,基础数据类型,比如bool,int,address,他们的赋值传参都是值拷贝,所有复杂数据类型,比如:struct,mapping,数组类型[],他们的赋值传参的时候,到底是值拷贝还是引用传递,要看两者的数据类型是否一致。
在使用引用类型的数据时,我们必须使用存储位置关键字(memory,storage,calldata)来指定数据存储位置,有且只有类成员变量无需指定(其实就是指合约,因为合约就是solidity中的类),因为他们默认是storage。我们的合约是不需要指定存储关键字的,因为默认就是storage(其实等同于上一句话,合约中的成员变量的存储位置无需指定,自动默认)。
引用类型的传参到底是值拷贝还是引用传递:
如果相同类型的赋值时引用传递,其余是值拷贝,其中特殊的是,storage与storage之间是值拷贝。
具体来说,memory与memory之间传值是引用传递
storage与local storage之间是引用传递。
以下是值拷贝
storage与memory之间是值拷贝,但是memory向storage是不可以传值的,否则会报错。
storage与storage之间是值拷贝。
花不花gas,只取决于两个层面:
1、是否修改了storage参数
2、你函数 调用有没有声明pure或者view
如果两个条件都满足,即没有修改storage状态变量,而且你调用的函数声明了pure或者view,就可以不用花gas,否则,哪怕是查询函数调用一次就要花一次gas。
6、pure和view
pure对状态变量不可读不可写,只对局部变量进行操作。
view,对状态变量可读,不可写。
7、常量的定义和全局变量
用constant + 大写变量名,可以节省gas。
只读方法,难道不是不要gas吗?其实不是的,因为在写入函数中读取变量的时候,要按照是否是常量来收取gas,所以,我们需要把不需要修改的变量定义为constant。
全局变量
区块和交易有关的:
block.number (uint)当前区块号
block.timestample, (uint) 从开始到当前区块按秒计的时间戳
msg.sender:(address)当前消息的调用者
msg.value:(uint)随消息发送的wei
tx.orign:(address payable) 交易的发起者
abi有关的接口
abi.encode(),等abi相关的内置函数
错误处理
require(),revert()
类型信息
type()
type(T).max,type(T).min
地址和合约相关
8、结构控制与三元运算符
结构控制