分享百科
复制链接
Twitter分享
微信扫码分享
SSTORE
百科
文章
视频
课程
相关标签
在 Yul 中写入打包存储变量
该视频的核心内容是讲解了如何使用 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 的值不变。
0
0
0
2小时前
在Solidity智能合约中使用Yul汇编管理存储槽和数据
该视频深入探讨了如何在 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 读取和写入存储槽,以及如何处理数据打包的情况。
0
0
0
2小时前
登链社区
文章
视频
讲堂
百科图谱
线下集训
更多
问答
提问
发表文章
专栏
活动
文档
工作
集市
发现
Toggle navigation
文章
问答
视频
讲堂
线下集训
专栏
活动
工作
文档
集市
搜索
登录/注册
×
发送私信
请将文档链接发给晓娜,我们会尽快安排上架,感谢您的推荐!
发给:
内容:
×
举报此文章
垃圾广告信息:
广告、推广、测试等内容
违规内容:
色情、暴力、血腥、敏感信息等内容
不友善内容:
人身攻击、挑衅辱骂、恶意行为
其他原因:
请补充说明
举报原因: