Skip to content

Commit 29507a3

Browse files
Squashed 'libbitcoinkernel-sys/bitcoin/' changes from 9e203b460d8a..73acb3ff8a04
73acb3ff8a04 kernel: Add pure kernel bitcoin-chainstate 6c26da3dc494 kernel: Add functions to get the block hash from a block 99d302a824f5 kernel: Add block index utility functions to C header 7d1583ec269f kernel: Add function to read block undo data from disk to C header 7af127e174e8 kernel: Add functions to read block from disk to C header 700087ca1112 kernel: Add function for copying block data to C header db9b5fa92db4 kernel: Add functions for the block validation state to C header ae178c846341 kernel: Add validation interface to C header f5ecbabe94d9 kernel: Add interrupt function to C header 08a52f02bf84 kernel: Add import blocks function to C header 3ced859f0f9f kernel: Add chainstate load options for in-memory dbs in C header b3a1f0c65ec0 kernel: Add options for reindexing in C header bde14cb16090 kernel: Add block validation to C header 3ebee13826d3 Kernel: Add chainstate loading to kernel C header 593999ab9a6c kernel: Add chainstate manager option for setting worker threads 78dda8e7474f kernel: Add chainstate manager object to C header 436db528893b kernel: Add notifications context option to C header 2e4e30d45c39 kerenl: Add chain params context option to C header 20f1d3996ec6 kernel: Add kernel library context object f3ab2302a1c3 kernel: Add logging to kernel library C header REVERT: 9e203b460d8a kernel: Add pure kernel bitcoin-chainstate REVERT: a568bf9a494d kernel: Add functions to get the block hash from a block REVERT: 237b97dd542b kernel: Add block index utility functions to C header REVERT: f6b3f264e2f6 kernel: Add function to read block undo data from disk to C header REVERT: 90875aedcd64 kernel: Add functions to read block from disk to C header REVERT: 90b9adb287b6 kernel: Add function for copying block data to C header REVERT: d17e5dd695f4 kernel: Add functions for the block validation state to C header REVERT: f61407f19aaf kernel: Add validation interface to C header REVERT: 6d2b74ee03fe kernel: Add interrupt function to C header REVERT: 1385c03b10c5 kernel: Add import blocks function to C header REVERT: 229d696f3826 kernel: Add chainstate load options for in-memory dbs in C header REVERT: d239f5504ca2 kernel: Add options for reindexing in C header REVERT: d351759979f4 kernel: Add block validation to C header REVERT: 4ebfbf84491f Kernel: Add chainstate loading to kernel C header REVERT: b15df6bb21f1 kernel: Add chainstate manager option for setting worker threads REVERT: e2cbb3265c44 kernel: Add chainstate manager object to C header REVERT: 2818646db5f8 kernel: Add notifications context option to C header REVERT: eb91f6c35dd5 kerenl: Add chain params context option to C header REVERT: a1045172f381 kernel: Add kernel library context object REVERT: 373f260d97ec kernel: Add logging to kernel library C header git-subtree-dir: libbitcoinkernel-sys/bitcoin git-subtree-split: 73acb3ff8a04cddc4904c446c2521dd2b2abc84d
1 parent 4903fc3 commit 29507a3

File tree

5 files changed

+84
-70
lines changed

5 files changed

+84
-70
lines changed

src/kernel/bitcoin-chainstate.cpp

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
#include <filesystem>
55
#include <iostream>
66
#include <optional>
7+
#include <string>
8+
#include <string_view>
79
#include <sstream>
810

911
std::vector<unsigned char> hex_string_to_char_vec(const std::string& hex)
@@ -22,7 +24,7 @@ std::vector<unsigned char> hex_string_to_char_vec(const std::string& hex)
2224
class KernelLog
2325
{
2426
public:
25-
void LogMessage(const char* message)
27+
void LogMessage(std::string_view message)
2628
{
2729
std::cout << "kernel: " << message;
2830
}
@@ -96,12 +98,12 @@ class TestKernelNotifications : public KernelNotifications<TestKernelNotificatio
9698
std::cout << "Block tip changed" << std::endl;
9799
}
98100

99-
void ProgressHandler(const char* title, int progress_percent, bool resume_possible) override
101+
void ProgressHandler(std::string_view title, int progress_percent, bool resume_possible) override
100102
{
101103
std::cout << "Made progress: " << title << " " << progress_percent << "%" << std::endl;
102104
}
103105

