文章
视频
讲堂
百科图谱
线下集训
更多
问答
提问
发表文章
专栏
活动
文档
工作
集市
发现
Toggle navigation
文章
问答
视频
讲堂
线下集训
专栏
活动
工作
文档
集市
搜索
登录/注册
Reanblock
文章
专栏
问答
视频
课程
集市作品
活动
招聘
TA的视频
TA的合集
Yul 回退函数接口
该视频的核心内容是展示如何使用 YUL (YORL) 编写几乎全部的智能合约,并演示了如何通过 Solidity 接口与 YUL 合约进行交互。 视频的关键论据和信息包括: * **YUL 合约结构:** 合约主要由内联汇编代码组成,没有明确定义的 Solidity 函数或接口。 * **函数选择器:** 通过提取调用数据的头四个字节(函数选择器)并使用位移操作,实现类似 switch 语句的函数分发机制。 * **YUL 中的返回值:** YUL 使用内存来存储返回值,并通过 `return` 语句将值返回给调用合约。`leave` 关键字用于在 YUL 函数之间跳转并最终返回。 * **调用数据处理:** 使用 `calldataload` 指令加载调用数据,并根据函数选择器和参数执行不同的逻辑。 * **接口合约:** 为了方便测试,视频创建了一个 Solidity 接口合约,该合约调用 YUL 合约的 fallback 函数,从而实现与 YUL 合约的交互。 * **演示示例:** 视频演示了两个函数:`get123` 返回硬编码值 123,`get999` 接受一个参数,如果参数等于 999 则返回 999,否则返回 888。
34
0
0
5天前
使用Yul将价值转移到另一个账户
该视频的核心内容是展示如何使用 Yul (YOR) 语言从智能合约向钱包发送以太币,并对比了使用 Solidity 和 Yul 实现相同功能的 gas 消耗。 **关键论据/信息:** * **功能对比:** 视频展示了 Solidity 和 Yul 两种语言实现从合约向指定地址转移以太币的功能。Solidity 版本使用了 `payable` 地址类型和 `call` 函数,而 Yul 版本则直接使用了 `call` 操作码。 * **Gas 消耗:** 视频重点强调了使用 Yul 语言编写的合约在执行时 gas 消耗更低。通过实际部署和调用合约,视频展示了 Yul 版本的 gas 消耗比 Solidity 版本低约 273 gas。 * **Yul 代码解释:** 视频详细解释了 Yul 代码中 `call` 操作码的各个参数,包括 gas 限制、目标地址、发送的 value (使用 `self-balance` 获取合约余额)、以及用于传递和接收数据的内存区域。`self-balance` 被指出是比 `balance address` 更经济的获取合约余额的方式。 * **代码逻辑:** 两种语言实现的合约都包含一个 `withdraw` 函数,该函数将合约的所有余额转移到预先设定的 owner 地址。合约构造函数被设置为 `payable`,以便在部署时接收以太币。合约会检查交易是否成功,如果交易失败则回滚。
30
0
0
5天前
在 Yul 中使用 staticcall 调用其他合约
该视频的核心内容是讲解了Solidity中call data的工作原理,以及如何在Yaw语言中使用call data进行跨合约调用。 **关键论据/信息:** 1. **Call Data 结构:** 当向智能合约发送交易时,call data 的前四个字节代表要调用的函数签名,后续的32字节增量分组代表函数参数。Solidity会忽略超出预期的数据。 2. **函数签名生成:** 可以使用 Foundry 工具包中的 `cast` 命令生成函数签名。例如,`cast sig "balanceOf(address)"` 可以生成 `balanceOf` 函数的签名。 3. **Call Data 生成:** 可以使用 `cast calldata` 命令生成完整的 call data,包括函数签名和参数。例如,`cast calldata "balanceOf(address)" 0x...`。 4. **ABI 编码:** Solidity 中可以使用 `abi.encodeWithSignature` 函数生成 call data。但它会在数据末尾填充零,以确保总长度是32字节的倍数。 5. **Yaw 中使用 Call Data:** Yaw 允许打破 Solidity 的 call data 约定,提供更大的灵活性。视频展示了如何在 Yaw 中使用内联汇编(Yul)通过 `staticcall` 指令调用另一个合约的函数,并传递 call data。`staticcall` 需要指定 gas 限制、目标合约地址、call data 的内存位置和长度,以及用于存储返回值的内存位置。 6. **工具介绍:** 视频介绍了 `cast` (Foundry) 用于生成函数签名和 call data,以及 `Chisel` 用于在 REPL 环境中测试 Solidity 代码。
37
0
0
5天前
在 Yul 中记录事件
该视频主要讲解了在YUL中如何处理日志(logging),特别是如何手动生成和发出事件(events),以及如何区分索引(indexed)和非索引(non-indexed)数据。 **核心内容/主要观点:** * YUL需要手动处理事件的生成和发出,包括生成事件签名的哈希值(keccak256)。 * YUL使用`log`系列操作码(opcode)来发出事件,`log3`用于有三个topic的情况,`log2`用于有两个topic的情况。 * 索引数据存储在交易收据(transaction receipt)的topics中,而非索引数据存储在data中。 **关键论据/关键信息:** * **Solidity vs. YUL:** Solidity会自动处理事件签名哈希的生成,而YUL需要手动生成。 * **事件签名哈希:** 事件签名哈希是事件接口(interface)的keccak256哈希值,用于唯一标识事件类型。 * **`log`操作码:** `log`操作码的参数包括: * `P` 和 `S`: 指向内存中非索引数据的指针和大小。 * `T1`, `T2`, `T3`...: 事件的topics,第一个topic通常是事件签名哈希,后续topics是索引数据。 * **索引 vs. 非索引数据:** 索引数据可以被快速搜索,而非索引数据不能。非索引数据需要先存储在内存中,然后通过`log`操作码指定内存地址和大小。 * **交易收据分析:** 通过分析交易收据的topics和data字段,可以区分事件中的索引和非索引数据。
29
0
0
5天前
在 Yul 中使用 return、revert 和 keccak256
该视频主要讲解了如何在Yul语言中使用`return`、`revert`和`keccak256`这三个关键操作。 **核心内容:** * **Yul中`return`、`revert`和`keccak256`的使用方法:** 视频通过具体的代码示例,展示了如何在Yul中进行数据返回、交易回滚以及哈希计算。 **关键论据/信息:** * **Return:** * Yul中的`return`操作允许返回内存中的数据。 * 返回的数据长度需要与函数接口定义的类型匹配,否则可能导致客户端解码错误。如果返回的数据字节数少于ABI定义的,客户端会报错。如果返回的数据字节数多于ABI定义的,客户端会截取前32个字节,但建议避免这种情况。 * Yul处理的是32字节的字,最终会根据函数接口转换成对应的类型。 * **Revert:** * `revert`用于终止交易并回滚状态。 * 视频展示了Solidity和Yul两种方式实现`revert`,Yul的实现更底层,需要手动检查条件并调用`revert`操作码。 * `revert`通常不返回数据,主要用于错误处理。 * **Keccak256:** * `keccak256`用于计算数据的哈希值。 * Solidity中需要先使用`abi.encode`将数据编码到内存中,再传递给`keccak256`函数。 * Yul中需要手动将数据写入内存,然后调用`keccak256`函数,并指定数据在内存中的起始位置和长度。 * 视频演示了如何在Yul中手动管理内存指针,将多个32字节的数据块写入连续的内存区域,然后计算整个区域的哈希值。 * Yul中的`keccak256`函数返回的哈希值可以存储在内存的“scratch space”中,以便后续返回。 * **内存管理:** 视频强调了Yul中内存管理的重要性,包括使用free memory pointer,以及确保数据在内存中的正确布局。 * **Yul文档和Remix:** 视频推荐使用Yul官方文档和Remix IDE进行学习和测试。
37
0
0
5天前
使用 Yul 在内存中进行 ABI 编码
该视频主要讲解了Yul语言中ABI编码对内存分配的影响,重点对比了`abi.encode`和`abi.encodePacked`两种编码方式在内存使用上的差异。 **核心内容/主要观点:** * Yul中的ABI编码会影响内存的使用和分配。 * `abi.encode` 会将数据填充到32字节的字长,即使数据本身小于32字节,也会进行填充,导致占用更多内存。 * `abi.encodePacked` 会尝试将数据打包到尽可能小的空间,避免填充,从而节省内存。 **关键论据/关键信息:** * Yul使用自由内存指针(Free Memory Pointer)来管理内存分配,该指针的初始位置为0x80,存储在地址0x40。 * `abi.encode` 会在实际数据之前添加一个32字节的字,用于指示后续数据的长度。 * 视频通过具体的例子展示了`abi.encode`和`abi.encodePacked`在编码相同数据时,自由内存指针的移动距离不同,从而验证了`abi.encodePacked`更节省内存的结论。 * 视频通过调试工具展示了内存中的数据布局,清晰地展示了填充和打包的区别。
36
0
0
5天前
通过 Yul 使用空闲内存指针的基础知识
该视频的核心内容是讲解Solidity如何管理内存中的空闲内存指针(free memory pointer),以及如何使用Yul语言访问和操作它。视频强调了在使用Yul直接操作内存时,需要手动更新空闲内存指针,否则可能导致意想不到的后果。 **关键论据/信息:** 1. **空闲内存指针的位置:** Solidity将空闲内存指针存储在内存地址`0x40`处。初始值通常为`0x80`。 2. **Solidity的自动管理:** 当使用Solidity代码(例如,将数据复制到内存)时,Solidity编译器会自动更新空闲内存指针。 3. **Yul的手动管理:** 当使用Yul语言直接访问和修改内存时(例如,使用`mload`和`mstore`),Solidity不会自动更新空闲内存指针。 4. **`msize`操作码:** `msize`操作码返回函数调用期间访问的最远内存位置。它与空闲内存指针不同,空闲内存指针是Solidity用于分配新内存的指针。 5. **潜在风险:** 如果使用Yul写入内存但不更新空闲内存指针,可能会覆盖Solidity管理的数据,导致程序出错。 6. **示例代码:** 视频通过示例代码演示了如何使用Yul读取和写入内存,以及如何使用`msize`操作码。示例还展示了如何使用Hardhat控制台日志输出空闲内存指针的值。
36
0
0
5天前
在 Yul 中使用内存 (mstore & mstore8)
该视频主要讲解了在Yul(Solidity的底层语言)中如何管理和使用内存,重点介绍了 `mstore` 和 `mstore8` 这两个关键的内存操作指令。 **关键论据/信息:** * **内存使用的必要性:** 智能合约需要内存来返回值、设置参数、获取外部调用值、回退特定字符串、记录日志、部署新合约以及使用 `keccak256` 函数。 * **内存组织:** Solidity中的内存以32字节为增量进行组织,没有垃圾回收机制。 * **关键指令:** 内存管理的关键指令包括 `mload`、`mstore`、`mstore8` 和 `mSize`。 * **`mstore` 的工作方式:** `mstore` 指令将32字节的数据写入指定的内存地址。视频演示了如何使用 `mstore` 将一个32字节的全1值(0xFF...FF)写入内存的特定位置,以及如何通过偏移量改变写入的位置。 * **`mstore8` 的工作方式:** `mstore8` 指令仅修改单个字节。视频演示了 `mstore8` 如何只修改内存地址的第一个字节,以及 `mstore` 如何覆盖 `mstore8` 的结果,因为它操作的是整个32字节的字。 * **内存指针:** 视频提到了空闲内存指针(free memory pointer),并指出后续会深入探讨。
33
0
0
5天前
在 Yul 中使用映射
该视频主要讲解了如何使用 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` 读取数组中特定索引的元素。
34
0
0
5天前
在 Yul 中使用数组
该视频主要讲解了YUL(YORL)语言中如何处理和存储数组,特别是固定大小数组、动态数组以及较小数据类型(uint8)的动态数组。 **核心内容/主要观点:** YUL处理不同类型的数组的方式不同,理解这些差异对于优化智能合约的存储和gas消耗至关重要。 **关键论据/关键信息:** * **固定大小数组:** 元素按顺序存储在连续的存储槽中,每个元素占用一个完整的32字节的存储槽(slot)。访问元素时,通过数组的起始存储槽加上索引偏移量来定位。 * **动态数组:** 数组的长度存储在数组变量对应的存储槽中。数组的实际数据存储在一个通过对数组变量的存储槽进行keccak256哈希运算得到的新的存储位置开始的连续区域中。这样做是为了避免与合约中其他变量的数据发生冲突。 * **uint8动态数组:** 由于uint8类型小于32字节,YUL会将多个uint8元素紧密地打包到一个存储槽中,以节省存储空间。一个存储槽可以容纳32个uint8元素。
33
0
0
5天前
‹
1
2
›
Reanblock
关注
贡献值: 5
学分: 10
江湖只有他的大名,没有他的介绍。
0 关注
0 粉丝
×
发送私信
请将文档链接发给晓娜,我们会尽快安排上架,感谢您的推荐!
发给:
内容:
提醒
检测到你当前登录的账号还未绑定手机号
请绑定后再发布
去绑定
×
编辑封面图
封面预览
取消
确认