13 #include "depends/gtest/googletest/include/gtest/gtest.h"
50 TEST(Examples, ProtoboardUsage)
64 pb->addRank1Constraint(
68 "Constraint 1: input[0] * (5 + input[2]) == output");
71 pb->addUnaryConstraint(
72 input[1] - output,
"Constraint 2: input[1] - output == 0");
89 pb->val(input[0]) = pb->val(input[1]) = pb->val(input[2]) =
91 EXPECT_FALSE(pb->isSatisfied());
94 pb->val(input[0]) = 1;
95 pb->val(input[1]) = pb->val(output) = 42;
96 pb->val(input[2]) = 37;
97 EXPECT_TRUE(pb->isSatisfied());
125 void generateConstraints();
129 void generateWitness();
167 NAND_Gadget::NAND_Gadget(
171 :
Gadget(pb), inputs_(inputs), output_(output), andResult_(
"andResult")
175 void NAND_Gadget::init()
195 andGadget_->generateConstraints();
198 1, 1 - andResult_, output_,
"1 * (1 - andResult) = output");
210 for (
const auto &input : inputs_) {
222 for (
const auto &input : inputs_) {
224 val(input) == 0 ||
val(input) == 1,
"NAND input is not boolean");
228 andGadget_->generateWitness();
230 val(output_) = 1 -
val(andResult_);
250 nandGadget->generateConstraints();
253 EXPECT_ANY_THROW(pb->isSatisfied());
256 for (
const auto &input : inputs) {
259 nandGadget->generateWitness();
260 EXPECT_TRUE(pb->isSatisfied());
261 EXPECT_TRUE(pb->val(output) == 0);
263 pb->val(inputs[2]) = 0;
264 EXPECT_FALSE(pb->isSatisfied());
267 pb->val(inputs[1]) = 2;
268 EXPECT_FALSE(pb->isSatisfied());
270 pb->val(inputs[1]) = 1;
273 EXPECT_TRUE(pb->val(output) == 0);
276 nandGadget->generateWitness();
277 EXPECT_TRUE(pb->val(output) == 1);
278 EXPECT_TRUE(pb->isSatisfied());
303 const size_t difficultyBits);
308 const size_t hashSizeInBits_;
309 const size_t difficultyBits_;
320 const size_t difficultyBits);
326 HashDifficultyEnforcer_Gadget::HashDifficultyEnforcer_Gadget(
329 const size_t difficultyBits)
331 , hashSizeInBits_(64)
332 , difficultyBits_(difficultyBits)
333 , hashValue_(hashValue,
UnpackedWord(64,
"hashValue_u"))
337 void HashDifficultyEnforcer_Gadget::init()
344 "multipacked word size too large");
357 const size_t difficultyBits)
368 hashValueUnpacker_->generateConstraints();
372 for (
size_t i = 0; i < difficultyBits_; ++i) {
382 hashValueUnpacker_->generateWitness();
403 const size_t difficulty = 10;
404 auto difficultyEnforcer =
406 difficultyEnforcer->generateConstraints();
409 EXPECT_ANY_THROW(pb->isSatisfied());
410 pb->val(hashValue[0]) = 42;
411 difficultyEnforcer->generateWitness();
414 EXPECT_TRUE(pb->isSatisfied(PrintOptions::DBG_PRINT_IF_NOT_SATISFIED));
415 pb->val(hashValue[0]) = 1000000000000000000;
420 EXPECT_FALSE(pb->isSatisfied());
459 :
public VerifyTransactionAmounts_GadgetBase
490 VerifyTransactionAmounts_Gadget,
501 VerifyTransactionAmounts_GadgetBase::~VerifyTransactionAmounts_GadgetBase() {}
506 sum(txInputAmounts_) -
sum(txOutputAmounts_) - minersFee_,
507 "sum(txInputAmounts) == sum(txOutputAmounts) + minersFee");
527 FElem sumOutputs = 0;
528 for (
const auto &inputAmount : txInputAmounts_) {
529 sumInputs +=
val(inputAmount);
531 for (
const auto &outputAmount : txOutputAmounts_) {
532 sumOutputs +=
val(outputAmount);
534 val(minersFee_) = sumInputs - sumOutputs;
537 R1P_VerifyTransactionAmounts_Gadget::R1P_VerifyTransactionAmounts_Gadget(
544 , VerifyTransactionAmounts_GadgetBase(pb)
546 , txInputAmounts_(txInputAmounts)
547 , txOutputAmounts_(txOutputAmounts)
548 , minersFee_(minersFee)
552 void R1P_VerifyTransactionAmounts_Gadget::init() {}
579 const Variable minersFee(
"minersFee");
580 auto verifyTx = VerifyTransactionAmounts_Gadget::create(
581 pb, inputAmounts, outputAmounts, minersFee);
582 verifyTx->generateConstraints();
583 pb->val(inputAmounts[0]) = pb->val(inputAmounts[1]) = 2;
584 pb->val(outputAmounts[0]) = pb->val(outputAmounts[1]) =
585 pb->val(outputAmounts[2]) = 1;
586 verifyTx->generateWitness();
587 EXPECT_TRUE(pb->isSatisfied());
588 EXPECT_EQ(pb->val(minersFee), 1);
589 pb->val(minersFee) = 3;
590 EXPECT_FALSE(pb->isSatisfied());
604 const bool test_serialization =
false;
606 const bool bit = libsnark::run_r1cs_ppzksnark<libff::default_ec_pp>(
607 example, test_serialization);
613 int main(
int argc,
char **argv)
615 ::testing::InitGoogleTest(&argc, argv);
616 return RUN_ALL_TESTS();