零知识范围证明支持说明(Go)

最近更新时间:2024-01-15 14:42:01

我的收藏

简介

在 Fabric 区块链网络中,用户可以把业务数据按照特定的业务逻辑上链。链上存储 hash 数据具备了隐私性强的特点,但存在参与方难以对链上的 hash 数据直接操作的问题。存在如下场景,用户数据不能直接向其他组织直接开放,但其他组织又需要根据链上数据进行特定的运算背书,同时其他组织需要确定链上的数据在特定的数值范围内。例如,在用户转账场景中,对于加密的用户账户,参与方需要判断用户的余额大于等于转账金额,同时可以直接利用链上的加密数据进行加减操作。
针对以上问题,TBaaS 引入 Bulletproofs 零知识范围证明的能力,保证了数据隐私性、链上透明性和数据可操作性。Bulletproofs 零知识范围证明可以利用 Pedersen 承诺算法将明文数值隐藏,实现数据加密。同时 Pedersen 承诺是一个支持同态加法、减法、部分乘法运算的算法,因此在对已经制成承诺的数据进行运算时,不使用“解密-运算-加密”流程,而是直接对承诺进行计算。

TBaaS 的零知识范围证明能力特点

TBaaS 的零知识范围证明能力,主要体现在以下两个方面:
TBaaS 提供了零知识范围证明使用的两个工具 BulletproofsPedersen。Bulletproofs 工具提供生成范围证明、验证范围证明与承诺的有效性、范围证明的同态运算(加、减、乘)等功能。Pedersen 工具提供生成承诺、验证承诺、致盲因子的随机生成、同态加法、减法、乘法及求相反数运算。
TBaaS 在 Go 语言智能合约中,额外引入了 Bulletproofs 包,增加了零知识范围证明 API 接口。用户可以通过在智能合约中使用 API 接口,实现验证范围证明与承诺的有效性、范围证明的同态运算(加、减、乘)等功能。
下面将分别对零知识范围证明工具 Bulletproofs 和 Pedersen 进行说明。

零知识范围证明工具 Bulletproofs

Bulletproofs 工具是零知识范围证明 Bulletproofs 算法的用户端工具。零知识范围证明算法在提供验证一个数值属于 [0,264) 的同时,不向验证者泄露此数值。该工具提供生成范围证明、验证范围证明与承诺的有效性、范围证明的同态运算(加、减、乘)等功能。您可访问 Bulletproofs 进行下载。

使用说明

命令
描述
输入参数
输出
prove
为输入的数字生成零知识证明,证明其为非负整数。
value:无符号整数,证明该整数是非负数。
opening:用于在 Pedersen 承诺和 Bulletproofs 证明中隐藏整数 value 的随机数,也用来验证某个 Pedersen 承诺中隐藏的整数是否是某个给定值时用到的致盲因子。(可选,若不给出则使用一个密码学随机数)
proof:{proof}类型的字符串,是零知识范围证明的内容。
commitment:{commitment}类型的字符串,是对应 proof 的承诺。
opening:{opening}类型的字符串,用在 commitment 中作为致盲因子的部分,需要用户自行保存,在核对 commitment 中的数值时使用。
verify
验证已输入 Bulletproofs 证明和 Pedersen 承诺的有效性。
proof:{proof}类型的数据,由 prove 或者 add、sub、mul 等同态运算命令生成的零知识范围证明。
commitment:{commitment}类型数据,由 pedersen 工具、prove 命令或者 add、sub、mul 等同态运算命令生成的 Pedersen 承诺。
若 proof 与 commitment 相符,并且 commitment 中隐藏的值为非负整数,则显示 “Valid proof”,否则显示 “Invalid proof”。
add
证明的同态加法计算。支持“承诺 + 承诺”、“承诺 + 数值”两种模式。
value1、value2:数字,分别在commitment1、commitment2两个承诺中。
commitment1、commitment2:相加的两个承诺。
opening1、opening2:分别为 commitment1和 commitment2的致盲因子。

其中,commitment2、opening2是可选入参,如果同时给出了这两个入参,则使用“承诺 + 承诺”模式,否则使用“承诺 + 数值”模式。
proof:value1 + value2为非负整数的证明。
commitment:value1 + value2的承诺。
opening:commitment 的致盲因子。
sub
证明的同态减法计算。支持“承诺 - 承诺”、“承诺 - 数值”两种模式。
value1、value2:数字,分别在commitment1、commitment2两个承诺中。
commitment1、commitment2:相减的两个承诺。
opening1、opening2:分别为 commitment1和 commitment2的致盲因子。

其中,commitment2、opening2是可选入参,如果同时给出了这两个入参,则使用“承诺 - 承诺”模式,否则使用“承诺 - 数值”模式。
proof:value1 - value2为非负整数的证明。
commitment:value1 - value2的承诺。
opening:commitment 的致盲因子。
mul
证明的同态乘法计算。只有“承诺 * 数值”的模式。
value1、value2:相乘的两个值。
commitment1:包含 value1的承诺。
opening1:commitment1的致盲因子。
proof:value1 * value2为非负整数的证明。
commitment:value1 * value2的承诺。
opening:commitment 的致盲因子。

零知识范围证明工具 Pedersen

