Skip to main content

libbitcoinkernel_sys/
lib.rs

1//! Raw FFI bindings to libbitcoinkernel.
2//!
3//! For documentation on the underlying API, refer to the upstream C header:
4//! <https://github.com/bitcoin/bitcoin/blob/master/src/kernel/bitcoinkernel.h>
5
6#![no_std]
7#![allow(non_camel_case_types, non_upper_case_globals)]
8
9use core::ffi::{c_char, c_int, c_uchar, c_uint, c_void};
10
11// Primitive type aliases - alphabetical order
12
13pub type btck_BlockCheckFlags = u32;
14pub type btck_BlockValidationResult = u32;
15pub type btck_ChainType = u8;
16pub type btck_LogCategory = u8;
17pub type btck_LogLevel = u8;
18pub type btck_ScriptVerificationFlags = u32;
19pub type btck_ScriptVerifyStatus = u8;
20pub type btck_SynchronizationState = u8;
21pub type btck_ValidationMode = u8;
22pub type btck_Warning = u8;
23
24// btck_BlockValidationResult
25
26pub const btck_BlockValidationResult_UNSET: btck_BlockValidationResult = 0;
27pub const btck_BlockValidationResult_CONSENSUS: btck_BlockValidationResult = 1;
28pub const btck_BlockValidationResult_CACHED_INVALID: btck_BlockValidationResult = 2;
29pub const btck_BlockValidationResult_INVALID_HEADER: btck_BlockValidationResult = 3;
30pub const btck_BlockValidationResult_MUTATED: btck_BlockValidationResult = 4;
31pub const btck_BlockValidationResult_MISSING_PREV: btck_BlockValidationResult = 5;
32pub const btck_BlockValidationResult_INVALID_PREV: btck_BlockValidationResult = 6;
33pub const btck_BlockValidationResult_TIME_FUTURE: btck_BlockValidationResult = 7;
34pub const btck_BlockValidationResult_HEADER_LOW_WORK: btck_BlockValidationResult = 8;
35
36// btck_ChainType
37
38pub const btck_ChainType_MAINNET: btck_ChainType = 0;
39pub const btck_ChainType_TESTNET: btck_ChainType = 1;
40pub const btck_ChainType_TESTNET_4: btck_ChainType = 2;
41pub const btck_ChainType_SIGNET: btck_ChainType = 3;
42pub const btck_ChainType_REGTEST: btck_ChainType = 4;
43
44// btck_LogCategory
45
46pub const btck_LogCategory_ALL: btck_LogCategory = 0;
47pub const btck_LogCategory_BENCH: btck_LogCategory = 1;
48pub const btck_LogCategory_BLOCKSTORAGE: btck_LogCategory = 2;
49pub const btck_LogCategory_COINDB: btck_LogCategory = 3;
50pub const btck_LogCategory_LEVELDB: btck_LogCategory = 4;
51pub const btck_LogCategory_MEMPOOL: btck_LogCategory = 5;
52pub const btck_LogCategory_PRUNE: btck_LogCategory = 6;
53pub const btck_LogCategory_RAND: btck_LogCategory = 7;
54pub const btck_LogCategory_REINDEX: btck_LogCategory = 8;
55pub const btck_LogCategory_VALIDATION: btck_LogCategory = 9;
56pub const btck_LogCategory_KERNEL: btck_LogCategory = 10;
57
58// btck_LogLevel
59
60pub const btck_LogLevel_TRACE: btck_LogLevel = 0;
61pub const btck_LogLevel_DEBUG: btck_LogLevel = 1;
62pub const btck_LogLevel_INFO: btck_LogLevel = 2;
63
64// btck_ScriptVerificationFlags
65
66pub const btck_ScriptVerificationFlags_NONE: btck_ScriptVerificationFlags = 0;
67pub const btck_ScriptVerificationFlags_P2SH: btck_ScriptVerificationFlags = 1 << 0;
68pub const btck_ScriptVerificationFlags_DERSIG: btck_ScriptVerificationFlags = 1 << 2;
69pub const btck_ScriptVerificationFlags_NULLDUMMY: btck_ScriptVerificationFlags = 1 << 4;
70pub const btck_ScriptVerificationFlags_CHECKLOCKTIMEVERIFY: btck_ScriptVerificationFlags = 1 << 9;
71pub const btck_ScriptVerificationFlags_CHECKSEQUENCEVERIFY: btck_ScriptVerificationFlags = 1 << 10;
72pub const btck_ScriptVerificationFlags_WITNESS: btck_ScriptVerificationFlags = 1 << 11;
73pub const btck_ScriptVerificationFlags_TAPROOT: btck_ScriptVerificationFlags = 1 << 17;
74pub const btck_ScriptVerificationFlags_ALL: btck_ScriptVerificationFlags =
75    btck_ScriptVerificationFlags_P2SH
76        | btck_ScriptVerificationFlags_DERSIG
77        | btck_ScriptVerificationFlags_NULLDUMMY
78        | btck_ScriptVerificationFlags_CHECKLOCKTIMEVERIFY
79        | btck_ScriptVerificationFlags_CHECKSEQUENCEVERIFY
80        | btck_ScriptVerificationFlags_WITNESS
81        | btck_ScriptVerificationFlags_TAPROOT;
82
83// btck_ScriptVerifyStatus
84
85pub const btck_ScriptVerifyStatus_OK: btck_ScriptVerifyStatus = 0;
86pub const btck_ScriptVerifyStatus_ERROR_INVALID_FLAGS_COMBINATION: btck_ScriptVerifyStatus = 1;
87pub const btck_ScriptVerifyStatus_ERROR_SPENT_OUTPUTS_REQUIRED: btck_ScriptVerifyStatus = 2;
88
89// btck_SynchronizationState
90
91pub const btck_SynchronizationState_INIT_REINDEX: btck_SynchronizationState = 0;
92pub const btck_SynchronizationState_INIT_DOWNLOAD: btck_SynchronizationState = 1;
93pub const btck_SynchronizationState_POST_INIT: btck_SynchronizationState = 2;
94
95// btck_ValidationMode
96
97pub const btck_ValidationMode_VALID: btck_ValidationMode = 0;
98pub const btck_ValidationMode_INVALID: btck_ValidationMode = 1;
99pub const btck_ValidationMode_INTERNAL_ERROR: btck_ValidationMode = 2;
100
101// btck_Warning
102
103pub const btck_Warning_UNKNOWN_NEW_RULES_ACTIVATED: btck_Warning = 0;
104pub const btck_Warning_LARGE_WORK_INVALID_CHAIN: btck_Warning = 1;
105
106// Opaque types - alphabetical order
107
108#[repr(C)]
109pub struct btck_Block {
110    _unused: [u8; 0],
111}
112#[repr(C)]
113pub struct btck_BlockHash {
114    _unused: [u8; 0],
115}
116#[repr(C)]
117pub struct btck_BlockHeader {
118    _unused: [u8; 0],
119}
120#[repr(C)]
121pub struct btck_BlockSpentOutputs {
122    _unused: [u8; 0],
123}
124#[repr(C)]
125pub struct btck_BlockTreeEntry {
126    _unused: [u8; 0],
127}
128#[repr(C)]
129pub struct btck_BlockValidationState {
130    _unused: [u8; 0],
131}
132#[repr(C)]
133pub struct btck_Chain {
134    _unused: [u8; 0],
135}
136#[repr(C)]
137pub struct btck_ChainParameters {
138    _unused: [u8; 0],
139}
140#[repr(C)]
141pub struct btck_ChainstateManager {
142    _unused: [u8; 0],
143}
144#[repr(C)]
145pub struct btck_ChainstateManagerOptions {
146    _unused: [u8; 0],
147}
148#[repr(C)]
149pub struct btck_Coin {
150    _unused: [u8; 0],
151}
152#[repr(C)]
153pub struct btck_ConsensusParams {
154    _unused: [u8; 0],
155}
156#[repr(C)]
157pub struct btck_Context {
158    _unused: [u8; 0],
159}
160#[repr(C)]
161pub struct btck_ContextOptions {
162    _unused: [u8; 0],
163}
164#[repr(C)]
165pub struct btck_LoggingConnection {
166    _unused: [u8; 0],
167}
168#[repr(C)]
169pub struct btck_PrecomputedTransactionData {
170    _unused: [u8; 0],
171}
172#[repr(C)]
173pub struct btck_ScriptPubkey {
174    _unused: [u8; 0],
175}
176#[repr(C)]
177pub struct btck_Transaction {
178    _unused: [u8; 0],
179}
180#[repr(C)]
181pub struct btck_TransactionInput {
182    _unused: [u8; 0],
183}
184#[repr(C)]
185pub struct btck_TransactionOutPoint {
186    _unused: [u8; 0],
187}
188#[repr(C)]
189pub struct btck_TransactionOutput {
190    _unused: [u8; 0],
191}
192#[repr(C)]
193pub struct btck_TransactionSpentOutputs {
194    _unused: [u8; 0],
195}
196#[repr(C)]
197pub struct btck_Txid {
198    _unused: [u8; 0],
199}
200
201// Function-pointer type aliases - alphabetical order
202
203pub type btck_DestroyCallback = Option<unsafe extern "C" fn(user_data: *mut c_void)>;
204
205pub type btck_LogCallback = Option<
206    unsafe extern "C" fn(user_data: *mut c_void, message: *const c_char, message_len: usize),
207>;
208
209pub type btck_NotifyBlockTip = Option<
210    unsafe extern "C" fn(
211        user_data: *mut c_void,
212        state: btck_SynchronizationState,
213        entry: *const btck_BlockTreeEntry,
214        verification_progress: f64,
215    ),
216>;
217
218pub type btck_NotifyFatalError = Option<
219    unsafe extern "C" fn(user_data: *mut c_void, message: *const c_char, message_len: usize),
220>;
221
222pub type btck_NotifyFlushError = Option<
223    unsafe extern "C" fn(user_data: *mut c_void, message: *const c_char, message_len: usize),
224>;
225
226pub type btck_NotifyHeaderTip = Option<
227    unsafe extern "C" fn(
228        user_data: *mut c_void,
229        state: btck_SynchronizationState,
230        height: i64,
231        timestamp: i64,
232        presync: c_int,
233    ),
234>;
235
236pub type btck_NotifyProgress = Option<
237    unsafe extern "C" fn(
238        user_data: *mut c_void,
239        title: *const c_char,
240        title_len: usize,
241        progress_percent: c_int,
242        resume_possible: c_int,
243    ),
244>;
245
246pub type btck_NotifyWarningSet = Option<
247    unsafe extern "C" fn(
248        user_data: *mut c_void,
249        warning: btck_Warning,
250        message: *const c_char,
251        message_len: usize,
252    ),
253>;
254
255pub type btck_NotifyWarningUnset =
256    Option<unsafe extern "C" fn(user_data: *mut c_void, warning: btck_Warning)>;
257
258pub type btck_ValidationInterfaceBlockChecked = Option<
259    unsafe extern "C" fn(
260        user_data: *mut c_void,
261        block: *mut btck_Block,
262        state: *const btck_BlockValidationState,
263    ),
264>;
265
266pub type btck_ValidationInterfaceBlockConnected = Option<
267    unsafe extern "C" fn(
268        user_data: *mut c_void,
269        block: *mut btck_Block,
270        entry: *const btck_BlockTreeEntry,
271    ),
272>;
273
274pub type btck_ValidationInterfaceBlockDisconnected = Option<
275    unsafe extern "C" fn(
276        user_data: *mut c_void,
277        block: *mut btck_Block,
278        entry: *const btck_BlockTreeEntry,
279    ),
280>;
281
282pub type btck_ValidationInterfacePoWValidBlock = Option<
283    unsafe extern "C" fn(
284        user_data: *mut c_void,
285        block: *mut btck_Block,
286        entry: *const btck_BlockTreeEntry,
287    ),
288>;
289
290pub type btck_WriteBytes =
291    Option<unsafe extern "C" fn(bytes: *const c_void, size: usize, userdata: *mut c_void) -> c_int>;
292
293// These structs are passed by value across the FFI boundary - alphabetical order
294// Field order must match C exactly - sizes verified by const assertions below
295
296#[repr(C)]
297pub struct btck_LoggingOptions {
298    pub log_timestamps: c_int,
299    pub log_time_micros: c_int,
300    pub log_threadnames: c_int,
301    pub log_sourcelocations: c_int,
302    pub always_print_category_levels: c_int,
303}
304
305#[repr(C)]
306pub struct btck_NotificationInterfaceCallbacks {
307    pub user_data: *mut c_void,
308    pub user_data_destroy: btck_DestroyCallback,
309    pub block_tip: btck_NotifyBlockTip,
310    pub header_tip: btck_NotifyHeaderTip,
311    pub progress: btck_NotifyProgress,
312    pub warning_set: btck_NotifyWarningSet,
313    pub warning_unset: btck_NotifyWarningUnset,
314    pub flush_error: btck_NotifyFlushError,
315    pub fatal_error: btck_NotifyFatalError,
316}
317
318#[repr(C)]
319pub struct btck_ValidationInterfaceCallbacks {
320    pub user_data: *mut c_void,
321    pub user_data_destroy: btck_DestroyCallback,
322    pub block_checked: btck_ValidationInterfaceBlockChecked,
323    pub pow_valid_block: btck_ValidationInterfacePoWValidBlock,
324    pub block_connected: btck_ValidationInterfaceBlockConnected,
325    pub block_disconnected: btck_ValidationInterfaceBlockDisconnected,
326}
327
328// Layout guards for structs passed by value across the FFI boundary.
329// Pointer-sized fields use size_of::<*const ()>() to remain correct on both
330// 32-bit and 64-bit targets.
331const _: () = {
332    assert!(core::mem::size_of::<btck_LoggingOptions>() == 20);
333    assert!(core::mem::align_of::<btck_LoggingOptions>() == 4);
334    assert!(
335        core::mem::size_of::<btck_NotificationInterfaceCallbacks>()
336            == 9 * core::mem::size_of::<*const ()>()
337    );
338    assert!(
339        core::mem::align_of::<btck_NotificationInterfaceCallbacks>()
340            == core::mem::align_of::<*const ()>()
341    );
342    assert!(
343        core::mem::size_of::<btck_ValidationInterfaceCallbacks>()
344            == 6 * core::mem::size_of::<*const ()>()
345    );
346    assert!(
347        core::mem::align_of::<btck_ValidationInterfaceCallbacks>()
348            == core::mem::align_of::<*const ()>()
349    );
350};
351
352// extern "C" declarations - grouped by type
353
354extern "C" {
355
356    // --- Transaction --------------------------------------------------------
357
358    pub fn btck_transaction_create(
359        raw_transaction: *const c_void,
360        raw_transaction_len: usize,
361    ) -> *mut btck_Transaction;
362
363    pub fn btck_transaction_copy(transaction: *const btck_Transaction) -> *mut btck_Transaction;
364
365    pub fn btck_transaction_to_bytes(
366        transaction: *const btck_Transaction,
367        writer: btck_WriteBytes,
368        user_data: *mut c_void,
369    ) -> c_int;
370
371    pub fn btck_transaction_count_outputs(transaction: *const btck_Transaction) -> usize;
372
373    pub fn btck_transaction_get_output_at(
374        transaction: *const btck_Transaction,
375        output_index: usize,
376    ) -> *const btck_TransactionOutput;
377
378    pub fn btck_transaction_get_input_at(
379        transaction: *const btck_Transaction,
380        input_index: usize,
381    ) -> *const btck_TransactionInput;
382
383    pub fn btck_transaction_count_inputs(transaction: *const btck_Transaction) -> usize;
384
385    pub fn btck_transaction_get_locktime(transaction: *const btck_Transaction) -> u32;
386
387    pub fn btck_transaction_get_txid(transaction: *const btck_Transaction) -> *const btck_Txid;
388
389    pub fn btck_transaction_destroy(transaction: *mut btck_Transaction);
390
391    // --- PrecomputedTransactionData -----------------------------------------
392
393    pub fn btck_precomputed_transaction_data_create(
394        tx_to: *const btck_Transaction,
395        spent_outputs: *mut *const btck_TransactionOutput,
396        spent_outputs_len: usize,
397    ) -> *mut btck_PrecomputedTransactionData;
398
399    pub fn btck_precomputed_transaction_data_copy(
400        precomputed_txdata: *const btck_PrecomputedTransactionData,
401    ) -> *mut btck_PrecomputedTransactionData;
402
403    pub fn btck_precomputed_transaction_data_destroy(
404        precomputed_txdata: *mut btck_PrecomputedTransactionData,
405    );
406
407    // --- ScriptPubkey -------------------------------------------------------
408
409    pub fn btck_script_pubkey_create(
410        script_pubkey: *const c_void,
411        script_pubkey_len: usize,
412    ) -> *mut btck_ScriptPubkey;
413
414    pub fn btck_script_pubkey_copy(
415        script_pubkey: *const btck_ScriptPubkey,
416    ) -> *mut btck_ScriptPubkey;
417
418    pub fn btck_script_pubkey_verify(
419        script_pubkey: *const btck_ScriptPubkey,
420        amount: i64,
421        tx_to: *const btck_Transaction,
422        precomputed_txdata: *const btck_PrecomputedTransactionData,
423        input_index: c_uint,
424        flags: btck_ScriptVerificationFlags,
425        status: *mut btck_ScriptVerifyStatus,
426    ) -> c_int;
427
428    pub fn btck_script_pubkey_to_bytes(
429        script_pubkey: *const btck_ScriptPubkey,
430        writer: btck_WriteBytes,
431        user_data: *mut c_void,
432    ) -> c_int;
433
434    pub fn btck_script_pubkey_destroy(script_pubkey: *mut btck_ScriptPubkey);
435
436    // --- TransactionOutput --------------------------------------------------
437
438    pub fn btck_transaction_output_create(
439        script_pubkey: *const btck_ScriptPubkey,
440        amount: i64,
441    ) -> *mut btck_TransactionOutput;
442
443    pub fn btck_transaction_output_get_script_pubkey(
444        transaction_output: *const btck_TransactionOutput,
445    ) -> *const btck_ScriptPubkey;
446
447    pub fn btck_transaction_output_get_amount(
448        transaction_output: *const btck_TransactionOutput,
449    ) -> i64;
450
451    pub fn btck_transaction_output_copy(
452        transaction_output: *const btck_TransactionOutput,
453    ) -> *mut btck_TransactionOutput;
454
455    pub fn btck_transaction_output_destroy(transaction_output: *mut btck_TransactionOutput);
456
457    // --- Logging ------------------------------------------------------------
458
459    pub fn btck_logging_disable();
460
461    pub fn btck_logging_set_options(options: btck_LoggingOptions);
462
463    pub fn btck_logging_set_level_category(category: btck_LogCategory, level: btck_LogLevel);
464
465    pub fn btck_logging_enable_category(category: btck_LogCategory);
466
467    pub fn btck_logging_disable_category(category: btck_LogCategory);
468
469    pub fn btck_logging_connection_create(
470        log_callback: btck_LogCallback,
471        user_data: *mut c_void,
472        user_data_destroy_callback: btck_DestroyCallback,
473    ) -> *mut btck_LoggingConnection;
474
475    pub fn btck_logging_connection_destroy(logging_connection: *mut btck_LoggingConnection);
476
477    // --- ChainParameters ----------------------------------------------------
478
479    pub fn btck_chain_parameters_create(chain_type: btck_ChainType) -> *mut btck_ChainParameters;
480
481    pub fn btck_chain_parameters_copy(
482        chain_parameters: *const btck_ChainParameters,
483    ) -> *mut btck_ChainParameters;
484
485    pub fn btck_chain_parameters_get_consensus_params(
486        chain_parameters: *const btck_ChainParameters,
487    ) -> *const btck_ConsensusParams;
488
489    pub fn btck_chain_parameters_destroy(chain_parameters: *mut btck_ChainParameters);
490
491    // --- ContextOptions -----------------------------------------------------
492
493    pub fn btck_context_options_create() -> *mut btck_ContextOptions;
494
495    pub fn btck_context_options_set_chainparams(
496        context_options: *mut btck_ContextOptions,
497        chain_parameters: *const btck_ChainParameters,
498    );
499
500    pub fn btck_context_options_set_notifications(
501        context_options: *mut btck_ContextOptions,
502        notifications: btck_NotificationInterfaceCallbacks,
503    );
504
505    pub fn btck_context_options_set_validation_interface(
506        context_options: *mut btck_ContextOptions,
507        validation_interface_callbacks: btck_ValidationInterfaceCallbacks,
508    );
509
510    pub fn btck_context_options_destroy(context_options: *mut btck_ContextOptions);
511
512    // --- Context ------------------------------------------------------------
513
514    pub fn btck_context_create(context_options: *const btck_ContextOptions) -> *mut btck_Context;
515
516    pub fn btck_context_copy(context: *const btck_Context) -> *mut btck_Context;
517
518    pub fn btck_context_interrupt(context: *mut btck_Context) -> c_int;
519
520    pub fn btck_context_destroy(context: *mut btck_Context);
521
522    // --- BlockTreeEntry -----------------------------------------------------
523
524    pub fn btck_block_tree_entry_get_previous(
525        block_tree_entry: *const btck_BlockTreeEntry,
526    ) -> *const btck_BlockTreeEntry;
527
528    pub fn btck_block_tree_entry_get_ancestor(
529        block_tree_entry: *const btck_BlockTreeEntry,
530        height: i32,
531    ) -> *const btck_BlockTreeEntry;
532
533    pub fn btck_block_tree_entry_get_block_header(
534        block_tree_entry: *const btck_BlockTreeEntry,
535    ) -> *mut btck_BlockHeader;
536
537    pub fn btck_block_tree_entry_get_height(block_tree_entry: *const btck_BlockTreeEntry) -> i32;
538
539    pub fn btck_block_tree_entry_get_block_hash(
540        block_tree_entry: *const btck_BlockTreeEntry,
541    ) -> *const btck_BlockHash;
542
543    pub fn btck_block_tree_entry_equals(
544        entry1: *const btck_BlockTreeEntry,
545        entry2: *const btck_BlockTreeEntry,
546    ) -> c_int;
547
548    // --- ChainstateManagerOptions -------------------------------------------
549
550    pub fn btck_chainstate_manager_options_create(
551        context: *const btck_Context,
552        data_directory: *const c_char,
553        data_directory_len: usize,
554        blocks_directory: *const c_char,
555        blocks_directory_len: usize,
556    ) -> *mut btck_ChainstateManagerOptions;
557
558    pub fn btck_chainstate_manager_options_set_worker_threads_num(
559        chainstate_manager_options: *mut btck_ChainstateManagerOptions,
560        worker_threads: c_int,
561    );
562
563    pub fn btck_chainstate_manager_options_set_wipe_dbs(
564        chainstate_manager_options: *mut btck_ChainstateManagerOptions,
565        wipe_block_tree_db: c_int,
566        wipe_chainstate_db: c_int,
567    ) -> c_int;
568
569    pub fn btck_chainstate_manager_options_update_block_tree_db_in_memory(
570        chainstate_manager_options: *mut btck_ChainstateManagerOptions,
571        block_tree_db_in_memory: c_int,
572    );
573
574    pub fn btck_chainstate_manager_options_update_chainstate_db_in_memory(
575        chainstate_manager_options: *mut btck_ChainstateManagerOptions,
576        chainstate_db_in_memory: c_int,
577    );
578
579    pub fn btck_chainstate_manager_options_destroy(
580        chainstate_manager_options: *mut btck_ChainstateManagerOptions,
581    );
582
583    // --- ChainstateManager --------------------------------------------------
584
585    pub fn btck_chainstate_manager_create(
586        chainstate_manager_options: *const btck_ChainstateManagerOptions,
587    ) -> *mut btck_ChainstateManager;
588
589    pub fn btck_chainstate_manager_get_best_entry(
590        chainstate_manager: *const btck_ChainstateManager,
591    ) -> *const btck_BlockTreeEntry;
592
593    pub fn btck_chainstate_manager_process_block_header(
594        chainstate_manager: *mut btck_ChainstateManager,
595        header: *const btck_BlockHeader,
596        block_validation_state: *mut btck_BlockValidationState,
597    ) -> c_int;
598
599    pub fn btck_chainstate_manager_import_blocks(
600        chainstate_manager: *mut btck_ChainstateManager,
601        block_file_paths_data: *mut *const c_char,
602        block_file_paths_lens: *mut usize,
603        block_file_paths_data_len: usize,
604    ) -> c_int;
605
606    pub fn btck_chainstate_manager_process_block(
607        chainstate_manager: *mut btck_ChainstateManager,
608        block: *const btck_Block,
609        new_block: *mut c_int,
610    ) -> c_int;
611
612    pub fn btck_chainstate_manager_get_active_chain(
613        chainstate_manager: *const btck_ChainstateManager,
614    ) -> *const btck_Chain;
615
616    pub fn btck_chainstate_manager_get_block_tree_entry_by_hash(
617        chainstate_manager: *const btck_ChainstateManager,
618        block_hash: *const btck_BlockHash,
619    ) -> *const btck_BlockTreeEntry;
620
621    pub fn btck_chainstate_manager_destroy(chainstate_manager: *mut btck_ChainstateManager);
622
623    // --- Block --------------------------------------------------------------
624
625    pub fn btck_block_read(
626        chainstate_manager: *const btck_ChainstateManager,
627        block_tree_entry: *const btck_BlockTreeEntry,
628    ) -> *mut btck_Block;
629
630    pub fn btck_block_create(raw_block: *const c_void, raw_block_len: usize) -> *mut btck_Block;
631
632    pub fn btck_block_copy(block: *const btck_Block) -> *mut btck_Block;
633
634    pub fn btck_block_check(
635        block: *const btck_Block,
636        consensus_params: *const btck_ConsensusParams,
637        flags: btck_BlockCheckFlags,
638        validation_state: *mut btck_BlockValidationState,
639    ) -> c_int;
640
641    pub fn btck_block_count_transactions(block: *const btck_Block) -> usize;
642
643    pub fn btck_block_get_transaction_at(
644        block: *const btck_Block,
645        transaction_index: usize,
646    ) -> *const btck_Transaction;
647
648    pub fn btck_block_get_header(block: *const btck_Block) -> *mut btck_BlockHeader;
649
650    pub fn btck_block_get_hash(block: *const btck_Block) -> *mut btck_BlockHash;
651
652    pub fn btck_block_to_bytes(
653        block: *const btck_Block,
654        writer: btck_WriteBytes,
655        user_data: *mut c_void,
656    ) -> c_int;
657
658    pub fn btck_block_destroy(block: *mut btck_Block);
659
660    // --- BlockValidationState -----------------------------------------------
661
662    pub fn btck_block_validation_state_create() -> *mut btck_BlockValidationState;
663
664    pub fn btck_block_validation_state_get_validation_mode(
665        block_validation_state: *const btck_BlockValidationState,
666    ) -> btck_ValidationMode;
667
668    pub fn btck_block_validation_state_get_block_validation_result(
669        block_validation_state: *const btck_BlockValidationState,
670    ) -> btck_BlockValidationResult;
671
672    pub fn btck_block_validation_state_copy(
673        block_validation_state: *const btck_BlockValidationState,
674    ) -> *mut btck_BlockValidationState;
675
676    pub fn btck_block_validation_state_destroy(
677        block_validation_state: *mut btck_BlockValidationState,
678    );
679
680    // --- Chain --------------------------------------------------------------
681
682    pub fn btck_chain_get_height(chain: *const btck_Chain) -> i32;
683
684    pub fn btck_chain_get_by_height(
685        chain: *const btck_Chain,
686        block_height: i32,
687    ) -> *const btck_BlockTreeEntry;
688
689    pub fn btck_chain_contains(
690        chain: *const btck_Chain,
691        block_tree_entry: *const btck_BlockTreeEntry,
692    ) -> c_int;
693
694    // --- BlockSpentOutputs --------------------------------------------------
695
696    pub fn btck_block_spent_outputs_read(
697        chainstate_manager: *const btck_ChainstateManager,
698        block_tree_entry: *const btck_BlockTreeEntry,
699    ) -> *mut btck_BlockSpentOutputs;
700
701    pub fn btck_block_spent_outputs_copy(
702        block_spent_outputs: *const btck_BlockSpentOutputs,
703    ) -> *mut btck_BlockSpentOutputs;
704
705    pub fn btck_block_spent_outputs_count(
706        block_spent_outputs: *const btck_BlockSpentOutputs,
707    ) -> usize;
708
709    pub fn btck_block_spent_outputs_get_transaction_spent_outputs_at(
710        block_spent_outputs: *const btck_BlockSpentOutputs,
711        transaction_spent_outputs_index: usize,
712    ) -> *const btck_TransactionSpentOutputs;
713
714    pub fn btck_block_spent_outputs_destroy(block_spent_outputs: *mut btck_BlockSpentOutputs);
715
716    // --- TransactionSpentOutputs --------------------------------------------
717
718    pub fn btck_transaction_spent_outputs_copy(
719        transaction_spent_outputs: *const btck_TransactionSpentOutputs,
720    ) -> *mut btck_TransactionSpentOutputs;
721
722    pub fn btck_transaction_spent_outputs_count(
723        transaction_spent_outputs: *const btck_TransactionSpentOutputs,
724    ) -> usize;
725
726    pub fn btck_transaction_spent_outputs_get_coin_at(
727        transaction_spent_outputs: *const btck_TransactionSpentOutputs,
728        coin_index: usize,
729    ) -> *const btck_Coin;
730
731    pub fn btck_transaction_spent_outputs_destroy(
732        transaction_spent_outputs: *mut btck_TransactionSpentOutputs,
733    );
734
735    // --- TransactionInput ---------------------------------------------------
736
737    pub fn btck_transaction_input_copy(
738        transaction_input: *const btck_TransactionInput,
739    ) -> *mut btck_TransactionInput;
740
741    pub fn btck_transaction_input_get_out_point(
742        transaction_input: *const btck_TransactionInput,
743    ) -> *const btck_TransactionOutPoint;
744
745    pub fn btck_transaction_input_get_sequence(
746        transaction_input: *const btck_TransactionInput,
747    ) -> u32;
748
749    pub fn btck_transaction_input_destroy(transaction_input: *mut btck_TransactionInput);
750
751    // --- TransactionOutPoint ------------------------------------------------
752
753    pub fn btck_transaction_out_point_copy(
754        transaction_out_point: *const btck_TransactionOutPoint,
755    ) -> *mut btck_TransactionOutPoint;
756
757    pub fn btck_transaction_out_point_get_index(
758        transaction_out_point: *const btck_TransactionOutPoint,
759    ) -> u32;
760
761    pub fn btck_transaction_out_point_get_txid(
762        transaction_out_point: *const btck_TransactionOutPoint,
763    ) -> *const btck_Txid;
764
765    pub fn btck_transaction_out_point_destroy(transaction_out_point: *mut btck_TransactionOutPoint);
766
767    // --- Txid ---------------------------------------------------------------
768
769    pub fn btck_txid_copy(txid: *const btck_Txid) -> *mut btck_Txid;
770
771    pub fn btck_txid_equals(txid1: *const btck_Txid, txid2: *const btck_Txid) -> c_int;
772
773    pub fn btck_txid_to_bytes(txid: *const btck_Txid, output: *mut c_uchar);
774
775    pub fn btck_txid_destroy(txid: *mut btck_Txid);
776
777    // --- Coin ---------------------------------------------------------------
778
779    pub fn btck_coin_copy(coin: *const btck_Coin) -> *mut btck_Coin;
780
781    pub fn btck_coin_confirmation_height(coin: *const btck_Coin) -> u32;
782
783    pub fn btck_coin_is_coinbase(coin: *const btck_Coin) -> c_int;
784
785    pub fn btck_coin_get_output(coin: *const btck_Coin) -> *const btck_TransactionOutput;
786
787    pub fn btck_coin_destroy(coin: *mut btck_Coin);
788
789    // --- BlockHash ----------------------------------------------------------
790
791    pub fn btck_block_hash_create(block_hash: *const c_uchar) -> *mut btck_BlockHash;
792
793    pub fn btck_block_hash_equals(
794        hash1: *const btck_BlockHash,
795        hash2: *const btck_BlockHash,
796    ) -> c_int;
797
798    pub fn btck_block_hash_copy(block_hash: *const btck_BlockHash) -> *mut btck_BlockHash;
799
800    pub fn btck_block_hash_to_bytes(block_hash: *const btck_BlockHash, output: *mut c_uchar);
801
802    pub fn btck_block_hash_destroy(block_hash: *mut btck_BlockHash);
803
804    // --- BlockHeader --------------------------------------------------------
805
806    pub fn btck_block_header_create(
807        raw_block_header: *const c_void,
808        raw_block_header_len: usize,
809    ) -> *mut btck_BlockHeader;
810
811    pub fn btck_block_header_copy(header: *const btck_BlockHeader) -> *mut btck_BlockHeader;
812
813    pub fn btck_block_header_get_hash(header: *const btck_BlockHeader) -> *mut btck_BlockHash;
814
815    pub fn btck_block_header_get_prev_hash(
816        header: *const btck_BlockHeader,
817    ) -> *const btck_BlockHash;
818
819    pub fn btck_block_header_get_timestamp(header: *const btck_BlockHeader) -> u32;
820
821    pub fn btck_block_header_get_bits(header: *const btck_BlockHeader) -> u32;
822
823    pub fn btck_block_header_get_version(header: *const btck_BlockHeader) -> i32;
824
825    pub fn btck_block_header_get_nonce(header: *const btck_BlockHeader) -> u32;
826
827    pub fn btck_block_header_to_bytes(
828        header: *const btck_BlockHeader,
829        output: *mut c_uchar,
830    ) -> c_int;
831
832    pub fn btck_block_header_destroy(header: *mut btck_BlockHeader);
833
834} // extern "C"