#ifndef _ZCJOINSPLIT_H_ #define _ZCJOINSPLIT_H_ #include "Zcash.h" #include "Address.hpp" #include "Note.hpp" #include "IncrementalMerkleTree.hpp" #include "NoteEncryption.hpp" #include "uint256.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; JSOutput(); JSOutput(PaymentAddress addr, uint64_t value) : addr(addr), value(value) { } Note note(const uint256& phi, const uint256& r, size_t i, const uint256& h_sig) const; }; template class JoinSplit { public: static JoinSplit* Generate(); static JoinSplit* Unopened(); static uint256 h_sig(const uint256& randomSeed, const boost::array& nullifiers, const uint256& pubKeyHash ); // TODO: #789 virtual void setProvingKeyPath(std::string) = 0; virtual void loadProvingKey() = 0; virtual void saveProvingKey(std::string path) = 0; virtual void loadVerifyingKey(std::string path) = 0; virtual void saveVerifyingKey(std::string path) = 0; virtual std::string 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 ) = 0; virtual bool verify( const std::string& proof, 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_