Add loading/unlocking/locking of non-default bitcoin wallet

This commit is contained in:
Srdjan Obucina 2020-02-29 18:30:00 +01:00
parent da0b3fafd2
commit 57a9675282
3 changed files with 47 additions and 36 deletions

View file

@ -39,7 +39,7 @@ public:
std::string signrawtransactionwithwallet(const std::string &tx_hash);
std::string unloadwallet(const std::string &filename);
std::string walletlock();
std::string walletpassphrase(const std::string &passphrase, uint32_t timeout = 60);
std::string walletpassphrase(const std::string &passphrase, uint32_t timeout = 5);
private:
fc::http::reply send_post_request(std::string body);
@ -96,8 +96,8 @@ private:
std::string wallet;
std::string wallet_password;
std::unique_ptr<zmq_listener> listener;
std::unique_ptr<bitcoin_rpc_client> bitcoin_client;
std::unique_ptr<zmq_listener> listener;
std::string create_multisignature_wallet(const std::vector<std::string> public_keys);
std::string transfer(const std::string &from, const std::string &to, const uint64_t amount);

View file

@ -29,7 +29,7 @@ public:
void plugin_set_program_options(
boost::program_options::options_description &cli,
boost::program_options::options_description &cfg);
void plugin_initialize(const boost::program_options::variables_map &options);
void plugin_initialize(const boost::program_options::variables_map &opt);
void plugin_startup();
std::set<chain::son_id_type> &get_sons();
@ -53,6 +53,8 @@ public:
private:
peerplays_sidechain_plugin &plugin;
boost::program_options::variables_map options;
bool config_ready_son;
bool config_ready_bitcoin;
bool config_ready_peerplays;
@ -60,7 +62,7 @@ private:
son_id_type current_son_id;
std::unique_ptr<peerplays_sidechain::sidechain_net_manager> net_manager;
std::set<chain::son_id_type> _sons;
std::set<chain::son_id_type> sons;
std::map<chain::public_key_type, fc::ecc::private_key> private_keys;
fc::future<void> _heartbeat_task;
fc::future<void> _son_processing_task;
@ -120,16 +122,17 @@ void peerplays_sidechain_plugin_impl::plugin_set_program_options(
cfg.add(cli);
}
void peerplays_sidechain_plugin_impl::plugin_initialize(const boost::program_options::variables_map &options) {
void peerplays_sidechain_plugin_impl::plugin_initialize(const boost::program_options::variables_map &opt) {
options = opt;
config_ready_son = (options.count("son-id") || options.count("son-ids")) && options.count("peerplays-private-key");
if (config_ready_son) {
LOAD_VALUE_SET(options, "son-id", _sons, chain::son_id_type)
LOAD_VALUE_SET(options, "son-id", sons, chain::son_id_type)
if (options.count("son-ids"))
boost::insert(_sons, fc::json::from_string(options.at("son-ids").as<string>()).as<vector<chain::son_id_type>>(5));
config_ready_son = config_ready_son && !_sons.empty();
boost::insert(sons, fc::json::from_string(options.at("son-ids").as<string>()).as<vector<chain::son_id_type>>(5));
config_ready_son = config_ready_son && !sons.empty();
#ifndef SUPPORT_MULTIPLE_SONS
FC_ASSERT(_sons.size() == 1, "Multiple SONs not supported");
FC_ASSERT(sons.size() == 1, "Multiple SONs not supported");
#endif
if (options.count("peerplays-private-key")) {
@ -149,77 +152,74 @@ void peerplays_sidechain_plugin_impl::plugin_initialize(const boost::program_opt
}
private_keys[key_id_to_wif_pair.first] = *private_key;
}
config_ready_son = config_ready_son && !private_keys.empty();
}
} else {
}
if (!config_ready_son) {
wlog("Haven't set up SON parameters");
throw;
}
plugin.database().applied_block.connect([&](const signed_block &b) {
on_applied_block(b);
});
net_manager = std::unique_ptr<sidechain_net_manager>(new sidechain_net_manager(plugin));
config_ready_bitcoin = options.count("bitcoin-node-ip") &&
options.count("bitcoin-node-zmq-port") && options.count("bitcoin-node-rpc-port") &&
options.count("bitcoin-node-rpc-user") && options.count("bitcoin-node-rpc-password") &&
/*options.count( "bitcoin-wallet" ) && options.count( "bitcoin-wallet-password" ) &&*/
options.count("bitcoin-private-key");
if (config_ready_bitcoin) {
net_manager->create_handler(sidechain_type::bitcoin, options);
ilog("Bitcoin sidechain handler created");
} else {
if (!config_ready_bitcoin) {
wlog("Haven't set up Bitcoin sidechain parameters");
}
//config_ready_ethereum = options.count( "ethereum-node-ip" ) &&
// options.count( "ethereum-address" ) && options.count( "ethereum-public-key" ) && options.count( "ethereum-private-key" );
//if (config_ready_ethereum) {
// net_manager->create_handler(sidechain_type::ethereum, options);
// ilog("Ethereum sidechain handler created");
//} else {
//if (!config_ready_ethereum) {
// wlog("Haven't set up Ethereum sidechain parameters");
//}
config_ready_peerplays = true;
if (config_ready_peerplays) {
net_manager->create_handler(sidechain_type::peerplays, options);
ilog("Peerplays sidechain handler created");
} else {
if (!config_ready_peerplays) {
wlog("Haven't set up Peerplays sidechain parameters");
}
if (!(config_ready_bitcoin /*&& config_ready_ethereum*/)) {
if (!(config_ready_bitcoin /*&& config_ready_ethereum*/ && config_ready_peerplays)) {
wlog("Haven't set up any sidechain parameters");
throw;
}
}
void peerplays_sidechain_plugin_impl::plugin_startup() {
plugin.database().applied_block.connect([&](const signed_block &b) {
on_applied_block(b);
});
if (config_ready_son) {
ilog("Starting ${n} SON instances", ("n", _sons.size()));
ilog("Starting ${n} SON instances", ("n", sons.size()));
schedule_heartbeat_loop();
} else {
elog("No sons configured! Please add SON IDs and private keys to configuration.");
}
net_manager = std::unique_ptr<sidechain_net_manager>(new sidechain_net_manager(plugin));
if (config_ready_bitcoin) {
net_manager->create_handler(sidechain_type::bitcoin, options);
ilog("Bitcoin sidechain handler running");
}
//if (config_ready_ethereum) {
// net_manager->create_handler(sidechain_type::ethereum, options);
// ilog("Ethereum sidechain handler running");
//}
if (config_ready_peerplays) {
net_manager->create_handler(sidechain_type::peerplays, options);
ilog("Peerplays sidechain handler running");
}
}
std::set<chain::son_id_type> &peerplays_sidechain_plugin_impl::get_sons() {
return _sons;
return sons;
}
son_id_type &peerplays_sidechain_plugin_impl::get_current_son_id() {
@ -282,7 +282,7 @@ void peerplays_sidechain_plugin_impl::heartbeat_loop() {
schedule_heartbeat_loop();
chain::database &d = plugin.database();
for (son_id_type son_id : _sons) {
for (son_id_type son_id : sons) {
if (is_active_son(son_id) || get_son_object(son_id).status == chain::son_status::in_maintenance) {
ilog("peerplays_sidechain_plugin: sending heartbeat for SON ${son}", ("son", son_id));
@ -332,7 +332,7 @@ void peerplays_sidechain_plugin_impl::son_processing() {
approve_proposals();
// Tasks that are executed by scheduled and active SON
if (_sons.find(next_son_id) != _sons.end()) {
if (sons.find(next_son_id) != sons.end()) {
current_son_id = next_son_id;
@ -373,7 +373,7 @@ void peerplays_sidechain_plugin_impl::approve_proposals() {
const auto &idx = plugin.database().get_index_type<proposal_index>().indices().get<by_id>();
for (const auto &proposal : idx) {
for (son_id_type son_id : _sons) {
for (son_id_type son_id : sons) {
if (!is_active_son(son_id)) {
continue;
}

View file

@ -66,7 +66,7 @@ std::string bitcoin_rpc_client::addmultisigaddress(const std::vector<std::string
}
if (json.count("error") && !json.get_child("error").empty()) {
wlog("BTC multisig address creation failed! Reply: ${msg}", ("msg", ss.str()));
wlog("Bitcoin RPC call ${function} failed with reply '${msg}'", ("function", __FUNCTION__)("msg", ss.str()));
}
return "";
}
@ -589,9 +589,12 @@ sidechain_net_handler_bitcoin::sidechain_net_handler_bitcoin(peerplays_sidechain
FC_ASSERT(false);
}
listener = std::unique_ptr<zmq_listener>(new zmq_listener(ip, zmq_port));
bitcoin_client = std::unique_ptr<bitcoin_rpc_client>(new bitcoin_rpc_client(ip, rpc_port, rpc_user, rpc_password, wallet, wallet_password));
if (!wallet.empty()) {
bitcoin_client->loadwallet(wallet);
}
listener = std::unique_ptr<zmq_listener>(new zmq_listener(ip, zmq_port));
listener->event_received.connect([this](const std::string &event_data) {
std::thread(&sidechain_net_handler_bitcoin::handle_event, this, event_data).detach();
});
@ -706,12 +709,20 @@ std::string sidechain_net_handler_bitcoin::sign_and_send_transaction_with_wallet
std::string unsigned_tx_hex = pt.get<std::string>("result");
if (!wallet_password.empty()) {
bitcoin_client->walletpassphrase(wallet_password);
}
reply_str = bitcoin_client->signrawtransactionwithwallet(unsigned_tx_hex);
ilog(reply_str);
std::stringstream ss_stx(reply_str);
boost::property_tree::ptree stx_json;
boost::property_tree::read_json(ss_stx, stx_json);
//if (!wallet_password.empty()) {
// bitcoin_client->walletlock();
//}
if (!(stx_json.count("error") && stx_json.get_child("error").empty()) || !stx_json.count("result") || !stx_json.get_child("result").count("hex")) {
return "";
}