#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 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 void saveR1CS(std::string path) = 0; 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 ) = 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_