铜锁 Bulletproofs Range 使用教程
背景
在许多应用场景中,需要证明一个值满足特定的范围条件,但又不希望透露该值的具体大小,传统的证明方法可能需要暴 露更多的信息,而范围证明可以提供一种更高效、更隐私保护的方式来实现这一目标。Bulletproofs Range Proof(范围证明)就是这样一种高效的范围证明技术,Range Proof 也是 Bulletproofs 算法的一个重要应用,用于证明一个值位于指定的范围内:,(n 为指数,是 Range Proof 的重要参数)。 在加密货币交易中,范围证明可以用于证明交易金额在特定范围内,以确保交易的合法性和保护用户隐私,这可以防止恶意用户创建无效的交易或泄露敏感的交易金额信息。而 Bulletproofs 具有 proof 较小的特点,可以大大减小交易成本。以下是一些使用 Bulletproofs 的区块链项目:
- Monero(门罗币):Monero 是一种基于隐私的加密货币,它使用了 Bulletproofs 技术来实现交易的隐私和匿名性。Bulletproofs 可以帮助减小 Monero 交易的大小,提高交易的效率,并保护用户的隐私。
- Grin:Grin 是一种基于 MimbleWimble 协议的加密货币,它使用了 Bulletproofs 技术来实现交易的隐私和可扩展性。Bulletproofs 在 Grin 中被用于构建零知识证明,以验证交易的有效性和保护用户的隐私。
- Zcoin:Zcoin 是一种基于零知识证明的隐私加密货币,它使用了 Bulletproofs 技术来改进其零知识证明方案。Bulletproofs 可以帮助 Zcoin 实现更高效和更紧凑的证明,提高隐私保护的性能。
Bulletproofs 的零知识证明和范围证明特性使其成为提高区块链隐私和性能的有力工具,因此在隐私保护和可扩展性方面具有广泛的应用潜力。
命令行
公共参数(-ppgen/-pp)
- 生成公共参数
$ tongsuo bulletproofs -ppgen -out ./pp.pem -curve_name sm2 -gens_capacity 16 -party_capacity 4
参数说明,其中 bulletproofs 是 tongsuo 的子命令:bulletproofs 功能。不再赘述。
- -ppgen:是 bulletproofs 的子命令,指公共参数的生成,pp 是 pub_param 的缩写,gen 是 generate 的缩写;
- -out:输出文件路径;
- -curve_name:椭圆曲线名称;
- -gens_capacity:椭圆曲线点生成器的容量,对于 range proof 来说,该数是 range 的比特位数。这里是 16 位,也就是证明的范围为:,即:
- -party_capacity:可以生成聚合证明的最大参与方数量,仅对 range proof 有效,也就是批量范围证明的最大个数。这里是 4,也就是最多只能批量证明/验证4个数。
- 文本显示公共参数
-pp 是用来显示公共参数的子命令。
$ tongsuo bulletproofs -pp -in ./pp.pem -text -noout
Bulletproofs Public Parameter:
curve: SM2 (1172)
gens_capacity: 16
party_capacity: 4
G[n]:
[0]: 02:b2:83:7e:13:99:e9:d7:93:57:8d:11:4a:e7:f1:01:66:0b:b2:7b:d9:2e:a4:c7:8a:bf:a6:10:89:0c:c6:93:e9
[1]: 02:7e:44:85:96:15:53:db:f2:72:66:c5:af:b6:4d:d2:1b:f0:b7:aa:3a:f2:3a:14:fd:99:2c:e0:5d:56:26:2e:fb
[2]: 02:81:57:f9:d5:38:f2:11:16:f4:a1:45:60:8e:50:da:31:2d:6a:c8:fa:19:d3:36:90:66:01:14:2c:14:53:0b:f0
[3]: 03:20:46:61:ea:ff:68:49:a3:e3:d9:d5:3b:6a:a0:22:c4:78:47:c1:d0:1b:08:d7:42:8b:c9:19:d1:a8:f5:e5:18
# 太长了,中间省略了 #
[60]: 03:a7:b9:80:6f:ff:7d:30:6e:86:9d:d4:e0:cd:52:ee:cc:10:7e:0d:0e:6e:26:25:ae:bb:5d:48:b3:43:c0:4a:a0
[61]: 03:4a:b8:07:7f:44:49:b2:0e:b9:26:4e:56:97:76:89:57:22:e7:34:3d:c2:e1:d9:57:a3:73:0d:dd:49:79:19:f0
[62]: 03:9f:24:5c:30:a8:6d:08:75:8a:4c:79:04:f0:e5:41:b7:3d:41:84:71:51:77:8e:41:36:4a:9b:b6:24:bb:26:73
[63]: 03:97:c7:a6:45:70:19:a2:ae:ff:52:fa:1c:c7:f2:e6:a0:dd:91:fd:e8:97:d8:c2:9b:4e:41:a4:9c:17:73:63:8b
H[n]:
[0]: 03:0a:b0:b0:4c:09:7f:ec:e2:a8:41:c0:fc:75:ad:f3:02:cf:af:6a:77:a7:96:35:d8:ce:8b:6a:4b:02:a3:8c:49
[1]: 02:5e:1d:90:be:23:90:a9:a6:02:b2:9f:b2:07:70:eb:f5:d3:0d:93:65:bd:ac:60:21:50:cc:d2:05:29:29:9d:5d
[2]: 03:3c:d3:ef:45:77:e1:0d:e4:51:6e:73:ae:61:04:fc:6a:8d:f1:69:a6:9e:ca:d8:c4:bb:63:4c:37:c6:30:c9:05
[3]: 03:b1:1d:fb:e0:f3:1f:33:a1:12:cf:58:0b:2c:a4:13:68:7f:42:57:98:f4:3d:0f:0c:88:98:f7:31:0e:e7:35:27
# 太长了,中间省略了 #
[60]: 02:bc:b6:19:81:7e:53:21:f0:b9:00:fe:b2:77:47:4c:e5:d8:f4:57:43:d0:5a:52:ba:78:59:6c:e6:00:78:23:04
[61]: 03:cd:c2:e8:fc:27:0b:2c:af:6b:39:d7:c0:7b:2a:58:61:dd:36:8e:72:3d:6c:c1:1f:b0:12:3e:9d:78:c3:7b:cd
[62]: 03:27:53:ec:07:b8:05:fe:24:5f:77:1d:62:c1:32:8f:75:8b:1e:bc:4f:92:ca:02:c1:ef:26:73:b3:c7:41:83:32
[63]: 02:f0:7c:60:03:68:41:08:27:6b:d8:0b:f1:37:ba:0f:68:ac:33:f9:2b:4d:b6:74:d7:21:9f:7b:73:4c:8c:2e:90
U: 03:34:aa:13:0f:76:92:8d:33:1f:62:00:70:ff:04:86:08:9c:c7:3b:77:66:af:77:59:ce:d9:69:66:86:60:db:24
H: 02:e5:21:75:20:47:fb:c2:76:c2:86:3c:10:e0:4c:1e:72:66:26:7b:3d:5d:ac:5b:a0:de:ab:11:d3:56:bd:fc:f1
如上结果所示,G[n] 和 H[n] 就是随机生成椭圆曲线 SM2 上的点,n = gens_capacity * party_capacity,上图是 64,中间一些随机点由于太长太点篇幅省略掉了。
证据(-witness)
- 生成证据
$ tongsuo bulletproofs -witness -pp_in ./pp.pem -out witness_range.pem 11 22 10000
$ tongsuo bulletproofs -witness -pp_in ./pp.pem -out witness_range_capacity_exceeded.pem 11 22 33 44 55
$ tongsuo bulletproofs -witness -pp_in ./pp.pem -out witness_range_exceeded.pem 65536
$ tongsuo bulletproofs -witness -pp_in ./pp.pem -out witness_range_exceeded_one.pem 11 22 65536
参数说明:
- -witness 是用来生成/显示证据的子命令
- -pp_in:指定公共参数文件所在路径
- -out:生成的证据文件路径,上述四条命令生成的四个证据文件分别为:
- witness_range.pem:正常的 range 证据文件
- witness_range_capacity_exceeded.pem:容量超出的证据文件,因为生成的公共参数支持的批量证明和验证个数为最多4个,这里指定了5个
- witness_range_exceeded.pem:range 范围超出的证据文件,因为生成的公共参数可证明和验证的二进制比特位为16,验证范围是 ,也就是 0-65535,提交的 65535 在验证时会失败。
- witness_range_exceeded_one.pem:指定了3个数:11、22 和 65536,其中 11 和 22 正常,但 65536 超出范围了,这个 witness 文件生成的 proof 在验证时也会失败。
- 显示证据
$ tongsuo bulletproofs -witness -in witness_range.pem -text
Witness:
curve: SM2 (1172)
H: 02:e5:21:75:20:47:fb:c2:76:c2:86:3c:10:e0:4c:1e:72:66:26:7b:3d:5d:ac:5b:a0:de:ab:11:d3:56:bd:fc:f1
V[n]:
[0]: 03:a0:80:74:69:3a:9e:ad:d3:c2:f2:8f:90:db:34:11:89:b5:ab:2a:da:e5:e5:45:1c:0a:e3:63:86:f2:0e:92:13
[1]: 02:1b:1d:6a:c4:e5:ae:80:19:0c:0d:ce:48:bf:7e:19:c1:b3:a2:9a:ce:da:d1:40:dc:bd:de:43:b4:e3:c8:6a:14
[2]: 02:b3:76:ca:f5:0a:fc:37:9d:dd:55:52:37:f7:2c:4e:a4:9c:91:41:f4:d0:ea:2e:64:05:2e:dd:f7:fb:0a:1b:1d
v[n]:
[0]: 11 (0xb)
[1]: 22 (0x16)
[2]: 10000 (0x2710)
r[n]:
[0]: 4d:df:5b:b7:fb:ed:73:1a:cc:40:53:19:4f:35:e8:f5:bf:f8:08:30:cc:6d:f7:25:77:87:f1:a4:87:1e:d8:ea
[1]: 57:cb:b6:2a:db:b5:5c:e9:33:27:73:88:72:b4:18:18:1e:da:41:b1:71:32:8f:29:f4:e7:cc:c7:a4:f3:3b:31
[2]: 00:88:b0:2c:3f:a0:4d:8a:91:1e:fa:3c:9b:0a:c2:e0:b1:89:7a:b4:b2:2c:e6:50:75:f7:61:60:d3:2c:b9:33:94
-----BEGIN BULLETPROOFS WITNESS-----
AAAElALlIXUgR/vCdsKGPBDgTB5yZiZ7PV2sW6DeqxHTVr388QAAAAMDoIB0aTqe
rdPC8o+Q2zQRibWrKtrl5UUcCuNjhvIOkhMAAhsdasTlroAZDA3OSL9+GcGzoprO
2tFA3L3eQ7TjyGoUAAKzdsr1Cvw3nd1VUjf3LE6knJFB9NDqLmQFLt33+wobHQAA
AAADK03fW7f77XMazEBTGU816PW/+AgwzG33JXeH8aSHHtjqK1fLtirbtVzpMydz
iHK0GBge2kGxcTKPKfTnzMek8zsxK4iwLD+gTYqRHvo8mwrC4LGJerSyLOZQdfdh
YNMsuTOUAAAAAysAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACysAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFisAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAnEA==
-----END BULLETPROOFS WITNESS-----
如上结果所示,witness 中包含了椭圆曲线名称,H 点(与公共参数一致),密文证据 V,明文证据 v 和随机数 r。
证明(-prove/-proof)
- 生成 range 证明(-prove)
$ tongsuo ./apps/openssl bulletproofs -prove -pp_in ./pp.pem -witness_in witness_range.pem -out proof-range.pem
$ tongsuo bulletproofs -prove -pp_in ./pp.pem -witness_in witness_range_exceeded.pem -out proof-range-exceeded.pem
$ tongsuo bulletproofs -prove -pp_in ./pp.pem -witness_in witness_range_exceeded_one.pem -out proof-range-exceeded-one.pem
$ tongsuo ./apps/openssl bulletproofs -prove -pp_in ./pp.pem -witness_in witness_range_capacity_exceeded.pem -out proof-range-capacity-exceeded.pem
May be extra arguments error, please use -help for usage summary.
80C54E0201000000:error:1F800068:lib(63):BP_RANGE_PROOF_prove:reason(104):crypto/zkp/bulletproofs/range_proof.c:276: