diff --git a/src/avalanche/proofbuilder.h b/src/avalanche/proofbuilder.h --- a/src/avalanche/proofbuilder.h +++ b/src/avalanche/proofbuilder.h @@ -39,7 +39,7 @@ public: ProofBuilder(uint64_t sequence_, int64_t expirationTime_, CKey masterKey_, - const CScript &payoutScriptPubKey_ = CScript()) + const CScript &payoutScriptPubKey_) : sequence(sequence_), expirationTime(expirationTime_), masterKey(std::move(masterKey_)), payoutScriptPubKey(payoutScriptPubKey_) {} diff --git a/src/avalanche/test/peermanager_tests.cpp b/src/avalanche/test/peermanager_tests.cpp --- a/src/avalanche/test/peermanager_tests.cpp +++ b/src/avalanche/test/peermanager_tests.cpp @@ -92,7 +92,8 @@ const CKey &master = CKey::MakeCompressedKey(), int64_t sequence = 1, uint32_t height = 100, bool is_coinbase = false, int64_t expirationTime = 0) { - ProofBuilder pb(sequence, expirationTime, master); + ProofBuilder pb(sequence, expirationTime, master, + UNSPENDABLE_ECREG_PAYOUT_SCRIPT); for (const auto &outpoint : outpoints) { BOOST_CHECK(pb.addUTXO(std::get<0>(outpoint), std::get<1>(outpoint), height, is_coinbase, key)); @@ -718,7 +719,8 @@ // Duplicated input. { - ProofBuilder pb(0, 0, CKey::MakeCompressedKey()); + ProofBuilder pb(0, 0, CKey::MakeCompressedKey(), + UNSPENDABLE_ECREG_PAYOUT_SCRIPT); COutPoint o(txid1, 3); BOOST_CHECK(pb.addUTXO(o, v, height, false, key)); BOOST_CHECK( diff --git a/src/avalanche/test/processor_tests.cpp b/src/avalanche/test/processor_tests.cpp --- a/src/avalanche/test/processor_tests.cpp +++ b/src/avalanche/test/processor_tests.cpp @@ -166,7 +166,7 @@ coins.AddCoin(outpoint, Coin(CTxOut(amount, script), height, false), false); - ProofBuilder pb(0, 0, masterpriv); + ProofBuilder pb(0, 0, masterpriv, UNSPENDABLE_ECREG_PAYOUT_SCRIPT); BOOST_CHECK(pb.addUTXO(outpoint, amount, height, false, key)); return pb.build(); } @@ -1233,7 +1233,7 @@ auto buildProof = [&](const COutPoint &outpoint, uint64_t sequence, uint32_t height = 10) { - ProofBuilder pb(sequence, 0, key); + ProofBuilder pb(sequence, 0, key, UNSPENDABLE_ECREG_PAYOUT_SCRIPT); BOOST_CHECK( pb.addUTXO(outpoint, PROOF_DUST_THRESHOLD, height, false, key)); return pb.build(); @@ -1377,7 +1377,7 @@ height, isCoinbase), false); } - ProofBuilder pb(1, tipMTP + 1, key); + ProofBuilder pb(1, tipMTP + 1, key, UNSPENDABLE_ECREG_PAYOUT_SCRIPT); BOOST_CHECK(pb.addUTXO(utxo, amount, height, isCoinbase, key)); auto proof2 = pb.build(); 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 @@ -49,7 +49,7 @@ const uint64_t sequence = InsecureRandBits(64); const int64_t expiration = InsecureRandBits(64); - ProofBuilder pb(sequence, expiration, key); + ProofBuilder pb(sequence, expiration, key, UNSPENDABLE_ECREG_PAYOUT_SCRIPT); for (int i = 0; i < 3; i++) { key.MakeNewKey(true); @@ -920,7 +920,8 @@ const uint32_t h, const bool is_coinbase, const CKey &k, int64_t expirationTime = 0) { // Generate a proof that match the UTXO. - ProofBuilder pb(0, expirationTime, key); + ProofBuilder pb(0, expirationTime, key, + UNSPENDABLE_ECREG_PAYOUT_SCRIPT); BOOST_CHECK(pb.addUTXO(o, v, h, is_coinbase, k)); ProofRef p = pb.build(); @@ -998,7 +999,8 @@ // No stake { - ProofRef p = ProofBuilder(0, 0, key).build(); + ProofRef p = + ProofBuilder(0, 0, key, UNSPENDABLE_ECREG_PAYOUT_SCRIPT).build(); ProofValidationState state; BOOST_CHECK(!p->verify(PROOF_DUST_THRESHOLD, chainman, state)); @@ -1024,7 +1026,7 @@ }; for (auto it = testCases.begin(); it != testCases.end(); ++it) { - ProofBuilder pb(0, 0, key); + ProofBuilder pb(0, 0, key, UNSPENDABLE_ECREG_PAYOUT_SCRIPT); BOOST_CHECK( pb.addUTXO(pkh_outpoint, std::get<0>(*it), height, false, key)); ProofRef p = pb.build(); @@ -1038,7 +1040,7 @@ // Duplicated input { - ProofBuilder pb(0, 0, key); + ProofBuilder pb(0, 0, key, UNSPENDABLE_ECREG_PAYOUT_SCRIPT); BOOST_CHECK(pb.addUTXO(pkh_outpoint, value, height, false, key)); ProofRef p = TestProofBuilder::buildDuplicatedStakes(pb); @@ -1055,7 +1057,7 @@ coins.AddCoin(other_pkh_outpoint, Coin(other_pkh_output, height, false), false); - ProofBuilder pb(0, 0, key); + ProofBuilder pb(0, 0, key, UNSPENDABLE_ECREG_PAYOUT_SCRIPT); BOOST_CHECK(pb.addUTXO(pkh_outpoint, value, height, false, key)); BOOST_CHECK(pb.addUTXO(other_pkh_outpoint, value, height, false, key)); ProofRef p = TestProofBuilder::buildWithReversedOrderStakes(pb); @@ -1128,7 +1130,7 @@ } auto computeProofId = [&]() { - ProofBuilder pb(0, 0, key); + ProofBuilder pb(0, 0, key, UNSPENDABLE_ECREG_PAYOUT_SCRIPT); for (const COutPoint &outpoint : outpoints) { BOOST_CHECK(pb.addUTXO(outpoint, value, height, false, key)); } @@ -1144,7 +1146,7 @@ BOOST_AUTO_TEST_CASE(get_staked_amount) { auto key = CKey::MakeCompressedKey(); - ProofBuilder pb(10, 11, key); + ProofBuilder pb(10, 11, key, UNSPENDABLE_ECREG_PAYOUT_SCRIPT); { ProofRef p = pb.build(); diff --git a/src/avalanche/test/proofpool_tests.cpp b/src/avalanche/test/proofpool_tests.cpp --- a/src/avalanche/test/proofpool_tests.cpp +++ b/src/avalanche/test/proofpool_tests.cpp @@ -47,7 +47,7 @@ const COutPoint conflictingOutpoint{TxId(GetRandHash()), 0}; auto buildProofWithSequence = [&](uint64_t sequence) { - ProofBuilder pb(sequence, 0, key); + ProofBuilder pb(sequence, 0, key, UNSPENDABLE_ECREG_PAYOUT_SCRIPT); BOOST_CHECK( pb.addUTXO(conflictingOutpoint, 10 * COIN, 123456, false, key)); return pb.build(); @@ -123,7 +123,7 @@ auto buildProofWithSequenceAndOutpoints = [&](uint64_t sequence, const std::vector<COutPoint> &outpoints) { - ProofBuilder pb(sequence, 0, key); + ProofBuilder pb(sequence, 0, key, UNSPENDABLE_ECREG_PAYOUT_SCRIPT); for (const COutPoint &outpoint : outpoints) { BOOST_CHECK( pb.addUTXO(outpoint, 10 * COIN, 123456, false, key)); @@ -198,7 +198,7 @@ const COutPoint conflictingOutpoint{TxId(GetRandHash()), 0}; auto buildProofWithSequence = [&](uint64_t sequence) { - ProofBuilder pb(sequence, 0, key); + ProofBuilder pb(sequence, 0, key, UNSPENDABLE_ECREG_PAYOUT_SCRIPT); BOOST_CHECK( pb.addUTXO(conflictingOutpoint, 10 * COIN, 123456, false, key)); return pb.build(); @@ -314,7 +314,7 @@ const CKey key = CKey::MakeCompressedKey(); auto buildProofWithRandomOutpoints = [&](uint32_t score) { int numOutpoints = InsecureRand32() % 10 + 1; - ProofBuilder pb(0, 0, key); + ProofBuilder pb(0, 0, key, UNSPENDABLE_ECREG_PAYOUT_SCRIPT); for (int i = 0; i < numOutpoints; i++) { Amount amount = 1 * COIN; if (i == numOutpoints - 1) { diff --git a/src/avalanche/test/util.h b/src/avalanche/test/util.h --- a/src/avalanche/test/util.h +++ b/src/avalanche/test/util.h @@ -8,13 +8,18 @@ #include <avalanche/proof.h> #include <avalanche/proofbuilder.h> #include <key.h> +#include <script/script.h> -#include <cstdio> +#include <vector> namespace avalanche { constexpr uint32_t MIN_VALID_PROOF_SCORE = 100 * PROOF_DUST_THRESHOLD / COIN; +const CScript UNSPENDABLE_ECREG_PAYOUT_SCRIPT = + CScript() << OP_DUP << OP_HASH160 << std::vector<uint8_t>(20, 0) + << OP_EQUALVERIFY << OP_CHECKSIG; + ProofRef buildRandomProof(CChainState &active_chainstate, uint32_t score, int height = 100, const CKey &masterKey = CKey::MakeCompressedKey()); 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 @@ -33,7 +33,8 @@ coins.AddCoin(o, Coin(CTxOut(v, script), height, is_coinbase), false); } - ProofBuilder pb(0, std::numeric_limits<uint32_t>::max(), masterKey); + ProofBuilder pb(0, std::numeric_limits<uint32_t>::max(), masterKey, + UNSPENDABLE_ECREG_PAYOUT_SCRIPT); BOOST_CHECK(pb.addUTXO(o, v, height, is_coinbase, std::move(key))); return pb.build(); } diff --git a/src/test/serialize_tests.cpp b/src/test/serialize_tests.cpp --- a/src/test/serialize_tests.cpp +++ b/src/test/serialize_tests.cpp @@ -6,6 +6,7 @@ #include <avalanche/proof.h> #include <avalanche/proofbuilder.h> +#include <avalanche/test/util.h> #include <hash.h> #include <streams.h> #include <util/strencodings.h> @@ -428,7 +429,8 @@ const char charstrval[16] = "testing charstr"; CMutableTransaction txval; CTransactionRef tx_ref{MakeTransactionRef(txval)}; - avalanche::ProofBuilder pb(0, 0, CKey::MakeCompressedKey()); + avalanche::ProofBuilder pb(0, 0, CKey::MakeCompressedKey(), + avalanche::UNSPENDABLE_ECREG_PAYOUT_SCRIPT); avalanche::ProofRef proofval = pb.build(); CSerializeMethodsTestSingle methodtest1(intval, boolval, stringval, charstrval, tx_ref, proofval);