在 Yul 中没有多种类型的概念,或者说只有一种类型——u256,也可以理解为 bytes32。
for 循环与 if 语句。
读取和修改存储变量。
读取和修改同一个槽中的不同数据,往往需要使用位移和掩码操作。
数组与映射是如何存放在“存储槽”的?
从本章开始,我们来研究内存布局。
Solidity 是如何使用内存的?
一些内存使用的注意事项。
本章我们来看看 `return(p, s)` `revert(p, s)` `keccak256(p, n)` 这三条指令。
关于 `log` 的指令。
在 Solidity 中关于 tx.data 有约定俗成的用法。
关于合约之间调用的指令 `call`、`callcode`、`delegatecall` 和 `staticcall`。
可变长度的数据,ABI 采用了一种指针和数据分离的方式进行编码。
本文将介绍两种常见转账的实现方式,以及它们在 Yul 中的对应写法和 gas 费用的比较。
让我们来看一下如何使用 Yul 编写一个合约,并使其能够接受外部调用。
100% Yul 合约。
在本节中,我们将详细讲解官方文档中的 100% Yul 实现的 ERC20 合约。
在这最后一节,我们将看一些 Yul 中相对较少使用的指令。
在这系列文章中,我们将深入探讨 Solidity 的内联汇编(Yul)。你可能会问:“我学会 Solidity 不就能写大部分合约了吗?为什么还需要学习内联汇编?”的确,大部分合约的编写完全可以通过 Solidity 完成。但内联汇编是 Solidity 的一个重要补充,它让你更深入地理解底层操作和合约优化。
起初,我也曾对内联汇编感到困惑,尽管我曾尝试过,但很快就忘记了。中文资料少且零散,这使得学习内联汇编变得更加困难。后来,找到了 Jeffrey Scholz 较为系统的讲解 Yul 的课程,此系列文章为我当时的学习笔记整理而来。学习 Yul 让我对存储、内存、栈、合约调用以及 ABI 编码有了更深入的理解。
即使你未来可能不会直接编写内联汇编代码,但掌握这些知识对编写更高效的 Solidity 合约是非常有帮助的。希望这系列文章能帮助你更好地理解内联汇编的基础及其在合约中的应用。