登录 后可观看高清视频

在 Yul 中写入打包存储变量

Reanblock Reanblock
29次播放
2025-04-16

该视频的核心内容是讲解了如何使用 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 的值不变。
Storage slot  Bitwise masking  Shifting  Yaw language  SSTORE  Packed variables