From de9c89f3c28a6e2fae9643a8b3f857c435af6ede Mon Sep 17 00:00:00 2001 From: Some Random Crypto Guy Date: Wed, 18 Dec 2024 10:37:46 +0000 Subject: [PATCH] updated to support v0.7.0 --- src/ringct/rctTypes.h | 43 ++++++++++++++++++++++++++++++++++--------- 1 file changed, 34 insertions(+), 9 deletions(-) diff --git a/src/ringct/rctTypes.h b/src/ringct/rctTypes.h index 814493c..8fb3670 100644 --- a/src/ringct/rctTypes.h +++ b/src/ringct/rctTypes.h @@ -87,6 +87,18 @@ namespace rct { typedef std::vector keyV; //vector of keys typedef std::vector keyM; //matrix of keys (indexed by column first) + struct zk_proof { + key R; // Commitment + key z1; // Response + key z2; // Response + + BEGIN_SERIALIZE_OBJECT() + FIELD(R) + FIELD(z1) + FIELD(z2) + END_SERIALIZE() + }; + //containers For CT operations //if it's representing a private ctkey then "dest" contains the secret key of the address // while "mask" contains a where C = aG + bH is CT pedersen commitment and b is the amount @@ -293,6 +305,7 @@ namespace rct { RCTTypeBulletproof2 = 4, RCTTypeCLSAG = 5, RCTTypeBulletproofPlus = 6, + RCTTypeFullProofs = 7 }; enum RangeProofType { RangeProofBorromean, RangeProofBulletproof, RangeProofMultiOutputBulletproof, RangeProofPaddedBulletproof }; struct RCTConfig { @@ -315,9 +328,11 @@ namespace rct { ctkeyV outPk; xmr_amount txnFee = 0; // contains b key p_r; + zk_proof pr_proof; // p_r + zk_proof sa_proof; // spend authority proof rctSigBase() : - type(RCTTypeNull), message{}, mixRing{}, pseudoOuts{}, ecdhInfo{}, outPk{}, txnFee(0), p_r{} + type(RCTTypeNull), message{}, mixRing{}, pseudoOuts{}, ecdhInfo{}, outPk{}, txnFee(0), p_r{}, pr_proof{}, sa_proof{} {} template class Archive> @@ -326,7 +341,7 @@ namespace rct { FIELD(type) if (type == RCTTypeNull) return ar.stream().good(); - if (type != RCTTypeFull && type != RCTTypeSimple && type != RCTTypeBulletproof && type != RCTTypeBulletproof2 && type != RCTTypeCLSAG && type != RCTTypeBulletproofPlus) + if (type != RCTTypeFull && type != RCTTypeSimple && type != RCTTypeBulletproof && type != RCTTypeBulletproof2 && type != RCTTypeCLSAG && type != RCTTypeBulletproofPlus && type != RCTTypeFullProofs) return false; VARINT_FIELD(txnFee) // inputs/outputs not saved, only here for serialization help @@ -339,7 +354,7 @@ namespace rct { return false; for (size_t i = 0; i < outputs; ++i) { - if (type == RCTTypeBulletproof2 || type == RCTTypeCLSAG || type == RCTTypeBulletproofPlus) + if (type == RCTTypeBulletproof2 || type == RCTTypeCLSAG || type == RCTTypeBulletproofPlus || type == RCTTypeFullProofs) { // Since RCTTypeBulletproof2 enote types, we don't serialize the blinding factor, and only serialize the // first 8 bytes of ecdhInfo[i].amount @@ -373,6 +388,11 @@ namespace rct { ar.end_array(); FIELD(p_r) + if (type == RCTTypeFullProofs) + { + FIELD(pr_proof) + FIELD(sa_proof) + } return ar.stream().good(); } @@ -385,6 +405,10 @@ namespace rct { FIELD(outPk) VARINT_FIELD(txnFee) FIELD(p_r) + if (type == RCTTypeFullProofs) { + FIELD(pr_proof) + FIELD(sa_proof) + } END_SERIALIZE() }; struct rctSigPrunable { @@ -407,9 +431,9 @@ namespace rct { return false; if (type == RCTTypeNull) return ar.stream().good(); - if (type != RCTTypeFull && type != RCTTypeSimple && type != RCTTypeBulletproof && type != RCTTypeBulletproof2 && type != RCTTypeCLSAG && type != RCTTypeBulletproofPlus) + if (type != RCTTypeFull && type != RCTTypeSimple && type != RCTTypeBulletproof && type != RCTTypeBulletproof2 && type != RCTTypeCLSAG && type != RCTTypeBulletproofPlus && type != RCTTypeFullProofs) return false; - if (type == RCTTypeBulletproofPlus) + if (type == RCTTypeBulletproofPlus || type == RCTTypeFullProofs) { uint32_t nbp = bulletproofs_plus.size(); VARINT_FIELD(nbp) @@ -466,7 +490,7 @@ namespace rct { ar.end_array(); } - if (type == RCTTypeCLSAG || type == RCTTypeBulletproofPlus) + if (type == RCTTypeCLSAG || type == RCTTypeBulletproofPlus || type == RCTTypeFullProofs) { ar.tag("CLSAGs"); ar.begin_array(); @@ -557,7 +581,7 @@ namespace rct { } ar.end_array(); } - if (type == RCTTypeBulletproof || type == RCTTypeBulletproof2 || type == RCTTypeCLSAG || type == RCTTypeBulletproofPlus) + if (type == RCTTypeBulletproof || type == RCTTypeBulletproof2 || type == RCTTypeCLSAG || type == RCTTypeBulletproofPlus || type == RCTTypeFullProofs) { ar.tag("pseudoOuts"); ar.begin_array(); @@ -589,12 +613,12 @@ namespace rct { keyV& get_pseudo_outs() { - return type == RCTTypeBulletproof || type == RCTTypeBulletproof2 || type == RCTTypeCLSAG || type == RCTTypeBulletproofPlus ? p.pseudoOuts : pseudoOuts; + return type == RCTTypeBulletproof || type == RCTTypeBulletproof2 || type == RCTTypeCLSAG || type == RCTTypeBulletproofPlus || type == RCTTypeFullProofs ? p.pseudoOuts : pseudoOuts; } keyV const& get_pseudo_outs() const { - return type == RCTTypeBulletproof || type == RCTTypeBulletproof2 || type == RCTTypeCLSAG || type == RCTTypeBulletproofPlus ? p.pseudoOuts : pseudoOuts; + return type == RCTTypeBulletproof || type == RCTTypeBulletproof2 || type == RCTTypeCLSAG || type == RCTTypeBulletproofPlus || type == RCTTypeFullProofs ? p.pseudoOuts : pseudoOuts; } BEGIN_SERIALIZE_OBJECT() @@ -765,5 +789,6 @@ VARIANT_TAG(binary_archive, rct::multisig_kLRki, 0x9d); VARIANT_TAG(binary_archive, rct::multisig_out, 0x9e); VARIANT_TAG(binary_archive, rct::clsag, 0x9f); VARIANT_TAG(binary_archive, rct::BulletproofPlus, 0xa0); +VARIANT_TAG(binary_archive, rct::zk_proof, 0xa1); #endif /* RCTTYPES_H */