A Short Introduction To Huff
Jan 9, 2023, KCC has been invited to do a presentation on Moonshot Hackathon. Since it is an inner workshop, we will share the recap of Junm, the KCC blockchain engineer’s speech here.
Time: Jan 9, 2023
Venue: Moonshot Hackathon
Topic: A Short Introduction To Huff
Overview(~3min)
- Huff 是一种底层语言。
- 最早几年前,Aztec 的团队开发了 Huff 语言,因为 **当时(Istanbul 硬分叉之前)**precompile gas cost 太高,而 Solidity 和 Yul 都无法满足他们需求。
- 几个月前,huff-rs 编译器出来,并对 foundry 有很好的支持,于是 Huff 又开始受到一些关注,并且被认为是非常适合学习 EVM 的一个底层语言。
- Yul 的定位是一种 IR(intermediate representation),在语言设计的时候,设计目标中尝试将 EVM 的 stack 尽量抽象掉,因此通过 Yul 去学习 EVM 并不是一个好的主意。而 Huff 更推荐用来学习 EVM,因为它更接近 bytecode/mnemonic,将 EVM 的 stack 直接暴露给了开发者。
A Short Introduction to EVM(~5min)
BTW: 之前,我有在其他地方做一个更详细的分享,如果感兴趣,可以参考这个视频。
Stack ⇒ LIFO (Last in first out)
- EVM 里面最基本的指令就是一系列 PUSH,这些 PUSH 可以把 bytes 放到 Stack 的顶部
- EVM 里面的其他 Operators,它们的输入和输出也大多放在 Stack 的顶部,比如这里的乘法 MULT
- EVM 的 Stack 中的每个 Entry 是 32 bytes, 也就是 256 bits; EVM 的 byte order 是 big endianness
下面这两张图图片引用自这里
“Stack too Deep”:
Simple Multiplication(~5min)
EVM 的智能合约是没有 “函数” 的概念的,函数是编译器为你抽象出来的。
当你向一个智能合约发起一笔交易的时候,EVM 会从合约的 code 中的第一个指令开始执行。
上面左边是 bytecode 和 对应的 mnemonic; 右边是 huff 和 使用 yul 来写同样的程序。
- bytecode 读起来是很痛苦的
- huff 看起来似乎像是简化版本的 mnemonic
- Yul 将 Stack 隐藏了起来
A Contract With Two Functions (~9min)
Message Call:
Function Dispatching Based on the function selector:
Huff does not abstract function dispatching.
Get Selector From Calldata:
Function Dispatching:
Jump Tables(~6min)
Without jump tables:
Example from here:
“Foundry-huff”
Test in foundry:
Close
- An afternoon, a cup of coffee, and huff.sh