104-
void WarningSetHandler(kernel_Warning warning, const char* message) override
106+
void WarningSetHandler(kernel_Warning warning, std::string_view message) override
105107
{
106108
std::cout << message << std::endl;
107109
}
@@ -111,12 +113,12 @@ class TestKernelNotifications : public KernelNotifications<TestKernelNotificatio
111113
std::cout << "Warning unset: " << warning << std::endl;
112114
}
113115

114-
void FlushErrorHandler(const char* error) override
116+
void FlushErrorHandler(std::string_view error) override
115117
{
116118
std::cout << error << std::endl;
117119
}
118120

119-
void FatalErrorHandler(const char* error) override
121+
void FatalErrorHandler(std::string_view error) override
120122
{
121123
std::cout << error << std::endl;
122124
}

src/kernel/bitcoinkernel.cpp

Lines changed: 38 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -174,21 +174,25 @@ class KernelNotifications : public kernel::Notifications
174174
{
175175
if (m_cbs.header_tip) m_cbs.header_tip((void*) m_cbs.user_data, cast_state(state), height, timestamp, presync);
176176
}
177+
void progress(const bilingual_str& title, int progress_percent, bool resume_possible) override
178+
{
179+
if (m_cbs.progress) m_cbs.progress((void*) m_cbs.user_data, title.original.c_str(), title.original.length(), progress_percent, resume_possible);
180+
}
177181
void warningSet(kernel::Warning id, const bilingual_str& message) override
178182
{
179-
if (m_cbs.warning_set) m_cbs.warning_set((void*) m_cbs.user_data, cast_kernel_warning(id), message.original.c_str());
183+
if (m_cbs.warning_set) m_cbs.warning_set((void*) m_cbs.user_data, cast_kernel_warning(id), message.original.c_str(), message.original.length());
180184
}
181185
void warningUnset(kernel::Warning id) override
182186
{
183187
if (m_cbs.warning_unset) m_cbs.warning_unset((void*) m_cbs.user_data, cast_kernel_warning(id));
184188
}
185189
void flushError(const bilingual_str& message) override
186190
{
187-
if (m_cbs.flush_error) m_cbs.flush_error((void*) m_cbs.user_data, message.original.c_str());
191+
if (m_cbs.flush_error) m_cbs.flush_error((void*) m_cbs.user_data, message.original.c_str(), message.original.length());
188192
}
189193
void fatalError(const bilingual_str& message) override
190194
{
191-
if (m_cbs.fatal_error) m_cbs.fatal_error((void*) m_cbs.user_data, message.original.c_str());
195+
if (m_cbs.fatal_error) m_cbs.fatal_error((void*) m_cbs.user_data, message.original.c_str(), message.original.length());
192196
}
193197
};
194198

@@ -533,22 +537,22 @@ kernel_LoggingConnection* kernel_logging_connection_create(kernel_LogCallback ca
533537
LogInstance().m_log_sourcelocations = options.log_sourcelocations;
534538
LogInstance().m_always_print_category_level = options.always_print_category_levels;
535539

536-
auto connection{LogInstance().PushBackCallback([callback, user_data](const std::string& str) { callback((void*) user_data, str.c_str()); })};
540+
auto connection{LogInstance().PushBackCallback([callback, user_data](const std::string& str) { callback((void*) user_data, str.c_str(), str.length()); })};
537541

538542
try {
539543
// Only start logging if we just added the connection.
540544
if (LogInstance().NumConnections() == 1 && !LogInstance().StartLogging()) {
541-
LogError("Logger start failed.\n");
545+
LogError("Logger start failed.");
542546
LogInstance().DeleteCallback(connection);
543547
return nullptr;
544548
}
545549
} catch (std::exception& e) {
546-
LogError("Logger start failed.\n");
550+
LogError("Logger start failed.");
547551
LogInstance().DeleteCallback(connection);
548552
return nullptr;
549553
}
550554

551-
LogDebug(BCLog::KERNEL, "Logger connected.\n");
555+
LogDebug(BCLog::KERNEL, "Logger connected.");
552556

553557
auto heap_connection{new std::list<std::function<void(const std::string&)>>::iterator(connection)};
554558
return reinterpret_cast<kernel_LoggingConnection*>(heap_connection);
@@ -561,7 +565,7 @@ void kernel_logging_connection_destroy(kernel_LoggingConnection* connection_)
561565
return;
562566
}
563567

