登录 后可观看高清视频

在Solidity智能合约中使用Yul汇编管理存储槽和数据

Reanblock Reanblock
25次播放
2025-04-16

该视频深入探讨了如何在 Solidity 智能合约开发中使用 Yul 语言来管理存储槽。

核心内容/主要观点:

  • Yul 允许开发者直接访问和操作智能合约的存储槽,提供了比 Solidity 更底层的控制能力。
  • 视频演示了如何使用 Yul 读取和写入存储槽,以及如何处理存储槽中的数据打包(packing)问题。

关键论据/关键信息:

  • 存储槽的概念: Solidity 中的存储变量会被分配到智能合约内部的索引槽中。
  • .slot 属性: Yul 中,变量名后加 .slot 可以获取该变量在存储中的槽位索引。
  • sload 函数: Yul 中的 sload(slot_index) 函数可以读取指定槽位索引中的数据。
  • sstore 函数: Yul 中的 sstore(slot_index, value) 函数可以将指定值写入指定槽位索引。视频强调了直接使用 sstore 的风险,因为它可能导致合约漏洞。
  • 数据打包(Packing): Solidity 会将小于 256 位的变量打包到同一个存储槽中以节省 Gas。
  • 偏移量(Offset): 当变量被打包到同一个存储槽中时,每个变量都有一个偏移量,表示该变量在槽中的起始位置。可以通过 .offset 属性获取变量的偏移量。
  • 位移(Shifting)和掩码(Masking): 当需要从打包的存储槽中读取特定变量时,需要使用位移和掩码技术。
    • 位移(shr): 使用 shr(bits, value) 函数将数据向右移动指定的位数。
    • 掩码(Bitwise AND): 使用位与运算符 & 和掩码来提取所需的数据。
  • 视频通过具体的代码示例,展示了如何使用 Yul 读取和写入存储槽,以及如何处理数据打包的情况。
Yul  storage slots  SLOAD  SSTORE  data packing  offset