Pedersen 工具是 Pedersen 承诺的用户端工具。Pedersen 承诺是一个同态加密算法,可以隐藏明文,且与目标明文绑定。但 Pedersen 承诺不能进行解密,作为替代,它支持对明文、承诺(密文)关联性的验证。Pedersen 承诺中用于生成承诺和验证明文、承诺关联性的组件被称为致盲因子,又叫做 opening。该工具提供生成承诺、验证承诺及致盲因子的随机生成、同态加法、减法、乘法、求相反数运算的工具。您可访问 Pedersen 进行下载。

使用说明

命令
描述
输入参数
输出
commit
生成承诺。
value:在承诺中绑定及隐藏的目标值。
opening:用于隐藏 value 的随机数。若不给出则随机生成一个致盲因子。
commitment:绑定了 value 的承诺。
opening:用于生成 commitment 的致盲因子。
verify
验证 Pedersen 承诺的有效性。
commitment:绑定了 Value 的 Pedersen 承诺。
value:在承诺中绑定及隐藏的目标值。
opening:用于隐藏 value 的随机数。若不给出则随机生成一个致盲因子。
Valid or Invalid。
genOpening
生成随机致盲因子。
-
opening:一个随机生成的44-byte 的 base64字符串(32-byte 二进制串)。该随机字符串可用于在生成承诺 ./pedersen commit 或生成证明 ./bulletproofs prove 命令中作为指定的随机数入参。
openingAdd
在 Pedersen 承诺的 “承诺 + 承诺” 同态加法运算中更新致盲因子。
opening1、opening2:两个相加的致盲因子。
opening:opening1 + opening2
openingSub
在 Pedersen 承诺的 “承诺 - 承诺” 同态减法运算中更新致盲因子。
opening1、opening2:两个相减的致盲因子。
opening:opening1 - opening2
openingMul
在 Pedersen 承诺的 “承诺 * 数值” 同态乘法运算中更新致盲因子。
value:参与乘法的数值。
opening:参与乘法的致盲因子。
opening:opening * value
openingNeg
计算 opening 的相反数(mod p 数域内的相反数,其中 p 是一个大质数)。
opening:需要求相反数的目标致盲因子。
opening:- opening


Go 语言智能合约 Bulletproofs 包接口说明

用户在 TBaaS 中使用 Go 语言智能合约时,可直接 import bulletproofs 包,使用相关的接口。当前接口支持验证范围证明与承诺的有效性,同态加法、减法、乘法、求相反数运算。

Bulletproofs 包支持接口

接口
功能
参数
输出
BulletproofsVerify(proof []byte, commitment []byte) (bool, error)
验证范围证明与承诺的有效性。
proof:672 - byte 二进制串,证明内容。
commitment:32 - byte 二进制串,与 proof 对应的 Pedersen 承诺。
证明有效性:若证明与承诺通过验证,即 x 在[0, 264) 范围内,则返回 true,否则为 false。
错误信息
PedersenAddNum(commitment []byte, value uint64) ([]byte, error)
进行“承诺 + 数值”的同态运算,该运算不涉及致盲因子变化,链上、线下皆适用。
commitment:32 - byte 二进制串,原承诺。
value:无符号64位整数,参与同态运算的数值。
新承诺:32 - byte 二进制串,假设 commitment 所绑定值为 x,则新承诺绑定值为 “x + value”,致盲因子不变。
错误信息
PedersenAddCommitment(commitment1, commitment2 []byte) ([]byte, error)
进行“承诺 + 承诺”的同态运算,仅返回新承诺,虽然致盲因子发生变化,但运算过程及结果中不出现新旧致盲因子,适用于链上数据更新。
commitment1:32 - byte 二进制串,绑定值为 x、致盲因子为 r 的承诺。
commitment2:32 - byte 二进制串,绑定值为 y、致盲因子为 s 的承诺。
新承诺:32 - byte 二进制串,绑定值为 x + y、致盲因子为 r + s 的承诺。
错误信息
PedersenSubNum(commitment []byte, value uint64) ([]byte, error)
进行“承诺 - 数值”的同态运算,该运算不涉及致盲因子变化,链上、线下皆适用。
commitment:32 - byte 二进制串,原承诺。
value:无符号64位整数,参与同态运算的数值。
新承诺:32 - byte 二进制串,假设 commitment 所绑定值为 x,则新承诺绑定值为 x - value,致盲因子不变。
错误信息
PedersenSubCommitment(commitment1, commitment2 []byte) ([]byte, error)
进行“承诺 - 承诺”的同态运算,仅返回新承诺,虽然致盲因子发生了变化,但运算过程及结果中不出现新旧致盲因子,适用于链上数据更新。
commitment1:32 - byte 二进制串,绑定值为 x、致盲因子为 r 的承诺。
commitment2:32 - byte 二进制串,绑定值为 y、致盲因子为 s 的承诺。
新承诺:32 - byte 二进制串,绑定值为 x - y、致盲因子为 r - s 的承诺。
错误信息
PedersenMulNum(commitment1 []byte, value uint64) ([]byte, error)
进行“承诺 * 数值”的同态运算,仅返回新承诺,虽然致盲因子发生了变化,但运算过程及结果中不出现新旧致盲因子,适用于链上数据更新。
commitment:32 - byte 二进制串,原承诺。
value:无符号64位整数,参与同态运算的数值。
新承诺:32 -byte 二进制串,假设 commitment 所绑定值为 x、致盲因子为 r,则新承诺绑定值为 x * value,致盲因子为 r * value。
错误信息