564-
LogDebug(BCLog::KERNEL, "Logger disconnected.\n");
568+
LogDebug(BCLog::KERNEL, "Logger disconnected.");
565569
LogInstance().DeleteCallback(*connection);
566570
delete connection;
567571

@@ -641,7 +645,7 @@ kernel_Context* kernel_context_create(const kernel_ContextOptions* options_)
641645
bool sane{true};
642646
auto context{new Context{options, sane}};
643647
if (!sane) {
644-
LogError("Kernel context sanity check failed.\n");
648+
LogError("Kernel context sanity check failed.");
645649
delete context;
646650
return nullptr;
647651
}
@@ -697,10 +701,10 @@ kernel_BlockValidationResult kernel_get_block_validation_result_from_block_valid
697701
assert(false);
698702
}
699703

700-
kernel_ChainstateManagerOptions* kernel_chainstate_manager_options_create(const kernel_Context* context_, const char* data_dir)
704+
kernel_ChainstateManagerOptions* kernel_chainstate_manager_options_create(const kernel_Context* context_, const char* data_dir, size_t data_dir_len)
701705
{
702706
try {
703-
fs::path abs_data_dir{fs::absolute(fs::PathFromString(data_dir))};
707+
fs::path abs_data_dir{fs::absolute(fs::PathFromString({data_dir, data_dir_len}))};
704708
fs::create_directories(abs_data_dir);
705709
auto context{cast_const_context(context_)};
706710
return reinterpret_cast<kernel_ChainstateManagerOptions*>(new ChainstateManager::Options{
@@ -709,7 +713,7 @@ kernel_ChainstateManagerOptions* kernel_chainstate_manager_options_create(const
709713
.notifications = *context->m_notifications,
710714
.signals = context->m_signals.get()});
711715
} catch (const std::exception& e) {
712-
LogError("Failed to create chainstate manager options: %s\n", e.what());
716+
LogError("Failed to create chainstate manager options: %s", e.what());
713717
return nullptr;
714718
}
715719
}
@@ -727,10 +731,10 @@ void kernel_chainstate_manager_options_destroy(kernel_ChainstateManagerOptions*
727731
}
728732
}
729733

