Dash Core  0.12.2.1
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 Core developers
3 // Distributed under the MIT software license, see the accompanying
4 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
5 
6 #ifndef BITCOIN_COMPRESSOR_H
7 #define BITCOIN_COMPRESSOR_H
8 
10 #include "script/script.h"
11 #include "serialize.h"
12 
13 class CKeyID;
14 class CPubKey;
15 class CScriptID;
16 
29 {
30 private:
37  static const unsigned int nSpecialScripts = 6;
38 
40 protected:
48  bool IsToKeyID(CKeyID &hash) const;
49  bool IsToScriptID(CScriptID &hash) const;
50  bool IsToPubKey(CPubKey &pubkey) const;
51 
52  bool Compress(std::vector<unsigned char> &out) const;
53  unsigned int GetSpecialSize(unsigned int nSize) const;
54  bool Decompress(unsigned int nSize, const std::vector<unsigned char> &out);
55 public:
56  CScriptCompressor(CScript &scriptIn) : script(scriptIn) { }
57 
58  unsigned int GetSerializeSize(int nType, int nVersion) const {
59  std::vector<unsigned char> compr;
60  if (Compress(compr))
61  return compr.size();
62  unsigned int nSize = script.size() + nSpecialScripts;
63  return script.size() + VARINT(nSize).GetSerializeSize(nType, nVersion);
64  }
65 
66  template<typename Stream>
67  void Serialize(Stream &s, int nType, int nVersion) const {
68  std::vector<unsigned char> compr;
69  if (Compress(compr)) {
70  s << CFlatData(compr);
71  return;
72  }
73  unsigned int nSize = script.size() + nSpecialScripts;
74  s << VARINT(nSize);
75  s << CFlatData(script);
76  }
77 
78  template<typename Stream>
79  void Unserialize(Stream &s, int nType, int nVersion) {
80  unsigned int nSize = 0;
81  s >> VARINT(nSize);
82  if (nSize < nSpecialScripts) {
83  std::vector<unsigned char> vch(GetSpecialSize(nSize), 0x00);
84  s >> REF(CFlatData(vch));
85  Decompress(nSize, vch);
86  return;
87  }
88  nSize -= nSpecialScripts;
89  script.resize(nSize);
90  s >> REF(CFlatData(script));
91  }
92 };
93 
96 {
97 private:
99 
100 public:
101  static uint64_t CompressAmount(uint64_t nAmount);
102  static uint64_t DecompressAmount(uint64_t nAmount);
103 
104  CTxOutCompressor(CTxOut &txoutIn) : txout(txoutIn) { }
105 
107 
108  template <typename Stream, typename Operation>
109  inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) {
110  if (!ser_action.ForRead()) {
111  uint64_t nVal = CompressAmount(txout.nValue);
112  READWRITE(VARINT(nVal));
113  } else {
114  uint64_t nVal = 0;
115  READWRITE(VARINT(nVal));
116  txout.nValue = DecompressAmount(nVal);
117  }
119  READWRITE(cscript);
120  }
121 };
122 
123 #endif // BITCOIN_COMPRESSOR_H
#define VARINT(obj)
Definition: serialize.h:388
bool Compress(std::vector< unsigned char > &out) const
Definition: compressor.cpp:48
void resize(size_type new_size)
Definition: prevector.h:296
void SerializationOp(Stream &s, Operation ser_action, int nType, int nVersion)
Definition: compressor.h:109
bool IsToPubKey(CPubKey &pubkey) const
Definition: compressor.cpp:33
#define READWRITE(obj)
Definition: serialize.h:175
unsigned int GetSpecialSize(unsigned int nSize) const
Definition: compressor.cpp:79
bool IsToKeyID(CKeyID &hash) const
Definition: compressor.cpp:12
CAmount nValue
Definition: transaction.h:136
Definition: pubkey.h:27
CTxOutCompressor(CTxOut &txoutIn)
Definition: compressor.h:104
bool Decompress(unsigned int nSize, const std::vector< unsigned char > &out)
Definition: compressor.cpp:88
CScript & script
Definition: compressor.h:39
static uint64_t CompressAmount(uint64_t nAmount)
Definition: compressor.cpp:142
CScriptCompressor(CScript &scriptIn)
Definition: compressor.h:56
static const unsigned int nSpecialScripts
Definition: compressor.h:37
CScript scriptPubKey
Definition: transaction.h:137
static uint64_t DecompressAmount(uint64_t nAmount)
Definition: compressor.cpp:161
unsigned int GetSerializeSize(int nType, int nVersion) const
Definition: compressor.h:58
bool IsToScriptID(CScriptID &hash) const
Definition: compressor.cpp:23
void Serialize(Stream &s, int nType, int nVersion) const
Definition: compressor.h:67
Definition: pubkey.h:37
size_type size() const
Definition: prevector.h:262
CTxOut & txout
Definition: compressor.h:98
void Unserialize(Stream &s, int nType, int nVersion)
Definition: compressor.h:79
T & REF(const T &val)
Definition: serialize.h:33