Solidity 进阶知识总结 2

2018年7月3日 作者 jacky

异常处理

一旦发生异常,所有的操作都回滚

如果处理异常:

以太坊提供了三个异常处理的函数:

assert(bool condition) : // 0xfe 无效的操作
通常用于检测内部错误

require(bool condition) : //0xfd reback(回退操作)
用检测输入和外部组件

revert() : 强行回滚(reback)

合约成员的访问权限

external:声明的合约成员可以被其他的合约和交易调用,但不能直接调用(不能直接调用f(),应该使用this.f()).外部函数有时接受大数组时会更有效率。

public:
于external类似,可以在外部和内部调用。

internal:
用internal声明的函数和变量只能在内部使用,但是可以继承。

private:
只能在内部使用,不能继承。

getter 函数

solidity 为成为变量自动生成的函数。

在用一个合约中,访问合约的成员变量,可以通过内部的方式(data),也可以通过外部的方式(this.data();), 前提是data的熟悉是public,就会生成getter方法,调用方式为this.data();

如果要访问另一个合约中的成员变量(属性为public),只能通过getter函数(data())

事件

事件是向客户端推送数据的。

事件的监听需要和客户端配合测试。

利用node 命令与合约互动。。

最终当合约调用就会触发事件,控制台会执行watch函数。

合约的集成

solidity中合约是支持多继承。但是同时只会创建一个合约。编译器会将父合约的所有成员都复制到子合约中。

抽象合约

抽象合约是指 合约中包含没有实现的函数(可以包含已经实现的函数)。
主要要用接口的使用。

如果一个合约从另一个抽象合约继承,但并没有实现所有的抽象函数,那么当前合约仍然是一个抽象合约。

抽象合约是不能被部署的。

利用抽象合约实现多态。

合约接口

接口和抽象不一样

1,不能喝其他的合约和接口继承
2,不能定义构造函数
3,不能变量
4,不能定义结构体和枚举

使用库

库和合约类似,但是库的目录是在一个指定的地址,仅仅部署一次,然后通过EVM中复用代码,这就意味着函数调用时,代码是在调用库函数的合约的上下文中执行。通过this可以获得调用合约。

库的限制:

  1. 不能定义状态变量
  2. 不能继承或者被继承
  3. 不能接受以太(ether)

using * for *;