提交 f23048a0 编写于 作者: K Kevin Heifner

Add get_required_keys to eosd

上级 50bf83a6
......@@ -164,7 +164,7 @@ namespace eos { namespace chain {
* @return Subset of candidateKeys whose private keys should be used to sign transaction
* @throws fc::exception if candidateKeys does not contain all required keys
*/
flat_set<public_key_type> get_required_keys( const SignedTransaction& trx, const flat_set<public_key_type>& candidateKeys)const;
flat_set<public_key_type> get_required_keys(const SignedTransaction& trx, const flat_set<public_key_type>& candidateKeys)const;
bool _push_block( const signed_block& b );
......
......@@ -54,6 +54,7 @@ void chain_api_plugin::plugin_startup() {
CHAIN_RO_CALL(get_table_rows),
CHAIN_RO_CALL(abi_json_to_bin),
CHAIN_RO_CALL(abi_bin_to_json),
CHAIN_RO_CALL(get_required_keys),
CHAIN_RW_CALL(push_block),
CHAIN_RW_CALL(push_transaction),
CHAIN_RW_CALL(push_transactions)
......
......@@ -12,6 +12,8 @@
#include <eos/native_contract/balance_object.hpp>
#include <eos/native_contract/genesis_state.hpp>
#include <eos/utilities/key_conversion.hpp>
#include <fc/io/json.hpp>
#include <fc/variant.hpp>
......@@ -322,5 +324,26 @@ read_only::abi_bin_to_json_result read_only::abi_bin_to_json( const read_only::a
return result;
}
read_only::get_required_keys_result read_only::get_required_keys( const get_required_keys_params& params)const {
flat_set<public_key_type> available_keys;
available_keys.reserve(params.available_keys_wif.size());
for (const auto& k : params.available_keys_wif) {
available_keys.emplace(public_key_type(k));
}
auto pretty_input = db.transaction_from_variant(params.transaction);
auto required_keys_set = db.get_required_keys(pretty_input, available_keys);
get_required_keys_result result;
result.required_keys_wif.reserve(required_keys_set.size());
for (const auto& k : required_keys_set) {
result.required_keys_wif.emplace_back(k.operator std::string());
}
return result;
}
} // namespace chain_apis
} // namespace eos
......@@ -7,6 +7,8 @@
#include <eos/database_plugin/database_plugin.hpp>
#include <boost/container/flat_set.hpp>
namespace fc { class variant; }
namespace eos {
......@@ -14,8 +16,10 @@ namespace eos {
using std::unique_ptr;
using namespace appbase;
using chain::Name;
using fc::optional;
using chain::uint128_t;
using chain::public_key_type;
using fc::optional;
using boost::container::flat_set;
namespace chain_apis {
struct empty{};
......@@ -93,6 +97,16 @@ public:
abi_bin_to_json_result abi_bin_to_json( const abi_bin_to_json_params& params )const;
struct get_required_keys_params {
fc::variant transaction;
vector<string> available_keys_wif;
};
struct get_required_keys_result {
vector<string> required_keys_wif;
};
get_required_keys_result get_required_keys( const get_required_keys_params& params)const;
struct get_block_params {
string block_num_or_id;
......@@ -276,3 +290,5 @@ FC_REFLECT( eos::chain_apis::read_only::abi_json_to_bin_params, (code)(action)(a
FC_REFLECT( eos::chain_apis::read_only::abi_json_to_bin_result, (binargs)(required_scope)(required_auth) )
FC_REFLECT( eos::chain_apis::read_only::abi_bin_to_json_params, (code)(action)(binargs) )
FC_REFLECT( eos::chain_apis::read_only::abi_bin_to_json_result, (args)(required_scope)(required_auth) )
FC_REFLECT( eos::chain_apis::read_only::get_required_keys_params, (available_keys_wif) )
FC_REFLECT( eos::chain_apis::read_only::get_required_keys_result, (required_keys_wif) )
......@@ -60,8 +60,7 @@ public:
/// @return A list of wallet names with " *" appended if the wallet is unlocked.
std::vector<std::string> list_wallets();
/// @return A list of unlocked wallet names and their private keys.
/// Wallet name entry followed by private key entries.
/// @return A list of private keys from all unlocked wallets in wif format.
std::vector<std::string> list_keys();
/// Locks all the unlocked wallets.
......
......@@ -78,7 +78,6 @@ std::vector<std::string> wallet_manager::list_keys() {
std::vector<std::string> result;
for (const auto& i : wallets) {
if (!i.second->is_locked()) {
result.emplace_back(i.first);
const auto& keys = i.second->list_keys();
for (const auto& i : keys) {
result.emplace_back(i.second);
......
......@@ -85,14 +85,14 @@ BOOST_AUTO_TEST_CASE(wallet_manager_test)
BOOST_CHECK(!pw.empty());
BOOST_CHECK_EQUAL(0, pw.find("PW")); // starts with PW
BOOST_CHECK_EQUAL(1, wm.list_wallets().size());
BOOST_CHECK_EQUAL(1, wm.list_keys().size()); // wallet name only
BOOST_CHECK_EQUAL(0, wm.list_keys().size()); // no keys
BOOST_CHECK(wm.list_wallets().at(0).find("*") != std::string::npos);
wm.lock("test");
BOOST_CHECK(wm.list_wallets().at(0).find("*") == std::string::npos);
wm.unlock("test", pw);
BOOST_CHECK(wm.list_wallets().at(0).find("*") != std::string::npos);
wm.import_key("test", key1);
BOOST_CHECK_EQUAL(2, wm.list_keys().size()); // name and key
BOOST_CHECK_EQUAL(1, wm.list_keys().size());
auto keys = wm.list_keys();
BOOST_CHECK(std::find(keys.cbegin(), keys.cend(), key1) != keys.cend());
wm.import_key("test", key2);
......@@ -102,14 +102,14 @@ BOOST_AUTO_TEST_CASE(wallet_manager_test)
wm.lock("test");
BOOST_CHECK_EQUAL(0, wm.list_keys().size());
wm.unlock("test", pw);
BOOST_CHECK_EQUAL(3, wm.list_keys().size());
BOOST_CHECK_EQUAL(2, wm.list_keys().size());
wm.lock_all();
BOOST_CHECK_EQUAL(0, wm.list_keys().size());
BOOST_CHECK(wm.list_wallets().at(0).find("*") == std::string::npos);
auto pw2 = wm.create("test2");
BOOST_CHECK_EQUAL(2, wm.list_wallets().size());
BOOST_CHECK_EQUAL(1, wm.list_keys().size()); // wallet name only
BOOST_CHECK_EQUAL(0, wm.list_keys().size());
wm.import_key("test2", key3);
keys = wm.list_keys();
BOOST_CHECK(std::find(keys.cbegin(), keys.cend(), key1) == keys.cend());
......@@ -138,7 +138,7 @@ BOOST_AUTO_TEST_CASE(wallet_manager_test)
optional_private_key = utilities::wif_to_key(key3);
BOOST_CHECK(find(pks.cbegin(), pks.cend(), optional_private_key->get_public_key()) != pks.cend());
BOOST_CHECK_EQUAL(5, wm.list_keys().size());
BOOST_CHECK_EQUAL(3, wm.list_keys().size());
wm.set_timeout(chrono::seconds(0));
BOOST_CHECK_EQUAL(0, wm.list_keys().size());
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册