众享区块链大讲堂81-Solidity编程-杂项和安全

你好,欢迎收听众享区块链大讲堂,今天的课程是以太坊技术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字节。内部的函数调用,则使用了不同的约定。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190819A0MYP100?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券