存储 Layout : `Bytes' 数用 “u256” 计算, 跨 2^ 251 或 多个槽的包装
作者: Lokkw0510创建于 2026年8月26日更新于 2026年9月12日
标签bug :bug:
□ 说明
libsolity/interface/StorageLayout.cpp:74'计算该字段的数目 '
" 存储Layout " 输出文物,未加限制的256位乘法:
翻译: typeInfo ["number OffBytes"]=u256 ( type-> storageBytes () * type-> storageSize ()).str (); ;
`储存Size()'是一个`u256'槽计数,而`储存Bytes()'为32,所以产品无声地包装。
和所排放的值为`(32 * 槽)mod 2^256'。
现有警卫不负责此事,因为其名称是不同的单位。
`合同级别检查员:检查StorageSize ' 将**相位**的计数限制在2^256以下,而
`数目 ' 需要`32 *分档 < 2^256',即`分档 < 2^251'。 每个大小在
`[2^251,2^256]'被接受、编译和包装。
反之,`ArrayType: storageSize ()'(`Types.cpp:1830-1831')有意地促进`大'
并称槽计数为256比特,“StorageOffsets:computeOffsets”
(`Types.cpp:142-172')使用有两名警卫的`Bigint'。 `Storage Layout.cpp:74 ' 似乎是唯一一个
在“libsoliity”/“libyul”中,用“storageSize()”来乘以“storageBytes()”,即:
可能为什么编码基因不会受到影响
** 预计:** " 字节数 " 大于32个,与同值的 " 分数 " 一致
文档。 `docs/internals/layout in storage.rst:312-313'表示: *'`bytes'之数为:
使用字节(作为小数字符串)。 请注意,如果“Bytes数 > 32”表示一个以上。
使用了插槽。”
** 实际:** `Bytes'号为`32'-字节与平地`int256'同为`32'-,而字节相同。
JSON将以下变量放入2^251+1槽. 该文件自相矛盾,因为
`分数 ' 值来自被溢出检查的`大'道,只有字节数是错误的。
注意此仅是一个输出- 艺术缺陷: 插槽、 抵消和生成代码都正确 。
□ 环境
- 编译版本:0.8.36+承诺8a079791(还转载于0.8.0至0.8.36;资料来源为:
关于当前`发展'的同文行
- 编译管道(Legacy、IR、SSA CFG):所有——缺陷在于输出生成,而不是代码
- 目标EVM版本(按编译器设置):默认(`osaka');不依赖EVM版本
- 框架/IDE(如创始人、Hardhat、Remix):`Solc'直接命令行
- EVM执行环境/后端/块链客户端:n/a——不需要执行
- 操作系统:macOS 26.5.2
□ 步骤重现
`poc.sol':
团结
//SPDX-License-识别器:GPL-3.0
立体固态为0.8.0;
合同C {
(二) 旺蒂256[2**251+1] v;
(一) 尾巴;
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?solc -- storage-layout poc. sol (英语).相关产出:
v 位数=0 OffBytes=32
尾槽=36185027886631106986593281521497120414687020807626233049500247285301249" v " 报告32字节,而 " 尾 " 则放在2^251+1后档。
** 控制**-一个真正的一分点变量产生相同的`数Bytes':
团结 合同C{ uint256 v; uint256 尾;}
v 位数=0 OffBytes=32 尾声 . . . . . . .
内容来源: argotorg/solidity