一个看似没用的小操作
给你一个 256 位的二进制数,问它开头有多少个连续的零。比如一个数值很小,二进制表示的开头会有一长串零;数值逼近 2 的 256 次方,前导零就趋近于零。这个操作叫数前导零(Count Leading Zeros,简称 CLZ),在普通电脑里是几乎所有主流 CPU 的原生指令,一条机器指令就能完成。而在以太坊虚拟机里,直到 EIP-7939 出现之前,它都只能用一串操作码组合硬凑。

数前导零为什么重要
直觉上想:一个数的前导零个数,等价于问这个数用二进制写出来有多长。这两个问题互为镜像,而二进制长度恰好是大量算法的关键中间量。
一是数值范围判断。判断一个数落在哪个数量级,做指数或对数运算时确定缩放因子,本质都是求二进制长度。去中心化交易所里常用的定点数数学库,做乘方、自然对数这类运算时,第一步往往就是确定操作数的位长,再用查表和移位完成后续。二是二分与树结构。默克尔树的层定位、按位长的快速比较,都可以用前导零一步到位。三是压缩与比特扫描。哪些字节为零、从哪里开始有有效数据,CLZ 是这类扫描的最小构件。
没有 CLZ 的时候,合约作者用位移、比较、查表的组合模拟,往往要多花几十到上百 Gas,而且代码晦涩。EIP-7939 的判断是:既然这是一条 CPU 原生、且是许多高效算法骨架的操作,就值得在 EVM 里给它一个自己的操作码。
规则本身
CLZ 的操作对象是栈顶的 256 位字:弹出这个数,把它的二进制前导零个数压回栈。协议文本里有一个值得注意的边界:当这个数等于零时,结果定义为 256,也就是全部位都是零。这个定义让 CLZ 在数学上处处有定义,合约不需要再为零值单独写分支。
按 EIP 的设定,它的成本是固定量级——不管数值形状如何,执行代价都相近,这正是硬件原生指令的特征。这条操作码随 Fusaka 升级在 2025 年 12 月 3 日于以太坊主网激活,属于那次升级的核心改动之一。
谁能感受到它的存在
直接受益的是链上数学库与协议实现者:做利息复利计算、固定摊销、AMM 曲线近似、以及各类需要位运算的底层库,能用更少的 Gas 与更清晰的代码完成原本晦涩的模拟。普通用户一般不会直接感知一条操作码的诞生,感受路径是间接的——依赖这些数学库的协议,其调用的 Gas 开销可能随实现更新而缓慢下降。
还有一类低调的受益者是跨链与互操作组件:批量证明、签名聚合、状态压缩这些环节里,扫描有效位是热路径上的高频动作,一条原生指令省下的是每一次验证都要付的重复成本。
快速问答
问:CLZ 是不是只对大数有用? 答:恰恰相反,数值越小前导零越多,这个操作对所有输入都有定义、都可能有用途,零值也有明确结果 256。
问:有了 CLZ,旧数学库会立刻换实现吗? 答:不会自动发生。已部署合约无法修改,收益要等新部署或升级的协议逐步采用。
问:它会改变 EVM 的状态模型吗? 答:不会,它只是栈上的纯计算操作,不碰存储,也不碰账户。
常见误区
一是低估它的用途,觉得数零没什么价值,实际上它是位长度问题的直接答案,而位长度是数值算法的骨架。二是把它与移位、与或这些已有位操作混为一谈,CLZ 提供的是数量级判断的一跳直达,与逐位处理是互补关系。三是把操作码进入规范当作链上 Gas 立即下降,协议提供的是原料,省不省钱取决于上层库何时换用新原料。
风险提示:本文为协议机制科普,不构成任何投资建议;涉及合约实现与Gas优化,请以当期官方规范与实测数据为准。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。