Skip to content

Commit c4415d1

Browse files
committed
refactor: remove more code duplication from (dis)connect operations
1 parent 3a15c93 commit c4415d1

File tree

5 files changed

+57
-112
lines changed

5 files changed

+57
-112
lines changed

src/Makefile.am

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -386,6 +386,7 @@ libbitcoin_server_a_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) $(MINIUPNPC_CP
386386
libbitcoin_server_a_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
387387
libbitcoin_server_a_SOURCES = \
388388
addrdb.cpp \
389+
addressindex.cpp \
389390
addrman.cpp \
390391
banman.cpp \
391392
batchedlogger.cpp \

src/addressindex.cpp

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
// Copyright (c) 2016 BitPay, Inc.
2+
// Copyright (c) 2023 The Dash 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+
#include <addressindex.h>
7+
8+
#include <key_io.h>
9+
#include <hash.h>
10+
#include <script/script.h>
11+
12+
template <typename T1>
13+
inline std::vector<uint8_t> TrimScriptP2PKH(const T1& input) {
14+
return std::vector<uint8_t>(input.begin() + 3, input.begin() + 23);
15+
};
16+
17+
template <typename T1>
18+
inline std::vector<uint8_t> TrimScriptP2SH(const T1& input) {
19+
return std::vector<uint8_t>(input.begin() + 2, input.begin() + 22);
20+
};
21+
22+
template <typename T1>
23+
inline std::vector<uint8_t> TrimScriptP2PK(const T1& input) {
24+
return std::vector<uint8_t>(input.begin() + 1, input.end() - 1);
25+
};
26+
27+
bool AddressBytesFromScript(const CScript& script, uint8_t& address_type, uint160& address_bytes) {
28+
if (script.IsPayToScriptHash()) {
29+
address_type = AddressType::P2SH;
30+
address_bytes = uint160(TrimScriptP2SH(script));
31+
} else if (script.IsPayToPublicKeyHash()) {
32+
address_type = AddressType::P2PKH;
33+
address_bytes = uint160(TrimScriptP2PKH(script));
34+
} else if (script.IsPayToPublicKey()) {
35+
address_type = AddressType::P2PK;
36+
address_bytes = Hash160(TrimScriptP2PK(script));
37+
} else {
38+
address_type = AddressType::UNKNOWN;
39+
address_bytes.SetNull();
40+
return false;
41+
}
42+
return true;
43+
}

src/addressindex.h

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313

1414
#include <chrono>
1515

16+
class CScript;
17+
1618
namespace AddressType {
1719
enum AddressType {
1820
P2PK = 1,
@@ -224,19 +226,6 @@ struct CAddressIndexIteratorHeightKey {
224226
}
225227
};
226228

227-
template <typename T1>
228-
inline std::vector<uint8_t> TrimScriptP2PK(const T1& input) {
229-
return std::vector<uint8_t>(input.begin() + 1, input.end() - 1);
230-
};
231-
232-
template <typename T1>
233-
inline std::vector<uint8_t> TrimScriptP2PKH(const T1& input) {
234-
return std::vector<uint8_t>(input.begin() + 3, input.begin() + 23);
235-
};
236-
237-
template <typename T1>
238-
inline std::vector<uint8_t> TrimScriptP2SH(const T1& input) {
239-
return std::vector<uint8_t>(input.begin() + 2, input.begin() + 22);
240-
};
229+
bool AddressBytesFromScript(const CScript& script, uint8_t& address_type, uint160& address_bytes);
241230

242231
#endif // BITCOIN_ADDRESSINDEX_H

src/txmempool.cpp

Lines changed: 4 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -478,16 +478,7 @@ void CTxMemPool::addAddressIndex(const CTxMemPoolEntry &entry, const CCoinsViewC
478478
uint8_t address_type{0};
479479
uint160 address_bytes;
480480

481-
if (prevout.scriptPubKey.IsPayToScriptHash()) {
482-
address_type = AddressType::P2SH;
483-
address_bytes = uint160(TrimScriptP2SH(prevout.scriptPubKey));
484-
} else if (prevout.scriptPubKey.IsPayToPublicKeyHash()) {
485-
address_type = AddressType::P2PKH;
486-
address_bytes = uint160(TrimScriptP2PKH(prevout.scriptPubKey));
487-
} else if (prevout.scriptPubKey.IsPayToPublicKey()) {
488-
address_type = AddressType::P2PK;
489-
address_bytes = Hash160(TrimScriptP2PK(prevout.scriptPubKey));
490-
} else {
481+
if (!AddressBytesFromScript(prevout.scriptPubKey, address_type, address_bytes)) {
491482
continue;
492483
}
493484

@@ -503,16 +494,7 @@ void CTxMemPool::addAddressIndex(const CTxMemPoolEntry &entry, const CCoinsViewC
503494
uint8_t address_type{0};
504495
uint160 address_bytes;
505496

506-
if (out.scriptPubKey.IsPayToScriptHash()) {
507-
address_type = AddressType::P2SH;
508-
address_bytes = uint160(TrimScriptP2SH(out.scriptPubKey));
509-
} else if (out.scriptPubKey.IsPayToPublicKeyHash()) {
510-
address_type = AddressType::P2PKH;
511-
address_bytes = uint160(TrimScriptP2PKH(out.scriptPubKey));
512-
} else if (out.scriptPubKey.IsPayToPublicKey()) {
513-
address_type = AddressType::P2PK;
514-
address_bytes = Hash160(TrimScriptP2PK(out.scriptPubKey));
515-
} else {
497+
if (!AddressBytesFromScript(out.scriptPubKey, address_type, address_bytes)) {
516498
continue;
517499
}
518500

@@ -570,18 +552,8 @@ void CTxMemPool::addSpentIndex(const CTxMemPoolEntry &entry, const CCoinsViewCac
570552
uint8_t address_type{0};
571553
uint160 address_bytes;
572554

573-
if (prevout.scriptPubKey.IsPayToScriptHash()) {
574-
address_type = AddressType::P2SH;
575-
address_bytes = uint160(TrimScriptP2SH(prevout.scriptPubKey));
576-
} else if (prevout.scriptPubKey.IsPayToPublicKeyHash()) {
577-
address_type = AddressType::P2PKH;
578-
address_bytes = uint160(TrimScriptP2PKH(prevout.scriptPubKey));
579-
} else if (prevout.scriptPubKey.IsPayToPublicKey()) {
580-
address_type = AddressType::P2PK;
581-
address_bytes = Hash160(TrimScriptP2PK(prevout.scriptPubKey));
582-
} else {
583-
address_type = AddressType::UNKNOWN;
584-
address_bytes.SetNull();
555+
if (!AddressBytesFromScript(prevout.scriptPubKey, address_type, address_bytes)) {
556+
continue;
585557
}
586558

587559
CSpentIndexKey key = CSpentIndexKey(input.prevout.hash, input.prevout.n);

src/validation.cpp

Lines changed: 6 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -1709,16 +1709,7 @@ DisconnectResult CChainState::DisconnectBlock(const CBlock& block, const CBlockI
17091709
uint8_t address_type{0};
17101710
uint160 address_bytes;
17111711

1712-
if (out.scriptPubKey.IsPayToScriptHash()) {
1713-
address_type = AddressType::P2SH;
1714-
address_bytes = uint160(TrimScriptP2SH(out.scriptPubKey));
1715-
} else if (out.scriptPubKey.IsPayToPublicKeyHash()) {
1716-
address_type = AddressType::P2PKH;
1717-
address_bytes = uint160(TrimScriptP2PKH(out.scriptPubKey));
1718-
} else if (out.scriptPubKey.IsPayToPublicKey()) {
1719-
address_type = AddressType::P2PK;
1720-
address_bytes = Hash160(TrimScriptP2PK(out.scriptPubKey));
1721-
} else {
1712+
if (!AddressBytesFromScript(out.scriptPubKey, address_type, address_bytes)) {
17221713
continue;
17231714
}
17241715

@@ -1771,16 +1762,7 @@ DisconnectResult CChainState::DisconnectBlock(const CBlock& block, const CBlockI
17711762
uint8_t address_type{0};
17721763
uint160 address_bytes;
17731764

1774-
if (prevout.scriptPubKey.IsPayToScriptHash()) {
1775-
address_type = AddressType::P2SH;
1776-
address_bytes = uint160(TrimScriptP2SH(prevout.scriptPubKey));
1777-
} else if (prevout.scriptPubKey.IsPayToPublicKeyHash()) {
1778-
address_type = AddressType::P2PKH;
1779-
address_bytes = uint160(TrimScriptP2PKH(prevout.scriptPubKey));
1780-
} else if (prevout.scriptPubKey.IsPayToPublicKey()) {
1781-
address_type = AddressType::P2PK;
1782-
address_bytes = Hash160(TrimScriptP2PK(prevout.scriptPubKey));
1783-
} else {
1765+
if (!AddressBytesFromScript(prevout.scriptPubKey, address_type, address_bytes)) {
17841766
continue;
17851767
}
17861768

@@ -2245,19 +2227,7 @@ bool CChainState::ConnectBlock(const CBlock& block, BlockValidationState& state,
22452227
uint8_t address_type{0};
22462228
uint160 address_bytes;
22472229

2248-
if (prevout.scriptPubKey.IsPayToScriptHash()) {
2249-
address_type = AddressType::P2SH;
2250-
address_bytes = uint160(TrimScriptP2SH(prevout.scriptPubKey));
2251-
} else if (prevout.scriptPubKey.IsPayToPublicKeyHash()) {
2252-
address_type = AddressType::P2PKH;
2253-
address_bytes = uint160(TrimScriptP2PKH(prevout.scriptPubKey));
2254-
} else if (prevout.scriptPubKey.IsPayToPublicKey()) {
2255-
address_type = AddressType::P2PK;
2256-
address_bytes = Hash160(TrimScriptP2PK(prevout.scriptPubKey));
2257-
} else {
2258-
address_type = AddressType::UNKNOWN;
2259-
address_bytes.SetNull();
2260-
}
2230+
AddressBytesFromScript(prevout.scriptPubKey, address_type, address_bytes);
22612231

22622232
if (fAddressIndex && address_type != AddressType::UNKNOWN) {
22632233
// record spending activity
@@ -2311,16 +2281,7 @@ bool CChainState::ConnectBlock(const CBlock& block, BlockValidationState& state,
23112281
uint8_t address_type{0};
23122282
uint160 address_bytes;
23132283

2314-
if (out.scriptPubKey.IsPayToScriptHash()) {
2315-
address_type = AddressType::P2SH;
2316-
address_bytes = uint160(TrimScriptP2SH(out.scriptPubKey));
2317-
} else if (out.scriptPubKey.IsPayToPublicKeyHash()) {
2318-
address_type = AddressType::P2PKH;
2319-
address_bytes = uint160(TrimScriptP2PKH(out.scriptPubKey));
2320-
} else if (out.scriptPubKey.IsPayToPublicKey()) {
2321-
address_type = AddressType::P2PK;
2322-
address_bytes = Hash160(TrimScriptP2PK(out.scriptPubKey));
2323-
} else {
2284+
if (!AddressBytesFromScript(out.scriptPubKey, address_type, address_bytes)) {
23242285
continue;
23252286
}
23262287

@@ -4847,19 +4808,7 @@ bool CChainState::RollforwardBlock(const CBlockIndex* pindex, CCoinsViewCache& i
48474808
uint8_t address_type{0};
48484809
uint160 address_bytes;
48494810

4850-
if (prevout.scriptPubKey.IsPayToScriptHash()) {
4851-
address_type = AddressType::P2SH;
4852-
address_bytes = uint160(TrimScriptP2SH(prevout.scriptPubKey));
4853-
} else if (prevout.scriptPubKey.IsPayToPublicKeyHash()) {
4854-
address_type = AddressType::P2PKH;
4855-
address_bytes = uint160(TrimScriptP2PKH(prevout.scriptPubKey));
4856-
} else if (prevout.scriptPubKey.IsPayToPublicKey()) {
4857-
address_type = AddressType::P2PK;
4858-
address_bytes = Hash160(TrimScriptP2PK(prevout.scriptPubKey));
4859-
} else {
4860-
address_type = AddressType::UNKNOWN;
4861-
address_bytes.SetNull();
4862-
}
4811+
AddressBytesFromScript(prevout.scriptPubKey, address_type, address_bytes);
48634812

48644813
if (fAddressIndex && address_type != AddressType::UNKNOWN) {
48654814
// record spending activity
@@ -4884,16 +4833,7 @@ bool CChainState::RollforwardBlock(const CBlockIndex* pindex, CCoinsViewCache& i
48844833
uint8_t address_type{0};
48854834
uint160 address_bytes;
48864835

4887-
if (out.scriptPubKey.IsPayToScriptHash()) {
4888-
address_type = AddressType::P2SH;
4889-
address_bytes = uint160(TrimScriptP2SH(out.scriptPubKey));
4890-
} else if (out.scriptPubKey.IsPayToPublicKeyHash()) {
4891-
address_type = AddressType::P2PKH;
4892-
address_bytes = uint160(TrimScriptP2PKH(out.scriptPubKey));
4893-
} else if (out.scriptPubKey.IsPayToPublicKey()) {
4894-
address_type = AddressType::P2PK;
4895-
address_bytes = Hash160(TrimScriptP2PK(out.scriptPubKey));
4896-
} else {
4836+
if (!AddressBytesFromScript(out.scriptPubKey, address_type, address_bytes)) {
48974837
continue;
48984838
}
48994839

0 commit comments

Comments
 (0)