fix(js-sdk): 两个范围检查验证了错误的边界(assertIsUint128、toClearValueType)
□ 描述问题
" sdk/js-sdk " 中的两次范围检查没有检查它们所说的范围。 两者都是一相通的滑道,两者都与几行外的一相相矛盾,两者都是当前测试所看不见的,因为阴性案例仍然通过其他方式被否定.
- `sertIsUint128 ' 对受约束的 " uint256 " 进行验证
`弧/分/基/int.ts':
导出函数 profileIsUint128( 值: 未知, 选项:...): 声称值为 Uint128 { 如果 (!isUint256(值)) {// isUint128 已存在且正确 扔出无效的新 TypeError( {., expectType : “ int128 ”), 选项 ; {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢? {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
`assertIsUint8'、`16'、`32'、`64'和`256'各自称其为`isUintN'。 只有128起案件送达了256名警卫,同时仍然报告`预期的Type:`int128',因此`asUint128'返回了一个`Uint128'的品牌价值,而不是`int128'。
作为Uint128( 2n ** 200n) // 返回 2n ** 200n, 无抛出
作为Uint128(MAX UINT128 + 1n) // 返回, 无抛出
asUint128( 1n) // 扔出, 这就是为什么这很容易错过
- " To ClearValueType " 索引带有FHE类型名称的绑定表
" src/core/handle/FheType.ts " , "euint8/16/32 " 和 "euint64/128/256 " 武器:
profileIsUint( 值, {... 选项, 最大值: MAX UINT FOR TYPE [fheTypeName]] );
“MAX UINT-FOR-TYPE”由明确的类型名称键入(`int8',`int16',.),从未用“FHE”类型名称键入,因此“MAX UINT-FOR-TYPE['euint8']”是`未定义的',`isUint(价值,未定义)'不适用上限,支票已失效。 `asClearValueType', 上面四十行在同一文件中, 得到正确:
最大值: MAX UINT FOR TYPE[类型名称来自FheTypeName(fheTypeName)],
因此这两个函数在同一个输入上存在分歧:
作为 ClearValueType ('euint8', 999) // 扔出无效的Type Error 至 ClearValueType ('euint8', 999) // 返回 999 至 ClearValueType('euint64', 2n ** 200n) // 返回 2n ** 200n
这与函数本身的 doc 注释相矛盾,该注释以 QQsrows 结尾 如果价值不是预期的JS类型,或不能被胁迫。 "
□ 内容
`To ClearValueType'在公开解密路径上:`src/core/kms/publicDecryptionProof-p.ts'通过它绘制了已解码的`有序AbiEncodedClearValues'。 准确性而非戏剧性:对于手柄类型来说,一个超出范围值在后期被"创建ClearValue"/"asClearValueType"所捕捉,因此今天可见的效果是更下游更不具体的误差,而不是传到呼叫者的误差. 应该捕捉它的地层根本就没有。
`AssertIsUint128 ' 在`asUint128 ' 之外没有树上呼叫者,因此目前潜伏。
□ 重复或建议的步骤
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
cd sdk/js-sdk 安装 npm
npx vitest 运行 -- config src/vitest. config.ts
在fa40f7a'的main'基线:36个文件,910个测试,都是绿色的,因为没有任何东西行使任一功能的上限。
增加了两个案例,使差距明显可见:
//src/core/base/int.test.ts (中文(简体) ).
期望(( ())
. . . . . . .
内容来源: zama-ai/fhevm