diff --git a/src/avalanche/proof.h b/src/avalanche/proof.h --- a/src/avalanche/proof.h +++ b/src/avalanche/proof.h @@ -97,6 +97,7 @@ CPubKey master; std::vector stakes; CScript payoutScriptPubKey; + SchnorrSig signature; LimitedProofId limitedProofId; ProofId proofid; @@ -108,17 +109,19 @@ payoutScriptPubKey(CScript()), limitedProofId(), proofid() {} Proof(uint64_t sequence_, int64_t expirationTime_, CPubKey master_, - std::vector stakes_, const CScript &payoutScriptPubKey_) + std::vector stakes_, const CScript &payoutScriptPubKey_, + SchnorrSig signature_) : sequence(sequence_), expirationTime(expirationTime_), master(std::move(master_)), stakes(std::move(stakes_)), - payoutScriptPubKey(payoutScriptPubKey_) { + payoutScriptPubKey(payoutScriptPubKey_), + signature(std::move(signature_)) { computeProofId(); } SERIALIZE_METHODS(Proof, obj) { READWRITE(obj.sequence, obj.expirationTime, obj.master, obj.stakes); if (!useLegacy(gArgs)) { - READWRITE(obj.payoutScriptPubKey); + READWRITE(obj.payoutScriptPubKey, obj.signature); } SER_READ(obj, obj.computeProofId()); } diff --git a/src/avalanche/proof.cpp b/src/avalanche/proof.cpp --- a/src/avalanche/proof.cpp +++ b/src/avalanche/proof.cpp @@ -97,6 +97,11 @@ return state.Invalid(ProofValidationResult::INVALID_PAYOUT_SCRIPT, "payout-script-non-standard"); } + + if (!master.VerifySchnorr(limitedProofId, signature)) { + return state.Invalid(ProofValidationResult::INVALID_PROOF_SIGNATURE, + "invalid-proof-signature"); + } } StakeId prevId = uint256::ZERO; diff --git a/src/avalanche/proofbuilder.h b/src/avalanche/proofbuilder.h --- a/src/avalanche/proofbuilder.h +++ b/src/avalanche/proofbuilder.h @@ -50,6 +50,7 @@ Proof build(); private: + LimitedProofId getLimitedProofId() const; ProofId getProofId() const; friend struct TestProofBuilder; diff --git a/src/avalanche/proofbuilder.cpp b/src/avalanche/proofbuilder.cpp --- a/src/avalanche/proofbuilder.cpp +++ b/src/avalanche/proofbuilder.cpp @@ -33,6 +33,12 @@ } Proof ProofBuilder::build() { + SchnorrSig proofSignature; + const LimitedProofId limitedProofId = getLimitedProofId(); + if (!masterKey.SignSchnorr(limitedProofId, proofSignature)) { + proofSignature.fill(0); + } + const ProofId proofid = getProofId(); std::vector signedStakes; @@ -44,10 +50,11 @@ } return Proof(sequence, expirationTime, masterKey.GetPubKey(), - std::move(signedStakes), payoutScriptPubKey); + std::move(signedStakes), payoutScriptPubKey, + std::move(proofSignature)); } -ProofId ProofBuilder::getProofId() const { +LimitedProofId ProofBuilder::getLimitedProofId() const { CHashWriter ss(SER_GETHASH, 0); ss << sequence; ss << expirationTime; @@ -61,11 +68,15 @@ ss << s.stake; } - CHashWriter ss2(SER_GETHASH, 0); - ss2 << ss.GetHash(); - ss2 << masterKey.GetPubKey(); + return LimitedProofId(ss.GetHash()); +} + +ProofId ProofBuilder::getProofId() const { + CHashWriter ss(SER_GETHASH, 0); + ss << getLimitedProofId(); + ss << masterKey.GetPubKey(); - return ProofId(ss2.GetHash()); + return ProofId(ss.GetHash()); } } // namespace avalanche diff --git a/src/avalanche/test/proof_tests.cpp b/src/avalanche/test/proof_tests.cpp --- a/src/avalanche/test/proof_tests.cpp +++ b/src/avalanche/test/proof_tests.cpp @@ -309,15 +309,19 @@ 0, ProofValidationResult::DUST_THRESOLD}, }; + // Proof master key: + // privkey L4J6gEE4wL9ji2EQbzS5dPMTTsw8LRvcMst1Utij4e3X5ccUSdqW std::vector regularFormatTestCases{ {"Properly signed 1 UTXO proof, P2PK payout script", "d97587e6c882615796011ec8f9a7b1c621023beefdde700a6bc02036335b4df141c8b" "c67bb05a971f5ac2745fd683797dde30169a79ff23e1d58c64afad42ad81cffe53967" "e16beb692fc5776bb442c79c5d91de00cf21804712806594010038e168a32102449fb" - "5237efe8f647d32e8b64f06c22d1d40368eaca2a71ffc6a13ecc8bce680baa8704cc7" - "97482ae7b673f04fec50be1cdcefdffc3863029352aef07b16336d57a6036c0c62782" - "780fb12051839ac46328040bffe675bfbcdd15f5f6a5acbda2321023beefdde700a6b" - "c02036335b4df141c8bc67bb05a971f5ac2745fd683797dde3ac", + "5237efe8f647d32e8b64f06c22d1d40368eaca2a71ffc6a13ecc8bce6802249784cdf" + "70222cafa65d71a80d6f588cda6fd7183b67b2e5a9097dd49e3be7ddc24a54ccb393e" + "5c9e51ce3f7e788ff93d19b5954fb61215875a14b34f029272321023beefdde700a6b" + "c02036335b4df141c8bc67bb05a971f5ac2745fd683797dde3ac7b0b7865200f63052" + "ff980b93f965f398dda04917d411dd46e3c009a5fef35661fac28779b6a22760c0000" + "4f5ddf7d9865c7fead7e4a840b947939590261640f", ProofId::fromHex("455f34eb8a00b0799630071c0728481bdb1653035b1484ac33e9" "74aa4ae7db6d"), 444638638, ProofValidationResult::NONE}, @@ -325,10 +329,12 @@ "d97587e6c882615796011ec8f9a7b1c621023beefdde700a6bc02036335b4df141c8b" "c67bb05a971f5ac2745fd683797dde30169a79ff23e1d58c64afad42ad81cffe53967" "e16beb692fc5776bb442c79c5d91de00cf21804712806594010038e168a32102449fb" - "5237efe8f647d32e8b64f06c22d1d40368eaca2a71ffc6a13ecc8bce6802ddcceb12b" - "f6fa6f3b5001e0c7a60dd79ae373bb83d52630a11691b62a9c32e43a3003f6c13ca22" - "8e33add06fafba4c76ce91bab15171b0c53aef732e824f78b1976a914f8172c51efbf" - "34413a308a030fd4b164c5bfcd8f88ac", + "5237efe8f647d32e8b64f06c22d1d40368eaca2a71ffc6a13ecc8bce68095189fd41e" + "e3a637f27ae84b45b0c15ba43e674be4692ec91546941295c5d35c101bf657902bc6a" + "2f64f70bb431f3c9e8d20f0c4081963ca63117df9f471b8991976a914f8172c51efbf" + "34413a308a030fd4b164c5bfcd8f88ac2d805b078f5efe022304f8c6ccd0ef5255d80" + "6a473fc85a5ad1caf1aa94a4e49ef7625b9dc85d263b2829d5822af62226bc50a4a83" + "76a3a6e1cd0a37ea2fbbf9", ProofId::fromHex("8a2fcc5700a89f37a3726cdf3202353bf61f280815a9df744e3c" "9de6215a745a"), 444638638, ProofValidationResult::NONE}, @@ -336,10 +342,12 @@ "d97587e6c882615796011ec8f9a7b1c621023beefdde700a6bc02036335b4df141c8b" "c67bb05a971f5ac2745fd683797dde30169a79ff23e1d58c64afad42ad81cffe53967" "e16beb692fc5776bb442c79c5d91de00cf21804712806594010038e168a32102449fb" - "5237efe8f647d32e8b64f06c22d1d40368eaca2a71ffc6a13ecc8bce680091c7780f8" - "981eb8edbdf98aae9a9072cb2f0af1a87b426c734e79e32704b02878086b5e933ba5d" - "3fc6948ab24b14669e1f670ff0ac2965cce03dcd315e9322a17a914da1745e9b549bd" - "0bfa1a569971c77eba30cd5a4b87", + "5237efe8f647d32e8b64f06c22d1d40368eaca2a71ffc6a13ecc8bce680c2e8203530" + "d213ceef91536cb6167a0cfe4deb9561b938ee54791d51692ef665d87eb23b7f7ddc3" + "6b2d7914ca592bf58f9295ed41015061463315a8ac3bb192b17a914da1745e9b549bd" + "0bfa1a569971c77eba30cd5a4b87fea0a245528a4aadfc1dd5731c0cfe738e276c938" + "15c69789fe97b15a5fb5b4f75b598ed94096205561e8d16203b8ef21763891d8e79a5" + "9862bccbbd5bdf3a58", ProofId::fromHex("c61ee0416eb9549ea0e09dfd2c6062a11aa5d3ab0adcdf59abcc" "02dd0de401fc"), 444638638, ProofValidationResult::NONE}, @@ -347,10 +355,12 @@ "d97587e6c882615796011ec8f9a7b1c621023beefdde700a6bc02036335b4df141c8b" "c67bb05a971f5ac2745fd683797dde30169a79ff23e1d58c64afad42ad81cffe53967" "e16beb692fc5776bb442c79c5d91de00cf21804712806594010038e168a32102449fb" - "5237efe8f647d32e8b64f06c22d1d40368eaca2a71ffc6a13ecc8bce680e669fa3d48" - "1cce63ddf4dd4f1bc486f7294f4d3fa06bf3e03185423d614aeba8b8577aaca91b0d6" - "212a335e4977523c54d701db772ac5a16b352efc085fb0741255121023beefdde700a" - "6bc02036335b4df141c8bc67bb05a971f5ac2745fd683797dde351ae", + "5237efe8f647d32e8b64f06c22d1d40368eaca2a71ffc6a13ecc8bce680c5eb5fdf05" + "84d9a6e938d41034daf43d6bac05a9d6132ba0711193279e5f5494cb9d59920bdbd96" + "858162c7226ddfc565dbb3a2e4609a148e67770f09a968582255121023beefdde700a" + "6bc02036335b4df141c8bc67bb05a971f5ac2745fd683797dde351ae29eaecb058c9b" + "b74eef68dbeaa5da8b96aacc00bc89c911095ad016cfbdc53b1eeb10a9f29d6c48a5f" + "b3a1e6e30d332a05bdc67062f94acffbe6d6c909bb5643", ProofId::fromHex("29deedc94713bbc4d4f88fe96fae6801b91c5ae50601f158fa76" "a036e18ea468"), 444638638, ProofValidationResult::NONE}, @@ -358,12 +368,14 @@ "d97587e6c882615796011ec8f9a7b1c621023beefdde700a6bc02036335b4df141c8b" "c67bb05a971f5ac2745fd683797dde30169a79ff23e1d58c64afad42ad81cffe53967" "e16beb692fc5776bb442c79c5d91de00cf21804712806594010038e168a32102449fb" - "5237efe8f647d32e8b64f06c22d1d40368eaca2a71ffc6a13ecc8bce6808d8b48717e" - "f23eafb7254c8bdb79cec84b259d023f973c6a086fb6c369671c97c93d2a22c698d17" - "5b4c37c30f5b681a6b019106dd1fab54dc6212e8eb12c500f695221023beefdde700a" + "5237efe8f647d32e8b64f06c22d1d40368eaca2a71ffc6a13ecc8bce68072fb150ce9" + "813a3fe876bac7e2f4806a0f1efdadcfb1970c009a29af212cca0a43555eb1e0e0863" + "a2361244ad282cc9568d1691a582513d9793c0432cb78339e695221023beefdde700a" "6bc02036335b4df141c8bc67bb05a971f5ac2745fd683797dde321023beefdde700a6" "bc02036335b4df141c8bc67bb05a971f5ac2745fd683797dde321023beefdde700a6b" - "c02036335b4df141c8bc67bb05a971f5ac2745fd683797dde353ae", + "c02036335b4df141c8bc67bb05a971f5ac2745fd683797dde353ae34814734c1bd2c4" + "76fdae6fb1145530c3244878f3c2e0c2e5c05da14f17456aedee6beb80f68f42248fd" + "89042346be54beaef7da8e549d7d5ff07f9a2cc63c83", ProofId::fromHex("c24dc13d98d0e0a80c19346b9590368557a66f0f65c0088c179d" "89eca25107c8"), 444638638, ProofValidationResult::NONE}, @@ -371,10 +383,12 @@ "d97587e6c882615796011ec8f9a7b1c621023beefdde700a6bc02036335b4df141c8b" "c67bb05a971f5ac2745fd683797dde30169a79ff23e1d58c64afad42ad81cffe53967" "e16beb692fc5776bb442c79c5d91de00cf21804712806594010038e168a32102449fb" - "5237efe8f647d32e8b64f06c22d1d40368eaca2a71ffc6a13ecc8bce680a89393513c" - "b33ef4c1941f19e25e5cc9d75f648e89b91b748598d9966de35a0781c4e0409765bdf" - "896f53f8430b7150077e1952c118d374bdfaab1c37713cdb01b6a19492077616e7420" - "746f206275726e206d792072657761726473", + "5237efe8f647d32e8b64f06c22d1d40368eaca2a71ffc6a13ecc8bce680c48602d78d" + "8ee81361082417c97d94c54648adc9ef7f9047df5d03546ad6a13c6e81a15a4888130" + "161ae29239a2c4d66df72e4bb73036781d96fab810a39a1d71b6a19492077616e7420" + "746f206275726e206d792072657761726473f42ae2e5fa253a700e5dcb3970a894db4" + "48b61960b45c84723bf769d4dab0370994d0163e235b688da2fabc8e5b57e24805dce" + "3baa62e064c32266a723c6adb6", ProofId::fromHex("bfc250ca1986177acc779f26eaff80aa8916d23cb3e7e0ce6d35" "89c4f5ea364c"), 444638638, ProofValidationResult::NONE}, @@ -382,9 +396,11 @@ "d97587e6c882615796011ec8f9a7b1c621023beefdde700a6bc02036335b4df141c8b" "c67bb05a971f5ac2745fd683797dde30169a79ff23e1d58c64afad42ad81cffe53967" "e16beb692fc5776bb442c79c5d91de00cf21804712806594010038e168a32102449fb" - "5237efe8f647d32e8b64f06c22d1d40368eaca2a71ffc6a13ecc8bce680176d115007" - "f81be4be87ae2883fda15d87a7991645f00c8acf79b7f31501ee823604df88d29acfb" - "4d911c02294d5157191ebcf6657926764757da69dad2897540100", + "5237efe8f647d32e8b64f06c22d1d40368eaca2a71ffc6a13ecc8bce6805337be85cb" + "44712c830d4fbecb59e89e19f6f77fa3b7cc17e8124e76ebd7626b9ba27d641ec97af" + "9b66bc6b73031e14db10a6e1adae74bf2cdb683eb99475ba50100b71f0e77b4ad5d73" + "d5a872ab43699309b5c194f72be5ee0812236c1a46a5b2c22ddd71d909cf52143f487" + "54a61dfe0c6566342fa50b7d62c40fb44d1ff5abed3", ProofId::fromHex("046e75fa2d7f0868dcfa683bbdf657fc6a49b8f8b0d5c2dfdf90" "736ded26b076"), 444638638, ProofValidationResult::INVALID_PAYOUT_SCRIPT}, @@ -392,27 +408,163 @@ "d97587e6c882615796011ec8f9a7b1c621023beefdde700a6bc02036335b4df141c8b" "c67bb05a971f5ac2745fd683797dde30169a79ff23e1d58c64afad42ad81cffe53967" "e16beb692fc5776bb442c79c5d91de00cf21804712806594010038e168a32102449fb" - "5237efe8f647d32e8b64f06c22d1d40368eaca2a71ffc6a13ecc8bce680a90f09c643" - "edc82a5babbd25c446fe22df502eba5c9eff4dee2c471fb8c9cc8e5142d71583ac970" - "d5dc717f5cd4969a1089f9b74ac558afe94398022422fce0cad5121023beefdde700a" + "5237efe8f647d32e8b64f06c22d1d40368eaca2a71ffc6a13ecc8bce6805cada44f47" + "acd1bc0d679f2448f03b56fdf20170add0c44b1cdcb7cc47d388269cdb7d452c0a9b4" + "06ea6de32e6a672ad125c8b54d0511768aa60b0212fbce1b2ad5121023beefdde700a" "6bc02036335b4df141c8bc67bb05a971f5ac2745fd683797dde321023beefdde700a6" "bc02036335b4df141c8bc67bb05a971f5ac2745fd683797dde321023beefdde700a6b" "c02036335b4df141c8bc67bb05a971f5ac2745fd683797dde321023beefdde700a6bc" "02036335b4df141c8bc67bb05a971f5ac2745fd683797dde321023beefdde700a6bc0" - "2036335b4df141c8bc67bb05a971f5ac2745fd683797dde355ae", + "2036335b4df141c8bc67bb05a971f5ac2745fd683797dde355ae005dfe80b01bc99f9" + "3ae1d1c2d7176f7ea54a7f7c76b6eabb1aec5d31de170b0690282f624d01070fb2700" + "18694aea6a73ac5b7a96e30ed69df9b7684298b986", ProofId::fromHex("e66b0ab11de5e2f358d2e1f65b1ebe608e4a1f10a9f5d42f1173" "b262e1a218a6"), 444638638, ProofValidationResult::INVALID_PAYOUT_SCRIPT}, - {"Changing the payout address changes the ProofId (P2PK)", + {"Changing the payout address changes the proof signature (P2PK)", "d97587e6c882615796011ec8f9a7b1c621023beefdde700a6bc02036335b4df141c8b" "c67bb05a971f5ac2745fd683797dde30169a79ff23e1d58c64afad42ad81cffe53967" "e16beb692fc5776bb442c79c5d91de00cf21804712806594010038e168a32102449fb" - "5237efe8f647d32e8b64f06c22d1d40368eaca2a71ffc6a13ecc8bce680baa8704cc7" - "97482ae7b673f04fec50be1cdcefdffc3863029352aef07b16336d57a6036c0c62782" - "780fb12051839ac46328040bffe675bfbcdd15f5f6a5acbda2321023beefdde700a6b" - "c02036335b4df141c8bc67bb05a971f5ac2745fd683797dde4ac", + "5237efe8f647d32e8b64f06c22d1d40368eaca2a71ffc6a13ecc8bce6802249784cdf" + "70222cafa65d71a80d6f588cda6fd7183b67b2e5a9097dd49e3be7ddc24a54ccb393e" + "5c9e51ce3f7e788ff93d19b5954fb61215875a14b34f029272321023beefdde700a6b" + "c02036335b4df141c8bc67bb05a971f5ac2745fd683797dde4ac7b0b7865200f63052" + "ff980b93f965f398dda04917d411dd46e3c009a5fef35661fac28779b6a22760c0000" + "4f5ddf7d9865c7fead7e4a840b947939590261640f", ProofId::fromHex("ce2812a1decdef0267e0266c68ab53c5ecad292f7b7d0fbd3db9" "285a08ccd2a1"), + 444638638, ProofValidationResult::INVALID_PROOF_SIGNATURE}, + // The following tests are based on the valid 1 UTXO proof (P2PK script) + {"Changing the sequence changes the proof signature", + "da7587e6c882615796011ec8f9a7b1c621023beefdde700a6bc02036335b4df141c8b" + "c67bb05a971f5ac2745fd683797dde30169a79ff23e1d58c64afad42ad81cffe53967" + "e16beb692fc5776bb442c79c5d91de00cf21804712806594010038e168a32102449fb" + "5237efe8f647d32e8b64f06c22d1d40368eaca2a71ffc6a13ecc8bce6802249784cdf" + "70222cafa65d71a80d6f588cda6fd7183b67b2e5a9097dd49e3be7ddc24a54ccb393e" + "5c9e51ce3f7e788ff93d19b5954fb61215875a14b34f029272321023beefdde700a6b" + "c02036335b4df141c8bc67bb05a971f5ac2745fd683797dde3ac7b0b7865200f63052" + "ff980b93f965f398dda04917d411dd46e3c009a5fef35661fac28779b6a22760c0000" + "4f5ddf7d9865c7fead7e4a840b947939590261640f", + ProofId::fromHex("37a08e004f35d6410b24a5724b8351b41d4e3ac04f285cd76d73" + "a023b2ae5519"), + 444638638, ProofValidationResult::INVALID_PROOF_SIGNATURE}, + {"Changing the expiration time changes the proof signature", + "d97587e6c882615797011ec8f9a7b1c621023beefdde700a6bc02036335b4df141c8b" + "c67bb05a971f5ac2745fd683797dde30169a79ff23e1d58c64afad42ad81cffe53967" + "e16beb692fc5776bb442c79c5d91de00cf21804712806594010038e168a32102449fb" + "5237efe8f647d32e8b64f06c22d1d40368eaca2a71ffc6a13ecc8bce6802249784cdf" + "70222cafa65d71a80d6f588cda6fd7183b67b2e5a9097dd49e3be7ddc24a54ccb393e" + "5c9e51ce3f7e788ff93d19b5954fb61215875a14b34f029272321023beefdde700a6b" + "c02036335b4df141c8bc67bb05a971f5ac2745fd683797dde3ac7b0b7865200f63052" + "ff980b93f965f398dda04917d411dd46e3c009a5fef35661fac28779b6a22760c0000" + "4f5ddf7d9865c7fead7e4a840b947939590261640f", + ProofId::fromHex("1312eff53594f63e61f044c36b2cf2d3e7e44c706f17bfabcf49" + "954741380bbc"), + 444638638, ProofValidationResult::INVALID_PROOF_SIGNATURE}, + {"Changing the master pubkey does NOT change the proof signature (but " + "signature verification obviously fails)", + "d97587e6c882615796011ec8f9a7b1c621023beefdde700a6bc02036335b4df141c8b" + "c67bb05a971f5ac2745fd683797dde40169a79ff23e1d58c64afad42ad81cffe53967" + "e16beb692fc5776bb442c79c5d91de00cf21804712806594010038e168a32102449fb" + "5237efe8f647d32e8b64f06c22d1d40368eaca2a71ffc6a13ecc8bce6802249784cdf" + "70222cafa65d71a80d6f588cda6fd7183b67b2e5a9097dd49e3be7ddc24a54ccb393e" + "5c9e51ce3f7e788ff93d19b5954fb61215875a14b34f029272321023beefdde700a6b" + "c02036335b4df141c8bc67bb05a971f5ac2745fd683797dde3ac7b0b7865200f63052" + "ff980b93f965f398dda04917d411dd46e3c009a5fef35661fac28779b6a22760c0000" + "4f5ddf7d9865c7fead7e4a840b947939590261640f", + ProofId::fromHex("de837b44ae2df5408f89dc42039ae53a61ea508a15e214e69a50" + "d940b72e7713"), + 444638638, ProofValidationResult::INVALID_PROOF_SIGNATURE}, + {"Changing the TxId changes the proof signature", + "d97587e6c882615796011ec8f9a7b1c621023beefdde700a6bc02036335b4df141c8b" + "c67bb05a971f5ac2745fd683797dde3016aa79ff23e1d58c64afad42ad81cffe53967" + "e16beb692fc5776bb442c79c5d91de00cf21804712806594010038e168a32102449fb" + "5237efe8f647d32e8b64f06c22d1d40368eaca2a71ffc6a13ecc8bce6802249784cdf" + "70222cafa65d71a80d6f588cda6fd7183b67b2e5a9097dd49e3be7ddc24a54ccb393e" + "5c9e51ce3f7e788ff93d19b5954fb61215875a14b34f029272321023beefdde700a6b" + "c02036335b4df141c8bc67bb05a971f5ac2745fd683797dde3ac7b0b7865200f63052" + "ff980b93f965f398dda04917d411dd46e3c009a5fef35661fac28779b6a22760c0000" + "4f5ddf7d9865c7fead7e4a840b947939590261640f", + ProofId::fromHex("2c90b8359740d675952b570cca76ffb7c1a225984b8c7f47bc27" + "607c58a613b5"), + 444638638, ProofValidationResult::INVALID_PROOF_SIGNATURE}, + {"Changing the outpoint index changes the proof signature", + "d97587e6c882615796011ec8f9a7b1c621023beefdde700a6bc02036335b4df141c8b" + "c67bb05a971f5ac2745fd683797dde30169a79ff23e1d58c64afad42ad81cffe53967" + "e16beb692fc5776bb442c79c5d91df00cf21804712806594010038e168a32102449fb" + "5237efe8f647d32e8b64f06c22d1d40368eaca2a71ffc6a13ecc8bce6802249784cdf" + "70222cafa65d71a80d6f588cda6fd7183b67b2e5a9097dd49e3be7ddc24a54ccb393e" + "5c9e51ce3f7e788ff93d19b5954fb61215875a14b34f029272321023beefdde700a6b" + "c02036335b4df141c8bc67bb05a971f5ac2745fd683797dde3ac7b0b7865200f63052" + "ff980b93f965f398dda04917d411dd46e3c009a5fef35661fac28779b6a22760c0000" + "4f5ddf7d9865c7fead7e4a840b947939590261640f", + ProofId::fromHex("289c082f835c2edd24b95e1aee7dbb353dff30cdcaab02d5dc2a" + "c44c57181468"), + 444638638, ProofValidationResult::INVALID_PROOF_SIGNATURE}, + {"Changing the amount changes the proof signature", + "d97587e6c882615796011ec8f9a7b1c621023beefdde700a6bc02036335b4df141c8b" + "c67bb05a971f5ac2745fd683797dde30169a79ff23e1d58c64afad42ad81cffe53967" + "e16beb692fc5776bb442c79c5d91de00cf21814712806594010038e168a32102449fb" + "5237efe8f647d32e8b64f06c22d1d40368eaca2a71ffc6a13ecc8bce6802249784cdf" + "70222cafa65d71a80d6f588cda6fd7183b67b2e5a9097dd49e3be7ddc24a54ccb393e" + "5c9e51ce3f7e788ff93d19b5954fb61215875a14b34f029272321023beefdde700a6b" + "c02036335b4df141c8bc67bb05a971f5ac2745fd683797dde3ac7b0b7865200f63052" + "ff980b93f965f398dda04917d411dd46e3c009a5fef35661fac28779b6a22760c0000" + "4f5ddf7d9865c7fead7e4a840b947939590261640f", + ProofId::fromHex("8d97d3ed1884462122976da4706778593fc4b5eaafb859bec0b4" + "5f590219f5ba"), + 444638638, ProofValidationResult::INVALID_PROOF_SIGNATURE}, + {"Changing the height changes the proof signature", + "d97587e6c882615796011ec8f9a7b1c621023beefdde700a6bc02036335b4df141c8b" + "c67bb05a971f5ac2745fd683797dde30169a79ff23e1d58c64afad42ad81cffe53967" + "e16beb692fc5776bb442c79c5d91de00cf2180471280659401003ae168a32102449fb" + "5237efe8f647d32e8b64f06c22d1d40368eaca2a71ffc6a13ecc8bce6802249784cdf" + "70222cafa65d71a80d6f588cda6fd7183b67b2e5a9097dd49e3be7ddc24a54ccb393e" + "5c9e51ce3f7e788ff93d19b5954fb61215875a14b34f029272321023beefdde700a6b" + "c02036335b4df141c8bc67bb05a971f5ac2745fd683797dde3ac7b0b7865200f63052" + "ff980b93f965f398dda04917d411dd46e3c009a5fef35661fac28779b6a22760c0000" + "4f5ddf7d9865c7fead7e4a840b947939590261640f", + ProofId::fromHex("690cb3d74b5add1cfb7d4cf186426d41117586c57d59da330cc9" + "50e2d18d613c"), + 444638638, ProofValidationResult::INVALID_PROOF_SIGNATURE}, + {"Changing the coinbase flag changes the proof signature", + "d97587e6c882615796011ec8f9a7b1c621023beefdde700a6bc02036335b4df141c8b" + "c67bb05a971f5ac2745fd683797dde30169a79ff23e1d58c64afad42ad81cffe53967" + "e16beb692fc5776bb442c79c5d91de00cf21804712806594010039e168a32102449fb" + "5237efe8f647d32e8b64f06c22d1d40368eaca2a71ffc6a13ecc8bce6802249784cdf" + "70222cafa65d71a80d6f588cda6fd7183b67b2e5a9097dd49e3be7ddc24a54ccb393e" + "5c9e51ce3f7e788ff93d19b5954fb61215875a14b34f029272321023beefdde700a6b" + "c02036335b4df141c8bc67bb05a971f5ac2745fd683797dde3ac7b0b7865200f63052" + "ff980b93f965f398dda04917d411dd46e3c009a5fef35661fac28779b6a22760c0000" + "4f5ddf7d9865c7fead7e4a840b947939590261640f", + ProofId::fromHex("f713dec5d2f798360748914face171d5a45706b9c5f0bc4d561f" + "6e80e098beef"), + 444638638, ProofValidationResult::INVALID_PROOF_SIGNATURE}, + {"Changing the stake pubkey changes the proof signature", + "d97587e6c882615796011ec8f9a7b1c621023beefdde700a6bc02036335b4df141c8b" + "c67bb05a971f5ac2745fd683797dde30169a79ff23e1d58c64afad42ad81cffe53967" + "e16beb692fc5776bb442c79c5d91de00cf21804712806594010038e168a32102449fb" + "5237efe8f647d32e8b64f06c22d1d40368eaca2a71ffc6a13ecc8bce6812249784cdf" + "70222cafa65d71a80d6f588cda6fd7183b67b2e5a9097dd49e3be7ddc24a54ccb393e" + "5c9e51ce3f7e788ff93d19b5954fb61215875a14b34f029272321023beefdde700a6b" + "c02036335b4df141c8bc67bb05a971f5ac2745fd683797dde3ac7b0b7865200f63052" + "ff980b93f965f398dda04917d411dd46e3c009a5fef35661fac28779b6a22760c0000" + "4f5ddf7d9865c7fead7e4a840b947939590261640f", + ProofId::fromHex("df84548b3a085e29d58ba5e83ad2fd1c9ecbe8595d4240f3f588" + "e52af84cc65b"), + 444638638, ProofValidationResult::INVALID_PROOF_SIGNATURE}, + {"Changing the stake signature does NOT change the proof signature", + "d97587e6c882615796011ec8f9a7b1c621023beefdde700a6bc02036335b4df141c8b" + "c67bb05a971f5ac2745fd683797dde30169a79ff23e1d58c64afad42ad81cffe53967" + "e16beb692fc5776bb442c79c5d91de00cf21804712806594010038e168a32102449fb" + "5237efe8f647d32e8b64f06c22d1d40368eaca2a71ffc6a13ecc8bce6802249784cdf" + "70222cafa65d71a80d6f588cda6fd7183b67b2e5a9097dd49e3be7ddc24a54ccb393e" + "5c9e51ce3f7e788ff93d19b5954fb61215875a14b34f029282321023beefdde700a6b" + "c02036335b4df141c8bc67bb05a971f5ac2745fd683797dde3ac7b0b7865200f63052" + "ff980b93f965f398dda04917d411dd46e3c009a5fef35661fac28779b6a22760c0000" + "4f5ddf7d9865c7fead7e4a840b947939590261640f", + ProofId::fromHex("455f34eb8a00b0799630071c0728481bdb1653035b1484ac33e9" + "74aa4ae7db6d"), 444638638, ProofValidationResult::INVALID_STAKE_SIGNATURE}, }; diff --git a/src/avalanche/test/util.cpp b/src/avalanche/test/util.cpp --- a/src/avalanche/test/util.cpp +++ b/src/avalanche/test/util.cpp @@ -78,7 +78,7 @@ } return Proof(pb.sequence, pb.expirationTime, pb.masterKey.GetPubKey(), - std::move(signedStakes), pb.payoutScriptPubKey); + std::move(signedStakes), pb.payoutScriptPubKey, SchnorrSig()); } ProofId TestProofBuilder::getDuplicatedStakeProofId(ProofBuilder &pb) { @@ -113,7 +113,7 @@ } return Proof(pb.sequence, pb.expirationTime, pb.masterKey.GetPubKey(), - std::move(signedStakes), pb.payoutScriptPubKey); + std::move(signedStakes), pb.payoutScriptPubKey, SchnorrSig()); } } // namespace avalanche diff --git a/src/avalanche/validation.h b/src/avalanche/validation.h --- a/src/avalanche/validation.h +++ b/src/avalanche/validation.h @@ -18,6 +18,7 @@ INVALID_STAKE_SIGNATURE, TOO_MANY_UTXOS, INVALID_PAYOUT_SCRIPT, + INVALID_PROOF_SIGNATURE, // UTXO based errors. MISSING_UTXO,