概述
- 合约升级问题:代理模式
- 软件复用:library
- 技术基础:delegatecall
知识储备
存储布局
Storage loyout
- 成员变量按照它们出现的顺序在storage中按照一种规则次第堆放,这使得每个成员变量具有固定的的位置。在slot中一个变量从低位开始存
值类型堆叠规则
- 值类型需要的空间就是这个数据类型的数据块大小(字节)
- 值类型数据如果不能在当前slot剩余空间存得下则新起一个slot
- 结构和数组不会与其他数据分享slot,之前或者之后
动态数组和映射
- 动态数组和mapping参与成员变量的堆叠占有一个32位的slot,但数据通过哈希运算存在别的存储slot中,不参与堆叠
- 动态数组的slot存放数组大小,mapping空着
一个合约有成员变量,每个成员变量根据它的类型占有固定长度的空间并按照规则堆叠上去。这个成员变量序列的布置是固定的,每个成员变量的位置是固定的。 - 合约编译成的机器码是用这个位置来访问它的!在幕后,合约机器代码只认位置,不认变量名称!
Layout中的递归与继承
- Struct和array的数据的堆叠跟上述成员变量的堆叠规则一样
- 对于合约继承,按照C3线性化的结果以此堆叠,并且允许父子数据共存于一个slot
- 如官方文档所言,layout原则并不是内部技术,而是与语言的外部行为有关的!