PIVX Core  5.6.99
P2P Digital Currency
compressor.h
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) 2017-2020 The PIVX Core developers
4 // Distributed under the MIT software license, see the accompanying
5 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
6 
7 #ifndef PIVX_COMPRESSOR_H
8 #define PIVX_COMPRESSOR_H
9 
10 #include "primitives/transaction.h"
11 #include "script/script.h"
12 #include "serialize.h"
13 #include "span.h"
14 
15 bool CompressScript(const CScript& script, std::vector<unsigned char> &out);
16 unsigned int GetSpecialScriptSize(unsigned int nSize);
17 bool DecompressScript(CScript& script, unsigned int nSize, const std::vector<unsigned char> &out);
18 
19 uint64_t CompressAmount(uint64_t nAmount);
20 uint64_t DecompressAmount(uint64_t nAmount);
21 
34 {
41  static const unsigned int nSpecialScripts = 6;
42 
43  template<typename Stream>
44  void Ser(Stream &s, const CScript& script) {
45  std::vector<unsigned char> compr;
46  if (CompressScript(script, compr)) {
47  s << MakeSpan(compr);
48  return;
49  }
50  unsigned int nSize = script.size() + nSpecialScripts;
51  s << VARINT(nSize);
52  s << MakeSpan(script);
53  }
54 
55  template<typename Stream>
56  void Unser(Stream &s, CScript& script) {
57  unsigned int nSize = 0;
58  s >> VARINT(nSize);
59  if (nSize < nSpecialScripts) {
60  std::vector<unsigned char> vch(GetSpecialScriptSize(nSize), 0x00);
61  s >> MakeSpan(vch);
62  DecompressScript(script, nSize, vch);
63  return;
64  }
65  nSize -= nSpecialScripts;
66  if (nSize > MAX_SCRIPT_SIZE) {
67  // Overly long script, replace with a short invalid one
68  script << OP_RETURN;
69  s.ignore(nSize);
70  } else {
71  script.resize(nSize);
72  s >> MakeSpan(script);
73  }
74  }
75 };
76 
78 {
79  template<typename Stream, typename I> void Ser(Stream& s, I val)
80  {
81  s << VARINT(CompressAmount(val));
82  }
83  template<typename Stream, typename I> void Unser(Stream& s, I& val)
84  {
85  uint64_t v;
86  s >> VARINT(v);
87  val = DecompressAmount(v);
88  }
89 };
90 
93 {
94  FORMATTER_METHODS(CTxOut, obj) { READWRITE(Using<AmountCompression>(obj.nValue), Using<ScriptCompression>(obj.scriptPubKey)); }
95 };
96 
97 #endif // PIVX_COMPRESSOR_H
Serialized script, used inside transaction inputs and outputs.
Definition: script.h:381
An output of a transaction.
Definition: transaction.h:137
size_type size() const
Definition: prevector.h:277
void resize(size_type new_size)
Definition: prevector.h:311
uint64_t DecompressAmount(uint64_t nAmount)
Definition: compressor.cpp:165
bool DecompressScript(CScript &script, unsigned int nSize, const std::vector< unsigned char > &out)
Definition: compressor.cpp:92
bool CompressScript(const CScript &script, std::vector< unsigned char > &out)
Definition: compressor.cpp:52
uint64_t CompressAmount(uint64_t nAmount)
Definition: compressor.cpp:146
unsigned int GetSpecialScriptSize(unsigned int nSize)
Definition: compressor.cpp:83
@ OP_RETURN
Definition: script.h:87
#define VARINT(obj)
Definition: serialize.h:513
#define READWRITE(...)
Definition: serialize.h:183
constexpr Span< A > MakeSpan(A(&a)[N])
MakeSpan for arrays:
Definition: span.h:221
void Unser(Stream &s, I &val)
Definition: compressor.h:83
void Ser(Stream &s, I val)
Definition: compressor.h:79
Compact serializer for scripts.
Definition: compressor.h:34
void Unser(Stream &s, CScript &script)
Definition: compressor.h:56
static const unsigned int nSpecialScripts
make this static for now (there are only 6 special scripts defined) this can potentially be extended ...
Definition: compressor.h:41
void Ser(Stream &s, const CScript &script)
Definition: compressor.h:44
wrapper for CTxOut that provides a more compact serialization
Definition: compressor.h:93
FORMATTER_METHODS(CTxOut, obj)
Definition: compressor.h:94