gateway2/Tongsuo-8.4.0/test/recipes/80-test_app_bulletproofs.t
2026-07-11 13:40:57 +08:00

335 lines
20 KiB
Perl

#! /usr/bin/env perl
# Copyright 2023 The Tongsuo Project Authors. All Rights Reserved.
#
# Licensed under the Apache License 2.0 (the "License"). You may not use
# this file except in compliance with the License. You can obtain a copy
# in the file LICENSE in the source distribution or at
# https://github.com/Tongsuo-Project/Tongsuo/blob/master/LICENSE.txt
use strict;
use warnings;
use File::Path 2.00 qw/rmtree/;
use OpenSSL::Test qw/:DEFAULT data_file result_dir/;
use OpenSSL::Test::Utils;
use File::Spec::Functions qw/catfile catdir/;
use Cwd qw/getcwd/;
my $BULLETPROOFS_TEST_D = getcwd();
my $BULLETPROOFS_TEST_OUT_D = catdir($BULLETPROOFS_TEST_D, "bulletproofs_test_outs");
my $ppgen_out_path = catfile($BULLETPROOFS_TEST_OUT_D, "pp.pem");
my $pp_out_path = catfile($BULLETPROOFS_TEST_OUT_D, "pp-out.txt");
my $witness_out_path = catfile($BULLETPROOFS_TEST_OUT_D, "witness-out.txt");
my $proof_out_path = catfile($BULLETPROOFS_TEST_OUT_D, "proof-out.txt");
my $prove_out_path = catfile($BULLETPROOFS_TEST_OUT_D, "proof.pem");
my $verify_out_path = catfile($BULLETPROOFS_TEST_OUT_D, "verify-out.txt");
my $pp_path = $ppgen_out_path;
my $witness_path = $witness_out_path;
my $proof_path = $prove_out_path;
rmtree(${BULLETPROOFS_TEST_OUT_D}, { safe => 0 });
mkdir($BULLETPROOFS_TEST_OUT_D);
sub file_content
{
my($file) = @_;
my $content;
my $opened = open(IN, $file);
if (!$opened) {
$content = "Error.";
} else {
my @lines = <IN>;
foreach my $line (@lines) {
$content .= $line;
}
close(IN);
}
return $content;
}
sub bulletproofs_ppgen
{
my ($curve_name, $gens_capacity, $party_capacity, $text) = @_;
my @app_args = ("openssl", "bulletproofs", "-ppgen", "-out", $ppgen_out_path);
if ($curve_name) {
push @app_args, "-curve_name";
push @app_args, $curve_name;
}
if ($gens_capacity) {
push @app_args, "-gens_capacity";
push @app_args, $gens_capacity;
}
if ($party_capacity) {
push @app_args, "-party_capacity";
push @app_args, $party_capacity;
}
if ($text) {
push @app_args, "-text";
}
if (run(app([@app_args]))) {
return file_content($ppgen_out_path);
}
return 'Error';
}
sub bulletproofs_pp
{
my ($pp_path, $text) = @_;
my @app_args = ("openssl", "bulletproofs", "-pp", "-in", $pp_path, "-out", $pp_out_path);
if ($text) {
push @app_args, "-text";
}
if (run(app([@app_args]))) {
return file_content($pp_out_path);
}
return 'Error';
}
sub bulletproofs_witness_commit
{
my ($pp_path, $r1cs, $text, @witnesses) = @_;
my @app_args = ("openssl", "bulletproofs", "-witness", "-pp_in", $pp_path, "-out", $witness_out_path);
if ($r1cs) {
push @app_args, "-r1cs";
}
if ($text) {
push @app_args, "-text";
}
push @app_args, @witnesses;
if (run(app([@app_args]))) {
return file_content($witness_out_path);
}
return 'Error';
}
sub bulletproofs_witness_print
{
my ($text) = @_;
my @app_args = ("openssl", "bulletproofs", "-witness", "-in", $witness_path);
if ($text) {
push @app_args, "-text";
}
if (run(app([@app_args]))) {
return file_content($witness_out_path);
}
return 'Error';
}
sub bulletproofs_proof
{
my ($proof, $text) = @_;
my @app_args = ("openssl", "bulletproofs", "-proof", "-in", $proof, "-out", $proof_out_path);
if ($text) {
push @app_args, "-text";
}
if (run(app([@app_args]))) {
return file_content($proof_out_path);
}
return 'Error';
}
sub bulletproofs_prove
{
my ($pp, $witness, $r1cs_constraint, $text) = @_;
my @app_args = ("openssl", "bulletproofs", "-prove", "-pp_in", $pp, "-witness_in", $witness, "-out", $prove_out_path);
if ($r1cs_constraint) {
push @app_args, "-r1cs_constraint";
push @app_args, "$r1cs_constraint";
}
if ($text) {
push @app_args, "-text";
}
if (run(app([@app_args]))) {
return file_content($prove_out_path);
}
return "Error";
}
sub bulletproofs_verify
{
my ($pp, $proof, $r1cs_constraint) = @_;
my @app_args = ("openssl", "bulletproofs", "-verify", "-pp_in", $pp,, "-in", $proof, "-out", $verify_out_path);
if ($r1cs_constraint) {
push @app_args, "-r1cs_constraint";
push @app_args, "$r1cs_constraint";
}
if (run(app([@app_args]))) {
return file_content($verify_out_path);
}
return 'Error';
}
setup("test_app_bulletproofs");
plan skip_all => "app_bulletproofs is not supported by this OpenSSL build"
if disabled("bulletproofs");
plan tests => 66;
my $res = bulletproofs_ppgen();
ok($res =~ m/BULLETPROOFS PUBLIC PARAM/, "Check bulletproofs public parameter generate with default arguments");
$res = bulletproofs_pp($pp_path, 1);
ok($res =~ m/curve: [\d\-A-Za-z_]+ \(\d+\)\ngens_capacity: \d+\nparty_capacity: \d+/, "Check bulletproofs public parameter generate with default arguments");
$res = bulletproofs_ppgen("SM2", 16, 4, 1);
ok($res =~ m/curve: SM2 \(1172\)\ngens_capacity: 16\nparty_capacity: 4/, "Check bulletproofs public parameter generate with (SM2, 16, 4)");
# test witness: 1
$res = bulletproofs_witness_commit($pp_path, 0, 1, (1));
ok($res =~ m/BEGIN BULLETPROOFS WITNESS/, "Check bulletproofs witness output format");
ok($res =~ m/v\[n\]:\s+\[0\]: 1 \(0x1\)/, "Check the value of V in the bulletproofs witness, generated with wintesses: 1");
# test prove secrets: 1
$res = bulletproofs_prove($pp_path, $witness_path, 0, 1);
ok($res =~ m/BEGIN BULLETPROOFS RANGE PROOF[\s\S]+BEGIN BULLETPROOFS WITNESS/, "Check the format of the bulletproofs range proof result with witness: 1");
$res = bulletproofs_verify($pp_path, $proof_path, 0);
ok($res =~ m/The proof is valid/, "Check the verification of the bulletproofs range proof with the witness: 1");
$res = bulletproofs_proof($proof_path);
ok($res =~ m/BEGIN BULLETPROOFS RANGE PROOF/, "Check bulletproofs range proof output");
$res = bulletproofs_proof($proof_path, 1);
ok($res =~ m/A: (\w\w:?)+\s+S: (\w\w:?)+\s+T1: (\w\w:?)+\s+T2: (\w\w:?)+\s+taux: (\w\w:?)+\s+mu: (\w\w:?)+\s+tx: (\w\w:?)+\s+inner proof:/ && $res =~ m/V\[n\]:/ && $res =~ m/ R\[n\]:/, "Check bulletproofs range proof text output");
# test witness: 1,100
$res = bulletproofs_witness_commit($pp_path, 0, 1, (1, 100));
ok($res =~ m/v\[n\]:\s+\[0\]: 1 \(0x1\)\s+\[1\]: 100 \(0x64\)/, "Check the value of v in the bulletproofs witness, generated with wintesses: 1,100");
# test prove secrets: 1,100
$res = bulletproofs_prove($pp_path, $witness_path, 0, 1);
ok($res =~ m/BEGIN BULLETPROOFS RANGE PROOF[\s\S]+BEGIN BULLETPROOFS WITNESS/, "Check the format of the bulletproofs range proof result with witness: 1,100");
$res = bulletproofs_verify($pp_path, $proof_path, 0);
ok($res =~ m/The proof is valid/, "Check the verification of the bulletproofs range proof with the witness: 1,100");
$res = bulletproofs_proof($proof_path);
ok($res =~ m/BEGIN BULLETPROOFS RANGE PROOF/, "Check bulletproofs range proof output");
$res = bulletproofs_proof($proof_path, 1);
ok($res =~ m/A: (\w\w:?)+\s+S: (\w\w:?)+\s+T1: (\w\w:?)+\s+T2: (\w\w:?)+\s+taux: (\w\w:?)+\s+mu: (\w\w:?)+\s+tx: (\w\w:?)+\s+inner proof:/ && $res =~ m/V\[n\]:/ && $res =~ m/ R\[n\]:/, "Check bulletproofs range proof text output");
bulletproofs_ppgen("SM2", 16, 4, 1);
$res = bulletproofs_verify($pp_path, $proof_path, 0);
ok($res =~ m/The proof is invalid/, "Check the verification of the bulletproofs range proof using the other public parameters.");
# test witness: 1,2,100000
$res = bulletproofs_witness_commit($pp_path, 0, 1, (1, 2, 100000));
ok($res =~ m/v\[n\]:\s+\[0\]: 1 \(0x1\)\s+\[1\]: 2 \(0x2\)\s+\[2\]: 100000 \(0x186a0\)/, "Check the value of v in the bulletproofs witness, generated with wintesses: 1,2,100000");
# test prove secrets: 1,2,100000
$res = bulletproofs_prove($pp_path, $witness_path, 0, 1);
ok($res =~ m/BEGIN BULLETPROOFS RANGE PROOF[\s\S]+BEGIN BULLETPROOFS WITNESS/, "Check the format of the bulletproofs range proof result with witness: 1,2,100000");
$res = bulletproofs_verify($pp_path, $proof_path, 0);
ok($res =~ m/The proof is invalid/, "Check the verification of the bulletproofs range proof with the witness: 1,2,100000. 100000 is out of range [0, 1<<16), it should fail.");
$res = bulletproofs_proof($proof_path);
ok($res =~ m/BEGIN BULLETPROOFS RANGE PROOF/, "Check bulletproofs range proof output");
$res = bulletproofs_proof($proof_path, 1);
ok($res =~ m/A: (\w\w:?)+\s+S: (\w\w:?)+\s+T1: (\w\w:?)+\s+T2: (\w\w:?)+\s+taux: (\w\w:?)+\s+mu: (\w\w:?)+\s+tx: (\w\w:?)+\s+inner proof:/ && $res =~ m/V\[n\]:/ && $res =~ m/ R\[n\]:/, "Check bulletproofs range proof text output");
# test witness: 1,2,100000,3,4
$res = bulletproofs_witness_commit($pp_path, 0, 1, (1, 2, 100000, 3, 4));
ok($res =~ m/v\[n\]:\s+\[0\]: 1 \(0x1\)\s+\[1\]: 2 \(0x2\)\s+\[2\]: 100000 \(0x186a0\)\s+\[3\]: 3 \(0x3\)\s+\[4\]: 4 \(0x4\)/, "Check the value of v in the bulletproofs witness, generated with wintesses: 1,2,100000,3,4");
# test prove secrets: 1,2,100000,3,4
$res = bulletproofs_prove($pp_path, $witness_path, 0, 1);
ok($res =~ m/Error/, "Check the format of the bulletproofs range proof result with witness: 1,2,100000. The party capacity is exceeded");
$res = bulletproofs_witness_commit($pp_path, 0, 1, ("a=1"));
ok($res =~ m/V\[n\]:\s+\[a\]: \w+/, "Check the value of V in the bulletproofs witness, generated with wintesses: a=1");
ok($res =~ m/v\[n\]:\s+\[a\]: 1 \(0x1\)/, "Check the value of v in the bulletproofs witness, generated with wintesses: a=1");
$res = bulletproofs_witness_commit($pp_path, 0, 1, ("a=1", "b=-2"));
ok($res =~ m/V\[n\]:\s+\[a\]: (\w\w:?)+\s+\[b\]: \w+/, "Check the value of V in the bulletproofs witness, generated with wintesses: a=1,b=-2");
ok($res =~ m/v\[n\]:\s+\[a\]: 1 \(0x1\)\s+\[b\]: -2 \(-0x2\)/, "Check the value of v in the bulletproofs witness, generated with wintesses: a=1,b=-2");
$res = bulletproofs_witness_commit($pp_path, 0, 1, ("a1=1", "b1=-2", "c1=3"));
ok($res =~ m/V\[n\]:\s+\[a1\]: (\w\w:?)+\s+\[b1\]: (\w\w:?)+\s+\[c1\]: (\w\w:?)+/, "Check the value of V in the bulletproofs witness, generated with wintesses: a1=1,b1=-2,c1=3");
ok($res =~ m/v\[n\]:\s+\[a1\]: 1 \(0x1\)\s+\[b1\]: -2 \(-0x2\)\s+\[c1\]: 3 \(0x3\)/, "Check the value of v in the bulletproofs witness, generated with wintesses: a1=1,b1=-2,c1=3");
$res = bulletproofs_witness_print(1);
ok($res =~ m/V\[n\]:\s+\[a1\]: (\w\w:?)+\s+\[b1\]: (\w\w:?)+\s+\[c1\]: (\w\w:?)+/, "Check the value of V in the bulletproofs witness pem file, generated with wintesses: a1=1,b1=-2,c1=3");
ok($res =~ m/v\[n\]:\s+\[a1\]: 1 \(0x1\)\s+\[b1\]: -2 \(-0x2\)\s+\[c1\]: 3 \(0x3\)/, "Check the value of v in the bulletproofs witness pem file, generated with wintesses: a1=1,b1=-2,c1=3");
$res = bulletproofs_witness_commit($pp_path, 0, 1, ("aa=1", "bb=2", "cc=33333", "dddd=4"));
ok($res =~ m/V\[n\]:\s+\[aa\]: (\w\w:?)+\s+\[bb\]: (\w\w:?)+\s+\[cc\]: (\w\w:?)+\s+\[dddd\]: (\w\w:?)+/, "Check the value of V in the bulletproofs witness, generated with wintesses: aa=1,bb=2,cc=3333,dddd=4");
ok($res =~ m/v\[n\]:\s+\[aa\]: 1 \(0x1\)\s+\[bb\]: 2 \(0x2\)\s+\[cc\]: 33333 \(0x8235\)\s+\[dddd\]: 4 \(0x4\)/, "Check the value of v in the bulletproofs witness, generated with wintesses: aa=1,bb=2,cc=3333,dddd=4");
# test r1cs
$res = bulletproofs_witness_commit($pp_path, 1, 1, ("aa=1", "bb=2", "cc=-3", "dd=4"));
ok($res =~ m/V\[n\]:\s+\[aa\]: (\w\w:?)+\s+\[bb\]: (\w\w:?)+\s+\[cc\]: (\w\w:?)+\s+\[dd\]: (\w\w:?)+/, "Check the value of V in the bulletproofs witness, generated with wintesses: aa=1,bb=2,cc=-3,dd=4");
ok($res =~ m/v\[n\]:\s+\[aa\]: 1 \(0x1\)\s+\[bb\]: 2 \(0x2\)\s+\[cc\]: -3 \(-0x3\)\s+\[dd\]: 4 \(0x4\)/, "Check the value of v in the bulletproofs witness, generated with wintesses: aa=1,bb=2,cc=-3,dd=4");
# test prove constraint expression: aa+bb+cc=0
$res = bulletproofs_prove($pp_path, $witness_path, "aa+bb+cc", 1);
ok($res =~ m/BEGIN BULLETPROOFS R1CS PROOF[\s\S]+BEGIN BULLETPROOFS WITNESS/, "Check the format of the bulletproofs r1cs proof result with constraint expression: aa+bb+cc=0");
$res = bulletproofs_proof($proof_path);
ok($res =~ m/BEGIN BULLETPROOFS R1CS PROOF/, "Check bulletproofs r1cs proof output");
$res = bulletproofs_proof($proof_path, 1);
ok($res =~ m/AI1: (\w\w:?)+\s+AO1: (\w\w:?)+\s+S1: (\w\w:?)+\s+AI2: (\w\w:?)+\s+AO2: (\w\w:?)+\s+S2: (\w\w:?)+\s+T1: (\w\w:?)+\s+T3: (\w\w:?)+\s+T4: (\w\w:?)+\s+T5: (\w\w:?)+\s+T6: (\w\w:?)+\s+taux: (\w\w:?)+\s+mu: (\w\w:?)+\s+tx: ((\w\w:?)|0)+\s+inner proof:/ && $res =~ m/V\[n\]:/ && $res =~ m/ R\[n\]:/, "Check bulletproofs r1cs proof text output");
$res = bulletproofs_verify($pp_path, $proof_path, "aa+bb+cc");
ok($res =~ m/The proof is valid/, "Check the verification of the bulletproofs r1cs proof with constraint expression: aa+bb+cc=0, it should ok");
$res = bulletproofs_verify($pp_path, $proof_path, "aa+bb+cc+0");
ok($res =~ m/The proof is valid/, "Check the verification of the bulletproofs r1cs proof with constraint expression: aa+bb+cc+0=0, it should ok");
$res = bulletproofs_verify($pp_path, $proof_path, "aa+bb+cc+1");
ok($res =~ m/The proof is invalid/, "Check the verification of the bulletproofs r1cs proof with constraint expression: aa+bb+cc+1=0, it should failed");
# test prove constraint expression: aa*bb+cc+1=0
$res = bulletproofs_prove($pp_path, $witness_path, "aa*bb+cc+1", 1);
ok($res =~ m/BEGIN BULLETPROOFS R1CS PROOF[\s\S]+BEGIN BULLETPROOFS WITNESS/, "Check the format of the bulletproofs r1cs proof result with constraint expression: aa*bb+cc+1=0");
$res = bulletproofs_proof($proof_path, 1);
ok($res =~ m/AI1: (\w\w:?)+\s+AO1: (\w\w:?)+\s+S1: (\w\w:?)+\s+AI2: (\w\w:?)+\s+AO2: (\w\w:?)+\s+S2: (\w\w:?)+\s+T1: (\w\w:?)+\s+T3: (\w\w:?)+\s+T4: (\w\w:?)+\s+T5: (\w\w:?)+\s+T6: (\w\w:?)+\s+taux: (\w\w:?)+\s+mu: (\w\w:?)+\s+tx: ((\w\w:?)|0)+\s+inner proof:/ && $res =~ m/V\[n\]:/ && $res =~ m/ R\[n\]:/, "Check bulletproofs r1cs proof text output");
$res = bulletproofs_verify($pp_path, $proof_path, "aa*bb+cc+1");
ok($res =~ m/The proof is valid/, "Check the verification of the bulletproofs r1cs proof with constraint expression: aa*bb+cc+1=0, it should ok");
$res = bulletproofs_verify($pp_path, $proof_path, "aa*bb+cc+1+0");
ok($res =~ m/The proof is valid/, "Check the verification of the bulletproofs r1cs proof with constraint expression: aa*bb+cc+1+0=0, it should ok");
$res = bulletproofs_verify($pp_path, $proof_path, "aa*bb+cc+2");
ok($res =~ m/The proof is invalid/, "Check the verification of the bulletproofs r1cs proof with constraint expression: aa*bb+cc+2=0, it should failed");
# test prove constraint expression: aa*bb*cc+6=0
$res = bulletproofs_prove($pp_path, $witness_path, "aa*bb*cc+6", 1);
ok($res =~ m/BEGIN BULLETPROOFS R1CS PROOF[\s\S]+BEGIN BULLETPROOFS WITNESS/, "Check the format of the bulletproofs r1cs proof result with constraint expression: aa*bb*cc+6=0");
$res = bulletproofs_proof($proof_path, 1);
ok($res =~ m/AI1: (\w\w:?)+\s+AO1: (\w\w:?)+\s+S1: (\w\w:?)+\s+AI2: (\w\w:?)+\s+AO2: (\w\w:?)+\s+S2: (\w\w:?)+\s+T1: (\w\w:?)+\s+T3: (\w\w:?)+\s+T4: (\w\w:?)+\s+T5: (\w\w:?)+\s+T6: (\w\w:?)+\s+taux: (\w\w:?)+\s+mu: (\w\w:?)+\s+tx: ((\w\w:?)|0)+\s+inner proof:/ && $res =~ m/V\[n\]:/ && $res =~ m/ R\[n\]:/, "Check bulletproofs r1cs proof text output");
$res = bulletproofs_verify($pp_path, $proof_path, "aa*bb*cc+6");
ok($res =~ m/The proof is valid/, "Check the verification of the bulletproofs r1cs proof with constraint expression: aa*bb*cc+6=0, it should ok");
$res = bulletproofs_verify($pp_path, $proof_path, "aa*bb*cc+6-0");
ok($res =~ m/The proof is valid/, "Check the verification of the bulletproofs r1cs proof with constraint expression: aa*bb*cc+6-0=0, it should ok");
$res = bulletproofs_verify($pp_path, $proof_path, "aa*bb*cc+6-1");
ok($res =~ m/The proof is invalid/, "Check the verification of the bulletproofs r1cs proof with constraint expression: aa*bb*cc+6-1=0, it should failed");
# test prove constraint expression: aa*aa+bb*bb+cc*cc-14=0
$res = bulletproofs_prove($pp_path, $witness_path, "aa*aa+bb*bb+cc*cc-14", 1);
ok($res =~ m/BEGIN BULLETPROOFS R1CS PROOF[\s\S]+BEGIN BULLETPROOFS WITNESS/, "Check the format of the bulletproofs r1cs proof result with constraint expression: aa*aa+bb*bb+cc*cc-14=0");
$res = bulletproofs_proof($proof_path, 1);
ok($res =~ m/AI1: (\w\w:?)+\s+AO1: (\w\w:?)+\s+S1: (\w\w:?)+\s+AI2: (\w\w:?)+\s+AO2: (\w\w:?)+\s+S2: (\w\w:?)+\s+T1: (\w\w:?)+\s+T3: (\w\w:?)+\s+T4: (\w\w:?)+\s+T5: (\w\w:?)+\s+T6: (\w\w:?)+\s+taux: (\w\w:?)+\s+mu: (\w\w:?)+\s+tx: ((\w\w:?)|0)+\s+inner proof:/ && $res =~ m/V\[n\]:/ && $res =~ m/ R\[n\]:/, "Check bulletproofs r1cs proof text output");
$res = bulletproofs_verify($pp_path, $proof_path, "aa*aa+bb*bb+cc*cc-14");
ok($res =~ m/The proof is valid/, "Check the verification of the bulletproofs r1cs proof with constraint expression: aa*aa+bb*bb+cc*cc-14=0, it should ok");
$res = bulletproofs_verify($pp_path, $proof_path, "aa*aa+bb*bb+cc*cc-14-0");
ok($res =~ m/The proof is valid/, "Check the verification of the bulletproofs r1cs proof with constraint expression: aa*aa+bb*bb+cc*cc-14-0=0, it should ok");
$res = bulletproofs_verify($pp_path, $proof_path, "aa*aa+bb*bb+cc*cc-14-1");
ok($res =~ m/The proof is invalid/, "Check the verification of the bulletproofs r1cs proof with constraint expression: aa*aa+bb*bb+cc*cc-14-1=0, it should failed");
# test prove constraint expression: (2*aa+bb)*cc+dd*3=0
$res = bulletproofs_prove($pp_path, $witness_path, "(2*aa+bb)*cc+dd*3", 1);
ok($res =~ m/BEGIN BULLETPROOFS R1CS PROOF[\s\S]+BEGIN BULLETPROOFS WITNESS/, "Check the format of the bulletproofs r1cs proof result with constraint expression: (2*aa+bb)*cc+dd*3=0");
$res = bulletproofs_proof($proof_path, 1);
ok($res =~ m/AI1: (\w\w:?)+\s+AO1: (\w\w:?)+\s+S1: (\w\w:?)+\s+AI2: (\w\w:?)+\s+AO2: (\w\w:?)+\s+S2: (\w\w:?)+\s+T1: (\w\w:?)+\s+T3: (\w\w:?)+\s+T4: (\w\w:?)+\s+T5: (\w\w:?)+\s+T6: (\w\w:?)+\s+taux: (\w\w:?)+\s+mu: (\w\w:?)+\s+tx: ((\w\w:?)|0)+\s+inner proof:/ && $res =~ m/V\[n\]:/ && $res =~ m/ R\[n\]:/, "Check bulletproofs r1cs proof text output");
$res = bulletproofs_verify($pp_path, $proof_path, "(2*aa+bb)*cc+dd*3");
ok($res =~ m/The proof is valid/, "Check the verification of the bulletproofs r1cs proof with constraint expression: (2*aa+bb)*cc+dd*3=0, it should ok");
$res = bulletproofs_verify($pp_path, $proof_path, "(2*aa+bb)*cc+dd*3-0");
ok($res =~ m/The proof is valid/, "Check the verification of the bulletproofs r1cs proof with constraint expression: (2*aa+bb)*cc+dd*3-0=0, it should ok");
$res = bulletproofs_verify($pp_path, $proof_path, "(2*aa+bb)*cc+dd*3-1");
ok($res =~ m/The proof is invalid/, "Check the verification of the bulletproofs r1cs proof with constraint expression: (2*aa+bb)*cc+dd*3-1=0, it should failed");
# test prove constraint expression: ((aa+bb)*cc+23)-(dd+10)=0
$res = bulletproofs_prove($pp_path, $witness_path, "((aa+bb)*cc+23)-(dd+10)", 1);
ok($res =~ m/BEGIN BULLETPROOFS R1CS PROOF[\s\S]+BEGIN BULLETPROOFS WITNESS/, "Check the format of the bulletproofs r1cs proof result with constraint expression: ((aa+bb)*cc+23)-(dd+10)=0");
$res = bulletproofs_proof($proof_path, 1);
ok($res =~ m/AI1: (\w\w:?)+\s+AO1: (\w\w:?)+\s+S1: (\w\w:?)+\s+AI2: (\w\w:?)+\s+AO2: (\w\w:?)+\s+S2: (\w\w:?)+\s+T1: (\w\w:?)+\s+T3: (\w\w:?)+\s+T4: (\w\w:?)+\s+T5: (\w\w:?)+\s+T6: (\w\w:?)+\s+taux: (\w\w:?)+\s+mu: (\w\w:?)+\s+tx: ((\w\w:?)|0)+\s+inner proof:/ && $res =~ m/V\[n\]:/ && $res =~ m/ R\[n\]:/, "Check bulletproofs r1cs proof text output");
$res = bulletproofs_verify($pp_path, $proof_path, "((aa+bb)*cc+23)-(dd+10)");
ok($res =~ m/The proof is valid/, "Check the verification of the bulletproofs r1cs proof with constraint expression: ((aa+bb)*cc+23)-(dd+10)=0, it should ok");
$res = bulletproofs_verify($pp_path, $proof_path, "((aa+bb)*cc+23)-(dd+10)-0");
ok($res =~ m/The proof is valid/, "Check the verification of the bulletproofs r1cs proof with constraint expression: ((aa+bb)*cc+23)-(dd+10)-0=0, it should ok");
$res = bulletproofs_verify($pp_path, $proof_path, "((aa+bb)*cc+23)-(dd+10)-1");
ok($res =~ m/The proof is invalid/, "Check the verification of the bulletproofs r1cs proof with constraint expression: ((aa+bb)*cc+23)-(dd+10)-1=0, it should failed");
# test prove constraint expression: aaa+bb+cc=0
$res = bulletproofs_prove($pp_path, $witness_path, "aaa+bb+cc", 1);
ok($res =~ m/Error/ && $res !~ m/BEGIN BULLETPROOFS R1CS PROOF[\s\S]+BEGIN BULLETPROOFS WITNESS/, "Check the format of the bulletproofs r1cs proof result with constraint expression: aaa+bb+cc=0. aaa not found, it should failed");
rmtree(${BULLETPROOFS_TEST_OUT_D}, { safe => 0 });