文章
视频
讲堂
百科图谱
线下集训
更多
问答
提问
发表文章
专栏
活动
文档
工作
集市
发现
Toggle navigation
文章
问答
视频
讲堂
线下集训
专栏
活动
工作
文档
集市
搜索
登录/注册
Reanblock
文章
专栏
问答
视频
课程
集市作品
活动
招聘
TA的视频
TA的合集
在 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 的值不变。
26
0
0
4天前
在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 读取和写入存储槽,以及如何处理数据打包的情况。
24
0
0
4天前
Solidity 中的 Yul 汇编编程
该视频主要介绍了Solidity中的汇编语言YUL,以及学习和使用YUL的好处和基本概念。 **核心内容/主要观点:** * YUL是Solidity代码和编译后的字节码之间的中间语言,理解YUL有助于更深入地理解Solidity的工作原理,并能更好地调试和解决Solidity代码中的问题。 * YUL可以提高代码的gas效率,并且Solidity的新特性通常会先在YUL中实现。 **关键论据/关键信息:** * **YUL的优势:** * 更深入地理解Solidity:帮助理解Solidity的底层行为和编译器错误的原因。 * 提前使用新特性:Solidity升级后,新特性通常先在YUL中可用。 * 提高Gas效率:用YUL编写的合约或函数通常更节省Gas。 * **YUL的局限性:** * 底层语言:缺乏Solidity中的许多语法糖和辅助功能。 * 数据类型单一:只有一种数据类型,即256位的字(uint256)。 * 缺乏高级特性:没有存储变量、内存管理、数组、函数参数传递等。 * **YUL的基本概念:** * 数据类型:所有数据都表示为256位的字。 * 变量赋值:使用`:=`进行赋值。 * 作用域:YUL代码块可以访问Solidity中定义的变量。 * 字符串处理:由于YUL处理的是指针,字符串需要使用`bytes32`类型,并且长度不能超过32字节。可以使用`ABI encode`将`bytes32`转换回`string`。 * 布尔值:布尔值在YUL中用32位字的最后一位表示,1为真,0为假。 * 逻辑运算:使用`iszero`进行零值判断,实现逻辑非。 * 控制流:支持`if`语句和`for`循环,但没有`else`语句。 * 函数调用:可以使用算术函数(ADD, DIV, MOD)、比较函数(LT, GT, EQ)等。 * **YUL中的真值和假值:** * 真值:任何非零值都被认为是真。 * 假值:只有零值被认为是假。 * **避免使用`not`进行逻辑非:** * `not`会翻转所有位,而不是简单地返回真或假。应该使用`iszero`来判断是否为零。
58
0
0
4天前
‹
1
2
›
Reanblock
关注
贡献值: 5
学分: 10
江湖只有他的大名,没有他的介绍。
0 关注
0 粉丝
×
发送私信
请将文档链接发给晓娜,我们会尽快安排上架,感谢您的推荐!
发给:
内容:
提醒
检测到你当前登录的账号还未绑定手机号
请绑定后再发布
去绑定
×
编辑封面图
封面预览
取消
确认