概念
在区块链应用中还有一种特殊的零知识证明场景,即当事人交易过程中的交易金额属于隐私信息,希望能受到保护。区块链中的其他参与方如何在不知道交易金额的情况下验证这笔交易是收支平衡的呢?这就要用到同态承诺(Homomorphic Commitment)技术。
承诺的概念
密码学中的“承诺”是指对一个既有的确定的事实(隐私数据)进行陈述,保证未来的某个时间验证方可以验证承诺的真假,也就是说承诺是个当前时间存在的且未来不会发生变化的事实。
承诺包含承诺方和验证方两个角色,通常分为三个阶段
- 初始化阶段
承诺方根据算法选择相应的参数进行初始化,并根据算法公开相关参数 - 生成阶段
承诺方选择一个暂不公开的敏感数据 $ v $,计算出对应的承诺 $ C $ 并公开 - 披露阶段
也称为承诺打开 - 验证(Open-Verify)阶段,承诺方公布隐私数据 $ v $ 的明文和其他必要参数,验证方重复承诺 $ C $ 生成的计算过程,比较新生成的承诺与之前收到的承诺 $ C $ 是否一致,一致则表示成果,否则失败。
承诺具备以下两个特性
- 隐匿性
做出的承诺是密文形式,在打开承诺之前验证方无法知晓承诺方的隐私数据内容 - 绑定性
一旦承诺生成并公开,承诺方不能将一承诺的隐私数据换成(或解释成)另一个不同的数据
哈希承诺
我们知道哈希算法是一个单向不可逆的算法,且对于不同的输入 $ v $,得到的结果 $ H(v) $ 也不同。随机输入一个 $ v $,得到的 $ H(v) $ 是均匀分布的,且无法预测(抗碰撞性)。基于哈希算法的单向性,难以通过 $ H(v) $ 反推出隐私数据 $ v $,这确保了一定的隐匿性;基于哈希算法的抗碰撞性,难以找到不同的隐私数据产生相同的哈希值,这确保了一定的绑定性。
椭圆曲线
椭圆曲线上的点可以进行加、减或乘(乘以整数,也称标量)运算。椭圆曲线上的点满足以下特性:给定一个证书 $ k $,;其可以与曲线上的点 $ H $ 进行标量乘法运算,即 $ k \times H $,所得结果也是曲线 $ C $上的一个点。给定另一个整数 $ j $,$ (k + j) \times H = k \times H + j \times H $,即椭圆曲线上的加法和标量乘法运算保持加法和乘法的交换律和结合律。
在 ECC(Elliptic Curve Cryptography,椭圆曲线密码学)中有这样一个性质:如果选择一个非常大的数字 $ k $ 作为私钥,$ k \times H $ 和 $ H $ 作为相应的公钥,那么通过公钥推导出私钥几乎是不可能的。类似这样的特性:向一个方向计算容易,但反过来倒推很困难的算法被称作单陷门函数(Trapdoor Function)。椭圆曲线就可以看作一个很好的陷门函数。
Pedersen同态承诺
Pedersen承诺目前主要搭配 ECC 使用,具有基于离散对数困难问题的墙绑定性以及同态加法特性。
以结合椭圆曲线为例来说明,Pedersen承诺核心公式表达为 $ C = r \times G + v \times H $,其中 $ C $ 为生成的承诺值,$ G、H $ 为特定椭圆曲线上的生成点,$ r $ 代表盲因子(Blinding Factor),$ v $ 代表隐私信息。由于 $ G、H $ 为特定椭圆曲线上的生成点,所以 $ r \times G $ 、$ v \times H $ 可以看作相应曲线上的公钥($ r、v $ 可视为私钥)
Pederson承诺还具备加法同态特性,这是椭圆曲线点运算的性质决定的,假设有两个要承诺的信息 $ v_{1}、v_{2} $,随机数 $ r_{1}、r_{2} $,生成对应的两个承诺为:
$$ C(v_{1}) = r_{1} \times G + v_{1} \times H, C(v_{2}) = r_{2} \times G + v_{2} \times H $$
则有如下特性:
$$
\begin{array}{lll}
C(v_{1} + v_{2}) & = (r_{1} + r_{2}) \times G + (v_{1} + v_{2}) \times H \\
& = (r_{1} \times G + v_{1} \times H) + (r_{2} \times G + v_{2} \times H) \\
& = C(v_{1}) + C(v_{2})
\end{array}
$$