我最近在重新学以太坊opcodes,也写一个“WTF EVM Opcodes极简入门”,供小白们使用。
所有代码和教程开源在github: github.com/WTFAcademy/WTF-Opcodes
这一讲,我们将介绍EVM唯一内置的密码学指令--SHA3
,你可以用它计算keccak-256
哈希。
SHA3指令
在EVM中,计算数据的哈希是一个常见的操作。以太坊使用Keccak算法(SHA-3)计算数据的哈希,并提供了一个专门的操作码SHA3
,Solidity中的keccak256()
函数就是建立在它之上的。
SHA3(offset, size)
指令从堆栈中取出两个参数,起始位置offset
和长度size
(以字节为单位),然后它从内存中读取起始位置offset
开始的size
长度的数据,计算这段数据的Keccak-256哈希,并将结果(一个32字节的值)压入堆栈。它的操作码为0x20
,gas消耗为30 + 6*数据的字节长度 + 扩展内存成本
。
在Python中,我们可以使用pysha3
库来实现keccak-256
哈希计算。首先你需要安装这个库:
下面,让我们在极简EVM中支持SHA3指令:
我们可以尝试运行一个包含SHA3
指令的字节码:0x5F5F20
(PUSH0 PUSH0 SHA3)。这个字节码将两个0
推入堆栈,然后使用SHA3
指令计算0
的哈希。
我们可以在evm.codes上验证结果:

总结
这一讲,我们介绍了EVM中重要的操作符SHA3
,它为我们提供了计算数据哈希的功能,这在验证数据或身份时非常重要。目前,我们写的极简EVM已经支持了112/144个操作码,剩下的不多了!