From 696a6c8d4ae9dd95429d3683f8edaefc7b902558 Mon Sep 17 00:00:00 2001 From: 0xDEADFACE Date: Thu, 11 Feb 2016 09:55:51 -0800 Subject: [PATCH] RPC: Optimize OP_RETURN outputs creation and parsing --- src/rpcrawtransaction.cpp | 37 ++++++++++++++++++++++++++++--------- 1 files changed, 28 insertions(+), 9 deletions(-) diff --git a/src/rpcrawtransaction.cpp b/src/rpcrawtransaction.cpp index 4fa6f67..5bec8b4 100644 --- a/src/rpcrawtransaction.cpp +++ b/src/rpcrawtransaction.cpp @@ -12,6 +12,8 @@ #include "main.h" #include "net.h" #include "wallet.h" +#include "script.h" +#include "util.h" using namespace std; using namespace boost; @@ -35,13 +37,20 @@ void ScriptPubKeyToJSON(const CScript& scriptPubKey, Object& out, bool fIncludeH return; } - out.push_back(Pair("reqSigs", nRequired)); - out.push_back(Pair("type", GetTxnOutputType(type))); + if (type != TX_NULL_DATA) + { + out.push_back(Pair("reqSigs", nRequired)); + out.push_back(Pair("type", GetTxnOutputType(type))); - Array a; - BOOST_FOREACH(const CTxDestination& addr, addresses) - a.push_back(CBitcoinAddress(addr).ToString()); - out.push_back(Pair("addresses", a)); + Array a; + BOOST_FOREACH(const CTxDestination& addr, addresses) + a.push_back(CBitcoinAddress(addr).ToString()); + out.push_back(Pair("addresses", a)); + } + else + { + out.push_back(Pair("type", GetTxnOutputType(type))); + } } void TxToJSON(const CTransaction& tx, const uint256& hashBlock, Object& entry) @@ -226,12 +235,13 @@ Value listunspent(const Array& params, bool fHelp) Value createrawtransaction(const Array& params, bool fHelp) { - if (fHelp || params.size() != 2) + if (fHelp || params.size() > 3 || params.size() < 2) throw runtime_error( - "createrawtransaction '[{\"txid\":txid,\"vout\":n},...]' '{address:amount,...}'\n" + "createrawtransaction <'[{\"txid\":txid,\"vout\":n},...]'> <'{address:amount,...}'> [hex data]\n" "Create a transaction spending given inputs\n" "(array of objects containing transaction id and output number),\n" - "sending to given address(es).\n" + "sending to given address(es),\n" + "optional data to add into data-carrying output.\n" "Returns hex-encoded raw transaction.\n" "Note that the transaction's inputs are not signed, and\n" "it is not stored in the wallet or transmitted to the network."); @@ -284,6 +294,15 @@ Value createrawtransaction(const Array& params, bool fHelp) rawTx.vout.push_back(out); } + if (params.size() == 3) + { + // Data carrying output + CScript scriptPubKey; + scriptPubKey << OP_RETURN << ParseHex(params[2].get_str()); + CTxOut out(0, scriptPubKey); + rawTx.vout.push_back(out); + } + CDataStream ss(SER_NETWORK, PROTOCOL_VERSION); ss << rawTx; return HexStr(ss.begin(), ss.end()); -- 1.7.1