Skip to content

Commit 27a3e3d

Browse files
yuviccsedited
andcommitted
kernel: Add Handle/View pattern for BlockValidationState
Add C API functions for managing BlockValidationState lifecycle: - btck_block_validation_state_create() - btck_block_validation_state_copy() - btck_block_validation_state_destroy() Introduce BlockValidationStateApi<> template to share common getter methods between BlockValidationState (Handle) and BlockValidationStateView (View) classes in the C++ wrapper. This enables external code to create and own BlockValidationState objects needed for the new process_block_header() API. Co-authored-by: TheCharlatan <seb.kung@gmail.com>
1 parent 94ddc2d commit 27a3e3d

File tree

5 files changed

+67
-18
lines changed

5 files changed

+67
-18
lines changed

src/bitcoin-chainstate.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ class TestValidationInterface : public ValidationInterface
5757

5858
std::optional<std::string> m_expected_valid_block = std::nullopt;
5959

60-
void BlockChecked(const Block block, const BlockValidationState state) override
60+
void BlockChecked(Block block, BlockValidationStateView state) override
6161
{
6262
auto mode{state.GetValidationMode()};
6363
switch (mode) {

src/kernel/bitcoinkernel.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -885,6 +885,21 @@ const btck_BlockTreeEntry* btck_block_tree_entry_get_previous(const btck_BlockTr
885885
return btck_BlockTreeEntry::ref(btck_BlockTreeEntry::get(entry).pprev);
886886
}
887887

888+
btck_BlockValidationState* btck_block_validation_state_create()
889+
{
890+
return btck_BlockValidationState::create();
891+
}
892+
893+
btck_BlockValidationState* btck_block_validation_state_copy(const btck_BlockValidationState* state)
894+
{
895+
return btck_BlockValidationState::copy(state);
896+
}
897+
898+
void btck_block_validation_state_destroy(btck_BlockValidationState* state)
899+
{
900+
delete state;
901+
}
902+
888903
btck_ValidationMode btck_block_validation_state_get_validation_mode(const btck_BlockValidationState* block_validation_state_)
889904
{
890905
auto& block_validation_state = btck_BlockValidationState::get(block_validation_state_);

src/kernel/bitcoinkernel.h

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1251,17 +1251,37 @@ BITCOINKERNEL_API void btck_block_destroy(btck_Block* block);
12511251
///@{
12521252

12531253
/**
1254-
* Returns the validation mode from an opaque block validation state pointer.
1254+
* Create a new btck_BlockValidationState.
1255+
*/
1256+
BITCOINKERNEL_API btck_BlockValidationState* BITCOINKERNEL_WARN_UNUSED_RESULT btck_block_validation_state_create();
1257+
1258+
/**
1259+
* Returns the validation mode from an opaque btck_BlockValidationState pointer.
12551260
*/
12561261
BITCOINKERNEL_API btck_ValidationMode btck_block_validation_state_get_validation_mode(
12571262
const btck_BlockValidationState* block_validation_state) BITCOINKERNEL_ARG_NONNULL(1);
12581263

12591264
/**
1260-
* Returns the validation result from an opaque block validation state pointer.
1265+
* Returns the validation result from an opaque btck_BlockValidationState pointer.
12611266
*/
12621267
BITCOINKERNEL_API btck_BlockValidationResult btck_block_validation_state_get_block_validation_result(
12631268
const btck_BlockValidationState* block_validation_state) BITCOINKERNEL_ARG_NONNULL(1);
12641269

1270+
/**
1271+
* @brief Copies the btck_BlockValidationState.
1272+
*
1273+
* @param[in] block_validation_state Non-null.
1274+
* @return The copied btck_BlockValidationState.
1275+
*/
1276+
BITCOINKERNEL_API btck_BlockValidationState* BITCOINKERNEL_WARN_UNUSED_RESULT btck_block_validation_state_copy(
1277+
const btck_BlockValidationState* block_validation_state) BITCOINKERNEL_ARG_NONNULL(1);
1278+
1279+
/**
1280+
* Destroy the btck_BlockValidationState.
1281+
*/
1282+
BITCOINKERNEL_API void btck_block_validation_state_destroy(
1283+
btck_BlockValidationState* block_validation_state) BITCOINKERNEL_ARG_NONNULL(1);
1284+
12651285
///@}
12661286

12671287
/** @name Chain

src/kernel/bitcoinkernel_wrapper.h

Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -685,7 +685,7 @@ class BlockHashApi
685685
}
686686
};
687687

688-
class BlockHashView: public View<btck_BlockHash>, public BlockHashApi<BlockHashView>
688+
class BlockHashView : public View<btck_BlockHash>, public BlockHashApi<BlockHashView>
689689
{
690690
public:
691691
explicit BlockHashView(const btck_BlockHash* ptr) : View{ptr} {}
@@ -831,36 +831,50 @@ class KernelNotifications
831831
virtual void FatalErrorHandler(std::string_view error) {}
832832
};
833833

834-
class BlockValidationState
834+
template <typename Derived>
835+
class BlockValidationStateApi
835836
{
836837
private:
837-
const btck_BlockValidationState* m_state;
838-
839-
public:
840-
BlockValidationState(const btck_BlockValidationState* state) : m_state{state} {}
838+
auto impl() const
839+
{
840+
return static_cast<const Derived*>(this)->get();
841+
}
841842

842-
BlockValidationState(const BlockValidationState&) = delete;
843-
BlockValidationState& operator=(const BlockValidationState&) = delete;
844-
BlockValidationState(BlockValidationState&&) = delete;
845-
BlockValidationState& operator=(BlockValidationState&&) = delete;
843+
friend Derived;
844+
BlockValidationStateApi() = default;
846845

846+
public:
847847
ValidationMode GetValidationMode() const
848848
{
849-
return static_cast<ValidationMode>(btck_block_validation_state_get_validation_mode(m_state));
849+
return static_cast<ValidationMode>(btck_block_validation_state_get_validation_mode(impl()));
850850
}
851851

852852
BlockValidationResult GetBlockValidationResult() const
853853
{
854-
return static_cast<BlockValidationResult>(btck_block_validation_state_get_block_validation_result(m_state));
854+
return static_cast<BlockValidationResult>(btck_block_validation_state_get_block_validation_result(impl()));
855855
}
856856
};
857857

858+
class BlockValidationStateView : public View<btck_BlockValidationState>, public BlockValidationStateApi<BlockValidationStateView>
859+
{
860+
public:
861+
explicit BlockValidationStateView(const btck_BlockValidationState* ptr) : View{ptr} {}
862+
};
863+
864+
class BlockValidationState : public Handle<btck_BlockValidationState, btck_block_validation_state_copy, btck_block_validation_state_destroy>, public BlockValidationStateApi<BlockValidationState>
865+
{
866+
public:
867+
explicit BlockValidationState() : Handle{btck_block_validation_state_create()} {}
868+
869+
BlockValidationState(const BlockValidationStateView& view) : Handle{view} {}
870+
};
871+
858872
class ValidationInterface
859873
{
860874
public:
861875
virtual ~ValidationInterface() = default;
862876

863-
virtual void BlockChecked(Block block, const BlockValidationState state) {}
877+
virtual void BlockChecked(Block block, BlockValidationStateView state) {}
864878

865879
virtual void PowValidBlock(BlockTreeEntry entry, Block block) {}
866880

@@ -918,7 +932,7 @@ class ContextOptions : public UniqueHandle<btck_ContextOptions, btck_context_opt
918932
btck_ValidationInterfaceCallbacks{
919933
.user_data = heap_vi.release(),
920934
.user_data_destroy = +[](void* user_data) { delete static_cast<user_type>(user_data); },
921-
.block_checked = +[](void* user_data, btck_Block* block, const btck_BlockValidationState* state) { (*static_cast<user_type>(user_data))->BlockChecked(Block{block}, BlockValidationState{state}); },
935+
.block_checked = +[](void* user_data, btck_Block* block, const btck_BlockValidationState* state) { (*static_cast<user_type>(user_data))->BlockChecked(Block{block}, BlockValidationStateView{state}); },
922936
.pow_valid_block = +[](void* user_data, btck_Block* block, const btck_BlockTreeEntry* entry) { (*static_cast<user_type>(user_data))->PowValidBlock(BlockTreeEntry{entry}, Block{block}); },
923937
.block_connected = +[](void* user_data, btck_Block* block, const btck_BlockTreeEntry* entry) { (*static_cast<user_type>(user_data))->BlockConnected(Block{block}, BlockTreeEntry{entry}); },
924938
.block_disconnected = +[](void* user_data, btck_Block* block, const btck_BlockTreeEntry* entry) { (*static_cast<user_type>(user_data))->BlockDisconnected(Block{block}, BlockTreeEntry{entry}); },

src/test/kernel/test_kernel.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ class TestValidationInterface : public ValidationInterface
145145
public:
146146
std::optional<std::vector<std::byte>> m_expected_valid_block = std::nullopt;
147147

148-
void BlockChecked(Block block, const BlockValidationState state) override
148+
void BlockChecked(Block block, BlockValidationStateView state) override
149149
{
150150
if (m_expected_valid_block.has_value()) {
151151
auto ser_block{block.ToBytes()};

0 commit comments

Comments
 (0)