10 #include "validation.h"
12 template <
typename Stream>
17 if (this->
version < PUBSPEND_SCHNORR) {
24 if (this->
coinVersion >= libzerocoin::PUBKEY_VERSION)
32 bool fUseV1Params =
getCoinVersion() < libzerocoin::PUBKEY_VERSION;
33 if (
version < PUBSPEND_SCHNORR) {
37 std::string errMsg =
strprintf(
"PublicCoinSpend version %d with coin version 1 not allowed. "
38 "Minimum spend version required: %d",
version, PUBSPEND_SCHNORR);
39 return error(
"%s: %s", __func__, errMsg);
46 return error(
"%s: commitments values are not equal", __func__);
53 return error(
"%s: invalid coin version", __func__);
59 return error(
"%s: schnorr signature does not verify", __func__);
66 return error(
"%s: signature invalid", __func__);;
78 if (
version < PUBSPEND_SCHNORR) {
81 return error(
"%s: hashedpubkey is not equal to the serial!", __func__);
96 #define SCRIPT_OFFSET 6
101 std::vector<unsigned char> vchZeroMint;
104 publicZerocoin.
setvch(vchZeroMint);
109 return state.
DoS(100,
error(
"%s: txout.nValue is not correct", __func__));
112 pubCoin = checkPubCoin;
127 auto it = map.find(in);
128 return it != map.end() ?
Optional<T>{it->second} : nullopt;
150 std::vector<char, zero_after_free_allocator<char> > data;
152 uint8_t byteskip = ((uint8_t) scriptSig[1] + 2);
153 data.
insert(data.end(), scriptSig.
begin() + byteskip, scriptSig.
end());
166 publicCoinSpend = *op;
171 return error(
"%s: invalid argument/s", __func__);
182 if (!TxOutToPublicCoin(prevOut, spend.
pubCoin, state))
183 return error(
"%s: cannot get mint from output", __func__);
186 publicCoinSpend = spend;
207 return error(
"PublicCoinSpend validateInput :: input nSequence different to prevout value");
209 return publicSpend.
Verify();
216 return state.
DoS(100,
error(
"%s: public zerocoin spend prev output not found, prevTx %s, index %d",
220 return state.
Invalid(
error(
"%s: invalid public coin spend parse %s\n", __func__,
221 tx.
GetHash().
GetHex()), REJECT_INVALID,
"bad-txns-invalid-zpiv");
PublicCoin class for the Zerocoin library.
Commitment and CommitmentProof classes for the Zerocoin library.
const CChainParams & Params()
Return the currently selected parameters.
iterator insert(iterator it, const char x=char())
std::string GetHex() const
void setvch(const std::vector< unsigned char > &vch)
const Consensus::Params & GetConsensus() const
A writer stream (for serialization) that computes a 256-bit hash.
bool Verify(const uint256 &hash, const std::vector< unsigned char > &vchSig) const
Verify a DER signature (~72 bytes).
Serialized script, used inside transaction inputs and outputs.
The basic transaction that is broadcasted on the network and contained in blocks.
const uint256 & GetHash() const
An input of a transaction.
bool IsZerocoinPublicSpend() const
An output of a transaction.
bool IsZerocoinMint() const
Capture information about block/transaction validation.
bool Invalid(bool ret=false, unsigned int _chRejectCode=0, const std::string &_strRejectReason="", const std::string &_strDebugMessage="")
bool DoS(int level, bool ret=false, unsigned int chRejectCodeIn=0, std::string strRejectReasonIn="", bool corruptionIn=false, const std::string &strDebugMessageIn="")
std::map< CScript, libzerocoin::CoinSpend > cache_coinspend
Optional< libzerocoin::CoinSpend > Get(const CScript &in) const
Optional< PublicCoinSpend > GetPub(const CScript &in) const
std::map< CScript, PublicCoinSpend > cache_public_coinspend
Optional< T > Get(const CScript &in, const std::map< CScript, T > &map) const
void AddPub(const CScript &in, PublicCoinSpend &spend)
void Add(const CScript &in, libzerocoin::CoinSpend &spend)
const uint256 signatureHash() const override
int getCoinVersion() const
bool HasValidSignature() const
PublicCoinSpend(libzerocoin::ZerocoinParams *params)
libzerocoin::PublicCoin pubCoin
libzerocoin::CoinRandomnessSchnorrSignature schnorrSig
std::string GetHex() const
bool Verify(const ZerocoinParams *zcparams, const CBigNum &S, const CBigNum &C, const uint256 msghash) const
Verifies the Schnorr signature on message msghash with public key pk = Cg^-S mod p.
The complete proof needed to spend a zerocoin.
const CBigNum & getCoinSerialNumber() const
void setDenom(libzerocoin::CoinDenomination denom)
void setTxOutHash(uint256 txOutHash)
uint256 getTxOutHash() const
SpendType getSpendType() const
CoinDenomination denomination
std::vector< unsigned char > vchSig
A commitment, complete with contents and opening randomness.
const CBigNum & getCommitmentValue() const
A Public coin is the part of a coin that is published to the network and what is handled by other cli...
CoinDenomination getDenomination() const
const CBigNum & getValue() const
IntegerGroupParams coinCommitmentGroup
The Quadratic Residue group from which we form a coin as a commitment to a serial number.
#define LogPrint(category,...)
bool validateInput(const CTxIn &in, const CTxOut &prevOut, const CTransaction &tx, PublicCoinSpend &publicSpend)
libzerocoin::CoinSpend TxInToZerocoinSpend(const CTxIn &txin)
void CleanCoinSpendsCache()
bool ParseZerocoinPublicSpend(const CTxIn &txIn, const CTransaction &tx, CValidationState &state, PublicCoinSpend &publicSpend)
PublicCoinSpend parseCoinSpend(const CTxIn &in)
CDataStream ScriptSigToSerializedSpend(const CScript &scriptSig)
CoinDenomination AmountToZerocoinDenomination(CAmount amount)
CoinDenomination IntToZerocoinDenomination(int64_t amount)
CAmount ZerocoinDenominationToAmount(const CoinDenomination &denomination)
int ExtractVersionFromSerial(const CBigNum &bnSerial)
CBigNum ExtractSerialFromPubKey(const CPubKey pubkey)
boost::optional< T > Optional
Substitute for C++17 std::optional.
A mutable version of CTransaction.
uint256 GetHash() const
Compute the hash of this CMutableTransaction.
libzerocoin::ZerocoinParams * Zerocoin_Params(bool useModulusV1) const
#define WITH_LOCK(cs, code)
Run code while locking a mutex.
bool error(const char *fmt, const Args &... args)
bool GetOutput(const uint256 &hash, unsigned int index, CValidationState &state, CTxOut &out)
Retrieve an output (from memory pool, or from disk, if possible)
std::unique_ptr< CoinSpendCache > g_coinspends_cache