PRCYCoin  2.0.0.7rc1
P2P Digital Currency
transaction.cpp
Go to the documentation of this file.
1 // Copyright (c) 2009-2010 Satoshi Nakamoto
2 // Copyright (c) 2009-2014 The Bitcoin developers
3 // Copyright (c) 2015-2018 The PIVX developers
4 // Copyright (c) 2018-2020 The DAPS Project developers
5 // Distributed under the MIT software license, see the accompanying
6 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
7 
8 #include "primitives/block.h"
10 
11 #include "chain.h"
12 #include "hash.h"
13 #include "main.h"
14 #include "tinyformat.h"
15 #include "utilstrencodings.h"
16 #include "transaction.h"
17 #include "secp256k1.h"
18 
19 extern bool GetTransaction(const uint256 &hash, CTransaction &txOut, uint256 &hashBlock, bool fAllowSlow);
20 
21 std::string COutPoint::ToString() const
22 {
23  return strprintf("COutPoint(%s, %u)", hash.ToString()/*.substr(0,10)*/, n);
24 }
25 
26 std::string COutPoint::ToStringShort() const
27 {
28  return strprintf("%s-%u", hash.ToString().substr(0,64), n);
29 }
30 
32 {
33  return Hash(BEGIN(hash), END(hash), BEGIN(n), END(n));
34 }
35 
36 CTxIn::CTxIn(COutPoint prevoutIn, CScript scriptSigIn, uint32_t nSequenceIn)
37 {
38  prevout = prevoutIn;
39  scriptSig = scriptSigIn;
40  nSequence = nSequenceIn;
41 }
42 
43 CTxIn::CTxIn(uint256 hashPrevTx, uint32_t nOut, CScript scriptSigIn, uint32_t nSequenceIn)
44 {
45  prevout = COutPoint(hashPrevTx, nOut);
46  scriptSig = scriptSigIn;
47  nSequence = nSequenceIn;
48 }
49 
50 std::string CTxIn::ToString() const
51 {
52  std::string str;
53  str += "CTxIn(";
54  str += prevout.ToString();
55  if (prevout.IsNull())
56  str += strprintf(", coinbase %s", HexStr(scriptSig));
57  else
58  str += strprintf(", scriptSig=%s", scriptSig.ToString().substr(0,24));
59  if (nSequence != std::numeric_limits<unsigned int>::max())
60  str += strprintf(", nSequence=%u", nSequence);
61  str += ")";
62  return str;
63 }
64 
65 CTxOut::CTxOut(const CAmount& nValueIn, CScript scriptPubKeyIn)
66 {
67  nValue = nValueIn;
68  scriptPubKey = scriptPubKeyIn;
69  nRounds = -10;
70 }
71 
73 {
74  if(!tx->IsCoinStake())
75  return false;
76 
77  return (n == tx->vout.size() - 1) && (tx->vout[1].scriptPubKey != tx->vout[n].scriptPubKey);
78 }
79 
81 {
82  return SerializeHash(*this);
83 }
84 
85 std::string CTxOut::ToString() const
86 {
87  return strprintf("CTxOut(nValue=%d.%08d, scriptPubKey=%s)", nValue / COIN, nValue % COIN, scriptPubKey.ToString().substr(0,30));
88 }
89 
90 CMutableTransaction::CMutableTransaction() : nVersion(CTransaction::CURRENT_VERSION), nLockTime(0), hasPaymentID(0), paymentID(0), txType(TX_TYPE_FULL), nTxFee(0) {}
91 CMutableTransaction::CMutableTransaction(const CTransaction& tx) : nVersion(tx.nVersion), vin(tx.vin), vout(tx.vout), nLockTime(tx.nLockTime), txPrivM(tx.txPrivM), hasPaymentID(tx.hasPaymentID), paymentID(tx.paymentID), txType(tx.txType), bulletproofs(tx.bulletproofs), nTxFee(tx.nTxFee), c(tx.c), S(tx.S), ntxFeeKeyImage(tx.ntxFeeKeyImage) {}
92 
94 {
95  return SerializeHash(*this);
96 }
97 
98 std::string CMutableTransaction::ToString() const
99 {
100  std::string str;
101  str += strprintf("CMutableTransaction(ver=%d, vin.size=%u, vout.size=%u, nLockTime=%u)\n",
102  nVersion,
103  vin.size(),
104  vout.size(),
105  nLockTime);
106  for (unsigned int i = 0; i < vin.size(); i++)
107  str += " " + vin[i].ToString() + "\n";
108  for (unsigned int i = 0; i < vout.size(); i++)
109  str += " " + vout[i].ToString() + "\n";
110  return str;
111 }
112 
114 {
115  *const_cast<uint256*>(&hash) = SerializeHash(*this);
116 }
117 
118 CTransaction::CTransaction() : nVersion(CTransaction::CURRENT_VERSION), vin(), vout(), nLockTime(0), hasPaymentID(0), paymentID(0), txType(TX_TYPE_FULL), nTxFee(0) { }
119 
120 CTransaction::CTransaction(const CMutableTransaction &tx) : nVersion(tx.nVersion), vin(tx.vin), vout(tx.vout), nLockTime(tx.nLockTime), hasPaymentID(tx.hasPaymentID), paymentID(tx.paymentID), txType(tx.txType), bulletproofs(tx.bulletproofs), nTxFee(tx.nTxFee), c(tx.c), S(tx.S), ntxFeeKeyImage(tx.ntxFeeKeyImage) {
121  UpdateHash();
122 }
123 
125  *const_cast<int*>(&nVersion) = tx.nVersion;
126  *const_cast<std::vector<CTxIn>*>(&vin) = tx.vin;
127  *const_cast<std::vector<CTxOut>*>(&vout) = tx.vout;
128  *const_cast<unsigned int*>(&nLockTime) = tx.nLockTime;
129  *const_cast<CKey*>(&txPrivM) = tx.txPrivM;
130  *const_cast<char*>(&hasPaymentID) = tx.hasPaymentID;
131  *const_cast<uint64_t*>(&paymentID) = tx.paymentID;
132  *const_cast<uint32_t*>(&txType) = tx.txType;
134  c = tx.c;
135  S = tx.S;
136  //*const_cast<std::vector<CKeyImage>*>(&keyImages) = tx.keyImages;
137  //*const_cast<std::vector<std::vector<CTxIn>>*>(&decoys) = tx.decoys;
138  nTxFee = tx.nTxFee;
140  return *this;
141 }
142 
144 {
145  if (vin.empty())
146  return false;
147 
148  // ppcoin: the coin stake transaction is marked with the first output empty
149  if (vin[0].prevout.IsNull())
150  return false;
151 
152  return (vin.size() > 0 && (!vin[0].prevout.IsNull() && vin[0].decoys.empty()) && vout.size() >= 2 && vout[0].IsEmpty());
153 }
154 
156 {
157  CAmount nValueOut = 0;
158  for (std::vector<CTxOut>::const_iterator it(vout.begin()); it != vout.end(); ++it)
159  {
160  // PRCYcoin: previously MoneyRange() was called here. This has been replaced with negative check and boundary wrap check.
161  if (it->nValue < 0)
162  throw std::runtime_error("CTransaction::GetValueOut() : value out of range : less than 0");
163 
164  if ((nValueOut + it->nValue) < nValueOut)
165  throw std::runtime_error("CTransaction::GetValueOut() : value out of range : wraps the int64_t boundary");
166 
167  if (IsCoinBase() || IsCoinStake() || IsCoinAudit()) nValueOut += it->nValue;
168  }
169  return nValueOut;
170 }
171 
173 {
174  for (const CTxIn& in : vin) {
175  if (in.prevout == out)
176  return true;
177  }
178 
179  return false;
180 }
181 
182 std::list<COutPoint> CTransaction::GetOutPoints() const
183 {
184  std::list<COutPoint> listOutPoints;
185  uint256 txHash = GetHash();
186  for (unsigned int i = 0; i < vout.size(); i++)
187  listOutPoints.emplace_back(COutPoint(txHash, i));
188  return listOutPoints;
189 }
190 
191 double CTransaction::ComputePriority(double dPriorityInputs, unsigned int nTxSize) const
192 {
193  nTxSize = CalculateModifiedSize(nTxSize);
194  if (nTxSize == 0) return 0.0;
195 
196  return (dPriorityInputs + nTxFee * 1000) / nTxSize;
197 }
198 
199 unsigned int CTransaction::CalculateModifiedSize(unsigned int nTxSize) const
200 {
201  // In order to avoid disincentivizing cleaning up the UTXO set we don't count
202  // the constant overhead for each txin and up to 110 bytes of scriptSig (which
203  // is enough to cover a compressed pubkey p2sh redemption) for priority.
204  // Providing any more cleanup incentive than making additional inputs free would
205  // risk encouraging people to create junk outputs to redeem later.
206  if (nTxSize == 0)
207  nTxSize = ::GetSerializeSize(*this, SER_NETWORK, PROTOCOL_VERSION);
208  for (std::vector<CTxIn>::const_iterator it(vin.begin()); it != vin.end(); ++it)
209  {
210  unsigned int offset = 41U + std::min(110U, (unsigned int)it->scriptSig.size());
211  if (nTxSize > offset)
212  nTxSize -= offset;
213  }
214  return nTxSize;
215 }
216 
217 std::string CTransaction::ToString() const
218 {
219  std::string str;
220  //CPubKey pubkey(txPub);
221  str += strprintf("CTransaction(hash=%s, ver=%d, vin.size=%u, vout.size=%u, nLockTime=%u)\n",
222  GetHash().ToString().substr(0,10),
223  nVersion,
224  vin.size(),
225  vout.size(),
226  nLockTime);
227  for (unsigned int i = 0; i < vin.size(); i++)
228  str += " " + vin[i].ToString() + "\n";
229  for (unsigned int i = 0; i < vout.size(); i++)
230  str += " " + vout[i].ToString() + "\n";
231  return str;
232 }
CTransaction::IsCoinAudit
bool IsCoinAudit() const
Definition: transaction.h:364
CTxIn
An input of a transaction.
Definition: transaction.h:83
block.h
CMutableTransaction::vin
std::vector< CTxIn > vin
Definition: transaction.h:387
SerializeHash
uint256 SerializeHash(const T &obj, int nType=SER_GETHASH, int nVersion=PROTOCOL_VERSION)
Compute the 256-bit hash of an object's serialization.
Definition: hash.h:295
transaction.h
BEGIN
#define BEGIN(a)
Utilities for converting data from/to strings.
Definition: utilstrencodings.h:17
CTransaction::S
std::vector< std::vector< uint256 > > S
Definition: transaction.h:301
COutPoint::hash
uint256 hash
Definition: transaction.h:39
CMutableTransaction::nVersion
int32_t nVersion
Definition: transaction.h:386
CTransaction::nLockTime
const uint32_t nLockTime
Definition: transaction.h:287
COutPoint::ToStringShort
std::string ToStringShort() const
Definition: transaction.cpp:26
CTransaction::UpdateHash
void UpdateHash() const
Definition: transaction.cpp:113
GetSerializeSize
unsigned int GetSerializeSize(char a, int, int=0)
Definition: serialize.h:194
CTransaction::GetValueOut
CAmount GetValueOut() const
Definition: transaction.cpp:155
SER_NETWORK
@ SER_NETWORK
Definition: serialize.h:159
COutPoint::IsMasternodeReward
bool IsMasternodeReward(const CTransaction *tx) const
Definition: transaction.cpp:72
CTransaction
The basic transaction that is broadcasted on the network and contained in blocks.
Definition: transaction.h:269
CTransaction::txType
uint32_t txType
Definition: transaction.h:294
tinyformat.h
COutPoint::IsNull
bool IsNull() const
Definition: transaction.h:54
CTxIn::nSequence
uint32_t nSequence
Definition: transaction.h:88
CTxOut::nValue
CAmount nValue
Definition: transaction.h:167
CTransaction::UsesUTXO
bool UsesUTXO(const COutPoint out)
Definition: transaction.cpp:172
CTransaction::IsCoinBase
bool IsCoinBase() const
Definition: transaction.h:359
CMutableTransaction::nLockTime
uint32_t nLockTime
Definition: transaction.h:389
CTransaction::GetOutPoints
std::list< COutPoint > GetOutPoints() const
Definition: transaction.cpp:182
secp256k1.h
CTxOut::CTxOut
CTxOut()
Definition: transaction.h:180
CTransaction::vout
std::vector< CTxOut > vout
Definition: transaction.h:286
CTxOut::scriptPubKey
CScript scriptPubKey
Definition: transaction.h:168
HexStr
std::string HexStr(const T itbegin, const T itend, bool fSpaces=false)
Definition: utilstrencodings.h:85
CTransaction::ntxFeeKeyImage
CKeyImage ntxFeeKeyImage
Definition: transaction.h:304
CAmount
int64_t CAmount
Amount in PRCY (Can be negative)
Definition: amount.h:17
CTransaction::nTxFee
CAmount nTxFee
Definition: transaction.h:298
CTxIn::CTxIn
CTxIn()
Definition: transaction.h:101
GetTransaction
bool GetTransaction(const uint256 &hash, CTransaction &txOut, uint256 &hashBlock, bool fAllowSlow)
uint256
256-bit unsigned big integer.
Definition: uint256.h:38
CTransaction::CTransaction
CTransaction()
Construct a CTransaction that qualifies as IsNull()
Definition: transaction.cpp:118
CScript
Serialized script, used inside transaction inputs and outputs.
Definition: script.h:363
TX_TYPE_FULL
@ TX_TYPE_FULL
Definition: transaction.h:258
chain.h
CMutableTransaction::vout
std::vector< CTxOut > vout
Definition: transaction.h:388
strprintf
#define strprintf
Definition: tinyformat.h:1056
CTransaction::ToString
std::string ToString() const
Definition: transaction.cpp:217
CTransaction::bulletproofs
std::vector< unsigned char > bulletproofs
Definition: transaction.h:296
CKey
An encapsulated private key.
Definition: key.h:39
END
#define END(a)
Definition: utilstrencodings.h:18
CTxIn::ToString
std::string ToString() const
Definition: transaction.cpp:50
main.h
COutPoint::n
uint32_t n
Definition: transaction.h:40
CTransaction::vin
std::vector< CTxIn > vin
Definition: transaction.h:285
CTransaction::txPrivM
CKey txPrivM
Definition: transaction.h:290
CScript::ToString
std::string ToString() const
Definition: script.cpp:266
CMutableTransaction::ToString
std::string ToString() const
Definition: transaction.cpp:98
CTxIn::prevout
COutPoint prevout
Definition: transaction.h:86
CTransaction::paymentID
uint64_t paymentID
Definition: transaction.h:292
CTxIn::scriptSig
CScript scriptSig
Definition: transaction.h:87
CTransaction::CalculateModifiedSize
unsigned int CalculateModifiedSize(unsigned int nTxSize=0) const
Definition: transaction.cpp:199
CTxOut::ToString
std::string ToString() const
Definition: transaction.cpp:85
CTxOut::GetHash
uint256 GetHash() const
Definition: transaction.cpp:80
COutPoint::ToString
std::string ToString() const
Definition: transaction.cpp:21
CTransaction::GetHash
const uint256 & GetHash() const
Definition: transaction.h:342
COutPoint::GetHash
uint256 GetHash()
Definition: transaction.cpp:31
COutPoint
An outpoint - a combination of a transaction hash and an index n into its vout.
Definition: transaction.h:36
utilstrencodings.h
CTransaction::operator=
CTransaction & operator=(const CTransaction &tx)
Definition: transaction.cpp:124
CMutableTransaction::GetHash
uint256 GetHash() const
Compute the hash of this CMutableTransaction.
Definition: transaction.cpp:93
CTransaction::nVersion
const int32_t nVersion
Definition: transaction.h:284
CTransaction::hasPaymentID
char hasPaymentID
Definition: transaction.h:291
CMutableTransaction::CMutableTransaction
CMutableTransaction()
Definition: transaction.cpp:90
Hash
std::string Hash(std::string input)
Compute the 256-bit hash of a std::string.
Definition: hash.h:122
CMutableTransaction
A mutable version of CTransaction.
Definition: transaction.h:384
CTransaction::ComputePriority
double ComputePriority(double dPriorityInputs, unsigned int nTxSize=0) const
Definition: transaction.cpp:191
CTransaction::c
uint256 c
Definition: transaction.h:300
CTransaction::hash
const uint256 hash
Memory only.
Definition: transaction.h:273
S
#define S(x0, x1, x2, x3, cb, r)
Definition: jh.c:494
CTxOut::nRounds
int nRounds
Definition: transaction.h:169
CTransaction::IsCoinStake
bool IsCoinStake() const
Definition: transaction.cpp:143
base_uint::ToString
std::string ToString() const
Definition: arith_uint256.cpp:199