mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-06-08 13:49:35 +02:00
wallet: Split signmessage from rpcwallet
Can be reviewed with --color-moved=dimmed-zebra --color-moved-ws=ignore-all-space
This commit is contained in:
@@ -409,6 +409,7 @@ libbitcoin_wallet_a_SOURCES = \
|
|||||||
wallet/interfaces.cpp \
|
wallet/interfaces.cpp \
|
||||||
wallet/load.cpp \
|
wallet/load.cpp \
|
||||||
wallet/receive.cpp \
|
wallet/receive.cpp \
|
||||||
|
wallet/rpc/signmessage.cpp \
|
||||||
wallet/rpcdump.cpp \
|
wallet/rpcdump.cpp \
|
||||||
wallet/rpcwallet.cpp \
|
wallet/rpcwallet.cpp \
|
||||||
wallet/scriptpubkeyman.cpp \
|
wallet/scriptpubkeyman.cpp \
|
||||||
|
|||||||
68
src/wallet/rpc/signmessage.cpp
Normal file
68
src/wallet/rpc/signmessage.cpp
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
// Copyright (c) 2011-2021 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 <key_io.h>
|
||||||
|
#include <rpc/util.h>
|
||||||
|
#include <util/message.h>
|
||||||
|
#include <wallet/rpcwallet.h>
|
||||||
|
#include <wallet/wallet.h>
|
||||||
|
|
||||||
|
#include <univalue.h>
|
||||||
|
|
||||||
|
RPCHelpMan signmessage()
|
||||||
|
{
|
||||||
|
return RPCHelpMan{"signmessage",
|
||||||
|
"\nSign a message with the private key of an address" +
|
||||||
|
HELP_REQUIRING_PASSPHRASE,
|
||||||
|
{
|
||||||
|
{"address", RPCArg::Type::STR, RPCArg::Optional::NO, "The bitcoin address to use for the private key."},
|
||||||
|
{"message", RPCArg::Type::STR, RPCArg::Optional::NO, "The message to create a signature of."},
|
||||||
|
},
|
||||||
|
RPCResult{
|
||||||
|
RPCResult::Type::STR, "signature", "The signature of the message encoded in base 64"
|
||||||
|
},
|
||||||
|
RPCExamples{
|
||||||
|
"\nUnlock the wallet for 30 seconds\n"
|
||||||
|
+ HelpExampleCli("walletpassphrase", "\"mypassphrase\" 30") +
|
||||||
|
"\nCreate the signature\n"
|
||||||
|
+ HelpExampleCli("signmessage", "\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XX\" \"my message\"") +
|
||||||
|
"\nVerify the signature\n"
|
||||||
|
+ HelpExampleCli("verifymessage", "\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XX\" \"signature\" \"my message\"") +
|
||||||
|
"\nAs a JSON-RPC call\n"
|
||||||
|
+ HelpExampleRpc("signmessage", "\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XX\", \"my message\"")
|
||||||
|
},
|
||||||
|
[&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue
|
||||||
|
{
|
||||||
|
const std::shared_ptr<const CWallet> pwallet = GetWalletForJSONRPCRequest(request);
|
||||||
|
if (!pwallet) return NullUniValue;
|
||||||
|
|
||||||
|
LOCK(pwallet->cs_wallet);
|
||||||
|
|
||||||
|
EnsureWalletIsUnlocked(*pwallet);
|
||||||
|
|
||||||
|
std::string strAddress = request.params[0].get_str();
|
||||||
|
std::string strMessage = request.params[1].get_str();
|
||||||
|
|
||||||
|
CTxDestination dest = DecodeDestination(strAddress);
|
||||||
|
if (!IsValidDestination(dest)) {
|
||||||
|
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid address");
|
||||||
|
}
|
||||||
|
|
||||||
|
const PKHash* pkhash = std::get_if<PKHash>(&dest);
|
||||||
|
if (!pkhash) {
|
||||||
|
throw JSONRPCError(RPC_TYPE_ERROR, "Address does not refer to key");
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string signature;
|
||||||
|
SigningResult err = pwallet->SignMessage(strMessage, *pkhash, signature);
|
||||||
|
if (err == SigningResult::SIGNING_FAILED) {
|
||||||
|
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, SigningResultString(err));
|
||||||
|
} else if (err != SigningResult::OK) {
|
||||||
|
throw JSONRPCError(RPC_WALLET_ERROR, SigningResultString(err));
|
||||||
|
}
|
||||||
|
|
||||||
|
return signature;
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -20,7 +20,6 @@
|
|||||||
#include <script/sign.h>
|
#include <script/sign.h>
|
||||||
#include <util/bip32.h>
|
#include <util/bip32.h>
|
||||||
#include <util/fees.h>
|
#include <util/fees.h>
|
||||||
#include <util/message.h> // For MessageSign()
|
|
||||||
#include <util/moneystr.h>
|
#include <util/moneystr.h>
|
||||||
#include <util/string.h>
|
#include <util/string.h>
|
||||||
#include <util/system.h>
|
#include <util/system.h>
|
||||||
@@ -48,7 +47,7 @@
|
|||||||
using interfaces::FoundBlock;
|
using interfaces::FoundBlock;
|
||||||
|
|
||||||
static const std::string WALLET_ENDPOINT_BASE = "/wallet/";
|
static const std::string WALLET_ENDPOINT_BASE = "/wallet/";
|
||||||
static const std::string HELP_REQUIRING_PASSPHRASE{"\nRequires wallet passphrase to be set with walletpassphrase call if wallet is encrypted.\n"};
|
const std::string HELP_REQUIRING_PASSPHRASE{"\nRequires wallet passphrase to be set with walletpassphrase call if wallet is encrypted.\n"};
|
||||||
|
|
||||||
static inline bool GetAvoidReuseFlag(const CWallet& wallet, const UniValue& param) {
|
static inline bool GetAvoidReuseFlag(const CWallet& wallet, const UniValue& param) {
|
||||||
bool can_avoid_reuse = wallet.IsWalletFlagSet(WALLET_FLAG_AVOID_REUSE);
|
bool can_avoid_reuse = wallet.IsWalletFlagSet(WALLET_FLAG_AVOID_REUSE);
|
||||||
@@ -612,63 +611,6 @@ static RPCHelpMan listaddressgroupings()
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
static RPCHelpMan signmessage()
|
|
||||||
{
|
|
||||||
return RPCHelpMan{"signmessage",
|
|
||||||
"\nSign a message with the private key of an address" +
|
|
||||||
HELP_REQUIRING_PASSPHRASE,
|
|
||||||
{
|
|
||||||
{"address", RPCArg::Type::STR, RPCArg::Optional::NO, "The bitcoin address to use for the private key."},
|
|
||||||
{"message", RPCArg::Type::STR, RPCArg::Optional::NO, "The message to create a signature of."},
|
|
||||||
},
|
|
||||||
RPCResult{
|
|
||||||
RPCResult::Type::STR, "signature", "The signature of the message encoded in base 64"
|
|
||||||
},
|
|
||||||
RPCExamples{
|
|
||||||
"\nUnlock the wallet for 30 seconds\n"
|
|
||||||
+ HelpExampleCli("walletpassphrase", "\"mypassphrase\" 30") +
|
|
||||||
"\nCreate the signature\n"
|
|
||||||
+ HelpExampleCli("signmessage", "\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XX\" \"my message\"") +
|
|
||||||
"\nVerify the signature\n"
|
|
||||||
+ HelpExampleCli("verifymessage", "\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XX\" \"signature\" \"my message\"") +
|
|
||||||
"\nAs a JSON-RPC call\n"
|
|
||||||
+ HelpExampleRpc("signmessage", "\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XX\", \"my message\"")
|
|
||||||
},
|
|
||||||
[&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue
|
|
||||||
{
|
|
||||||
const std::shared_ptr<const CWallet> pwallet = GetWalletForJSONRPCRequest(request);
|
|
||||||
if (!pwallet) return NullUniValue;
|
|
||||||
|
|
||||||
LOCK(pwallet->cs_wallet);
|
|
||||||
|
|
||||||
EnsureWalletIsUnlocked(*pwallet);
|
|
||||||
|
|
||||||
std::string strAddress = request.params[0].get_str();
|
|
||||||
std::string strMessage = request.params[1].get_str();
|
|
||||||
|
|
||||||
CTxDestination dest = DecodeDestination(strAddress);
|
|
||||||
if (!IsValidDestination(dest)) {
|
|
||||||
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid address");
|
|
||||||
}
|
|
||||||
|
|
||||||
const PKHash* pkhash = std::get_if<PKHash>(&dest);
|
|
||||||
if (!pkhash) {
|
|
||||||
throw JSONRPCError(RPC_TYPE_ERROR, "Address does not refer to key");
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string signature;
|
|
||||||
SigningResult err = pwallet->SignMessage(strMessage, *pkhash, signature);
|
|
||||||
if (err == SigningResult::SIGNING_FAILED) {
|
|
||||||
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, SigningResultString(err));
|
|
||||||
} else if (err != SigningResult::OK){
|
|
||||||
throw JSONRPCError(RPC_WALLET_ERROR, SigningResultString(err));
|
|
||||||
}
|
|
||||||
|
|
||||||
return signature;
|
|
||||||
},
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
static CAmount GetReceived(const CWallet& wallet, const UniValue& params, bool by_label) EXCLUSIVE_LOCKS_REQUIRED(wallet.cs_wallet)
|
static CAmount GetReceived(const CWallet& wallet, const UniValue& params, bool by_label) EXCLUSIVE_LOCKS_REQUIRED(wallet.cs_wallet)
|
||||||
{
|
{
|
||||||
std::set<CTxDestination> address_set;
|
std::set<CTxDestination> address_set;
|
||||||
@@ -4860,6 +4802,7 @@ RPCHelpMan removeprunedfunds();
|
|||||||
RPCHelpMan importmulti();
|
RPCHelpMan importmulti();
|
||||||
RPCHelpMan importdescriptors();
|
RPCHelpMan importdescriptors();
|
||||||
RPCHelpMan listdescriptors();
|
RPCHelpMan listdescriptors();
|
||||||
|
RPCHelpMan signmessage();
|
||||||
|
|
||||||
Span<const CRPCCommand> GetWalletRPCCommands()
|
Span<const CRPCCommand> GetWalletRPCCommands()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -21,6 +21,8 @@ class CTransaction;
|
|||||||
struct PartiallySignedTransaction;
|
struct PartiallySignedTransaction;
|
||||||
struct WalletContext;
|
struct WalletContext;
|
||||||
|
|
||||||
|
extern const std::string HELP_REQUIRING_PASSPHRASE;
|
||||||
|
|
||||||
Span<const CRPCCommand> GetWalletRPCCommands();
|
Span<const CRPCCommand> GetWalletRPCCommands();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user