Merge pull request #1383 from jgarzik/rawtx
JSON-RPC: Add 'sendrawtx' op, for sending pre-built TX's to network
This commit is contained in:
commit
ec9c902133
3 changed files with 37 additions and 1 deletions
|
@ -2217,6 +2217,40 @@ Value getblock(const Array& params, bool fHelp)
|
||||||
(params.size() > 1) ? params[1].get_obj() : emptyobj);
|
(params.size() > 1) ? params[1].get_obj() : emptyobj);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Value sendrawtx(const Array& params, bool fHelp)
|
||||||
|
{
|
||||||
|
if (fHelp || params.size() < 1 || params.size() > 1)
|
||||||
|
throw runtime_error(
|
||||||
|
"sendrawtx <hex string>\n"
|
||||||
|
"Submits raw transaction (serialized, hex-encoded) to local node and network.");
|
||||||
|
|
||||||
|
// parse hex string from parameter
|
||||||
|
vector<unsigned char> txData(ParseHex(params[0].get_str()));
|
||||||
|
CDataStream ssData(txData, SER_NETWORK, PROTOCOL_VERSION);
|
||||||
|
CTransaction tx;
|
||||||
|
|
||||||
|
// deserialize binary data stream
|
||||||
|
try {
|
||||||
|
ssData >> tx;
|
||||||
|
}
|
||||||
|
catch (std::exception &e) {
|
||||||
|
throw JSONRPCError(-22, "TX decode failed");
|
||||||
|
}
|
||||||
|
|
||||||
|
// push to local node
|
||||||
|
CTxDB txdb("r");
|
||||||
|
if (!tx.AcceptToMemoryPool(txdb))
|
||||||
|
throw JSONRPCError(-22, "TX rejected");
|
||||||
|
|
||||||
|
SyncWithWallets(tx, NULL, true);
|
||||||
|
|
||||||
|
// relay to network
|
||||||
|
CInv inv(MSG_TX, tx.GetHash());
|
||||||
|
RelayInventory(inv);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -2280,6 +2314,7 @@ static const CRPCCommand vRPCCommands[] =
|
||||||
{ "listsinceblock", &listsinceblock, false },
|
{ "listsinceblock", &listsinceblock, false },
|
||||||
{ "dumpprivkey", &dumpprivkey, false },
|
{ "dumpprivkey", &dumpprivkey, false },
|
||||||
{ "importprivkey", &importprivkey, false },
|
{ "importprivkey", &importprivkey, false },
|
||||||
|
{ "sendrawtx", &sendrawtx, false },
|
||||||
};
|
};
|
||||||
|
|
||||||
CRPCTable::CRPCTable()
|
CRPCTable::CRPCTable()
|
||||||
|
|
|
@ -109,7 +109,7 @@ void static EraseFromWallets(uint256 hash)
|
||||||
}
|
}
|
||||||
|
|
||||||
// make sure all wallets know about the given transaction, in the given block
|
// make sure all wallets know about the given transaction, in the given block
|
||||||
void static SyncWithWallets(const CTransaction& tx, const CBlock* pblock = NULL, bool fUpdate = false)
|
void SyncWithWallets(const CTransaction& tx, const CBlock* pblock, bool fUpdate)
|
||||||
{
|
{
|
||||||
BOOST_FOREACH(CWallet* pwallet, setpwalletRegistered)
|
BOOST_FOREACH(CWallet* pwallet, setpwalletRegistered)
|
||||||
pwallet->AddToWalletIfInvolvingMe(tx, pblock, fUpdate);
|
pwallet->AddToWalletIfInvolvingMe(tx, pblock, fUpdate);
|
||||||
|
|
|
@ -81,6 +81,7 @@ class CTxIndex;
|
||||||
|
|
||||||
void RegisterWallet(CWallet* pwalletIn);
|
void RegisterWallet(CWallet* pwalletIn);
|
||||||
void UnregisterWallet(CWallet* pwalletIn);
|
void UnregisterWallet(CWallet* pwalletIn);
|
||||||
|
void SyncWithWallets(const CTransaction& tx, const CBlock* pblock = NULL, bool fUpdate = false);
|
||||||
bool ProcessBlock(CNode* pfrom, CBlock* pblock);
|
bool ProcessBlock(CNode* pfrom, CBlock* pblock);
|
||||||
bool CheckDiskSpace(uint64 nAdditionalBytes=0);
|
bool CheckDiskSpace(uint64 nAdditionalBytes=0);
|
||||||
FILE* OpenBlockFile(unsigned int nFile, unsigned int nBlockPos, const char* pszMode="rb");
|
FILE* OpenBlockFile(unsigned int nFile, unsigned int nBlockPos, const char* pszMode="rb");
|
||||||
|
|
Loading…
Reference in a new issue