PRCYCoin  2.0.0.7rc1
P2P Digital Currency
core_write.cpp
Go to the documentation of this file.
1 // Copyright (c) 2009-2014 The Bitcoin developers
2 // Distributed under the MIT/X11 software license, see the accompanying
3 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4 
5 #include "core_io.h"
6 
7 #include "base58.h"
9 #include "primitives/block.h"
10 #include "script/script.h"
11 #include "script/standard.h"
12 #include "serialize.h"
13 #include "streams.h"
14 #include <univalue.h>
15 #include "util.h"
16 #include "utilmoneystr.h"
17 #include "utilstrencodings.h"
18 
19 
20 std::string FormatScript(const CScript& script)
21 {
22  std::string ret;
23  CScript::const_iterator it = script.begin();
24  opcodetype op;
25  while (it != script.end()) {
26  CScript::const_iterator it2 = it;
27  std::vector<unsigned char> vch;
28  if (script.GetOp2(it, op, &vch)) {
29  if (op == OP_0) {
30  ret += "0 ";
31  continue;
32  } else if ((op >= OP_1 && op <= OP_16) || op == OP_1NEGATE) {
33  ret += strprintf("%i ", op - OP_1NEGATE - 1);
34  continue;
35  } else if (op >= OP_NOP && op <= OP_CHECKMULTISIGVERIFY) {
36  std::string str(GetOpName(op));
37  if (str.substr(0, 3) == std::string("OP_")) {
38  ret += str.substr(3, std::string::npos) + " ";
39  continue;
40  }
41  }
42  if (vch.size() > 0) {
43  ret += strprintf("0x%x 0x%x ", HexStr(it2, it - vch.size()), HexStr(it - vch.size(), it));
44  } else {
45  ret += strprintf("0x%x", HexStr(it2, it));
46  }
47  continue;
48  }
49  ret += strprintf("0x%x ", HexStr(it2, script.end()));
50  break;
51  }
52  return ret.substr(0, ret.size() - 1);
53 }
54 
55 std::string EncodeHexTx(const CTransaction& tx)
56 {
57  CDataStream ssTx(SER_NETWORK, PROTOCOL_VERSION);
58  ssTx << tx;
59  return HexStr(ssTx.begin(), ssTx.end());
60 }
61 
63 {
64  CDataStream ssPoS(SER_NETWORK, PROTOCOL_VERSION);
65  ssPoS << pos;
66  return HexStr(ssPoS.begin(), ssPoS.end());
67 }
68 
69 void ScriptPubKeyToUniv(const CScript& scriptPubKey,
70  UniValue& out,
71  bool fIncludeHex)
72 {
73  txnouttype type;
74  std::vector<CTxDestination> addresses;
75  int nRequired;
76 
77  out.pushKV("asm", scriptPubKey.ToString());
78  if (fIncludeHex)
79  out.pushKV("hex", HexStr(scriptPubKey.begin(), scriptPubKey.end()));
80 
81  if (!ExtractDestinations(scriptPubKey, type, addresses, nRequired)) {
82  out.pushKV("type", GetTxnOutputType(type));
83  return;
84  }
85 
86  out.pushKV("reqSigs", nRequired);
87  out.pushKV("type", GetTxnOutputType(type));
88 
90  for (const CTxDestination& addr : addresses)
91  a.push_back(CBitcoinAddress(addr).ToString());
92  out.pushKV("addresses", a);
93 }
94 
95 void TxToUniv(const CTransaction& tx, const uint256& hashBlock, UniValue& entry)
96 {
97  entry.pushKV("txid", tx.GetHash().GetHex());
98  entry.pushKV("version", tx.nVersion);
99  entry.pushKV("size", (int)::GetSerializeSize(tx, SER_NETWORK, PROTOCOL_VERSION));
100  entry.pushKV("locktime", (int64_t)tx.nLockTime);
101 
103  for (const CTxIn& txin : tx.vin) {
105  if (tx.IsCoinBase())
106  in.pushKV("coinbase", HexStr(txin.scriptSig.begin(), txin.scriptSig.end()));
107  else {
108  in.pushKV("txid", txin.prevout.hash.GetHex());
109  in.pushKV("vout", (int64_t)txin.prevout.n);
111  o.pushKV("asm", txin.scriptSig.ToString());
112  o.pushKV("hex", HexStr(txin.scriptSig.begin(), txin.scriptSig.end()));
113  in.pushKV("scriptSig", o);
114  }
115  in.pushKV("sequence", (int64_t)txin.nSequence);
116  vin.push_back(in);
117  }
118  entry.pushKV("vin", vin);
119 
120  UniValue vout(UniValue::VARR);
121  for (unsigned int i = 0; i < tx.vout.size(); i++) {
122  const CTxOut& txout = tx.vout[i];
123 
125 
126  UniValue outValue(UniValue::VNUM, FormatMoney(txout.nValue));
127  out.pushKV("value", outValue);
128  out.pushKV("n", (int64_t)i);
129 
131  ScriptPubKeyToUniv(txout.scriptPubKey, o, true);
132  out.pushKV("scriptPubKey", o);
133  vout.push_back(out);
134  }
135  entry.pushKV("vout", vout);
136 
137  if (!hashBlock.IsNull())
138  entry.pushKV("blockhash", hashBlock.GetHex());
139 
140  entry.pushKV("hex", EncodeHexTx(tx)); // the hex-encoded transaction. used the name "hex" to be consistent with the verbose output of "getrawtransaction".
141 }
CTxIn
An input of a transaction.
Definition: transaction.h:83
block.h
OP_0
@ OP_0
Definition: script.h:41
GetOpName
const char * GetOpName(opcodetype opcode)
Definition: script.cpp:21
UniValue::VOBJ
@ VOBJ
Definition: univalue.h:21
FormatScript
std::string FormatScript(const CScript &script)
Definition: core_write.cpp:20
prevector::const_iterator
Definition: prevector.h:97
transaction.h
OP_NOP
@ OP_NOP
Definition: script.h:67
EncodeHexTx
std::string EncodeHexTx(const CTransaction &tx)
Definition: core_write.cpp:55
streams.h
CDataStream::begin
const_iterator begin() const
Definition: streams.h:116
base_uint::GetHex
std::string GetHex() const
Definition: arith_uint256.cpp:155
COutPoint::hash
uint256 hash
Definition: transaction.h:39
CScript::GetOp2
bool GetOp2(const_iterator &pc, opcodetype &opcodeRet, std::vector< unsigned char > *pvchRet) const
Definition: script.h:495
CBitcoinAddress
base58-encoded PRCY addresses.
Definition: base58.h:109
CTransaction::nLockTime
const uint32_t nLockTime
Definition: transaction.h:287
GetSerializeSize
unsigned int GetSerializeSize(char a, int, int=0)
Definition: serialize.h:194
FormatMoney
std::string FormatMoney(const CAmount &n, bool fPlus)
Money parsing/formatting utilities.
Definition: utilmoneystr.cpp:13
SER_NETWORK
@ SER_NETWORK
Definition: serialize.h:159
core_io.h
UniValue::pushKV
bool pushKV(const std::string &key, const UniValue &val)
Definition: univalue.cpp:192
ScriptPubKeyToUniv
void ScriptPubKeyToUniv(const CScript &scriptPubKey, UniValue &out, bool fIncludeHex)
Definition: core_write.cpp:69
UniValue
Definition: univalue.h:19
CTransaction
The basic transaction that is broadcasted on the network and contained in blocks.
Definition: transaction.h:269
CTxIn::nSequence
uint32_t nSequence
Definition: transaction.h:88
CTxOut::nValue
CAmount nValue
Definition: transaction.h:167
prevector::end
iterator end()
Definition: prevector.h:292
CTransaction::IsCoinBase
bool IsCoinBase() const
Definition: transaction.h:359
GetTxnOutputType
const char * GetTxnOutputType(txnouttype t)
Definition: standard.cpp:20
CTxOut
An output of a transaction.
Definition: transaction.h:164
CTransaction::vout
std::vector< CTxOut > vout
Definition: transaction.h:286
CTxOut::scriptPubKey
CScript scriptPubKey
Definition: transaction.h:168
univalue.h
CDataStream::end
const_iterator end() const
Definition: streams.h:118
HexStr
std::string HexStr(const T itbegin, const T itend, bool fSpaces=false)
Definition: utilstrencodings.h:85
standard.h
UniValue::VNUM
@ VNUM
Definition: univalue.h:21
uint256
256-bit unsigned big integer.
Definition: uint256.h:38
CScript
Serialized script, used inside transaction inputs and outputs.
Definition: script.h:363
base_uint::IsNull
bool IsNull() const
Definition: arith_uint256.h:312
CTxDestination
boost::variant< CNoDestination, CKeyID, CScriptID > CTxDestination
A txout script template with a specific destination.
Definition: standard.h:81
PoSBlockSummary
Definition: block.h:17
OP_16
@ OP_16
Definition: script.h:64
strprintf
#define strprintf
Definition: tinyformat.h:1056
utilmoneystr.h
COutPoint::n
uint32_t n
Definition: transaction.h:40
CTransaction::vin
std::vector< CTxIn > vin
Definition: transaction.h:285
CScript::ToString
std::string ToString() const
Definition: script.cpp:266
CTxIn::prevout
COutPoint prevout
Definition: transaction.h:86
CTxIn::scriptSig
CScript scriptSig
Definition: transaction.h:87
prevector::begin
iterator begin()
Definition: prevector.h:290
UniValue::push_back
bool push_back(const UniValue &val)
Definition: univalue.cpp:173
OP_1NEGATE
@ OP_1NEGATE
Definition: script.h:46
serialize.h
CDataStream
Double ended buffer combining vector and stream-like interfaces.
Definition: streams.h:34
base58.h
script.h
CTransaction::GetHash
const uint256 & GetHash() const
Definition: transaction.h:342
utilstrencodings.h
txnouttype
txnouttype
Definition: standard.h:57
CTransaction::nVersion
const int32_t nVersion
Definition: transaction.h:284
OP_CHECKMULTISIGVERIFY
@ OP_CHECKMULTISIGVERIFY
Definition: script.h:158
UniValue::VARR
@ VARR
Definition: univalue.h:21
ExtractDestinations
bool ExtractDestinations(const CScript &scriptPubKey, txnouttype &typeRet, std::vector< CTxDestination > &addressRet, int &nRequiredRet)
Definition: standard.cpp:223
EncodeHexPoSBlockSummary
std::string EncodeHexPoSBlockSummary(const PoSBlockSummary &pos)
Definition: core_write.cpp:62
util.h
OP_1
@ OP_1
Definition: script.h:48
TxToUniv
void TxToUniv(const CTransaction &tx, const uint256 &hashBlock, UniValue &entry)
Definition: core_write.cpp:95
opcodetype
opcodetype
Script opcodes.
Definition: script.h:38