分享百科

SLOAD

该视频主要讲解了如何使用 Yul (YOR) 在 Solidity 合约中处理和读取 mappings (映射) 的数据。 **核心内容/主要观点:** * Yul 可以用来读取 Solidity 合约中 mappings 的数据,包括简单映射、嵌套映射以及地址到动态数组的映射。 * 读取 mapping 数据的关键在于计算出数据存储的位置 (data location),这通常涉及到将 mapping 的 slot (存储位置) 与 key (键) 进行 Keccak-256 哈希运算。 **关键论据/关键信息:** * **简单映射:** 通过 `keccak256(key, slot)` 计算数据位置,然后使用 `sload` 读取数据。 * **嵌套映射:** 按照从左到右的顺序,依次将 key 与 slot 进行 Keccak-256 哈希运算。例如,对于 `mapping(uint256 => mapping(uint256 => uint256))`,先计算 `keccak256(key1, slot)`,再计算 `keccak256(key2, 上一步的结果)`,得到最终的数据位置。 * **地址到动态数组的映射:** * 首先,`keccak256(key, slot)` 得到的是动态数组的长度,而不是数组本身的数据位置。 * 要获取数组中的元素,需要再次进行 Keccak-256 哈希运算,计算 `keccak256(keccak256(key, slot))`,得到数组的起始数据位置。 * 然后,通过将索引 (index) 添加到起始数据位置,即可使用 `sload` 读取数组中特定索引的元素。
53
0
0
2025-04-16 09:26
该视频深入探讨了如何在 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 读取和写入存储槽,以及如何处理数据打包的情况。
45
0
0
2025-04-16 09:24
登链社区