MOVEONLY: Move script/compressor out of script and put CTxOutCompressor (from

core) with it
This commit is contained in:
jtimon 2014-10-19 04:28:43 +02:00
parent 999a2ab41e
commit 561e9e9de9
8 changed files with 93 additions and 93 deletions

View File

@ -80,6 +80,7 @@ BITCOIN_CORE_H = \
coincontrol.h \ coincontrol.h \
coins.h \ coins.h \
compat.h \ compat.h \
compressor.h \
core.h \ core.h \
core/transaction.h \ core/transaction.h \
core_io.h \ core_io.h \
@ -103,7 +104,6 @@ BITCOIN_CORE_H = \
rpcclient.h \ rpcclient.h \
rpcprotocol.h \ rpcprotocol.h \
rpcserver.h \ rpcserver.h \
script/compressor.h \
script/interpreter.h \ script/interpreter.h \
script/script.h \ script/script.h \
script/sigcache.h \ script/sigcache.h \
@ -214,6 +214,7 @@ libbitcoin_common_a_SOURCES = \
base58.cpp \ base58.cpp \
chainparams.cpp \ chainparams.cpp \
coins.cpp \ coins.cpp \
compressor.cpp \
core.cpp \ core.cpp \
core/transaction.cpp \ core/transaction.cpp \
core_read.cpp \ core_read.cpp \
@ -223,7 +224,6 @@ libbitcoin_common_a_SOURCES = \
keystore.cpp \ keystore.cpp \
netbase.cpp \ netbase.cpp \
protocol.cpp \ protocol.cpp \
script/compressor.cpp \
script/interpreter.cpp \ script/interpreter.cpp \
script/script.cpp \ script/script.cpp \
script/sigcache.cpp \ script/sigcache.cpp \

View File

@ -6,8 +6,7 @@
#ifndef BITCOIN_COINS_H #ifndef BITCOIN_COINS_H
#define BITCOIN_COINS_H #define BITCOIN_COINS_H
#include "core.h" // Only for CTxOutCompressor #include "compressor.h"
#include "core/transaction.h"
#include "serialize.h" #include "serialize.h"
#include "uint256.h" #include "uint256.h"
#include "undo.h" #include "undo.h"

View File

@ -5,6 +5,7 @@
#include "compressor.h" #include "compressor.h"
#include "hash.h"
#include "key.h" #include "key.h"
#include "script/standard.h" #include "script/standard.h"
@ -128,3 +129,57 @@ bool CScriptCompressor::Decompress(unsigned int nSize, const std::vector<unsigne
} }
return false; return false;
} }
// Amount compression:
// * If the amount is 0, output 0
// * first, divide the amount (in base units) by the largest power of 10 possible; call the exponent e (e is max 9)
// * if e<9, the last digit of the resulting number cannot be 0; store it as d, and drop it (divide by 10)
// * call the result n
// * output 1 + 10*(9*n + d - 1) + e
// * if e==9, we only know the resulting number is not zero, so output 1 + 10*(n - 1) + 9
// (this is decodable, as d is in [1-9] and e is in [0-9])
uint64_t CTxOutCompressor::CompressAmount(uint64_t n)
{
if (n == 0)
return 0;
int e = 0;
while (((n % 10) == 0) && e < 9) {
n /= 10;
e++;
}
if (e < 9) {
int d = (n % 10);
assert(d >= 1 && d <= 9);
n /= 10;
return 1 + (n*9 + d - 1)*10 + e;
} else {
return 1 + (n - 1)*10 + 9;
}
}
uint64_t CTxOutCompressor::DecompressAmount(uint64_t x)
{
// x = 0 OR x = 1+10*(9*n + d - 1) + e OR x = 1+10*(n - 1) + 9
if (x == 0)
return 0;
x--;
// x = 10*(9*n + d - 1) + e
int e = x % 10;
x /= 10;
uint64_t n = 0;
if (e < 9) {
// x = 9*n + d - 1
int d = (x % 9) + 1;
x /= 9;
// x = n
n = x*10 + d;
} else {
n = x+1;
}
while (e) {
n *= 10;
e--;
}
return n;
}

View File

@ -3,9 +3,10 @@
// Distributed under the MIT software license, see the accompanying // Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php. // file COPYING or http://www.opensource.org/licenses/mit-license.php.
#ifndef H_BITCOIN_SCRIPT_COMPRESSOR #ifndef H_BITCOIN_COMPRESSOR
#define H_BITCOIN_SCRIPT_COMPRESSOR #define H_BITCOIN_COMPRESSOR
#include "core/transaction.h"
#include "script/script.h" #include "script/script.h"
#include "serialize.h" #include "serialize.h"
@ -86,4 +87,33 @@ public:
} }
}; };
#endif // H_BITCOIN_SCRIPT_COMPRESSOR /** wrapper for CTxOut that provides a more compact serialization */
class CTxOutCompressor
{
private:
CTxOut &txout;
public:
static uint64_t CompressAmount(uint64_t nAmount);
static uint64_t DecompressAmount(uint64_t nAmount);
CTxOutCompressor(CTxOut &txoutIn) : txout(txoutIn) { }
ADD_SERIALIZE_METHODS;
template <typename Stream, typename Operation>
inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) {
if (!ser_action.ForRead()) {
uint64_t nVal = CompressAmount(txout.nValue);
READWRITE(VARINT(nVal));
} else {
uint64_t nVal = 0;
READWRITE(VARINT(nVal));
txout.nValue = DecompressAmount(nVal);
}
CScriptCompressor cscript(REF(txout.scriptPubKey));
READWRITE(cscript);
}
};
#endif // H_BITCOIN_COMPRESSOR

