区块链并不是真正的存储数据,它只是存储这些数据的“标识”,而每一个区块会被计算为一串散列哈希值,然后这一串哈希又被记录到下一个区块中,这样就一个区块一个区块的记录,每一个最新的区块总是记录着这条链从创世到当前的所有数据哈希值。如果想要去改变一些数据,则必须从创世块开始头从修改。
数据存储机制
- storage
- memory
- calldata
强制
--状态变量:storage
--function输入参数:calldata
数据结构优化
Mapping
- 类似与map(C++),dict(python)
- key(bool,int,address,string)
- value(任何类型)
- mapping(address=>Employee) employees
- 只能做成员变量,不能做本地局部变量
Mapping底层实现
- 不使用数组+链表,不需要扩容
- hash函数keccak256hash,在storage上储存,理论上无限大的hash表
- 无法naiive的遍历整个mapping
- 赋值employees[key] = value
- 取值 value = employees[key]
- value是引用,在storage上存储,可以直接修改
- 当key不存在,value= type's default
可视度及合约继承
- public 公共的 谁都可见
- private 只有当前合约可见
- external 只有外部调用可见
- internal 外部调用不可见,内部和子类可见
状态变量:public,internal,private
- 默认internal
- public:自动定义取值函数