|
|
@ -526,6 +526,72 @@ Value sendtoaddress(const Array& params, bool fHelp) |
|
|
|
return wtx.GetHash().GetHex(); |
|
|
|
return wtx.GetHash().GetHex(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static const string strMessageMagic = "Bitcoin Signed Message:\n"; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Value signmessage(const Array& params, bool fHelp) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
if (fHelp || params.size() != 2) |
|
|
|
|
|
|
|
throw runtime_error( |
|
|
|
|
|
|
|
"signmessage <bitcoinaddress> <message>\n" |
|
|
|
|
|
|
|
"Sign a message with the private key of an address"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (pwalletMain->IsLocked()) |
|
|
|
|
|
|
|
throw JSONRPCError(-13, "Error: Please enter the wallet passphrase with walletpassphrase first."); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
string strAddress = params[0].get_str(); |
|
|
|
|
|
|
|
string strMessage = params[1].get_str(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CBitcoinAddress addr(strAddress); |
|
|
|
|
|
|
|
if (!addr.IsValid()) |
|
|
|
|
|
|
|
throw JSONRPCError(-3, "Invalid address"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CKey key; |
|
|
|
|
|
|
|
if (!pwalletMain->GetKey(addr, key)) |
|
|
|
|
|
|
|
throw JSONRPCError(-4, "Private key not available"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CDataStream ss(SER_GETHASH); |
|
|
|
|
|
|
|
ss << strMessageMagic; |
|
|
|
|
|
|
|
ss << strMessage; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
vector<unsigned char> vchSig; |
|
|
|
|
|
|
|
if (!key.SignCompact(Hash(ss.begin(), ss.end()), vchSig)) |
|
|
|
|
|
|
|
throw JSONRPCError(-5, "Sign failed"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return EncodeBase64(&vchSig[0], vchSig.size()); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Value verifymessage(const Array& params, bool fHelp) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
if (fHelp || params.size() != 3) |
|
|
|
|
|
|
|
throw runtime_error( |
|
|
|
|
|
|
|
"verifymessage <bitcoinaddress> <signature> <message>\n" |
|
|
|
|
|
|
|
"Verify a signed message"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
string strAddress = params[0].get_str(); |
|
|
|
|
|
|
|
string strSign = params[1].get_str(); |
|
|
|
|
|
|
|
string strMessage = params[2].get_str(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CBitcoinAddress addr(strAddress); |
|
|
|
|
|
|
|
if (!addr.IsValid()) |
|
|
|
|
|
|
|
throw JSONRPCError(-3, "Invalid address"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool fInvalid = false; |
|
|
|
|
|
|
|
vector<unsigned char> vchSig = DecodeBase64(strSign.c_str(), &fInvalid); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (fInvalid) |
|
|
|
|
|
|
|
throw JSONRPCError(-5, "Malformed base64 encoding"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CDataStream ss(SER_GETHASH); |
|
|
|
|
|
|
|
ss << strMessageMagic; |
|
|
|
|
|
|
|
ss << strMessage; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CKey key; |
|
|
|
|
|
|
|
if (!key.SetCompactSignature(Hash(ss.begin(), ss.end()), vchSig)) |
|
|
|
|
|
|
|
return false; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return (key.GetAddress() == addr); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Value getreceivedbyaddress(const Array& params, bool fHelp) |
|
|
|
Value getreceivedbyaddress(const Array& params, bool fHelp) |
|
|
|
{ |
|
|
|
{ |
|
|
@ -937,7 +1003,6 @@ Value ListReceived(const Array& params, bool fByAccounts) |
|
|
|
Object obj; |
|
|
|
Object obj; |
|
|
|
obj.push_back(Pair("address", address.ToString())); |
|
|
|
obj.push_back(Pair("address", address.ToString())); |
|
|
|
obj.push_back(Pair("account", strAccount)); |
|
|
|
obj.push_back(Pair("account", strAccount)); |
|
|
|
obj.push_back(Pair("label", strAccount)); // deprecated
|
|
|
|
|
|
|
|
obj.push_back(Pair("amount", ValueFromAmount(nAmount))); |
|
|
|
obj.push_back(Pair("amount", ValueFromAmount(nAmount))); |
|
|
|
obj.push_back(Pair("confirmations", (nConf == INT_MAX ? 0 : nConf))); |
|
|
|
obj.push_back(Pair("confirmations", (nConf == INT_MAX ? 0 : nConf))); |
|
|
|
ret.push_back(obj); |
|
|
|
ret.push_back(obj); |
|
|
@ -952,7 +1017,6 @@ Value ListReceived(const Array& params, bool fByAccounts) |
|
|
|
int nConf = (*it).second.nConf; |
|
|
|
int nConf = (*it).second.nConf; |
|
|
|
Object obj; |
|
|
|
Object obj; |
|
|
|
obj.push_back(Pair("account", (*it).first)); |
|
|
|
obj.push_back(Pair("account", (*it).first)); |
|
|
|
obj.push_back(Pair("label", (*it).first)); // deprecated
|
|
|
|
|
|
|
|
obj.push_back(Pair("amount", ValueFromAmount(nAmount))); |
|
|
|
obj.push_back(Pair("amount", ValueFromAmount(nAmount))); |
|
|
|
obj.push_back(Pair("confirmations", (nConf == INT_MAX ? 0 : nConf))); |
|
|
|
obj.push_back(Pair("confirmations", (nConf == INT_MAX ? 0 : nConf))); |
|
|
|
ret.push_back(obj); |
|
|
|
ret.push_back(obj); |
|
|
@ -1482,9 +1546,9 @@ Value getwork(const Array& params, bool fHelp) |
|
|
|
throw runtime_error( |
|
|
|
throw runtime_error( |
|
|
|
"getwork [data]\n" |
|
|
|
"getwork [data]\n" |
|
|
|
"If [data] is not specified, returns formatted hash data to work on:\n" |
|
|
|
"If [data] is not specified, returns formatted hash data to work on:\n" |
|
|
|
" \"midstate\" : precomputed hash state after hashing the first half of the data\n" |
|
|
|
" \"midstate\" : precomputed hash state after hashing the first half of the data (DEPRECATED)\n" // deprecated
|
|
|
|
" \"data\" : block data\n" |
|
|
|
" \"data\" : block data\n" |
|
|
|
" \"hash1\" : formatted hash buffer for second hash\n" |
|
|
|
" \"hash1\" : formatted hash buffer for second hash (DEPRECATED)\n" // deprecated
|
|
|
|
" \"target\" : little endian hash target\n" |
|
|
|
" \"target\" : little endian hash target\n" |
|
|
|
"If [data] is specified, tries to solve the block and returns true if it was successful."); |
|
|
|
"If [data] is specified, tries to solve the block and returns true if it was successful."); |
|
|
|
|
|
|
|
|
|
|
@ -1548,9 +1612,9 @@ Value getwork(const Array& params, bool fHelp) |
|
|
|
uint256 hashTarget = CBigNum().SetCompact(pblock->nBits).getuint256(); |
|
|
|
uint256 hashTarget = CBigNum().SetCompact(pblock->nBits).getuint256(); |
|
|
|
|
|
|
|
|
|
|
|
Object result; |
|
|
|
Object result; |
|
|
|
result.push_back(Pair("midstate", HexStr(BEGIN(pmidstate), END(pmidstate)))); |
|
|
|
result.push_back(Pair("midstate", HexStr(BEGIN(pmidstate), END(pmidstate)))); // deprecated
|
|
|
|
result.push_back(Pair("data", HexStr(BEGIN(pdata), END(pdata)))); |
|
|
|
result.push_back(Pair("data", HexStr(BEGIN(pdata), END(pdata)))); |
|
|
|
result.push_back(Pair("hash1", HexStr(BEGIN(phash1), END(phash1)))); |
|
|
|
result.push_back(Pair("hash1", HexStr(BEGIN(phash1), END(phash1)))); // deprecated
|
|
|
|
result.push_back(Pair("target", HexStr(BEGIN(hashTarget), END(hashTarget)))); |
|
|
|
result.push_back(Pair("target", HexStr(BEGIN(hashTarget), END(hashTarget)))); |
|
|
|
return result; |
|
|
|
return result; |
|
|
|
} |
|
|
|
} |
|
|
@ -1609,20 +1673,13 @@ pair<string, rpcfn_type> pCallTable[] = |
|
|
|
make_pair("getnewaddress", &getnewaddress), |
|
|
|
make_pair("getnewaddress", &getnewaddress), |
|
|
|
make_pair("getaccountaddress", &getaccountaddress), |
|
|
|
make_pair("getaccountaddress", &getaccountaddress), |
|
|
|
make_pair("setaccount", &setaccount), |
|
|
|
make_pair("setaccount", &setaccount), |
|
|
|
make_pair("setlabel", &setaccount), // deprecated
|
|
|
|
|
|
|
|
make_pair("getaccount", &getaccount), |
|
|
|
make_pair("getaccount", &getaccount), |
|
|
|
make_pair("getlabel", &getaccount), // deprecated
|
|
|
|
|
|
|
|
make_pair("getaddressesbyaccount", &getaddressesbyaccount), |
|
|
|
make_pair("getaddressesbyaccount", &getaddressesbyaccount), |
|
|
|
make_pair("getaddressesbylabel", &getaddressesbyaccount), // deprecated
|
|
|
|
|
|
|
|
make_pair("sendtoaddress", &sendtoaddress), |
|
|
|
make_pair("sendtoaddress", &sendtoaddress), |
|
|
|
make_pair("getamountreceived", &getreceivedbyaddress), // deprecated, renamed to getreceivedbyaddress
|
|
|
|
|
|
|
|
make_pair("getallreceived", &listreceivedbyaddress), // deprecated, renamed to listreceivedbyaddress
|
|
|
|
|
|
|
|
make_pair("getreceivedbyaddress", &getreceivedbyaddress), |
|
|
|
make_pair("getreceivedbyaddress", &getreceivedbyaddress), |
|
|
|
make_pair("getreceivedbyaccount", &getreceivedbyaccount), |
|
|
|
make_pair("getreceivedbyaccount", &getreceivedbyaccount), |
|
|
|
make_pair("getreceivedbylabel", &getreceivedbyaccount), // deprecated
|
|
|
|
|
|
|
|
make_pair("listreceivedbyaddress", &listreceivedbyaddress), |
|
|
|
make_pair("listreceivedbyaddress", &listreceivedbyaddress), |
|
|
|
make_pair("listreceivedbyaccount", &listreceivedbyaccount), |
|
|
|
make_pair("listreceivedbyaccount", &listreceivedbyaccount), |
|
|
|
make_pair("listreceivedbylabel", &listreceivedbyaccount), // deprecated
|
|
|
|
|
|
|
|
make_pair("backupwallet", &backupwallet), |
|
|
|
make_pair("backupwallet", &backupwallet), |
|
|
|
make_pair("keypoolrefill", &keypoolrefill), |
|
|
|
make_pair("keypoolrefill", &keypoolrefill), |
|
|
|
make_pair("walletpassphrase", &walletpassphrase), |
|
|
|
make_pair("walletpassphrase", &walletpassphrase), |
|
|
@ -1636,6 +1693,8 @@ pair<string, rpcfn_type> pCallTable[] = |
|
|
|
make_pair("sendmany", &sendmany), |
|
|
|
make_pair("sendmany", &sendmany), |
|
|
|
make_pair("gettransaction", &gettransaction), |
|
|
|
make_pair("gettransaction", &gettransaction), |
|
|
|
make_pair("listtransactions", &listtransactions), |
|
|
|
make_pair("listtransactions", &listtransactions), |
|
|
|
|
|
|
|
make_pair("signmessage", &signmessage), |
|
|
|
|
|
|
|
make_pair("verifymessage", &verifymessage), |
|
|
|
make_pair("getwork", &getwork), |
|
|
|
make_pair("getwork", &getwork), |
|
|
|
make_pair("listaccounts", &listaccounts), |
|
|
|
make_pair("listaccounts", &listaccounts), |
|
|
|
make_pair("settxfee", &settxfee), |
|
|
|
make_pair("settxfee", &settxfee), |
|
|
@ -1656,11 +1715,8 @@ string pAllowInSafeMode[] = |
|
|
|
"getinfo", |
|
|
|
"getinfo", |
|
|
|
"getnewaddress", |
|
|
|
"getnewaddress", |
|
|
|
"getaccountaddress", |
|
|
|
"getaccountaddress", |
|
|
|
"setlabel", // deprecated
|
|
|
|
|
|
|
|
"getaccount", |
|
|
|
"getaccount", |
|
|
|
"getlabel", // deprecated
|
|
|
|
|
|
|
|
"getaddressesbyaccount", |
|
|
|
"getaddressesbyaccount", |
|
|
|
"getaddressesbylabel", // deprecated
|
|
|
|
|
|
|
|
"backupwallet", |
|
|
|
"backupwallet", |
|
|
|
"keypoolrefill", |
|
|
|
"keypoolrefill", |
|
|
|
"walletpassphrase", |
|
|
|
"walletpassphrase", |
|
|
@ -1811,43 +1867,6 @@ int ReadHTTP(std::basic_istream<char>& stream, map<string, string>& mapHeadersRe |
|
|
|
return nStatus; |
|
|
|
return nStatus; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
string EncodeBase64(string s) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
BIO *b64, *bmem; |
|
|
|
|
|
|
|
BUF_MEM *bptr; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
b64 = BIO_new(BIO_f_base64()); |
|
|
|
|
|
|
|
BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL); |
|
|
|
|
|
|
|
bmem = BIO_new(BIO_s_mem()); |
|
|
|
|
|
|
|
b64 = BIO_push(b64, bmem); |
|
|
|
|
|
|
|
BIO_write(b64, s.c_str(), s.size()); |
|
|
|
|
|
|
|
BIO_flush(b64); |
|
|
|
|
|
|
|
BIO_get_mem_ptr(b64, &bptr); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
string result(bptr->data, bptr->length); |
|
|
|
|
|
|
|
BIO_free_all(b64); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return result; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
string DecodeBase64(string s) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
BIO *b64, *bmem; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
char* buffer = static_cast<char*>(calloc(s.size(), sizeof(char))); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
b64 = BIO_new(BIO_f_base64()); |
|
|
|
|
|
|
|
BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL); |
|
|
|
|
|
|
|
bmem = BIO_new_mem_buf(const_cast<char*>(s.c_str()), s.size()); |
|
|
|
|
|
|
|
bmem = BIO_push(b64, bmem); |
|
|
|
|
|
|
|
BIO_read(bmem, buffer, s.size()); |
|
|
|
|
|
|
|
BIO_free_all(bmem); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
string result(buffer); |
|
|
|
|
|
|
|
free(buffer); |
|
|
|
|
|
|
|
return result; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool HTTPAuthorized(map<string, string>& mapHeaders) |
|
|
|
bool HTTPAuthorized(map<string, string>& mapHeaders) |
|
|
|
{ |
|
|
|
{ |
|
|
|
string strAuth = mapHeaders["authorization"]; |
|
|
|
string strAuth = mapHeaders["authorization"]; |
|
|
@ -2285,18 +2304,12 @@ int CommandLineRPC(int argc, char *argv[]) |
|
|
|
if (strMethod == "setgenerate" && n > 1) ConvertTo<boost::int64_t>(params[1]); |
|
|
|
if (strMethod == "setgenerate" && n > 1) ConvertTo<boost::int64_t>(params[1]); |
|
|
|
if (strMethod == "sendtoaddress" && n > 1) ConvertTo<double>(params[1]); |
|
|
|
if (strMethod == "sendtoaddress" && n > 1) ConvertTo<double>(params[1]); |
|
|
|
if (strMethod == "settxfee" && n > 0) ConvertTo<double>(params[0]); |
|
|
|
if (strMethod == "settxfee" && n > 0) ConvertTo<double>(params[0]); |
|
|
|
if (strMethod == "getamountreceived" && n > 1) ConvertTo<boost::int64_t>(params[1]); // deprecated
|
|
|
|
|
|
|
|
if (strMethod == "getreceivedbyaddress" && n > 1) ConvertTo<boost::int64_t>(params[1]); |
|
|
|
if (strMethod == "getreceivedbyaddress" && n > 1) ConvertTo<boost::int64_t>(params[1]); |
|
|
|
if (strMethod == "getreceivedbyaccount" && n > 1) ConvertTo<boost::int64_t>(params[1]); |
|
|
|
if (strMethod == "getreceivedbyaccount" && n > 1) ConvertTo<boost::int64_t>(params[1]); |
|
|
|
if (strMethod == "getreceivedbylabel" && n > 1) ConvertTo<boost::int64_t>(params[1]); // deprecated
|
|
|
|
|
|
|
|
if (strMethod == "getallreceived" && n > 0) ConvertTo<boost::int64_t>(params[0]); // deprecated
|
|
|
|
|
|
|
|
if (strMethod == "getallreceived" && n > 1) ConvertTo<bool>(params[1]); // deprecated
|
|
|
|
|
|
|
|
if (strMethod == "listreceivedbyaddress" && n > 0) ConvertTo<boost::int64_t>(params[0]); |
|
|
|
if (strMethod == "listreceivedbyaddress" && n > 0) ConvertTo<boost::int64_t>(params[0]); |
|
|
|
if (strMethod == "listreceivedbyaddress" && n > 1) ConvertTo<bool>(params[1]); |
|
|
|
if (strMethod == "listreceivedbyaddress" && n > 1) ConvertTo<bool>(params[1]); |
|
|
|
if (strMethod == "listreceivedbyaccount" && n > 0) ConvertTo<boost::int64_t>(params[0]); |
|
|
|
if (strMethod == "listreceivedbyaccount" && n > 0) ConvertTo<boost::int64_t>(params[0]); |
|
|
|
if (strMethod == "listreceivedbyaccount" && n > 1) ConvertTo<bool>(params[1]); |
|
|
|
if (strMethod == "listreceivedbyaccount" && n > 1) ConvertTo<bool>(params[1]); |
|
|
|
if (strMethod == "listreceivedbylabel" && n > 0) ConvertTo<boost::int64_t>(params[0]); // deprecated
|
|
|
|
|
|
|
|
if (strMethod == "listreceivedbylabel" && n > 1) ConvertTo<bool>(params[1]); // deprecated
|
|
|
|
|
|
|
|
if (strMethod == "getbalance" && n > 1) ConvertTo<boost::int64_t>(params[1]); |
|
|
|
if (strMethod == "getbalance" && n > 1) ConvertTo<boost::int64_t>(params[1]); |
|
|
|
if (strMethod == "move" && n > 2) ConvertTo<double>(params[2]); |
|
|
|
if (strMethod == "move" && n > 2) ConvertTo<double>(params[2]); |
|
|
|
if (strMethod == "move" && n > 3) ConvertTo<boost::int64_t>(params[3]); |
|
|
|
if (strMethod == "move" && n > 3) ConvertTo<boost::int64_t>(params[3]); |
|
|
|