View File

@ -9,60 +9,6 @@
#include "tinyformat.h" #include "tinyformat.h"
#include "utilstrencodings.h" #include "utilstrencodings.h"
// Amount compression:
// * If the amount is 0, output 0
// * first, divide the amount (in base units) by the largest power of 10 possible; call the exponent e (e is max 9)
// * if e<9, the last digit of the resulting number cannot be 0; store it as d, and drop it (divide by 10)
// * call the result n
// * output 1 + 10*(9*n + d - 1) + e
// * if e==9, we only know the resulting number is not zero, so output 1 + 10*(n - 1) + 9
// (this is decodable, as d is in [1-9] and e is in [0-9])
uint64_t CTxOutCompressor::CompressAmount(uint64_t n)
{
if (n == 0)
return 0;
int e = 0;
while (((n % 10) == 0) && e < 9) {
n /= 10;
e++;
}
if (e < 9) {
int d = (n % 10);
assert(d >= 1 && d <= 9);
n /= 10;
return 1 + (n*9 + d - 1)*10 + e;
} else {
return 1 + (n - 1)*10 + 9;
}
}
uint64_t CTxOutCompressor::DecompressAmount(uint64_t x)
{
// x = 0 OR x = 1+10*(9*n + d - 1) + e OR x = 1+10*(n - 1) + 9
if (x == 0)
return 0;
x--;
// x = 10*(9*n + d - 1) + e
int e = x % 10;
x /= 10;
uint64_t n = 0;
if (e < 9) {
// x = 9*n + d - 1
int d = (x % 9) + 1;
x /= 9;
// x = n
n = x*10 + d;
} else {
n = x+1;
}
while (e) {
n *= 10;
e--;
}
return n;
}
uint256 CBlockHeader::GetHash() const uint256 CBlockHeader::GetHash() const
{ {
return Hash(BEGIN(nVersion), END(nNonce)); return Hash(BEGIN(nVersion), END(nNonce));

View File

@ -7,39 +7,9 @@
#define BITCOIN_CORE_H #define BITCOIN_CORE_H
#include "core/transaction.h" #include "core/transaction.h"
#include "script/compressor.h"
#include "serialize.h" #include "serialize.h"
#include "uint256.h" #include "uint256.h"
/** wrapper for CTxOut that provides a more compact serialization */
class CTxOutCompressor
{
private:
CTxOut &txout;
public:
static uint64_t CompressAmount(uint64_t nAmount);
static uint64_t DecompressAmount(uint64_t nAmount);
CTxOutCompressor(CTxOut &txoutIn) : txout(txoutIn) { }
ADD_SERIALIZE_METHODS;
template <typename Stream, typename Operation>
inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) {
if (!ser_action.ForRead()) {
uint64_t nVal = CompressAmount(txout.nValue);
READWRITE(VARINT(nVal));
} else {
uint64_t nVal = 0;
READWRITE(VARINT(nVal));
txout.nValue = DecompressAmount(nVal);
}
CScriptCompressor cscript(REF(txout.scriptPubKey));
READWRITE(cscript);
}
};
/** Nodes collect new transactions into a block, hash them into a hash tree, /** Nodes collect new transactions into a block, hash them into a hash tree,
* and scan through nonce values to make the block's hash satisfy proof-of-work * and scan through nonce values to make the block's hash satisfy proof-of-work
* requirements. When they solve the proof-of-work, they broadcast the block * requirements. When they solve the proof-of-work, they broadcast the block

View File

@ -2,7 +2,7 @@
// Distributed under the MIT/X11 software license, see the accompanying // Distributed under the MIT/X11 software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php. // file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include "main.h" #include "compressor.h"
#include "util.h" #include "util.h"
#include <stdint.h> #include <stdint.h>

View File

@ -6,7 +6,7 @@
#ifndef H_BITCOIN_TXUNDO #ifndef H_BITCOIN_TXUNDO
#define H_BITCOIN_TXUNDO #define H_BITCOIN_TXUNDO
#include "core.h" // Only for CTxOutCompressor #include "compressor.h"
#include "core/transaction.h" #include "core/transaction.h"
#include "serialize.h" #include "serialize.h"