Clearmatics Libsnark  0.1
C++ library for zkSNARK proofs
Public Member Functions | Friends | List of all members
gadgetExamples::R1P_VerifyTransactionAmounts_Gadget Class Reference
Inheritance diagram for gadgetExamples::R1P_VerifyTransactionAmounts_Gadget:
Inheritance graph
[legend]
Collaboration diagram for gadgetExamples::R1P_VerifyTransactionAmounts_Gadget:
Collaboration graph
[legend]

Public Member Functions

void generateConstraints ()
 
void generateWitness ()
 
- Public Member Functions inherited from gadgetlib2::R1P_Gadget
 R1P_Gadget (ProtoboardPtr pb)
 
virtual ~R1P_Gadget ()=0
 
virtual void addRank1Constraint (const LinearCombination &a, const LinearCombination &b, const LinearCombination &c, const ::std::string &name)
 
- Public Member Functions inherited from gadgetlib2::Gadget
 Gadget (ProtoboardPtr pb)
 
void addUnaryConstraint (const LinearCombination &a, const ::std::string &name)
 
void addRank1Constraint (const LinearCombination &a, const LinearCombination &b, const LinearCombination &c, const ::std::string &name)
 
void enforceBooleanity (const Variable &var)
 
FElemval (const Variable &var)
 
FElem val (const LinearCombination &lc)
 
FieldType fieldType () const
 
bool flagIsSet (const FlagVariable &flag) const
 

Friends

class VerifyTransactionAmounts_Gadget
 

Additional Inherited Members

- Protected Attributes inherited from gadgetlib2::Gadget
ProtoboardPtr pb_
 

Detailed Description

Definition at line 458 of file tutorial.cpp.

Member Function Documentation

◆ generateConstraints()

void gadgetExamples::R1P_VerifyTransactionAmounts_Gadget::generateConstraints ( )
virtual

Implements gadgetlib2::Gadget.

Definition at line 503 of file tutorial.cpp.

504 {
506  sum(txInputAmounts_) - sum(txOutputAmounts_) - minersFee_,
507  "sum(txInputAmounts) == sum(txOutputAmounts) + minersFee");
508  // It would seem this is enough, but an adversary could cause an overflow of
509  // one side of the equation over the field modulus. In fact, for every
510  // input/output sum we will always find a miners' fee which will satisfy
511  // this constraint! It is left as an exercise for the reader to implement
512  // additional constraints (and witness) to check that each of the amounts
513  // (inputs, outputs, fee) are between 0 and 21,000,000 * 1E8 satoshis.
514  // Combine this with a maximum amount of inputs/outputs to disallow field
515  // overflow.
516  //
517  // Hint: use Comparison_Gadget to create a gadget which compares a
518  // variable's assigned value to a constant. Use a vector of these new
519  // gadgets to check each amount. Don't forget to: (1) Wire these gadgets in
520  // init() (2) Invoke the gadgets' constraints in generateConstraints() (3)
521  // Invoke the gadgets' witnesses in generateWitness()
522 }
Here is the call graph for this function:

◆ generateWitness()

void gadgetExamples::R1P_VerifyTransactionAmounts_Gadget::generateWitness ( )
virtual

Reimplemented from gadgetlib2::Gadget.

Definition at line 524 of file tutorial.cpp.

525 {
526  FElem sumInputs = 0;
527  FElem sumOutputs = 0;
528  for (const auto &inputAmount : txInputAmounts_) {
529  sumInputs += val(inputAmount);
530  }
531  for (const auto &outputAmount : txOutputAmounts_) {
532  sumOutputs += val(outputAmount);
533  }
534  val(minersFee_) = sumInputs - sumOutputs;
535 }
Here is the call graph for this function:

Friends And Related Function Documentation

◆ VerifyTransactionAmounts_Gadget

friend class VerifyTransactionAmounts_Gadget
friend

Definition at line 468 of file tutorial.cpp.


The documentation for this class was generated from the following file:
gadgetlib2::Gadget::val
FElem & val(const Variable &var)
Definition: gadget.hpp:109
gadgetlib2::FElem
Definition: variable.hpp:101
gadgetlib2::Gadget::addUnaryConstraint
void addUnaryConstraint(const LinearCombination &a, const ::std::string &name)
Definition: gadget.cpp:52
gadgetlib2::sum
LinearCombination sum(const VariableArray &inputs)
Definition: variable.cpp:616