#ifndef _ZCJOINSPLIT_H_ #define _ZCJOINSPLIT_H_ #include "Zcash.h" #include "Proof.hpp" #include "Address.hpp" #include "Note.hpp" #include "IncrementalMerkleTree.hpp" #include "NoteEncryption.hpp" #include "uint256.h" #include "uint252.h" #include namespace libzcash { class JSInput { public: ZCIncrementalWitness witness; Note note; SpendingKey key; JSInput(); JSInput(ZCIncrementalWitness witness, Note note, SpendingKey key) : witness(witness), note(note), key(key) { } uint256 nullifier() const { return note.nullifier(key); } }; class JSOutput { public: PaymentAddress addr; uint64_t value; boost::array memo = {{0xF6}}; // 0xF6 is invalid UTF8 as per spec, rest of array is 0x00 JSOutput(); JSOutput(PaymentAddress addr, uint64_t value) : addr(addr), value(value) { } Note note(const uint252& phi, const uint256& r, size_t i, const uint256& h_sig) const; }; template class JoinSplit { public: virtual ~JoinSplit() {} static void Generate(const std::string r1csPath, const std::string vkPath, const std::string pkPath); static JoinSplit* Prepared(const std::string vkPath, const std::string pkPath); static uint256 h_sig(const uint256& randomSeed, const boost::array& nullifiers, const uint256& pubKeyHash ); virtual ZCProof prove( const boost::array& inputs, const boost::array& outputs, boost::array& out_notes, boost::array& out_ciphertexts, uint256& out_ephemeralKey, const uint256& pubKeyHash, uint256& out_randomSeed, boost::array& out_hmacs, boost::array& out_nullifiers, boost::array& out_commitments, uint64_t vpub_old, uint64_t vpub_new, const uint256& rt, bool computeProof = true, // For paymentdisclosure, we need to retrieve the esk. // Reference as non-const parameter with default value leads to compile error. // So use pointer for simplicity. uint256 *out_esk = nullptr ) = 0; virtual bool verify( const ZCProof& proof, ProofVerifier& verifier, const uint256& pubKeyHash, const uint256& randomSeed, const boost::array& hmacs, const boost::array& nullifiers, const boost::array& commitments, uint64_t vpub_old, uint64_t vpub_new, const uint256& rt ) = 0; protected: JoinSplit() {} }; } typedef libzcash::JoinSplit ZCJoinSplit; #endif // _ZCJOINSPLIT_H_