Published: 2018-09-20

Celery network 学习笔记

本文是近期参与的一个区块链课程笔记整理,可能对你没有作用。之后会逐渐针对知识点整理,目前仅供自己参考。

Table of Contents

1 constant

constant 修饰函数,编译器不做限制。~constant~ 修饰合约变量,编译器会限制更改

solc 0.4.17之后, constant 不再建议使用,采用 viewpure 代替。

viewconstant 的替代,表明该函数不修改合约状态。

pureview 限制更加严格,它修饰的函数的返回结果只依赖输入。

参考这个 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写测试

12 END

Author: Nisen

Email: imnisen@163.com

Emacs 25.2.1 (Org mode 8.2.10)