bool constructMinerTxManually(const CryptoNote::Currency& currency, uint32_t height, uint64_t alreadyGeneratedCoins, const AccountPublicAddress& minerAddress, Transaction& tx, uint64_t fee, KeyPair* pTxKey/* = 0*/) { KeyPair txkey; txkey = KeyPair::generate(); add_tx_pub_key_to_extra(tx, txkey.pub); if (0 != pTxKey) { *pTxKey = txkey; } TransactionInputGenerate in; in.height = height; tx.vin.push_back(in); // This will work, until size of constructed block is less then currency.blockGrantedFullRewardZone() int64_t emissionChange; uint64_t blockReward; if (!currency.getBlockReward(0, 0, alreadyGeneratedCoins, fee, false, blockReward, emissionChange)) { std::cerr << "Block is too big" << std::endl; return false; } crypto::key_derivation derivation; crypto::public_key outEphPublicKey; crypto::generate_key_derivation(minerAddress.m_viewPublicKey, txkey.sec, derivation); crypto::derive_public_key(derivation, 0, minerAddress.m_spendPublicKey, outEphPublicKey); TransactionOutput out; out.amount = blockReward; out.target = TransactionOutputToKey(outEphPublicKey); tx.vout.push_back(out); tx.version = CURRENT_TRANSACTION_VERSION; tx.unlockTime = height + currency.minedMoneyUnlockWindow(); return true; }
bool constructMinerTxManually(const CryptoNote::Currency& currency, uint32_t height, uint64_t alreadyGeneratedCoins, const AccountPublicAddress& minerAddress, Transaction& tx, uint64_t fee, KeyPair* pTxKey/* = 0*/) { KeyPair txkey = generateKeyPair(); addTransactionPublicKeyToExtra(tx.extra, txkey.publicKey); if (0 != pTxKey) { *pTxKey = txkey; } BaseInput in; in.blockIndex = height; tx.inputs.push_back(in); // This will work, until size of constructed block is less then currency.blockGrantedFullRewardZone() int64_t emissionChange; uint64_t blockReward; if (!currency.getBlockReward(0, 0, alreadyGeneratedCoins, fee, height, blockReward, emissionChange)) { std::cerr << "Block is too big" << std::endl; return false; } Crypto::KeyDerivation derivation; Crypto::PublicKey outEphPublicKey; Crypto::generate_key_derivation(minerAddress.viewPublicKey, txkey.secretKey, derivation); Crypto::derive_public_key(derivation, 0, minerAddress.spendPublicKey, outEphPublicKey); TransactionOutput out; out.amount = blockReward; out.target = KeyOutput{outEphPublicKey}; tx.outputs.push_back(out); tx.version = TRANSACTION_VERSION_1; tx.unlockTime = height + currency.minedMoneyUnlockWindow(); return true; }