Pedersen承诺是一种密码学技术,允许在不暴露向量内容的情况下对其进行编码,广泛应用于零知识证明和区块链技术中。本文深入探讨了Pedersen承诺的原理、构建、优点和应用,包括对内部乘积和矢量承诺的解释,适合对密码学有一定了解的读者。
Pedersen 承诺允许我们用一个椭圆曲线点来编码任意大的向量,同时可以选择性地隐藏与该向量相关的任何信息。
它允许我们对一个向量进行声明,而无需透露向量本身。
当我们讨论 Bulletproof 零知识证明时,它们通常是“我有两个向量的内积是 $v$”的形式。这看起来很简单,但实际上我们可以利用这一机制证明非常非平凡的声明。稍后我们将讨论这个问题。
但是,要让这样的证明有效,向量不能只是存在于证明者的脑海里——否则,证明者可以随意更改它们。它们必须是真实世界中的数学实体。一般来说,证明者不想只是将两个向量传递给验证者,但他们仍然需要“传递某种东西”给验证者,以表明他们已经选择了一对向量并且无法更改它。
这就是 Pedersen 承诺的作用所在。
在内积论证中,证明者提供两个 承诺 给两个向量,然后提供一个证明,证明所承诺的向量具有特定的内积。
我们假设读者已经熟悉 椭圆曲线点加法 和标量乘法,以及点“在曲线上的”含义。
在符号上,大写字母表示椭圆曲线点,小写字母表示有限域元素。
我们说 $A$ 是一个椭圆曲线(EC)点,$a$ 是一个 有限域 元素,而 $aA$ 是有限域元素 $a$ 和 EC 点 $A$ 之间的点乘。表达式 $A + B$ 表示椭圆曲线点加法。
当我们在智能合约中设计承诺揭示函数时,它们通常是以下形式
$$ \text{commitment} = \mathsf{hash}(\text{value}, \text{salt}) $$
其中 $\text{salt}$ 是一个随机值,用于防止攻击者通过暴力猜测 $\text{value}$。
例如,如果我们承诺一票,选择的选项有限,因此投票选择可以通过尝试所有的投票并查看哪个哈希值匹配来猜测。
在 Pedersen 承诺的情况下,salt 变量的学术术语是 blinding factor(盲因子)。因为它是随机的,攻击者被“盲目”而无法猜测所承诺的值。
由于对手无法猜测“承诺”值,我们可以说这一承诺方案是 hiding(隐藏的)。
在揭示阶段,承诺者揭示值和盐,这样另一方(或智能合约)就可以验证其是否与原始承诺匹配。无法获取另一对 $(\text{value}, \text{salt})$,从而产生相同的承诺,因此我们说该方案是 binding(绑定的)——承诺者在事后不能更改(即被绑定)他们承诺的值。
导致哈希的 $(\text{value}, \text{salt})$ 对被称为 opening(揭示值)。说某人“知道承诺的揭示”意味着他们知道 (value, salt)。揭示 $(\text{value}, \text{salt})$ 意味着 打开 这个承诺。
在讨论 Pedersen 承诺时,知道 揭示和 打开 承诺之间有区别。我们通常想证明我们 知道 揭示,但不必 打开 它。
Pedersen 承诺的行为与前面描述的承诺-揭示方案非常相似,只是它们使用的是椭圆曲线群而不是加密哈希函数。
在离散对数假设下,给定椭圆曲线点 $V$ 和 $U$,我们无法计算 $x$ 使得 $V = xU$。也就是说,我们不知道它们的 离散对数关系 ,即需要将 $U$ 自身加几次才能得到 $V$。
即使我们无法计算 $x$,我们仍然称其为 $U$ 的离散对数,因为我们知道它是存在的。所有(加密的)椭圆曲线点都有离散对数,即使这些对数无法计算。
从这个意义上讲,椭圆曲线点乘法像哈希函数一样行为。只要我们只允许在曲线阶内的揭示,它们就是绑定的。
然而,如果离散对数的范围很小,并且受应用上下文(如投票选择)的限制,则离散对数可能变得可以猜测。
我们可以通过以下方式进行隐藏的 Pedersen 承诺:
$$ \text{commitment} = vG + sB $$
其中 $v$ 是我们要承诺的值,$s$ 是盐(或盲因子),$B$ 是另一个椭圆曲线点,承诺者不知道 $B$ 和 $G$ 之间的离散对数关系。
我们应该强调,尽管离散对数未知,点 $G$ 和 $B$ 是公共...
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!