智能合约(三)
一、错误处理
Ø assert 类型异常:内部错误
Ø require 类型异常: 外部错误
Ø revert 类型异常:终止并还原状态
注意:异常函数的参数为false时抛出异常
二、函数修饰器
Ø 使用形式:关键字:modifier
need-to-insert-img
Ø 多函数修改器
顺序执行,执行到_ 就跳到第二个参数的函数体 再执行 遇到 _ 就再跳到第三个参数的函数体,执行后再退回去,,,类似递归。
Ø 重写
n 即继承关键字is
n 使用形式:
need-to-insert-img
注意:覆盖的函数名、类型、参数、都一样,与C++一致
三、Solidity编码规范
Ø 合约、库、事件及结构体命名应该使用单词首字母大写的方式,
Ø 函数、参数、变量及修饰器应该使用首单词小写后面单词大写的方式,
Ø 缩进:4个空格
Ø 函数之间有空行,函数左括号和定义在一行
Ø 编写函数顺序:a.构造函数 b.回退函数(如果有)
c.外部函数(external) d.公有函数(public)
e.内部函数(internal) f.私有函数(private)
Ø 区分事件与函数
n 事件可以加前缀并全大写
Ø 常量:全大写及下划线分割的方式
四、事件Event的使用
Ø 关键字:event 与 emit
Ø 使用与监听
need-to-insert-img
need-to-insert-img
五、函数高级部分
注意:在构造函数内,不能使用this调用函数
Info()函数 :
feed.info.value(10).gas(310000)(); // 附加以太币及gas来调⽤info
callFeed()
Call() ,callcode() , delegatecall()
call() 函数:想一个合约发送消息,参数可以是任意类型的,并把参数打包成32字节
call指定函数:第一个参数如果是4个字节,会认为是签名的序号值,
如果只是想传个参数值,应避免参数为4个字节。
Call()返回值结果:bool类型
智能合约(四)
一、solidity继承
1:使用关键字is表示继承
2:访问属性:继承不可访问父合约的私有函数,构造函数不可以继承
3:支持多继承,可以存在相同的函数,变量以及事件,按照最远原则进行继承
4:继承之后的重写要求函数名称,参数,返回值,访问属性完全相同
5:可以显式调用父合约的构造函数,有两种方式
6:通过两种方式显式调用父合约的方法,合约名称. func() super. func()
7:支持棱形继承,按照最远原则处理
多继承是最远的向上继承,如1, 2, 3, 4, 4=>3 , 3=>2 , 2=>1 ,
Super:当前合约的上一层合约即所继承的合约
二、接口interface
抽象合约:只声明不实现即没有函数体
接口类似于抽象合约,但它们不能实现任何功能。还有其他限制:
• 无法继承其他合约或接口。
• 无法定义构造函数。
• 无法定义变量。
• 无法定义结构体。
• 无法定义枚举。
接口可以像继承合约一样继承,但是需要实现接口内的所有方法
三、库的使用 library
• 无状态变量(state variables)。
• 不能继承或被继承
• 不能接收以太币
• 不能销毁一个库
1、Using 的使用
指令using A for B;用来把库函数(从库A)关联到类型B。这些函数将会把调用函数的实例作为第一个参数 即
Ø Using+库名+for+函数的第一个参数类型
Ø Using+库名+for+ * (代表任意类型)
注意:当库有多个函数时,就会用到第二种方法应注意参数类型是否对应,即使不对应也会被关联。
网友评论