Skip to content

Commit a7b8b98

Browse files
authored
Merge pull request #1767 from evoskuil/master
Add serializable chain::outpoint.
2 parents 103fac3 + 01ccf08 commit a7b8b98

File tree

13 files changed

+559
-1
lines changed

13 files changed

+559
-1
lines changed

Makefile.am

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ src_libbitcoin_system_la_SOURCES = \
4646
src/chain/header.cpp \
4747
src/chain/input.cpp \
4848
src/chain/operation.cpp \
49+
src/chain/outpoint.cpp \
4950
src/chain/output.cpp \
5051
src/chain/point.cpp \
5152
src/chain/script.cpp \
@@ -234,6 +235,7 @@ test_libbitcoin_system_test_SOURCES = \
234235
test/chain/header.cpp \
235236
test/chain/input.cpp \
236237
test/chain/operation.cpp \
238+
test/chain/outpoint.cpp \
237239
test/chain/output.cpp \
238240
test/chain/point.cpp \
239241
test/chain/satoshi_words.cpp \
@@ -482,6 +484,7 @@ include_bitcoin_system_chain_HEADERS = \
482484
include/bitcoin/system/chain/header.hpp \
483485
include/bitcoin/system/chain/input.hpp \
484486
include/bitcoin/system/chain/operation.hpp \
487+
include/bitcoin/system/chain/outpoint.hpp \
485488
include/bitcoin/system/chain/output.hpp \
486489
include/bitcoin/system/chain/point.hpp \
487490
include/bitcoin/system/chain/prevout.hpp \

