分享百科

Storage slot

该视频主要讲解了YUL(YORL)语言中如何处理和存储数组,特别是固定大小数组、动态数组以及较小数据类型(uint8)的动态数组。 **核心内容/主要观点:** YUL处理不同类型的数组的方式不同,理解这些差异对于优化智能合约的存储和gas消耗至关重要。 **关键论据/关键信息:** * **固定大小数组:** 元素按顺序存储在连续的存储槽中,每个元素占用一个完整的32字节的存储槽(slot)。访问元素时,通过数组的起始存储槽加上索引偏移量来定位。 * **动态数组:** 数组的长度存储在数组变量对应的存储槽中。数组的实际数据存储在一个通过对数组变量的存储槽进行keccak256哈希运算得到的新的存储位置开始的连续区域中。这样做是为了避免与合约中其他变量的数据发生冲突。 * **uint8动态数组:** 由于uint8类型小于32字节,YUL会将多个uint8元素紧密地打包到一个存储槽中,以节省存储空间。一个存储槽可以容纳32个uint8元素。
30
0
0
4天前
该视频的核心内容是讲解了如何使用 Yaw 语言更新以太坊智能合约中存储在同一个存储槽 (storage slot) 中的多个变量中的一个特定变量的值。由于这些变量被“打包”在同一个槽中,直接更新整个槽会覆盖其他变量的值。 视频中提出的关键论据和信息包括: 1. **问题背景:** 多个变量被紧密地打包在同一个存储槽中,例如视频中的变量 A, B, C, D, E 都存储在 slot 3 中。 2. **直接更新的弊端:** 直接使用 `sstore` 更新整个存储槽会覆盖掉其他变量的值,导致数据丢失。 3. **解决方案:** 使用位掩码 (bitwise masking) 和位移 (shifting) 技术来精确地更新目标变量。 4. **位掩码和位移的原理:** * **位掩码:** 使用 `AND` 操作将目标变量的位置清零,保留其他变量的值。 * **位移:** 将新的变量值移动到目标变量在存储槽中的正确位置。 * **位或:** 使用 `OR` 操作将移动后的新值与清零后的存储槽值合并,从而实现只更新目标变量的目的。 5. **具体步骤:** * 加载整个存储槽的旧值。 * 创建一个位掩码,该掩码在目标变量的位置为 0,在其他位置为 1。 * 将旧值与位掩码进行 `AND` 操作,清除目标变量的值。 * 将新值左移到目标变量的正确位置。 * 将移位后的新值与清除后的旧值进行 `OR` 操作,得到新的存储槽值。 * 使用 `sstore` 将新的存储槽值写入存储。 6. **示例:** 视频演示了如何使用 Yaw 语言编写的 `setPacked` 函数来更新变量 C 的值,同时保持其他变量 A, B, D, E 的值不变。
25
0
0
4天前
登链社区