730-
kernel_BlockManagerOptions* kernel_block_manager_options_create(const kernel_Context* context_, const char* blocks_dir)
734+
kernel_BlockManagerOptions* kernel_block_manager_options_create(const kernel_Context* context_, const char* blocks_dir, size_t blocks_dir_len)
731735
{
732736
try {
733-
fs::path abs_blocks_dir{fs::absolute(fs::PathFromString(blocks_dir))};
737+
fs::path abs_blocks_dir{fs::absolute(fs::PathFromString({blocks_dir, blocks_dir_len}))};
734738
fs::create_directories(abs_blocks_dir);
735739
auto context{cast_const_context(context_)};
736740
if (!context) {
@@ -741,7 +745,7 @@ kernel_BlockManagerOptions* kernel_block_manager_options_create(const kernel_Con
741745
.blocks_dir = abs_blocks_dir,
742746
.notifications = *context->m_notifications});
743747
} catch (const std::exception& e) {
744-
LogError("Failed to create block manager options; %s\n", e.what());
748+
LogError("Failed to create block manager options; %s", e.what());
745749
return nullptr;
746750
}
747751
}
@@ -765,7 +769,7 @@ kernel_ChainstateManager* kernel_chainstate_manager_create(
765769
try {
766770
return reinterpret_cast<kernel_ChainstateManager*>(new ChainstateManager{*context->m_interrupt, *chainman_opts, *blockman_opts});
767771
} catch (const std::exception& e) {
768-
LogError("Failed to create chainstate manager: %s\n", e.what());
772+
LogError("Failed to create chainstate manager: %s", e.what());
769773
return nullptr;
770774
}
771775
}
@@ -824,7 +828,7 @@ bool kernel_chainstate_manager_load_chainstate(const kernel_Context* context_,
824828
auto& chainman{*cast_chainstate_manager(chainman_)};
825829

826830
if (chainstate_load_opts.wipe_block_tree_db && !chainstate_load_opts.wipe_chainstate_db) {
827-
LogError("Wiping the block tree db without also wiping the chainstate db is currently unsupported.\n");
831+
LogWarning("Wiping the block tree db without also wiping the chainstate db is currently unsupported.");
828832
return false;
829833
}
830834

@@ -834,24 +838,24 @@ bool kernel_chainstate_manager_load_chainstate(const kernel_Context* context_,
834838
cache_sizes.coins = (450 << 20) - (2 << 20) - (2 << 22);
835839
auto [status, chainstate_err]{node::LoadChainstate(chainman, cache_sizes, chainstate_load_opts)};
836840
if (status != node::ChainstateLoadStatus::SUCCESS) {
837-
LogError("Failed to load chain state from your data directory: %s\n", chainstate_err.original);
841+
LogError("Failed to load chain state from your data directory: %s", chainstate_err.original);
838842
return false;
839843
}
840844
std::tie(status, chainstate_err) = node::VerifyLoadedChainstate(chainman, chainstate_load_opts);
841845
if (status != node::ChainstateLoadStatus::SUCCESS) {
842-
LogError("Failed to verify loaded chain state from your datadir: %s\n", chainstate_err.original);
846+
LogError("Failed to verify loaded chain state from your datadir: %s", chainstate_err.original);
843847
return false;
844848
}
845849

846850
for (Chainstate* chainstate : WITH_LOCK(::cs_main, return chainman.GetAll())) {
847851
BlockValidationState state;
848852
if (!chainstate->ActivateBestChain(state, nullptr)) {
849-
LogError("Failed to connect best block: %s\n", state.ToString());
853+
LogError("Failed to connect best block: %s", state.ToString());
850854
return false;
851855
}
852856
}
853857
} catch (const std::exception& e) {
854-
LogError("Failed to load chainstate: %s\n", e.what());
858+
LogError("Failed to load chainstate: %s", e.what());
855859
return false;
856860
}
857861
return true;
@@ -880,6 +884,7 @@ void kernel_chainstate_manager_destroy(kernel_ChainstateManager* chainman_, cons
880884
bool kernel_import_blocks(const kernel_Context* context_,
881885
kernel_ChainstateManager* chainman_,
882886
const char** block_file_paths,
887+
size_t* block_file_paths_lens,
883888
size_t block_file_paths_len)
884889
{
885890
try {
@@ -888,13 +893,13 @@ bool kernel_import_blocks(const kernel_Context* context_,
888893
import_files.reserve(block_file_paths_len);
889894
for (uint32_t i = 0; i < block_file_paths_len; i++) {
890895
if (block_file_paths[i] != nullptr) {
891-
import_files.emplace_back(block_file_paths[i]);
896+
import_files.emplace_back(std::string{block_file_paths[i], block_file_paths_lens[i]}.c_str());
892897
}
893898
}
894899
node::ImportBlocks(*chainman, import_files);
895900
chainman->ActiveChainstate().ForceFlushStateToDisk();
896901
} catch (const std::exception& e) {
897-
LogError("Failed to import blocks: %s\n", e.what());
902+
LogError("Failed to import blocks: %s", e.what());
898903
return false;
899904
}
900905
return true;
@@ -910,7 +915,7 @@ kernel_Block* kernel_block_create(const unsigned char* raw_block, size_t raw_blo
910915
stream >> TX_WITH_WITNESS(*block);
911916
} catch (const std::exception& e) {
912917
delete block;
913-
LogDebug(BCLog::KERNEL, "Block decode failed.\n");
918+
LogDebug(BCLog::KERNEL, "Block decode failed.");
914919
return nullptr;
915920
}
916921

@@ -1001,7 +1006,7 @@ kernel_BlockIndex* kernel_get_block_index_from_hash(const kernel_Context* contex
10011006
auto hash = uint256{Span<const unsigned char>{(*block_hash).hash, 32}};
10021007
auto block_index = WITH_LOCK(::cs_main, return chainman->m_blockman.LookupBlockIndex(hash));
10031008
if (!block_index) {
1004-
LogDebug(BCLog::KERNEL, "A block with the given hash is not indexed.\n");
1009+
LogDebug(BCLog::KERNEL, "A block with the given hash is not indexed.");
10051010
return nullptr;
10061011
}
10071012
return reinterpret_cast<kernel_BlockIndex*>(block_index);
@@ -1014,7 +1019,7 @@ kernel_BlockIndex* kernel_get_block_index_from_height(const kernel_Context* cont
10141019
LOCK(cs_main);
10151020

10161021
if (height < 0 || height > chainman->ActiveChain().Height()) {
1017-
LogDebug(BCLog::KERNEL, "Block height is out of range.\n");
1022+
LogDebug(BCLog::KERNEL, "Block height is out of range.");
10181023
return nullptr;
10191024
}
10201025
return reinterpret_cast<kernel_BlockIndex*>(chainman->ActiveChain()[height]);
@@ -1028,7 +1033,7 @@ kernel_BlockIndex* kernel_get_next_block_index(const kernel_Context* context_, k
10281033
auto next_block_index{WITH_LOCK(::cs_main, return chainman->ActiveChain().Next(block_index))};
10291034

10301035
if (!next_block_index) {
1031-
LogTrace(BCLog::KERNEL, "The block index is the tip of the current chain, it does not have a next.\n");
1036+
LogTrace(BCLog::KERNEL, "The block index is the tip of the current chain, it does not have a next.");
10321037
}
10331038

10341039
return reinterpret_cast<kernel_BlockIndex*>(next_block_index);
@@ -1039,7 +1044,7 @@ kernel_BlockIndex* kernel_get_previous_block_index(const kernel_BlockIndex* bloc
10391044
const CBlockIndex* block_index{cast_const_block_index(block_index_)};
10401045

10411046
if (!block_index->pprev) {
1042-
LogTrace(BCLog::KERNEL, "The block index is the genesis, it has no previous.\n");
1047+
LogTrace(BCLog::KERNEL, "The block index is the genesis, it has no previous.");
10431048
return nullptr;
10441049
}
10451050

@@ -1055,7 +1060,7 @@ kernel_Block* kernel_read_block_from_disk(const kernel_Context* context_,
10551060

10561061
auto block{new std::shared_ptr<CBlock>(new CBlock{})};
10571062
if (!chainman->m_blockman.ReadBlockFromDisk(**block, *block_index)) {
1058-
LogError("Failed to read block from disk.\n");
1063+
LogError("Failed to read block from disk.");
10591064
return nullptr;
10601065
}
10611066
return reinterpret_cast<kernel_Block*>(block);
@@ -1069,12 +1074,12 @@ kernel_BlockUndo* kernel_read_block_undo_from_disk(const kernel_Context* context
10691074
const auto block_index{cast_const_block_index(block_index_)};
10701075

10711076
if (block_index->nHeight < 1) {
1072-
LogError("The genesis block does not have undo data.\n");
1077+
LogDebug(BCLog::KERNEL, "The genesis block does not have undo data.");
10731078
return nullptr;
10741079
}
10751080
auto block_undo{new CBlockUndo{}};
10761081
if (!chainman->m_blockman.UndoReadFromDisk(*block_undo, *block_index)) {
1077-
LogError("Failed to read undo data from disk.\n");
1082+
LogError("Failed to read undo data from disk.");
10781083
return nullptr;
10791084
}
10801085
return reinterpret_cast<kernel_BlockUndo*>(block_undo);
@@ -1112,14 +1117,14 @@ kernel_TransactionOutput* kernel_get_undo_output_by_index(const kernel_BlockUndo
11121117
const auto block_undo{cast_const_block_undo(block_undo_)};
11131118

11141119
if (transaction_undo_index >= block_undo->vtxundo.size()) {
1115-
LogInfo("transaction undo index is out of bounds.\n");
1120+
LogInfo("transaction undo index is out of bounds.");
11161121
return nullptr;
11171122
}
11181123

11191124
const auto& tx_undo = block_undo->vtxundo[transaction_undo_index];
11201125

11211126
if (output_index >= tx_undo.vprevout.size()) {
1122-
LogInfo("previous output index is out of bounds.\n");
1127+
LogInfo("previous output index is out of bounds.");
11231128
return nullptr;
11241129
}
11251130

src/kernel/bitcoinkernel.h

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -261,18 +261,18 @@ typedef enum {
261261
* Function signature for the global logging callback. All bitcoin kernel
262262
* internal logs will pass through this callback.
263263
*/
264-
typedef void (*kernel_LogCallback)(void* user_data, const char* message);
264+
typedef void (*kernel_LogCallback)(void* user_data, const char* message, size_t message_len);
265265

266266
/**
267267
* Function signatures for the kernel notifications.
268268
*/
269269
typedef void (*kernel_NotifyBlockTip)(void* user_data, kernel_SynchronizationState state, const kernel_BlockIndex* index);
270270
typedef void (*kernel_NotifyHeaderTip)(void* user_data, kernel_SynchronizationState state, int64_t height, int64_t timestamp, bool presync);
271-
typedef void (*kernel_NotifyProgress)(void* user_data, const char* title, int progress_percent, bool resume_possible);
272-
typedef void (*kernel_NotifyWarningSet)(void* user_data, kernel_Warning warning, const char* message);
271+
typedef void (*kernel_NotifyProgress)(void* user_data, const char* title, size_t title_len, int progress_percent, bool resume_possible);
272+
typedef void (*kernel_NotifyWarningSet)(void* user_data, kernel_Warning warning, const char* message, size_t message_len);
273273
typedef void (*kernel_NotifyWarningUnset)(void* user_data, kernel_Warning warning);
274-
typedef void (*kernel_NotifyFlushError)(void* user_data, const char* message);
275-
typedef void (*kernel_NotifyFatalError)(void* user_data, const char* message);
274+
typedef void (*kernel_NotifyFlushError)(void* user_data, const char* message, size_t message_len);
275+
typedef void (*kernel_NotifyFatalError)(void* user_data, const char* message, size_t message_len);
276276

277277
/**
278278
* Function signatures for the validation interface.
@@ -678,13 +678,14 @@ void kernel_context_destroy(kernel_Context* context);
678678
* @param[in] context Non-null, the created options will associate with this kernel context
679679
* for the duration of their lifetime. The same context needs to be used
680680
* when instantiating the chainstate manager.
681-
* @param[in] data_directory Non-null, directory containing the chainstate data. If the directory
682-
* does not exist yet, it will be created.
681+
* @param[in] data_directory Non-null, path string of the directory containing the chainstate data.
682+
* If the directory does not exist yet, it will be created.
683683
* @return The allocated chainstate manager options, or null on error.
684684
*/
685685
kernel_ChainstateManagerOptions* BITCOINKERNEL_WARN_UNUSED_RESULT kernel_chainstate_manager_options_create(
686686
const kernel_Context* context,
687-
const char* data_directory
687+
const char* data_directory,
688+
size_t data_directory_len
688689
) BITCOINKERNEL_ARG_NONNULL(1, 2);
689690

690691
/**
@@ -699,13 +700,14 @@ void kernel_chainstate_manager_options_destroy(kernel_ChainstateManagerOptions*
699700
* @param[in] context Non-null, the created options will associate with this kernel context
700701
* for the duration of their lifetime. The same context needs to be used
701702
* when instantiating the chainstate manager.
702-
* @param[in] blocks_directory Non-null, directory containing the block data. If the directory does
703-
* not exist yet, it will be created.
703+
* @param[in] blocks_directory Non-null, path string of the directory containing the block data. If
704+
* the directory does not exist yet, it will be created.
704705
* @return The allocated block manager options, or null on error.
705706
*/
706707
kernel_BlockManagerOptions* BITCOINKERNEL_WARN_UNUSED_RESULT kernel_block_manager_options_create(
707708
const kernel_Context* context,
708-
const char* blocks_directory
709+
const char* blocks_directory,
710+
size_t blocks_directory_len
709711
) BITCOINKERNEL_ARG_NONNULL(1, 2);
710712

711713
/**
@@ -832,7 +834,7 @@ bool BITCOINKERNEL_WARN_UNUSED_RESULT kernel_chainstate_manager_load_chainstate(
832834
*/
833835
bool kernel_import_blocks(const kernel_Context* context,
834836
kernel_ChainstateManager* chainstate_manager,
835-
const char** block_file_paths, size_t block_file_paths_len
837+
const char** block_file_paths, size_t* block_file_paths_lens, size_t block_file_paths_len
836838
) BITCOINKERNEL_ARG_NONNULL(1, 2);
837839

838840
/**

0 commit comments

Comments
 (0)