builds/cmake/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -479,6 +479,7 @@ add_library( ${CANONICAL_LIB_NAME}
479479
"../../src/chain/header.cpp"
480480
"../../src/chain/input.cpp"
481481
"../../src/chain/operation.cpp"
482+
"../../src/chain/outpoint.cpp"
482483
"../../src/chain/output.cpp"
483484
"../../src/chain/point.cpp"
484485
"../../src/chain/script.cpp"
@@ -713,6 +714,7 @@ if (with-tests)
713714
"../../test/chain/header.cpp"
714715
"../../test/chain/input.cpp"
715716
"../../test/chain/operation.cpp"
717+
"../../test/chain/outpoint.cpp"
716718
"../../test/chain/output.cpp"
717719
"../../test/chain/point.cpp"
718720
"../../test/chain/satoshi_words.cpp"

builds/msvc/vs2022/libbitcoin-system-test/libbitcoin-system-test.vcxproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@
135135
<ClCompile Include="..\..\..\..\test\chain\header.cpp" />
136136
<ClCompile Include="..\..\..\..\test\chain\input.cpp" />
137137
<ClCompile Include="..\..\..\..\test\chain\operation.cpp" />
138+
<ClCompile Include="..\..\..\..\test\chain\outpoint.cpp" />
138139
<ClCompile Include="..\..\..\..\test\chain\output.cpp" />
139140
<ClCompile Include="..\..\..\..\test\chain\point.cpp" />
140141
<ClCompile Include="..\..\..\..\test\chain\satoshi_words.cpp" />

builds/msvc/vs2022/libbitcoin-system-test/libbitcoin-system-test.vcxproj.filters

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,9 @@
147147
<ClCompile Include="..\..\..\..\test\chain\operation.cpp">
148148
<Filter>src\chain</Filter>
149149
</ClCompile>
150+
<ClCompile Include="..\..\..\..\test\chain\outpoint.cpp">
151+
<Filter>src\chain</Filter>
152+
</ClCompile>
150153
<ClCompile Include="..\..\..\..\test\chain\output.cpp">
151154
<Filter>src\chain</Filter>
152155
</ClCompile>

builds/msvc/vs2022/libbitcoin-system/libbitcoin-system.vcxproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,7 @@
138138
<ObjectFileName>$(IntDir)src_chain_input.obj</ObjectFileName>
139139
</ClCompile>
140140
<ClCompile Include="..\..\..\..\src\chain\operation.cpp" />
141+
<ClCompile Include="..\..\..\..\src\chain\outpoint.cpp" />
141142
<ClCompile Include="..\..\..\..\src\chain\output.cpp">
142143
<ObjectFileName>$(IntDir)src_chain_output.obj</ObjectFileName>
143144
</ClCompile>
@@ -323,6 +324,7 @@
323324
<ClInclude Include="..\..\..\..\include\bitcoin\system\chain\header.hpp" />
324325
<ClInclude Include="..\..\..\..\include\bitcoin\system\chain\input.hpp" />
325326
<ClInclude Include="..\..\..\..\include\bitcoin\system\chain\operation.hpp" />
327+
<ClInclude Include="..\..\..\..\include\bitcoin\system\chain\outpoint.hpp" />
326328
<ClInclude Include="..\..\..\..\include\bitcoin\system\chain\output.hpp" />
327329
<ClInclude Include="..\..\..\..\include\bitcoin\system\chain\point.hpp" />
328330
<ClInclude Include="..\..\..\..\include\bitcoin\system\chain\prevout.hpp" />

builds/msvc/vs2022/libbitcoin-system/libbitcoin-system.vcxproj.filters

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,9 @@
276276
<ClCompile Include="..\..\..\..\src\chain\operation.cpp">
277277
<Filter>src\chain</Filter>
278278
</ClCompile>
279+
<ClCompile Include="..\..\..\..\src\chain\outpoint.cpp">
280+
<Filter>src\chain</Filter>
281+
</ClCompile>
279282
<ClCompile Include="..\..\..\..\src\chain\output.cpp">
280283
<Filter>src\chain</Filter>
281284
</ClCompile>
@@ -719,6 +722,9 @@
719722
<ClInclude Include="..\..\..\..\include\bitcoin\system\chain\operation.hpp">
720723
<Filter>include\bitcoin\system\chain</Filter>
721724
</ClInclude>
725+
<ClInclude Include="..\..\..\..\include\bitcoin\system\chain\outpoint.hpp">
726+
<Filter>include\bitcoin\system\chain</Filter>
727+
</ClInclude>
722728
<ClInclude Include="..\..\..\..\include\bitcoin\system\chain\output.hpp">
723729
<Filter>include\bitcoin\system\chain</Filter>
724730
</ClInclude>

include/bitcoin/system.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
#include <bitcoin/system/chain/header.hpp>
4343
#include <bitcoin/system/chain/input.hpp>
4444
#include <bitcoin/system/chain/operation.hpp>
45+
#include <bitcoin/system/chain/outpoint.hpp>
4546
#include <bitcoin/system/chain/output.hpp>
4647
#include <bitcoin/system/chain/point.hpp>
4748
#include <bitcoin/system/chain/prevout.hpp>

include/bitcoin/system/chain/chain.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
#include <bitcoin/system/chain/input.hpp>
4242
#include <bitcoin/system/chain/operation.hpp>
4343
#include <bitcoin/system/chain/output.hpp>
44+
#include <bitcoin/system/chain/outpoint.hpp>
4445
#include <bitcoin/system/chain/point.hpp>
4546
#include <bitcoin/system/chain/prevout.hpp>
4647
#include <bitcoin/system/chain/script.hpp>
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
/**
2+
* Copyright (c) 2011-2025 libbitcoin developers (see AUTHORS)
3+
*
4+
* This file is part of libbitcoin.
5+
*
6+
* This program is free software: you can redistribute it and/or modify
7+
* it under the terms of the GNU Affero General Public License as published by
8+
* the Free Software Foundation, either version 3 of the License, or
9+
* (at your option) any later version.
10+
*
11+
* This program is distributed in the hope that it will be useful,
12+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14+
* GNU Affero General Public License for more details.
15+
*
16+
* You should have received a copy of the GNU Affero General Public License
17+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
18+
*/
19+
#ifndef LIBBITCOIN_SYSTEM_CHAIN_OUTPOINT_HPP
20+
#define LIBBITCOIN_SYSTEM_CHAIN_OUTPOINT_HPP
21+
22+
#include <memory>
23+
#include <unordered_set>
24+
#include <bitcoin/system/chain/point.hpp>
25+
#include <bitcoin/system/data/data.hpp>
26+
#include <bitcoin/system/define.hpp>
27+
#include <bitcoin/system/hash/hash.hpp>
28+
#include <bitcoin/system/stream/stream.hpp>
29+
30+
namespace libbitcoin {
31+
namespace system {
32+
namespace chain {
33+
34+
class BC_API outpoint
35+
{
36+
public:
37+
DEFAULT_COPY_MOVE_DESTRUCT(outpoint);
38+
39+
typedef std::shared_ptr<const outpoint> cptr;
40+
41+
static constexpr size_t serialized_size() NOEXCEPT
42+
{
43+
return point::serialized_size() + sizeof(uint32_t);
44+
}
45+
46+
/// Constructors.
47+
/// -----------------------------------------------------------------------
48+
49+
/// Default outpoint is an invalid null outpoint (null_hash/null_index/0).
50+
outpoint() NOEXCEPT;
51+
52+
outpoint(chain::point&& point, uint64_t value) NOEXCEPT;
53+
outpoint(const chain::point& point, uint64_t value) NOEXCEPT;
54+
55+
outpoint(const data_slice& data) NOEXCEPT;
56+
outpoint(stream::in::fast& stream) NOEXCEPT;
57+
outpoint(std::istream& stream) NOEXCEPT;
58+
outpoint(reader& source) NOEXCEPT;
59+
60+
/// Operators.
61+
/// -----------------------------------------------------------------------
62+
63+
bool operator==(const outpoint& other) const NOEXCEPT;
64+
bool operator!=(const outpoint& other) const NOEXCEPT;
65+
66+
/// Serialization.
67+
/// -----------------------------------------------------------------------
68+
69+
data_chunk to_data() const NOEXCEPT;
70+
void to_data(std::ostream& stream) const NOEXCEPT;
71+
void to_data(writer& sink) const NOEXCEPT;
72+
73+
/// Properties.
74+
/// -----------------------------------------------------------------------
75+
76+
/// Native properties.
77+
bool is_valid() const NOEXCEPT;
78+
const chain::point& point() const NOEXCEPT;
79+
uint64_t value() const NOEXCEPT;
80+
81+
/// Computed properties.
82+
bool is_null() const NOEXCEPT;
83+
84+
protected:
85+
outpoint(stream::in::fast&& stream) NOEXCEPT;
86+
outpoint(reader&& source) NOEXCEPT;
87+
outpoint(chain::point&& point, uint64_t value, bool valid) NOEXCEPT;
88+
outpoint(const chain::point& point, uint64_t value, bool valid) NOEXCEPT;
89+
90+
private:
91+
chain::point point_;
92+
uint64_t value_;
93+
94+
// Cache.
95+
bool valid_;
96+
};
97+
98+
/// Arbitrary compare, for uniqueness sorting.
99+
bool operator<(const outpoint& left, const outpoint& right) NOEXCEPT;
100+
101+
typedef std_vector<outpoint> outpoints;
102+
103+
DECLARE_JSON_TAG_INVOKE(outpoint);
104+
DECLARE_JSON_TAG_INVOKE(outpoint::cptr);
105+
106+
} // namespace chain
107+
} // namespace system
108+
} // namespace libbitcoin
109+
110+
namespace std
111+
{
112+
template<>
113+
struct hash<bc::system::chain::outpoint>
114+
{
115+
size_t operator()(const bc::system::chain::outpoint& value) const NOEXCEPT
116+
{
117+
// Value does not contribute to identity.
118+
return std::hash<bc::system::chain::point>{}(value.point());
119+
}
120+
};
121+
} // namespace std
122+
123+
#endif

include/bitcoin/system/chain/output.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#define LIBBITCOIN_SYSTEM_CHAIN_OUTPUT_HPP
2121

2222
#include <memory>
23+
#include <bitcoin/system/chain/point.hpp>
2324
#include <bitcoin/system/chain/script.hpp>
2425
#include <bitcoin/system/data/data.hpp>
2526
#include <bitcoin/system/define.hpp>

0 commit comments

Comments
 (0)