Celer network 学习笔记
本文是近期参与的一个区块链课程笔记整理,可能对你没有作用。之后会逐渐针对知识点整理,目前仅供自己参考。
Table of Contents
1 constant
constant
修饰函数,编译器不做限制。~constant~ 修饰合约变量,编译器会限制更改
solc 0.4.17之后, constant 不再建议使用,采用 view
和 pure
代替。
view
是 constant
的替代,表明该函数不修改合约状态。
pure
比 view
限制更加严格,它修饰的函数的返回结果只依赖输入。
参考这个 stackoverflow 回答。
2 TODO address几种调用比较
address.transfer address.send address.call address.callcode address.delegatecall
3 一些用作单位的全局变量
Banlance单位 wei szabo = 10^12wei szabo = 10^15wei ether = 10^18wei 时间单位 seconds minutes hours days weeks years
4 合约内部函数调用tip
this.function()调用要比直接function()调用消耗更多gas
但可以用来调用一些external函数
5 TODO 错误检测
threw
revert 停止执行,交还未消耗完的gas
assert
require
6 数据存储
3种存储类型 storage 存储区块链上
memory 临时
calldata 临时
使用的要求:
强制: 状态变量:storage function输入参数: calldata
默认: function返回参数:memory 本地变量:storage
相同存储空间变量赋值 传递reference(evm 上的内存地址)
不同存储空间变量赋值 拷贝
7 可视度和继承
7.1 可视度种类
public 谁都可见
external 只有“外部调用”可见
internal 外部调用不可见,内部和子类可见
private 只有当前合约可见
7.2 修饰成员变量和函数
成员/状态变量: public internal, private, 默认为internal 如果使用public修饰,那么会默认为此状态变量创建取值函数 private: 不代表别的人无法看到(所有数据都是公开的,肉眼都可见),只代表区块链智能合约无法看到。
函数: public external internal, private 默认 public this.func1() this 会将函数调用改成外部调用
7.3 继承时构造函数
继承的时候, 父类的无参数的构造函数会在子类构造函数被调用前默认调用 而当父类也是构造函数也是有参时,子类可以: 1、 子类声明时构造静态父类 2、 子类构造函数时构造父类
7.4 多继承MRO
多继承的重名函数 MRO 采用 C3 linearization,和Python类似
8 抽象合约和接口
抽象合约 可以定义状态变量等等 Inteface 只有方法定义
9 数据类型
9.1 不支持浮点数
9.2 mapping
不使用数组+链表实现,加入很多元素后不需要扩容 hash函数为keccak256hash, 在storage上存储,理论无限大的hash表 无法遍历整个hash
赋值 h[key] = value 取值 value = h[key], 注意,这萝莉的value是引用,在storage上存储,可以直接修改; 当key不存在时,value是该类型的默认值
10 函数参数返回
var 指定多个变量来接受返回的多值
函数返回参数也可以命名,这样可以告诉外界调用者信息。这时候也可以不用写return
11 truffle相关tip
11.1 import lib 在compiled的bytecode里怎么显示, link怎么处理?
11.2 migrate后的合约的instance地址记录在compiled的文件中
11.3 web3.js 调用合约方法
方法名.call() : 不修改合约的变量 方法名.send()/方法名() : 该方法修改合约变量
11.4 Truffle 测试
可以选择js版或者solidity写测试