Merge branch 'danger' of github.com:MyHush/hush3 into danger
This commit is contained in:
11
src/init.cpp
11
src/init.cpp
@@ -392,6 +392,7 @@ std::string HelpMessage(HelpMessageMode mode)
|
|||||||
strUsage += HelpMessageOpt("-sysperms", _("Create new files with system default permissions, instead of umask 077 (only effective with disabled wallet functionality)"));
|
strUsage += HelpMessageOpt("-sysperms", _("Create new files with system default permissions, instead of umask 077 (only effective with disabled wallet functionality)"));
|
||||||
#endif
|
#endif
|
||||||
strUsage += HelpMessageOpt("-txindex", strprintf(_("Maintain a full transaction index, used by the getrawtransaction rpc call (default: %u)"), 0));
|
strUsage += HelpMessageOpt("-txindex", strprintf(_("Maintain a full transaction index, used by the getrawtransaction rpc call (default: %u)"), 0));
|
||||||
|
strUsage += HelpMessageOpt("-txsend=<cmd>", _("Execute command to send a transaction instead of broadcasting (%s in cmd is replaced by transaction hex)"));
|
||||||
strUsage += HelpMessageOpt("-addressindex", strprintf(_("Maintain a full address index, used to query for the balance, txids and unspent outputs for addresses (default: %u)"), DEFAULT_ADDRESSINDEX));
|
strUsage += HelpMessageOpt("-addressindex", strprintf(_("Maintain a full address index, used to query for the balance, txids and unspent outputs for addresses (default: %u)"), DEFAULT_ADDRESSINDEX));
|
||||||
strUsage += HelpMessageOpt("-timestampindex", strprintf(_("Maintain a timestamp index for block hashes, used to query blocks hashes by a range of timestamps (default: %u)"), DEFAULT_TIMESTAMPINDEX));
|
strUsage += HelpMessageOpt("-timestampindex", strprintf(_("Maintain a timestamp index for block hashes, used to query blocks hashes by a range of timestamps (default: %u)"), DEFAULT_TIMESTAMPINDEX));
|
||||||
strUsage += HelpMessageOpt("-spentindex", strprintf(_("Maintain a full spent index, used to query the spending txid and input index for an outpoint (default: %u)"), DEFAULT_SPENTINDEX));
|
strUsage += HelpMessageOpt("-spentindex", strprintf(_("Maintain a full spent index, used to query the spending txid and input index for an outpoint (default: %u)"), DEFAULT_SPENTINDEX));
|
||||||
@@ -1118,6 +1119,16 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (mapArgs.count("-txsend")) {
|
||||||
|
if (GetBoolArg("-walletbroadcast", true)) {
|
||||||
|
if (SoftSetBoolArg("-walletbroadcast", false)) {
|
||||||
|
LogPrintf("%s: parameter interaction: -txsend=<cmd> -> setting -walletbroadcast=0\n", __func__);
|
||||||
|
} else {
|
||||||
|
return InitError(_("Wallet transaction broadcasting is incompatible with -txsend (for privacy)."));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// ********************************************************* Step 3: parameter-to-internal-flags
|
// ********************************************************* Step 3: parameter-to-internal-flags
|
||||||
|
|
||||||
fZdebug=GetBoolArg("-zdebug", false);
|
fZdebug=GetBoolArg("-zdebug", false);
|
||||||
|
|||||||
@@ -45,7 +45,10 @@
|
|||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include <boost/algorithm/string/replace.hpp>
|
||||||
|
|
||||||
#include <boost/assign/list_of.hpp>
|
#include <boost/assign/list_of.hpp>
|
||||||
|
#include <boost/thread.hpp>
|
||||||
|
|
||||||
#include <univalue.h>
|
#include <univalue.h>
|
||||||
|
|
||||||
@@ -82,65 +85,6 @@ void ScriptPubKeyToJSON(const CScript& scriptPubKey, UniValue& out, bool fInclud
|
|||||||
out.push_back(Pair("addresses", a));
|
out.push_back(Pair("addresses", a));
|
||||||
}
|
}
|
||||||
|
|
||||||
UniValue TxJoinSplitToJSON(const CTransaction& tx) {
|
|
||||||
bool useGroth = tx.fOverwintered && tx.nVersion >= SAPLING_TX_VERSION;
|
|
||||||
UniValue vjoinsplit(UniValue::VARR);
|
|
||||||
for (unsigned int i = 0; i < tx.vjoinsplit.size(); i++) {
|
|
||||||
const JSDescription& jsdescription = tx.vjoinsplit[i];
|
|
||||||
UniValue joinsplit(UniValue::VOBJ);
|
|
||||||
|
|
||||||
joinsplit.push_back(Pair("vpub_old", ValueFromAmount(jsdescription.vpub_old)));
|
|
||||||
joinsplit.push_back(Pair("vpub_oldZat", jsdescription.vpub_old));
|
|
||||||
joinsplit.push_back(Pair("vpub_new", ValueFromAmount(jsdescription.vpub_new)));
|
|
||||||
joinsplit.push_back(Pair("vpub_newZat", jsdescription.vpub_new));
|
|
||||||
|
|
||||||
joinsplit.push_back(Pair("anchor", jsdescription.anchor.GetHex()));
|
|
||||||
|
|
||||||
{
|
|
||||||
UniValue nullifiers(UniValue::VARR);
|
|
||||||
BOOST_FOREACH(const uint256 nf, jsdescription.nullifiers) {
|
|
||||||
nullifiers.push_back(nf.GetHex());
|
|
||||||
}
|
|
||||||
joinsplit.push_back(Pair("nullifiers", nullifiers));
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
UniValue commitments(UniValue::VARR);
|
|
||||||
BOOST_FOREACH(const uint256 commitment, jsdescription.commitments) {
|
|
||||||
commitments.push_back(commitment.GetHex());
|
|
||||||
}
|
|
||||||
joinsplit.push_back(Pair("commitments", commitments));
|
|
||||||
}
|
|
||||||
|
|
||||||
joinsplit.push_back(Pair("onetimePubKey", jsdescription.ephemeralKey.GetHex()));
|
|
||||||
joinsplit.push_back(Pair("randomSeed", jsdescription.randomSeed.GetHex()));
|
|
||||||
|
|
||||||
{
|
|
||||||
UniValue macs(UniValue::VARR);
|
|
||||||
BOOST_FOREACH(const uint256 mac, jsdescription.macs) {
|
|
||||||
macs.push_back(mac.GetHex());
|
|
||||||
}
|
|
||||||
joinsplit.push_back(Pair("macs", macs));
|
|
||||||
}
|
|
||||||
|
|
||||||
CDataStream ssProof(SER_NETWORK, PROTOCOL_VERSION);
|
|
||||||
auto ps = SproutProofSerializer<CDataStream>(ssProof, useGroth);
|
|
||||||
boost::apply_visitor(ps, jsdescription.proof);
|
|
||||||
joinsplit.push_back(Pair("proof", HexStr(ssProof.begin(), ssProof.end())));
|
|
||||||
|
|
||||||
{
|
|
||||||
UniValue ciphertexts(UniValue::VARR);
|
|
||||||
for (const ZCNoteEncryption::Ciphertext ct : jsdescription.ciphertexts) {
|
|
||||||
ciphertexts.push_back(HexStr(ct.begin(), ct.end()));
|
|
||||||
}
|
|
||||||
joinsplit.push_back(Pair("ciphertexts", ciphertexts));
|
|
||||||
}
|
|
||||||
|
|
||||||
vjoinsplit.push_back(joinsplit);
|
|
||||||
}
|
|
||||||
return vjoinsplit;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint64_t komodo_accrued_interest(int32_t *txheightp,uint32_t *locktimep,uint256 hash,int32_t n,int32_t checkheight,uint64_t checkvalue,int32_t tipheight);
|
uint64_t komodo_accrued_interest(int32_t *txheightp,uint32_t *locktimep,uint256 hash,int32_t n,int32_t checkheight,uint64_t checkvalue,int32_t tipheight);
|
||||||
|
|
||||||
UniValue TxShieldedSpendsToJSON(const CTransaction& tx) {
|
UniValue TxShieldedSpendsToJSON(const CTransaction& tx) {
|
||||||
@@ -306,9 +250,6 @@ void TxToJSONExpanded(const CTransaction& tx, const uint256 hashBlock, UniValue&
|
|||||||
}
|
}
|
||||||
entry.push_back(Pair("vout", vout));
|
entry.push_back(Pair("vout", vout));
|
||||||
|
|
||||||
UniValue vjoinsplit = TxJoinSplitToJSON(tx);
|
|
||||||
entry.push_back(Pair("vjoinsplit", vjoinsplit));
|
|
||||||
|
|
||||||
if (tx.fOverwintered && tx.nVersion >= SAPLING_TX_VERSION) {
|
if (tx.fOverwintered && tx.nVersion >= SAPLING_TX_VERSION) {
|
||||||
entry.push_back(Pair("valueBalance", ValueFromAmount(tx.valueBalance)));
|
entry.push_back(Pair("valueBalance", ValueFromAmount(tx.valueBalance)));
|
||||||
UniValue vspenddesc = TxShieldedSpendsToJSON(tx);
|
UniValue vspenddesc = TxShieldedSpendsToJSON(tx);
|
||||||
@@ -390,9 +331,6 @@ void TxToJSON(const CTransaction& tx, const uint256 hashBlock, UniValue& entry)
|
|||||||
}
|
}
|
||||||
entry.push_back(Pair("vout", vout));
|
entry.push_back(Pair("vout", vout));
|
||||||
|
|
||||||
UniValue vjoinsplit = TxJoinSplitToJSON(tx);
|
|
||||||
entry.push_back(Pair("vjoinsplit", vjoinsplit));
|
|
||||||
|
|
||||||
if (tx.fOverwintered && tx.nVersion >= SAPLING_TX_VERSION) {
|
if (tx.fOverwintered && tx.nVersion >= SAPLING_TX_VERSION) {
|
||||||
entry.push_back(Pair("valueBalance", ValueFromAmount(tx.valueBalance)));
|
entry.push_back(Pair("valueBalance", ValueFromAmount(tx.valueBalance)));
|
||||||
UniValue vspenddesc = TxShieldedSpendsToJSON(tx);
|
UniValue vspenddesc = TxShieldedSpendsToJSON(tx);
|
||||||
@@ -478,33 +416,6 @@ UniValue getrawtransaction(const UniValue& params, bool fHelp, const CPubKey& my
|
|||||||
" }\n"
|
" }\n"
|
||||||
" ,...\n"
|
" ,...\n"
|
||||||
" ],\n"
|
" ],\n"
|
||||||
" \"vjoinsplit\" : [ (array of json objects, only for version >= 2)\n"
|
|
||||||
" {\n"
|
|
||||||
" \"vpub_old\" : x.xxx, (numeric) public input value\n"
|
|
||||||
" \"vpub_new\" : x.xxx, (numeric) public output value\n"
|
|
||||||
" \"anchor\" : \"hex\", (string) the anchor\n"
|
|
||||||
" \"nullifiers\" : [ (json array of string)\n"
|
|
||||||
" \"hex\" (string) input note nullifier\n"
|
|
||||||
" ,...\n"
|
|
||||||
" ],\n"
|
|
||||||
" \"commitments\" : [ (json array of string)\n"
|
|
||||||
" \"hex\" (string) output note commitment\n"
|
|
||||||
" ,...\n"
|
|
||||||
" ],\n"
|
|
||||||
" \"onetimePubKey\" : \"hex\", (string) the onetime public key used to encrypt the ciphertexts\n"
|
|
||||||
" \"randomSeed\" : \"hex\", (string) the random seed\n"
|
|
||||||
" \"macs\" : [ (json array of string)\n"
|
|
||||||
" \"hex\" (string) input note MAC\n"
|
|
||||||
" ,...\n"
|
|
||||||
" ],\n"
|
|
||||||
" \"proof\" : \"hex\", (string) the zero-knowledge proof\n"
|
|
||||||
" \"ciphertexts\" : [ (json array of string)\n"
|
|
||||||
" \"hex\" (string) output note ciphertext\n"
|
|
||||||
" ,...\n"
|
|
||||||
" ]\n"
|
|
||||||
" }\n"
|
|
||||||
" ,...\n"
|
|
||||||
" ],\n"
|
|
||||||
" \"blockhash\" : \"hash\", (string) the block hash\n"
|
" \"blockhash\" : \"hash\", (string) the block hash\n"
|
||||||
" \"confirmations\" : n, (numeric) The number of notarized DPoW confirmations\n"
|
" \"confirmations\" : n, (numeric) The number of notarized DPoW confirmations\n"
|
||||||
" \"rawconfirmations\" : n, (numeric) The number of raw confirmations\n"
|
" \"rawconfirmations\" : n, (numeric) The number of raw confirmations\n"
|
||||||
@@ -933,33 +844,6 @@ UniValue decoderawtransaction(const UniValue& params, bool fHelp, const CPubKey&
|
|||||||
" }\n"
|
" }\n"
|
||||||
" ,...\n"
|
" ,...\n"
|
||||||
" ],\n"
|
" ],\n"
|
||||||
" \"vjoinsplit\" : [ (array of json objects, only for version >= 2)\n"
|
|
||||||
" {\n"
|
|
||||||
" \"vpub_old\" : x.xxx, (numeric) public input value in HUSH\n"
|
|
||||||
" \"vpub_new\" : x.xxx, (numeric) public output value in HUSH\n"
|
|
||||||
" \"anchor\" : \"hex\", (string) the anchor\n"
|
|
||||||
" \"nullifiers\" : [ (json array of string)\n"
|
|
||||||
" \"hex\" (string) input note nullifier\n"
|
|
||||||
" ,...\n"
|
|
||||||
" ],\n"
|
|
||||||
" \"commitments\" : [ (json array of string)\n"
|
|
||||||
" \"hex\" (string) output note commitment\n"
|
|
||||||
" ,...\n"
|
|
||||||
" ],\n"
|
|
||||||
" \"onetimePubKey\" : \"hex\", (string) the onetime public key used to encrypt the ciphertexts\n"
|
|
||||||
" \"randomSeed\" : \"hex\", (string) the random seed\n"
|
|
||||||
" \"macs\" : [ (json array of string)\n"
|
|
||||||
" \"hex\" (string) input note MAC\n"
|
|
||||||
" ,...\n"
|
|
||||||
" ],\n"
|
|
||||||
" \"proof\" : \"hex\", (string) the zero-knowledge proof\n"
|
|
||||||
" \"ciphertexts\" : [ (json array of string)\n"
|
|
||||||
" \"hex\" (string) output note ciphertext\n"
|
|
||||||
" ,...\n"
|
|
||||||
" ]\n"
|
|
||||||
" }\n"
|
|
||||||
" ,...\n"
|
|
||||||
" ],\n"
|
|
||||||
"}\n"
|
"}\n"
|
||||||
|
|
||||||
"\nExamples:\n"
|
"\nExamples:\n"
|
||||||
@@ -1373,6 +1257,19 @@ UniValue sendrawtransaction(const UniValue& params, bool fHelp, const CPubKey& m
|
|||||||
const CCoins* existingCoins = view.AccessCoins(hashTx);
|
const CCoins* existingCoins = view.AccessCoins(hashTx);
|
||||||
bool fHaveMempool = mempool.exists(hashTx);
|
bool fHaveMempool = mempool.exists(hashTx);
|
||||||
bool fHaveChain = existingCoins && existingCoins->nHeight < 1000000000;
|
bool fHaveChain = existingCoins && existingCoins->nHeight < 1000000000;
|
||||||
|
|
||||||
|
// If we are configured to send transactions via an
|
||||||
|
// external service instead of broadcasting, do that
|
||||||
|
std::string strCmd = GetArg("-txsend", "");
|
||||||
|
if (!strCmd.empty()) {
|
||||||
|
if (fHaveChain) {
|
||||||
|
throw JSONRPCError(RPC_TRANSACTION_ALREADY_IN_CHAIN, "transaction already in block chain");
|
||||||
|
}
|
||||||
|
boost::replace_all(strCmd, "%s", EncodeHexTx(tx));
|
||||||
|
boost::thread t(runCommand, strCmd); // thread runs free
|
||||||
|
// Return here so we don't add to our mempool or broadcast to peers
|
||||||
|
return hashTx.GetHex();
|
||||||
|
}
|
||||||
if (!fHaveMempool && !fHaveChain) {
|
if (!fHaveMempool && !fHaveChain) {
|
||||||
// push to local node and sync with wallets
|
// push to local node and sync with wallets
|
||||||
CValidationState state;
|
CValidationState state;
|
||||||
|
|||||||
@@ -66,9 +66,10 @@ void CScheduler::serviceQueue()
|
|||||||
|
|
||||||
// Some boost versions have a conflicting overload of wait_until that returns void.
|
// Some boost versions have a conflicting overload of wait_until that returns void.
|
||||||
// Explicitly use a template here to avoid hitting that overload.
|
// Explicitly use a template here to avoid hitting that overload.
|
||||||
while (!shouldStop() && !taskQueue.empty() &&
|
while (!shouldStop() && !taskQueue.empty()) {
|
||||||
newTaskScheduled.wait_until<>(lock, taskQueue.begin()->first) != boost::cv_status::timeout) {
|
boost::chrono::system_clock::time_point timeToWaitFor = taskQueue.begin()->first;
|
||||||
// Keep waiting until timeout
|
if (newTaskScheduled.wait_until<>(lock, timeToWaitFor) == boost::cv_status::timeout)
|
||||||
|
break; // Exit loop after timeout, it means we reached the time of the event
|
||||||
}
|
}
|
||||||
|
|
||||||
// If there are multiple threads, the queue can empty while we're waiting (another
|
// If there are multiple threads, the queue can empty while we're waiting (another
|
||||||
|
|||||||
@@ -3950,6 +3950,8 @@ bool CWallet::CommitTransaction(CWalletTx& wtxNew, CReserveKey& reservekey)
|
|||||||
// Track how many getdata requests our transaction gets
|
// Track how many getdata requests our transaction gets
|
||||||
mapRequestCount[wtxNew.GetHash()] = 0;
|
mapRequestCount[wtxNew.GetHash()] = 0;
|
||||||
|
|
||||||
|
std::string strCmd = GetArg("-txsend", "");
|
||||||
|
|
||||||
if (fBroadcastTransactions)
|
if (fBroadcastTransactions)
|
||||||
{
|
{
|
||||||
// Broadcast
|
// Broadcast
|
||||||
@@ -3962,6 +3964,12 @@ bool CWallet::CommitTransaction(CWalletTx& wtxNew, CReserveKey& reservekey)
|
|||||||
}
|
}
|
||||||
wtxNew.RelayWalletTransaction();
|
wtxNew.RelayWalletTransaction();
|
||||||
}
|
}
|
||||||
|
// If we are configured to send transactions via an
|
||||||
|
// external service instead of broadcasting, do that
|
||||||
|
else if (!strCmd.empty()) {
|
||||||
|
boost::replace_all(strCmd, "%s", EncodeHexTx(wtxNew));
|
||||||
|
boost::thread t(runCommand, strCmd); // thread runs free
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user