Bitcoin Core
31.1.0
P2P Digital Currency
Toggle main menu visibility
Loading...
Searching...
No Matches
src
compressor.h
Go to the documentation of this file.
1
// Copyright (c) 2009-2010 Satoshi Nakamoto
2
// Copyright (c) 2009-present 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
9
#include <
prevector.h
>
10
#include <
primitives/transaction.h
>
11
#include <
script/script.h
>
12
#include <
serialize.h
>
13
#include <
span.h
>
14
23
using
CompressedScript
=
prevector<33, unsigned char>
;
24
25
26
bool
CompressScript
(
const
CScript
&
script
,
CompressedScript
& out);
27
unsigned
int
GetSpecialScriptSize
(
unsigned
int
nSize);
28
bool
DecompressScript
(
CScript
&
script
,
unsigned
int
nSize,
const
CompressedScript
& in);
29
39
uint64_t
CompressAmount
(uint64_t nAmount);
40
41
uint64_t
DecompressAmount
(uint64_t nAmount);
42
54
struct
ScriptCompression
55
{
62
static
const
unsigned
int
nSpecialScripts
= 6;
63
64
template
<
typename
Stream>
65
void
Ser
(Stream &s,
const
CScript
&
script
) {
66
CompressedScript
compr;
67
if
(
CompressScript
(
script
, compr)) {
68
s << std::span{compr};
69
return
;
70
}
71
unsigned
int
nSize =
script
.size() +
nSpecialScripts
;
72
s <<
VARINT
(nSize);
73
s << std::span{
script
};
74
}
75
76
template
<
typename
Stream>
77
void
Unser
(Stream &s,
CScript
&
script
) {
78
unsigned
int
nSize = 0;
79
s >>
VARINT
(nSize);
80
if
(nSize <
nSpecialScripts
) {
81
CompressedScript
vch(
GetSpecialScriptSize
(nSize), 0x00);
82
s >> std::span{vch};
83
DecompressScript
(
script
, nSize, vch);
84
return
;
85
}
86
nSize -=
nSpecialScripts
;
87
if
(nSize >
MAX_SCRIPT_SIZE
) {
88
// Overly long script, replace with a short invalid one
89
script
<<
OP_RETURN
;
90
s.ignore(nSize);
91
}
else
{
92
script
.resize(nSize);
93
s >> std::span{
script
};
94
}
95
}
96
};
97
98
struct
AmountCompression
99
{
100
template
<
typename
Stream,
typename
I>
void
Ser
(Stream& s, I val)
101
{
102
s <<
VARINT
(
CompressAmount
(val));
103
}
104
template
<
typename
Stream,
typename
I>
void
Unser
(Stream& s, I& val)
105
{
106
uint64_t v;
107
s >>
VARINT
(v);
108
val =
DecompressAmount
(v);
109
}
110
};
111
113
struct
TxOutCompression
114
{
115
FORMATTER_METHODS
(
CTxOut
, obj) {
READWRITE
(
Using<AmountCompression>
(obj.nValue),
Using<ScriptCompression>
(obj.scriptPubKey)); }
116
};
117
118
#endif
// BITCOIN_COMPRESSOR_H
CScript
Serialized script, used inside transaction inputs and outputs.
Definition
script.h:405
CTxOut
An output of a transaction.
Definition
transaction.h:140
prevector
Implements a drop-in replacement for std::vector<T> which stores up to N elements directly (without h...
Definition
prevector.h:37
DecompressScript
bool DecompressScript(CScript &script, unsigned int nSize, const CompressedScript &in)
Definition
compressor.cpp:95
CompressScript
bool CompressScript(const CScript &script, CompressedScript &out)
Definition
compressor.cpp:55
DecompressAmount
uint64_t DecompressAmount(uint64_t nAmount)
Definition
compressor.cpp:168
CompressedScript
prevector< 33, unsigned char > CompressedScript
This saves us from making many heap allocations when serializing and deserializing compressed scripts...
Definition
compressor.h:23
CompressAmount
uint64_t CompressAmount(uint64_t nAmount)
Compress amount.
Definition
compressor.cpp:149
GetSpecialScriptSize
unsigned int GetSpecialScriptSize(unsigned int nSize)
Definition
compressor.cpp:86
script
Definition
parsing.cpp:13
prevector.h
transaction.h
script.h
MAX_SCRIPT_SIZE
static const int MAX_SCRIPT_SIZE
Definition
script.h:40
OP_RETURN
@ OP_RETURN
Definition
script.h:111
serialize.h
VARINT
#define VARINT(obj)
Definition
serialize.h:491
Using
static Wrapper< Formatter, T & > Using(T &&t)
Cause serialization/deserialization of an object to be done using a specified formatter class.
Definition
serialize.h:488
READWRITE
#define READWRITE(...)
Definition
serialize.h:145
span.h
AmountCompression
Definition
compressor.h:99
AmountCompression::Unser
void Unser(Stream &s, I &val)
Definition
compressor.h:104
AmountCompression::Ser
void Ser(Stream &s, I val)
Definition
compressor.h:100
ScriptCompression
Compact serializer for scripts.
Definition
compressor.h:55
ScriptCompression::Unser
void Unser(Stream &s, CScript &script)
Definition
compressor.h:77
ScriptCompression::nSpecialScripts
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:62
ScriptCompression::Ser
void Ser(Stream &s, const CScript &script)
Definition
compressor.h:65
TxOutCompression
wrapper for CTxOut that provides a more compact serialization
Definition
compressor.h:114
TxOutCompression::FORMATTER_METHODS
FORMATTER_METHODS(CTxOut, obj)
Definition
compressor.h:115
Generated on
for Bitcoin Core by
1.17.0