你好,欢迎收听众享区块链大讲堂,今天的课程是以太坊技术5之Solidity第六讲。
上节课我们介绍了Solidity合约的基础,了解了构成合约的元素和相关概念。
本节课我会向大家介绍Solidity杂项的一些技巧以及常规知识,另外还会提醒大家在使用Solidity开发过程中需要注意的陷阱和一些建议。
杂项
1.状态变量在存储中的布局(Layout of State Variables in Storage)
大小固定的变量(除了映射,变长数组以外的所有类型)在存储(storage)中是依次连续从位置0开始排列的。如果多个变量占用的大小少于32字节,会尽可能的打包到单个storage槽位里。
结构体和数组里的元素按它们给定的顺序存储。
映射和变长数组类型由于它们不可预知的大小,使用Keccak-256哈希运算来找真正数据存储的起始位置。
2.内存变量的布局(Layout in Memory)
Solidity预留了3个32字节大小的槽位:
— 0-64:哈希方法的暂存空间(scratch space)
— 64-96:当前已分配内存大小(也称空闲内存指针(free memory pointer))
Solidity总是在空闲内存指针所在位置创建一个新对象,且对应的内存永远不会被释放(也许未来会改变这种做法)。
有一些在Solidity中的操作需要超过64字节的临时空间,这样就会超过预留的暂存空间。他们会被分配到空闲内存指针所在的地方,但由于他们自身的特点,生命周期相对较短,且指针本身不能更新,内存也许不会被清零(zerod out)。因此,大家不应该认为空闲的内存一定已经是清零(zeroed out)的。
3.调用数据的布局(Layout of CallData)
当Solidity合约被部署后,从某个帐户调用这个合约,输入数据的格式要符合the ABI specification,ABI规范需要参数被填充为多个32字节。内部的函数调用,则使用了不同的约定。
领取专属 10元无门槛券
私享最新 技术干货