欢迎光临
我们一直在努力

批量多项式校验为何需要挑战值:别把求和当成安全证明

两个错误在固定权重下抵消的反例示意

把多个验证任务合成一次计算,是降低开销的常见方向。但“检查总和正确”并不自动说明每一项都正确:一个正误差和一个负误差可能刚好抵消。如果合并权重提前固定,恶意输入甚至可以针对这个检查来构造。

这篇先用有限域里的小例子说明挑战值的作用,不实现 KZG 或 IPA,不给出批量打开的 Gas 和证明耗时。Nova 与 HyperNova 是折叠研究的具体成果,各自有定义和假设,也不能简化成任意数据相加就得到一个安全证明。Nova、HyperNova

一个总和通过、逐项都错的反例

假设两项声明相对正确结果的误差分别是 +3、-3。按相同权重求和得到零,检查器会漏掉这两个错误。若换成 r*e0+e1,在示例挑战 r=2 下,就不再为零。

固定权重可让两个错误相互抵消,承诺之后的挑战值用于改变合并检查

P = 101

def eval_poly(coeffs, x):
result = 0
for c in reversed(coeffs):
result = (result * x + c) % P
return result

z = 4
actual = [eval_poly([1,2], z), eval_poly([3,1], z)]
claimed = [(actual[0] + 3) % P, (actual[1] – 3) % P]
errors = [(a-b) % P for a,b in zip(claimed, actual)]
def batch_error(r):
return (r * errors[0] + errors[1]) % P

assert errors == [3, 98]
assert batch_error(1) == 0 # fixed equal weights miss both errors
assert batch_error(2) == 3 # another challenge detects this example
assert all(a != b for a,b in zip(actual, claimed))
print("4 field-arithmetic checks passed; no commitment or proof generated")

保存为 batch_error.py,运行 python3 batch_error.py。r=2 是为了固定演示输出,不是密码学随机数。有限域只有 101 个元素,也不具备生产安全参数。这个反例说明固定求和的不足,并没有证明另一组权重对所有攻击都有效。

挑战必须绑定到已经确定的上下文

真实协议通常还要回答:声明和承诺何时固定,挑战如何产生,转录包含哪些域信息,攻击者能否在看到挑战后再改输入,以及挑战落在坏点的概率如何控制。Fiat–Shamir 变换不是“把任意 JSON 做一次哈希”的代名词;编码和域隔离都是协议的一部分。

聚合也不能随意替换语义不同的检查。例如每个量化余数分别落在区间内,比“某个加权总和落在区间内”强。要删掉逐项约束,必须有相应的健全性论证,而不是凭一条看起来像随机线性组合的式子。

性能比较要回到完整实现

KZG、IPA 与折叠方案的成本取决于曲线、承诺结构、验证位置、可信设置及实现。单说“64 个多项式”不足以确定证明大小,更不足以推出链上验证 Gas。把论文中的复杂度、库的微基准和应用端到端耗时混在一张表里,会制造不存在的可比性。

本文仅检查小域反例,没有运行承诺库、椭圆曲线、证明器或链上验证器。需要落地时,应固定成熟实现与版本,使用其测试向量并单独记录测量范围,再判断批量处理到底减少了哪一项成本。

赞(0)
未经允许不得转载:171主机测评 » 批量多项式校验为何需要挑战值:别把求和当成安全证明
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址