bool test_generator::constructBlockManually(Block& blk, const Block& prevBlock, const AccountBase& minerAcc, int actualParams/* = bf_none*/, uint8_t majorVer/* = 0*/, uint8_t minorVer/* = 0*/, uint64_t timestamp/* = 0*/, const Crypto::Hash& previousBlockHash/* = Crypto::Hash()*/, const difficulty_type& diffic/* = 1*/, const Transaction& baseTransaction/* = transaction()*/, const std::vector<Crypto::Hash>& transactionHashes/* = std::vector<Crypto::Hash>()*/, size_t txsSizes/* = 0*/, uint64_t fee/* = 0*/) { blk.majorVersion = actualParams & bf_major_ver ? majorVer : defaultMajorVersion; blk.minorVersion = actualParams & bf_minor_ver ? minorVer : defaultMinorVersion; blk.timestamp = actualParams & bf_timestamp ? timestamp : prevBlock.timestamp + m_currency.difficultyTarget(); // Keep difficulty unchanged blk.previousBlockHash = actualParams & bf_prev_id ? previousBlockHash : get_block_hash(prevBlock); blk.transactionHashes = actualParams & bf_tx_hashes ? transactionHashes : std::vector<Crypto::Hash>(); blk.parentBlock.baseTransaction.version = 0; blk.parentBlock.baseTransaction.unlockTime = 0; uint32_t height = get_block_height(prevBlock) + 1; uint64_t alreadyGeneratedCoins = getAlreadyGeneratedCoins(prevBlock); std::vector<size_t> blockSizes; getLastNBlockSizes(blockSizes, get_block_hash(prevBlock), m_currency.rewardBlocksWindow()); if (actualParams & bf_miner_tx) { blk.baseTransaction = baseTransaction; } else { blk.baseTransaction = boost::value_initialized<Transaction>(); size_t currentBlockSize = txsSizes + getObjectBinarySize(blk.baseTransaction); // TODO: This will work, until size of constructed block is less then m_currency.blockGrantedFullRewardZone() if (!m_currency.constructMinerTx(blk.majorVersion, height, Common::medianValue(blockSizes), alreadyGeneratedCoins, currentBlockSize, 0, minerAcc.getAccountKeys().address, blk.baseTransaction, BinaryArray(), 1)) { return false; } } if (blk.majorVersion >= BLOCK_MAJOR_VERSION_2) { blk.parentBlock.majorVersion = BLOCK_MAJOR_VERSION_1; blk.parentBlock.minorVersion = BLOCK_MINOR_VERSION_0; blk.parentBlock.transactionCount = 1; CryptoNote::TransactionExtraMergeMiningTag mmTag; mmTag.depth = 0; if (!CryptoNote::get_aux_block_header_hash(blk, mmTag.merkleRoot)) { return false; } blk.parentBlock.baseTransaction.extra.clear(); if (!CryptoNote::appendMergeMiningTagToExtra(blk.parentBlock.baseTransaction.extra, mmTag)) { return false; } } difficulty_type aDiffic = actualParams & bf_diffic ? diffic : getTestDifficulty(); if (1 < aDiffic) { fillNonce(blk, aDiffic); } addBlock(blk, txsSizes, fee, blockSizes, alreadyGeneratedCoins); return true; }
bool gen_upgrade::checkBlockTemplateVersion(CryptoNote::Core& c, uint8_t expectedMajorVersion, uint8_t expectedMinorVersion) { DEFINE_TESTS_ERROR_CONTEXT("gen_upgrade::checkBlockTemplateVersion"); AccountBase account; account.generate(); BlockTemplate b; Difficulty difficulty; uint32_t height; CHECK_TEST_CONDITION(c.getBlockTemplate(b, account.getAccountKeys().address, BinaryArray(), difficulty, height)); CHECK_EQ(static_cast<int>(b.majorVersion), static_cast<int>(expectedMajorVersion)); CHECK_EQ(static_cast<int>(b.minorVersion), static_cast<int>(expectedMinorVersion)); return true; }
std::string Currency::accountAddressAsString(const AccountBase& account) const { return getAccountAddressAsStr(m_publicAddressBase58Prefix, account.getAccountKeys().address); }