mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-01-14 13:52:36 -03:00
8d1286014c
8e7f930828
Add GetNewChangeDestination for getting new change Destinations (Andrew Chow)33d13edd2b
Replace CReserveKey with ReserveDestinatoin (Andrew Chow)172213be5b
Add GetNewDestination to CWallet to fetch new destinations (Andrew Chow) Pull request description: The wallet should give out destinations instead of keys. It should be the one that handles the conversion from key to destination and the setting of the label, not the caller. In order to do this, two new member functions are introduced `GetNewDestination()` and `GetNewChangeDestination()`. Additionally, `CReserveKey` is changed to be `ReserveDestination` and represents destinations whose keys can be returned to the keypool. ACKs for top commit: instagibbs: re-utACK8e7f930828
sipa: ACK8e7f930828
. Concept ACK as this gives a much cleaner abstraction to work with, and light code review ACK. laanwj: ACK8e7f930828
Tree-SHA512: 5be7051409232b71e0ef2c1fd1a3e76964ed2f5b14d47d06edc2ad3b3687abd0be2803a1adc45c0433aa2c3bed172e14f8a7e9f4a23bff70f86260b5a0497500
82 lines
2.3 KiB
C++
82 lines
2.3 KiB
C++
// Copyright (c) 2019 The Bitcoin Core developers
|
|
// Distributed under the MIT software license, see the accompanying
|
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
|
|
|
#include <test/util.h>
|
|
|
|
#include <chainparams.h>
|
|
#include <consensus/merkle.h>
|
|
#include <key_io.h>
|
|
#include <miner.h>
|
|
#include <outputtype.h>
|
|
#include <pow.h>
|
|
#include <script/standard.h>
|
|
#include <validation.h>
|
|
#include <validationinterface.h>
|
|
#ifdef ENABLE_WALLET
|
|
#include <wallet/wallet.h>
|
|
#endif
|
|
|
|
const std::string ADDRESS_BCRT1_UNSPENDABLE = "bcrt1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq3xueyj";
|
|
|
|
#ifdef ENABLE_WALLET
|
|
std::string getnewaddress(CWallet& w)
|
|
{
|
|
constexpr auto output_type = OutputType::BECH32;
|
|
CTxDestination dest;
|
|
std::string error;
|
|
if (!w.GetNewDestination(output_type, "", dest, error)) assert(false);
|
|
|
|
return EncodeDestination(dest);
|
|
}
|
|
|
|
void importaddress(CWallet& wallet, const std::string& address)
|
|
{
|
|
LOCK(wallet.cs_wallet);
|
|
const auto dest = DecodeDestination(address);
|
|
assert(IsValidDestination(dest));
|
|
const auto script = GetScriptForDestination(dest);
|
|
wallet.MarkDirty();
|
|
assert(!wallet.HaveWatchOnly(script));
|
|
if (!wallet.AddWatchOnly(script, 0 /* nCreateTime */)) assert(false);
|
|
wallet.SetAddressBook(dest, /* label */ "", "receive");
|
|
}
|
|
#endif // ENABLE_WALLET
|
|
|
|
CTxIn generatetoaddress(const std::string& address)
|
|
{
|
|
const auto dest = DecodeDestination(address);
|
|
assert(IsValidDestination(dest));
|
|
const auto coinbase_script = GetScriptForDestination(dest);
|
|
|
|
return MineBlock(coinbase_script);
|
|
}
|
|
|
|
CTxIn MineBlock(const CScript& coinbase_scriptPubKey)
|
|
{
|
|
auto block = PrepareBlock(coinbase_scriptPubKey);
|
|
|
|
while (!CheckProofOfWork(block->GetHash(), block->nBits, Params().GetConsensus())) {
|
|
++block->nNonce;
|
|
assert(block->nNonce);
|
|
}
|
|
|
|
bool processed{ProcessNewBlock(Params(), block, true, nullptr)};
|
|
assert(processed);
|
|
|
|
return CTxIn{block->vtx[0]->GetHash(), 0};
|
|
}
|
|
|
|
std::shared_ptr<CBlock> PrepareBlock(const CScript& coinbase_scriptPubKey)
|
|
{
|
|
auto block = std::make_shared<CBlock>(
|
|
BlockAssembler{Params()}
|
|
.CreateNewBlock(coinbase_scriptPubKey)
|
|
->block);
|
|
|
|
LOCK(cs_main);
|
|
block->nTime = ::ChainActive().Tip()->GetMedianTimePast() + 1;
|
|
block->hashMerkleRoot = BlockMerkleRoot(*block);
|
|
|
|
return block;
|
|
}
|